[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