[Telepathy-commits] [telepathy-salut/master] TubesChannel: implement ExportableChannel and Channel.FUTURE

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


---
 src/salut-muc-channel.c   |    2 +-
 src/salut-muc-manager.c   |   16 +++++++++----
 src/salut-muc-manager.h   |    2 +-
 src/salut-tubes-channel.c |   52 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/src/salut-muc-channel.c b/src/salut-muc-channel.c
index 7762c9b..dff2fc4 100644
--- a/src/salut-muc-channel.c
+++ b/src/salut-muc-channel.c
@@ -1136,7 +1136,7 @@ salut_muc_channel_received_stanza (GibberMucConnection *conn,
       SalutTubesChannel *tubes_chan;
 
       tubes_chan = salut_muc_manager_ensure_tubes_channel (priv->muc_manager,
-          priv->handle);
+          priv->handle, from_handle);
       g_assert (tubes_chan != NULL);
 
       tubes_message_received (tubes_chan, sender, stanza);
diff --git a/src/salut-muc-manager.c b/src/salut-muc-manager.c
index f94e2ab..48cf390 100644
--- a/src/salut-muc-manager.c
+++ b/src/salut-muc-manager.c
@@ -485,7 +485,8 @@ salut_muc_manager_new_muc_channel (SalutMucManager *mgr,
 static SalutTubesChannel *
 new_tubes_channel (SalutMucManager *self,
                    TpHandle room,
-                   SalutMucChannel *muc)
+                   SalutMucChannel *muc,
+                   TpHandle initiator)
 {
   SalutMucManagerPrivate *priv = SALUT_MUC_MANAGER_GET_PRIVATE (self);
   TpBaseConnection *conn = (TpBaseConnection *) priv->connection;
@@ -506,6 +507,7 @@ new_tubes_channel (SalutMucManager *self,
       "handle", room,
       "handle-type", TP_HANDLE_TYPE_ROOM,
       "muc", muc,
+      "initiator-handle", initiator,
       NULL);
 
   g_signal_connect (chan, "closed", (GCallback) tubes_channel_closed_cb, self);
@@ -651,6 +653,7 @@ make_roomlist_channel (SalutMucManager *self,
 static SalutTubesChannel *
 create_tubes_channel (SalutMucManager *self,
                       TpHandle handle,
+                      TpHandle initiator,
                       GError **error)
 {
   SalutMucManagerPrivate *priv = SALUT_MUC_MANAGER_GET_PRIVATE (self);
@@ -663,13 +666,14 @@ create_tubes_channel (SalutMucManager *self,
   if (text_chan == NULL)
     {
       DEBUG ("have to create the text channel before the tubes one");
+      /* FIXME: this channel will come out with Requested: True. */
       text_chan = salut_muc_manager_request_new_muc_channel (self,
           handle, error);
       if (text_chan == NULL)
         return NULL;
     }
 
-  tubes_chan = new_tubes_channel (self, handle, text_chan);
+  tubes_chan = new_tubes_channel (self, handle, text_chan, initiator);
   g_assert (tubes_chan != NULL);
 
   return tubes_chan;
@@ -752,7 +756,8 @@ salut_muc_manager_factory_iface_request (TpChannelFactoryIface *iface,
         }
       else
         {
-          tubes_chan = create_tubes_channel (mgr, handle, error);
+          tubes_chan = create_tubes_channel (mgr, handle,
+              base_connection->self_handle, error);
           if (tubes_chan == NULL)
             return TP_CHANNEL_FACTORY_REQUEST_STATUS_ERROR;
 
@@ -975,7 +980,8 @@ salut_muc_manager_handle_si_stream_request (SalutMucManager *self,
 
 SalutTubesChannel *
 salut_muc_manager_ensure_tubes_channel (SalutMucManager *self,
-                                        TpHandle handle)
+                                        TpHandle handle,
+                                        TpHandle actor)
 {
   SalutMucManagerPrivate *priv = SALUT_MUC_MANAGER_GET_PRIVATE (self);
   SalutTubesChannel *tubes_chan;
@@ -988,7 +994,7 @@ salut_muc_manager_ensure_tubes_channel (SalutMucManager *self,
       return tubes_chan;
     }
 
-  tubes_chan = create_tubes_channel (self, handle, NULL);
+  tubes_chan = create_tubes_channel (self, handle, actor, NULL);
   g_assert (tubes_chan != NULL);
   g_object_ref (tubes_chan);
 
diff --git a/src/salut-muc-manager.h b/src/salut-muc-manager.h
index e0cf962..8bffb24 100644
--- a/src/salut-muc-manager.h
+++ b/src/salut-muc-manager.h
@@ -86,7 +86,7 @@ void salut_muc_manager_handle_si_stream_request (SalutMucManager *muc_manager,
     const gchar *stream_id, GibberXmppStanza *msg);
 
 SalutTubesChannel * salut_muc_manager_ensure_tubes_channel (
-    SalutMucManager *muc_manager, TpHandle handle);
+    SalutMucManager *muc_manager, TpHandle handle, TpHandle actor);
 
 
 /* "protected" methods */
diff --git a/src/salut-tubes-channel.c b/src/salut-tubes-channel.c
index 40c5ec6..d286b19 100644
--- a/src/salut-tubes-channel.c
+++ b/src/salut-tubes-channel.c
@@ -39,6 +39,8 @@
 #include <gibber/gibber-namespaces.h>
 #include <gibber/gibber-xmpp-error.h>
 
+#include "extensions/extensions.h"
+
 #define DEBUG_FLAG DEBUG_TUBES
 #include "debug.h"
 #include "salut-util.h"
@@ -72,6 +74,8 @@ G_DEFINE_TYPE_WITH_CODE (SalutTubesChannel, salut_tubes_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_EXPORTABLE_CHANNEL, NULL);
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL_TYPE_TUBES, tubes_iface_init);
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL_INTERFACE_GROUP,
         tp_external_group_mixin_iface_init);
@@ -83,6 +87,7 @@ static const char *salut_tubes_channel_interfaces[] = {
   /* If more interfaces are added, either keep Group as the first, or change
    * the implementations of salut_tubes_channel_get_interfaces () and
    * salut_tubes_channel_get_property () too */
+  SALUT_IFACE_CHANNEL_FUTURE,
   NULL
 };
 
@@ -96,6 +101,9 @@ enum
   PROP_MUC,
   PROP_INTERFACES,
   PROP_TARGET_ID,
+  PROP_REQUESTED,
+  PROP_INITIATOR_ID,
+  PROP_INITIATOR_HANDLE,
   LAST_PROPERTY
 };
 
@@ -109,6 +117,7 @@ struct _SalutTubesChannelPrivate
   TpHandle handle;
   TpHandleType handle_type;
   TpHandle self_handle;
+  TpHandle initiator;
   GibberMucConnection *muc_connection;
 
   GHashTable *tubes;
@@ -249,6 +258,22 @@ salut_tubes_channel_get_property (GObject *object,
            g_value_set_string (value, tp_handle_inspect (repo, priv->handle));
         }
         break;
+      case PROP_INITIATOR_HANDLE:
+        g_assert (priv->initiator != 0);
+        g_value_set_uint (value, priv->initiator);
+        break;
+      case PROP_INITIATOR_ID:
+        {
+          TpHandleRepoIface *repo = tp_base_connection_get_handles (
+              (TpBaseConnection *) priv->conn, TP_HANDLE_TYPE_CONTACT);
+
+          g_assert (priv->initiator != 0);
+          g_value_set_string (value, tp_handle_inspect (repo, priv->handle));
+        }
+        break;
+      case PROP_REQUESTED:
+        g_value_set_boolean (value, (priv->initiator != priv->self_handle));
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         break;
@@ -291,6 +316,10 @@ salut_tubes_channel_set_property (GObject *object,
       case PROP_MUC:
         chan->muc = g_value_get_object (value);
         break;
+      case PROP_INITIATOR_HANDLE:
+        priv->initiator = g_value_get_uint (value);
+        g_assert (priv->initiator != 0);
+        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         break;
@@ -1835,6 +1864,29 @@ salut_tubes_channel_class_init (
       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 which caused the Tubes channel to appear",
+      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 this channel's 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 (
       "connection",
       "SalutConnection object",
-- 
1.5.6.5




More information about the Telepathy-commits mailing list