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

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


---
 src/salut-avahi-muc-channel.c |    2 +
 src/salut-avahi-muc-channel.h |    2 +-
 src/salut-avahi-muc-manager.c |    5 ++-
 src/salut-muc-channel.c       |   70 ++++++++++++++++++++++++++++++++++++++--
 src/salut-muc-manager.c       |   13 ++++---
 src/salut-muc-manager.h       |    3 +-
 6 files changed, 81 insertions(+), 14 deletions(-)

diff --git a/src/salut-avahi-muc-channel.c b/src/salut-avahi-muc-channel.c
index c231941..26d868a 100644
--- a/src/salut-avahi-muc-channel.c
+++ b/src/salut-avahi-muc-channel.c
@@ -346,6 +346,7 @@ salut_avahi_muc_channel_new (SalutConnection *connection,
                        TpHandle handle,
                        const gchar *name,
                        SalutAvahiDiscoveryClient *discovery_client,
+                       TpHandle initiator,
                        gboolean creator,
                        SalutXmppConnectionManager *xcm)
 {
@@ -356,6 +357,7 @@ salut_avahi_muc_channel_new (SalutConnection *connection,
       "handle", handle,
       "name", name,
       "discovery-client", discovery_client,
+      "initiator-handle", initiator,
       "creator", creator,
       "xmpp-connection-manager", xcm,
       NULL);
diff --git a/src/salut-avahi-muc-channel.h b/src/salut-avahi-muc-channel.h
index 8daaab8..4af06fb 100644
--- a/src/salut-avahi-muc-channel.h
+++ b/src/salut-avahi-muc-channel.h
@@ -65,7 +65,7 @@ GType salut_avahi_muc_channel_get_type (void);
 SalutAvahiMucChannel * salut_avahi_muc_channel_new (SalutConnection *connection,
     const gchar *path, GibberMucConnection *muc_connection, TpHandle handle,
     const gchar *name, SalutAvahiDiscoveryClient *discovery_client,
-    gboolean creator, SalutXmppConnectionManager *xcm);
+    TpHandle initiator, gboolean creator, SalutXmppConnectionManager *xcm);
 
 G_END_DECLS
 
diff --git a/src/salut-avahi-muc-manager.c b/src/salut-avahi-muc-manager.c
index fa8f3a4..3a1a9a4 100644
--- a/src/salut-avahi-muc-manager.c
+++ b/src/salut-avahi-muc-manager.c
@@ -356,6 +356,7 @@ salut_avahi_muc_manager_create_muc_channel (
     GibberMucConnection *muc_connection,
     TpHandle handle,
     const gchar *name,
+    TpHandle initiator,
     gboolean creator,
     SalutXmppConnectionManager *xcm)
 {
@@ -363,8 +364,8 @@ salut_avahi_muc_manager_create_muc_channel (
   SalutAvahiMucManagerPrivate *priv = SALUT_AVAHI_MUC_MANAGER_GET_PRIVATE (self);
 
   return SALUT_MUC_CHANNEL (salut_avahi_muc_channel_new (connection,
-        path, muc_connection, handle, name, priv->discovery_client, creator,
-        xcm));
+        path, muc_connection, handle, name, priv->discovery_client, initiator,
+        creator, xcm));
 }
 
 static void
diff --git a/src/salut-muc-channel.c b/src/salut-muc-channel.c
index 4f3e148..4117fd4 100644
--- a/src/salut-muc-channel.c
+++ b/src/salut-muc-channel.c
@@ -44,6 +44,8 @@
 
 #include <gibber/gibber-muc-connection.h>
 
+#include "extensions/extensions.h"
+
 #include "salut-connection.h"
 #include "salut-self.h"
 #include "salut-xmpp-connection-manager.h"
@@ -58,6 +60,8 @@ G_DEFINE_TYPE_WITH_CODE(SalutMucChannel, salut_muc_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_CHANNEL_IFACE, NULL);
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL_INTERFACE_GROUP,
         tp_group_mixin_iface_init);
@@ -93,6 +97,9 @@ enum
   PROP_XMPP_CONNECTION_MANAGER,
   PROP_INTERFACES,
   PROP_TARGET_ID,
+  PROP_REQUESTED,
+  PROP_INITIATOR_HANDLE,
+  PROP_INITIATOR_ID,
   LAST_PROPERTY
 };
 
@@ -114,6 +121,7 @@ struct _SalutMucChannelPrivate
   /* (gchar *) -> (SalutContact *) */
   GHashTable *senders;
   SalutMucManager *muc_manager;
+  TpHandle initiator;
 };
 
 #define SALUT_MUC_CHANNEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SALUT_TYPE_MUC_CHANNEL, SalutMucChannelPrivate))
@@ -141,6 +149,7 @@ salut_muc_channel_get_property (GObject    *object,
 {
   SalutMucChannel *chan = SALUT_MUC_CHANNEL (object);
   SalutMucChannelPrivate *priv = SALUT_MUC_CHANNEL_GET_PRIVATE (chan);
+  TpBaseConnection *base_conn = (TpBaseConnection *) chan->connection;
 
   switch (property_id) {
     case PROP_OBJECT_PATH:
@@ -175,12 +184,27 @@ salut_muc_channel_get_property (GObject    *object,
       break;
     case PROP_TARGET_ID:
       {
-         TpHandleRepoIface *repo = tp_base_connection_get_handles (
-           (TpBaseConnection *) chan->connection, TP_HANDLE_TYPE_ROOM);
+        TpHandleRepoIface *repo = tp_base_connection_get_handles (base_conn,
+            TP_HANDLE_TYPE_ROOM);
 
-         g_value_set_string (value, tp_handle_inspect (repo, priv->handle));
+        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_value_set_string (value, tp_handle_inspect (repo, priv->initiator));
+      }
+      break;
+    case PROP_REQUESTED:
+      g_value_set_boolean (value,
+          (priv->initiator == tp_base_connection_get_self_handle (base_conn)));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
@@ -228,7 +252,10 @@ salut_muc_channel_set_property (GObject     *object,
     case PROP_CREATOR:
       priv->creator = g_value_get_boolean (value);
       break;
-   case PROP_XMPP_CONNECTION_MANAGER:
+    case PROP_INITIATOR_HANDLE:
+      priv->initiator = g_value_get_uint (value);
+      break;
+    case PROP_XMPP_CONNECTION_MANAGER:
       priv->xmpp_connection_manager = g_value_get_object (value);
       break;
     default:
@@ -691,12 +718,23 @@ salut_muc_channel_class_init (SalutMucChannelClass *salut_muc_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 }
   };
 
@@ -725,6 +763,30 @@ salut_muc_channel_class_init (SalutMucChannelClass *salut_muc_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 which invited us to the MUC, or ourselves if we joined of "
+      "our own accord",
+      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_string ("name",
                                     "Name of the muc group",
                                     "The name of the muc group",
diff --git a/src/salut-muc-manager.c b/src/salut-muc-manager.c
index eb7ef70..f94e2ab 100644
--- a/src/salut-muc-manager.c
+++ b/src/salut-muc-manager.c
@@ -441,6 +441,7 @@ static SalutMucChannel *
 salut_muc_manager_new_muc_channel (SalutMucManager *mgr,
                                    TpHandle handle,
                                    GibberMucConnection *connection,
+                                   TpHandle initiator,
                                    gboolean new_connection)
 {
   SalutMucManagerPrivate *priv = SALUT_MUC_MANAGER_GET_PRIVATE(mgr);
@@ -462,8 +463,8 @@ salut_muc_manager_new_muc_channel (SalutMucManager *mgr,
       handle);
 
   chan = SALUT_MUC_MANAGER_GET_CLASS (mgr)->create_muc_channel (mgr,
-      priv->connection, path, connection, handle, name, new_connection,
-      priv->xmpp_connection_manager);
+      priv->connection, path, connection, handle, name, initiator,
+      new_connection, priv->xmpp_connection_manager);
   g_free (path);
 
   g_signal_connect (chan, "closed", G_CALLBACK (muc_channel_closed_cb), mgr);
@@ -585,7 +586,7 @@ salut_muc_manager_request_new_muc_channel (SalutMucManager *mgr,
   DEBUG ("Connect succeeded");
 
   text_chan = salut_muc_manager_new_muc_channel (mgr, handle,
-      connection, params == NULL);
+      connection, base_connection->self_handle, params == NULL);
   r = salut_muc_channel_invited (text_chan,
         base_connection->self_handle, NULL, NULL);
   /* Inviting ourselves to a connected channel should always
@@ -878,6 +879,8 @@ invite_stanza_callback (SalutXmppConnectionManager *mgr,
   chan = g_hash_table_lookup (priv->text_channels,
       GINT_TO_POINTER (room_handle));
 
+  inviter_handle = tp_handle_ensure (contact_repo, contact->name, NULL, NULL);
+
   if (chan == NULL)
     {
       connection = _get_connection (self, GIBBER_TELEPATHY_NS_CLIQUE,
@@ -896,14 +899,12 @@ invite_stanza_callback (SalutXmppConnectionManager *mgr,
         }
       /* Need to create a new one */
       chan = salut_muc_manager_new_muc_channel (self, room_handle,
-          connection, FALSE);
+          connection, inviter_handle, FALSE);
     }
 
   /* FIXME handle properly */
   g_assert (chan != NULL);
 
-  inviter_handle = tp_handle_ensure (contact_repo, contact->name, NULL, NULL);
-
 #ifdef ENABLE_OLPC
   salut_connection_olpc_observe_invitation (priv->connection, room_handle,
       inviter_handle, invite);
diff --git a/src/salut-muc-manager.h b/src/salut-muc-manager.h
index b953b11..e0cf962 100644
--- a/src/salut-muc-manager.h
+++ b/src/salut-muc-manager.h
@@ -50,7 +50,8 @@ struct _SalutMucManagerClass {
     SalutMucChannel * (*create_muc_channel) (SalutMucManager *self,
         SalutConnection *connection, const gchar *path,
         GibberMucConnection *muc_connection, TpHandle handle,
-        const gchar *name, gboolean creator, SalutXmppConnectionManager *xcm);
+        const gchar *name, TpHandle initiator, gboolean creator,
+        SalutXmppConnectionManager *xcm);
 };
 
 struct _SalutMucManager {
-- 
1.5.6.5




More information about the Telepathy-commits mailing list