[telepathy-idle/master] Implement the TpExportableChannel interface
Jonathon Jongsma
jjongsma at gnome.org
Thu Sep 10 16:07:39 PDT 2009
To complete the switch from TpChannelFactory to TpChannelManager, the
IdleIMChannel and IdleMUCChannel classes must implement the TpExportableChannel
interface. This implementation is highly influenced by the Salut implementation
---
src/idle-im-channel.c | 54 ++++++++++++++++++++++++++++++++++++++++-------
src/idle-im-channel.h | 2 +
src/idle-muc-channel.c | 39 ++++++++++++++++++++++++++++++++++
src/idle-muc-channel.h | 2 +
4 files changed, 89 insertions(+), 8 deletions(-)
diff --git a/src/idle-im-channel.c b/src/idle-im-channel.c
index daaeb6a..a6a090e 100644
--- a/src/idle-im-channel.c
+++ b/src/idle-im-channel.c
@@ -44,7 +44,8 @@ static void _text_iface_init(gpointer, gpointer);
G_DEFINE_TYPE_WITH_CODE(IdleIMChannel, idle_im_channel, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE(TP_TYPE_SVC_CHANNEL, _channel_iface_init);
G_IMPLEMENT_INTERFACE(TP_TYPE_SVC_CHANNEL_TYPE_TEXT, _text_iface_init);
- G_IMPLEMENT_INTERFACE(TP_TYPE_CHANNEL_IFACE, NULL);)
+ G_IMPLEMENT_INTERFACE(TP_TYPE_CHANNEL_IFACE, NULL);
+ G_IMPLEMENT_INTERFACE(TP_TYPE_EXPORTABLE_CHANNEL, NULL);)
/* property enum */
enum {
@@ -53,6 +54,8 @@ enum {
PROP_CHANNEL_TYPE,
PROP_HANDLE_TYPE,
PROP_HANDLE,
+ PROP_CHANNEL_DESTROYED,
+ PROP_CHANNEL_PROPERTIES,
LAST_PROPERTY_ENUM
};
@@ -134,6 +137,22 @@ static void idle_im_channel_get_property(GObject *object, guint property_id, GVa
g_value_set_uint(value, priv->handle);
break;
+ case PROP_CHANNEL_DESTROYED:
+ /* TODO: this should be FALSE if there are still pending messages, so
+ * the channel manager can respawn the channel.
+ */
+ g_value_set_boolean (value, TRUE);
+ break;
+
+ case PROP_CHANNEL_PROPERTIES:
+ g_value_take_boxed (value,
+ tp_dbus_properties_mixin_make_properties_hash (object,
+ TP_IFACE_CHANNEL, "TargetHandle",
+ TP_IFACE_CHANNEL, "TargetHandleType",
+ TP_IFACE_CHANNEL, "ChannelType",
+ NULL));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
break;
@@ -195,18 +214,37 @@ static void idle_im_channel_class_init (IdleIMChannelClass *idle_im_channel_clas
g_object_class_override_property(object_class, PROP_CHANNEL_TYPE, "channel-type");
g_object_class_override_property(object_class, PROP_HANDLE_TYPE, "handle-type");
g_object_class_override_property(object_class, PROP_HANDLE, "handle");
+ g_object_class_override_property(object_class, PROP_CHANNEL_DESTROYED, "channel-destroyed");
+ g_object_class_override_property(object_class, PROP_CHANNEL_PROPERTIES, "channel-properties");
param_spec = g_param_spec_object("connection", "IdleConnection object",
- "The IdleConnection object that owns this "
- "IMChannel object.",
- IDLE_TYPE_CONNECTION,
- G_PARAM_CONSTRUCT_ONLY |
- G_PARAM_READWRITE |
- G_PARAM_STATIC_NICK |
- G_PARAM_STATIC_BLURB);
+ "The IdleConnection object that owns this "
+ "IMChannel object.",
+ IDLE_TYPE_CONNECTION,
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_NICK |
+ G_PARAM_STATIC_BLURB);
g_object_class_install_property(object_class, PROP_CONNECTION, param_spec);
+ static TpDBusPropertiesMixinPropImpl channel_props[] = {
+ { "TargetHandleType", "handle-type", NULL },
+ { "TargetHandle", "handle", NULL },
+ { "ChannelType", "channel-type", NULL },
+ { NULL }
+ };
+ static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = {
+ { TP_IFACE_CHANNEL,
+ tp_dbus_properties_mixin_getter_gobject_properties,
+ NULL,
+ channel_props,
+ },
+ { NULL }
+ };
+
+ idle_im_channel_class->dbus_props_class.interfaces = prop_interfaces;
tp_text_mixin_class_init(object_class, G_STRUCT_OFFSET(IdleIMChannelClass, text_class));
+ tp_dbus_properties_mixin_class_init(object_class, G_STRUCT_OFFSET(IdleIMChannelClass, dbus_props_class));
}
void idle_im_channel_dispose (GObject *object) {
diff --git a/src/idle-im-channel.h b/src/idle-im-channel.h
index 292b013..05c810b 100644
--- a/src/idle-im-channel.h
+++ b/src/idle-im-channel.h
@@ -23,6 +23,7 @@
#include <glib-object.h>
#include <telepathy-glib/text-mixin.h>
+#include <telepathy-glib/dbus-properties-mixin.h>
G_BEGIN_DECLS
@@ -32,6 +33,7 @@ typedef struct _IdleIMChannelClass IdleIMChannelClass;
struct _IdleIMChannelClass {
GObjectClass parent_class;
TpTextMixinClass text_class;
+ TpDBusPropertiesMixinClass dbus_props_class;
};
struct _IdleIMChannel {
diff --git a/src/idle-muc-channel.c b/src/idle-muc-channel.c
index ea394a0..87e0ede 100644
--- a/src/idle-muc-channel.c
+++ b/src/idle-muc-channel.c
@@ -53,6 +53,7 @@ G_DEFINE_TYPE_WITH_CODE(IdleMUCChannel, idle_muc_channel, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE(TP_TYPE_SVC_CHANNEL_INTERFACE_PASSWORD, _password_iface_init);
G_IMPLEMENT_INTERFACE(TP_TYPE_SVC_CHANNEL_TYPE_TEXT, _text_iface_init);
G_IMPLEMENT_INTERFACE(TP_TYPE_SVC_PROPERTIES_INTERFACE, _properties_iface_init);
+ G_IMPLEMENT_INTERFACE(TP_TYPE_EXPORTABLE_CHANNEL, NULL);
G_IMPLEMENT_INTERFACE(TP_TYPE_CHANNEL_IFACE, NULL);)
/* signal enum */
@@ -68,6 +69,8 @@ enum {
PROP_CHANNEL_TYPE,
PROP_HANDLE_TYPE,
PROP_HANDLE,
+ PROP_CHANNEL_DESTROYED,
+ PROP_CHANNEL_PROPERTIES,
LAST_PROPERTY_ENUM
};
@@ -303,6 +306,22 @@ static void idle_muc_channel_get_property(GObject *object, guint property_id, GV
g_value_set_uint(value, priv->handle);
break;
+ case PROP_CHANNEL_DESTROYED:
+ /* TODO: this should be FALSE if there are still pending messages, so
+ * the channel manager can respawn the channel.
+ */
+ g_value_set_boolean (value, TRUE);
+ break;
+
+ case PROP_CHANNEL_PROPERTIES:
+ g_value_take_boxed (value,
+ tp_dbus_properties_mixin_make_properties_hash (object,
+ TP_IFACE_CHANNEL, "TargetHandle",
+ TP_IFACE_CHANNEL, "TargetHandleType",
+ TP_IFACE_CHANNEL, "ChannelType",
+ NULL));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
break;
@@ -362,6 +381,8 @@ static void idle_muc_channel_class_init (IdleMUCChannelClass *idle_muc_channel_c
g_object_class_override_property (object_class, PROP_CHANNEL_TYPE, "channel-type");
g_object_class_override_property (object_class, PROP_HANDLE_TYPE, "handle-type");
g_object_class_override_property (object_class, PROP_HANDLE, "handle");
+ g_object_class_override_property (object_class, PROP_CHANNEL_DESTROYED, "channel-destroyed");
+ g_object_class_override_property (object_class, PROP_CHANNEL_PROPERTIES, "channel-properties");
object_class->dispose = idle_muc_channel_dispose;
object_class->finalize = idle_muc_channel_finalize;
@@ -373,6 +394,24 @@ static void idle_muc_channel_class_init (IdleMUCChannelClass *idle_muc_channel_c
tp_group_mixin_class_init(object_class, G_STRUCT_OFFSET(IdleMUCChannelClass, group_class), add_member, remove_member);
tp_text_mixin_class_init(object_class, G_STRUCT_OFFSET(IdleMUCChannelClass, text_class));
+
+ static TpDBusPropertiesMixinPropImpl channel_props[] = {
+ { "TargetHandleType", "handle-type", NULL },
+ { "TargetHandle", "handle", NULL },
+ { "ChannelType", "channel-type", NULL },
+ { NULL }
+ };
+ static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = {
+ { TP_IFACE_CHANNEL,
+ tp_dbus_properties_mixin_getter_gobject_properties,
+ NULL,
+ channel_props,
+ },
+ { NULL }
+ };
+
+ idle_muc_channel_class->dbus_props_class.interfaces = prop_interfaces;
+ tp_dbus_properties_mixin_class_init(object_class, G_STRUCT_OFFSET(IdleMUCChannelClass, dbus_props_class));
}
void idle_muc_channel_dispose (GObject *object) {
diff --git a/src/idle-muc-channel.h b/src/idle-muc-channel.h
index 7c01731..7461b5f 100644
--- a/src/idle-muc-channel.h
+++ b/src/idle-muc-channel.h
@@ -27,6 +27,7 @@
#include <telepathy-glib/group-mixin.h>
#include <telepathy-glib/handle.h>
#include <telepathy-glib/text-mixin.h>
+#include <telepathy-glib/dbus-properties-mixin.h>
G_BEGIN_DECLS
@@ -37,6 +38,7 @@ struct _IdleMUCChannelClass {
GObjectClass parent_class;
TpGroupMixinClass group_class;
TpTextMixinClass text_class;
+ TpDBusPropertiesMixinClass dbus_props_class;
};
struct _IdleMUCChannel {
--
1.5.6.5
More information about the telepathy-commits
mailing list