[Telepathy-commits] [telepathy-salut/master] ImChannel: implement Channel.FUTURE

Will Thompson will.thompson at collabora.co.uk
Thu Oct 23 07:30:39 PDT 2008


---
 src/salut-im-channel.c |   75 ++++++++++++++++++++++++++++++++++++++++++++++--
 src/salut-im-manager.c |   12 +++++--
 2 files changed, 80 insertions(+), 7 deletions(-)

diff --git a/src/salut-im-channel.c b/src/salut-im-channel.c
index 1f6e484..4be0f14 100644
--- a/src/salut-im-channel.c
+++ b/src/salut-im-channel.c
@@ -39,6 +39,8 @@
 #include <gibber/gibber-xmpp-connection.h>
 #include <gibber/gibber-xmpp-stanza.h>
 
+#include "extensions/extensions.h"
+
 #define DEBUG_FLAG DEBUG_IM
 #include "debug.h"
 #include "salut-connection.h"
@@ -60,11 +62,13 @@ G_DEFINE_TYPE_WITH_CODE (SalutImChannel, salut_im_channel, G_TYPE_OBJECT,
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES,
       tp_dbus_properties_mixin_iface_init);
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL, channel_iface_init);
+    G_IMPLEMENT_INTERFACE (SALUT_TYPE_SVC_CHANNEL_FUTURE, NULL);
     G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_IFACE, NULL);
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL_TYPE_TEXT, text_iface_init);
 );
 
 static const gchar *salut_im_channel_interfaces[] = {
+    SALUT_IFACE_CHANNEL_FUTURE,
     NULL
 };
 
@@ -97,6 +101,9 @@ enum
   PROP_XMPP_CONNECTION_MANAGER,
   PROP_INTERFACES,
   PROP_TARGET_ID,
+  PROP_INITIATOR_HANDLE,
+  PROP_INITIATOR_ID,
+  PROP_REQUESTED,
   LAST_PROPERTY
 };
 
@@ -108,6 +115,7 @@ struct _SalutImChannelPrivate
   gboolean dispose_has_run;
   gchar *object_path;
   TpHandle handle;
+  TpHandle initiator;
   SalutContact *contact;
   SalutConnection *connection;
   GibberXmppConnection *xmpp_connection;
@@ -208,6 +216,7 @@ salut_im_channel_get_property (GObject *object,
 {
   SalutImChannel *chan = SALUT_IM_CHANNEL (object);
   SalutImChannelPrivate *priv = SALUT_IM_CHANNEL_GET_PRIVATE (chan);
+  TpBaseConnection *base_conn = (TpBaseConnection *) priv->connection;
 
   switch (property_id)
     {
@@ -237,12 +246,28 @@ salut_im_channel_get_property (GObject *object,
         break;
       case PROP_TARGET_ID:
         {
-           TpHandleRepoIface *repo = tp_base_connection_get_handles (
-             (TpBaseConnection *) priv->connection, TP_HANDLE_TYPE_CONTACT);
+           TpHandleRepoIface *repo = tp_base_connection_get_handles (base_conn,
+             TP_HANDLE_TYPE_CONTACT);
 
            g_value_set_string (value, tp_handle_inspect (repo, priv->handle));
         }
         break;
+      case PROP_INITIATOR_HANDLE:
+        g_value_set_uint (value, priv->initiator);
+        break;
+      case PROP_INITIATOR_ID:
+          {
+            TpHandleRepoIface *repo = tp_base_connection_get_handles (
+                base_conn, TP_HANDLE_TYPE_CONTACT);
+
+            g_assert (priv->initiator != 0);
+            g_value_set_string (value,
+                tp_handle_inspect (repo, priv->initiator));
+          }
+        break;
+      case PROP_REQUESTED:
+        g_value_set_boolean (value, (priv->initiator == base_conn->self_handle));
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         break;
@@ -268,6 +293,10 @@ salut_im_channel_set_property (GObject *object,
       case PROP_HANDLE:
         priv->handle = g_value_get_uint (value);
         break;
+      case PROP_INITIATOR_HANDLE:
+        priv->initiator = g_value_get_uint (value);
+        g_assert (priv->initiator != 0);
+        break;
       case PROP_CONTACT:
         priv->contact = g_value_get_object (value);
         g_object_ref (priv->contact);
@@ -312,7 +341,7 @@ salut_im_channel_constructor (GType type,
 
   priv = SALUT_IM_CHANNEL_GET_PRIVATE (SALUT_IM_CHANNEL (obj));
 
-  /* Ref our handle */
+  /* Ref our handle and initiator handle */
   base_conn = TP_BASE_CONNECTION (priv->connection);
 
   contact_repo = tp_base_connection_get_handles (base_conn,
@@ -320,6 +349,9 @@ salut_im_channel_constructor (GType type,
 
   tp_handle_ref (contact_repo, priv->handle);
 
+  g_assert (priv->initiator != 0);
+  tp_handle_ref (contact_repo, priv->initiator);
+
   /* Initialize text mixin */
   tp_text_mixin_init (obj, G_STRUCT_OFFSET (SalutImChannel, text),
       contact_repo);
@@ -355,12 +387,23 @@ salut_im_channel_class_init (SalutImChannelClass *salut_im_channel_class)
       { "Interfaces", "interfaces", NULL },
       { NULL }
   };
+  static TpDBusPropertiesMixinPropImpl future_props[] = {
+      { "Requested", "requested", NULL },
+      { "InitiatorHandle", "initiator-handle", NULL },
+      { "InitiatorID", "initiator-id", NULL },
+      { NULL }
+  };
   static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = {
       { TP_IFACE_CHANNEL,
         tp_dbus_properties_mixin_getter_gobject_properties,
         NULL,
         channel_props,
       },
+      { SALUT_IFACE_CHANNEL_FUTURE,
+        tp_dbus_properties_mixin_getter_gobject_properties,
+        NULL,
+        future_props,
+      },
       { NULL }
   };
 
@@ -389,6 +432,29 @@ salut_im_channel_class_init (SalutImChannelClass *salut_im_channel_class)
       G_PARAM_STATIC_BLURB);
   g_object_class_install_property (object_class, PROP_TARGET_ID, param_spec);
 
+  param_spec = g_param_spec_boolean ("requested", "Requested?",
+      "True if this channel was requested by the local user",
+      FALSE,
+      G_PARAM_READABLE |
+      G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+  g_object_class_install_property (object_class, PROP_REQUESTED, param_spec);
+
+  param_spec = g_param_spec_uint ("initiator-handle", "Initiator's handle",
+      "The contact who initiated the channel",
+      0, G_MAXUINT32, 0,
+      G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
+      G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+  g_object_class_install_property (object_class, PROP_INITIATOR_HANDLE,
+      param_spec);
+
+  param_spec = g_param_spec_string ("initiator-id", "Initiator JID",
+      "The string obtained by inspecting the initiator-handle",
+      NULL,
+      G_PARAM_READABLE |
+      G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+  g_object_class_install_property (object_class, PROP_INITIATOR_ID,
+      param_spec);
+
   param_spec = g_param_spec_object (
       "contact",
       "SalutContact object",
@@ -460,6 +526,9 @@ salut_im_channel_dispose (GObject *object)
 
   tp_handle_unref (handle_repo, priv->handle);
 
+  if (priv->initiator != 0)
+    tp_handle_unref (handle_repo, priv->initiator);
+
   if (priv->state != CHANNEL_NOT_CONNECTED)
     salut_im_channel_do_close (self);
 
diff --git a/src/salut-im-manager.c b/src/salut-im-manager.c
index ab25dea..874dd2e 100644
--- a/src/salut-im-manager.c
+++ b/src/salut-im-manager.c
@@ -41,7 +41,8 @@ static void salut_im_manager_factory_iface_init (gpointer g_iface,
     gpointer iface_data);
 
 static SalutImChannel *
-salut_im_manager_new_channel (SalutImManager *mgr, TpHandle handle);
+salut_im_manager_new_channel (SalutImManager *mgr, TpHandle handle,
+    TpHandle initiator);
 
 G_DEFINE_TYPE_WITH_CODE (SalutImManager, salut_im_manager, G_TYPE_OBJECT,
     G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_FACTORY_IFACE,
@@ -134,7 +135,7 @@ message_stanza_callback (SalutXmppConnectionManager *mgr,
   handle = tp_handle_lookup (handle_repo, contact->name, NULL, NULL);
   g_assert (handle != 0);
 
-  chan = salut_im_manager_new_channel (self, handle);
+  chan = salut_im_manager_new_channel (self, handle, handle);
   salut_im_channel_add_connection (chan, conn);
   salut_im_channel_received_stanza (chan, stanza);
 }
@@ -316,7 +317,8 @@ salut_im_manager_factory_iface_request (TpChannelFactoryIface *iface,
     }
   else
     {
-      chan = salut_im_manager_new_channel (mgr, handle);
+      chan = salut_im_manager_new_channel (mgr, handle,
+          base_connection->self_handle);
       if (chan == NULL)
         return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_AVAILABLE;
 
@@ -359,7 +361,8 @@ im_channel_closed_cb (SalutImChannel *chan,
 
 static SalutImChannel *
 salut_im_manager_new_channel (SalutImManager *mgr,
-                              TpHandle handle)
+                              TpHandle handle,
+                              TpHandle initiator)
 {
   SalutImManagerPrivate *priv = SALUT_IM_MANAGER_GET_PRIVATE (mgr);
   TpBaseConnection *base_connection = TP_BASE_CONNECTION (priv->connection);
@@ -386,6 +389,7 @@ salut_im_manager_new_channel (SalutImManager *mgr,
       "contact", contact,
       "object-path", path,
       "handle", handle,
+      "initiator-handle", initiator,
       "xmpp-connection-manager", priv->xmpp_connection_manager,
       NULL);
   g_object_unref (contact);
-- 
1.5.6.5




More information about the Telepathy-commits mailing list