[Telepathy-commits] [telepathy-salut/master] ImManager: implement _channel_manager_{create, request}_channel

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


---
 src/salut-im-manager.c |  108 +++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 102 insertions(+), 6 deletions(-)

diff --git a/src/salut-im-manager.c b/src/salut-im-manager.c
index ade820b..e524f27 100644
--- a/src/salut-im-manager.c
+++ b/src/salut-im-manager.c
@@ -22,6 +22,7 @@
 #include <string.h>
 
 #include "channel-manager.h"
+#include "exportable-channel.h"
 #include "salut-im-channel.h"
 #include "salut-im-manager.h"
 #include "salut-contact.h"
@@ -33,6 +34,7 @@
 #include <gibber/gibber-namespaces.h>
 
 #include <telepathy-glib/channel-factory-iface.h>
+#include <telepathy-glib/dbus.h>
 #include <telepathy-glib/interfaces.h>
 
 #define DEBUG_FLAG DEBUG_IM
@@ -45,7 +47,7 @@ static void salut_im_manager_channel_manager_iface_init (gpointer g_iface,
 
 static SalutImChannel *
 salut_im_manager_new_channel (SalutImManager *mgr, TpHandle handle,
-    TpHandle initiator);
+    TpHandle initiator, gpointer request);
 
 G_DEFINE_TYPE_WITH_CODE (SalutImManager, salut_im_manager, G_TYPE_OBJECT,
     G_IMPLEMENT_INTERFACE (TP_TYPE_CHANNEL_FACTORY_IFACE,
@@ -140,7 +142,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, handle);
+  chan = salut_im_manager_new_channel (self, handle, handle, NULL);
   salut_im_channel_add_connection (chan, conn);
   salut_im_channel_received_stanza (chan, stanza);
 }
@@ -325,7 +327,7 @@ salut_im_manager_factory_iface_request (TpChannelFactoryIface *iface,
   else
     {
       chan = salut_im_manager_new_channel (mgr, handle,
-          base_connection->self_handle);
+          base_connection->self_handle, request);
       if (chan == NULL)
         return TP_CHANNEL_FACTORY_REQUEST_STATUS_NOT_AVAILABLE;
 
@@ -389,6 +391,89 @@ salut_im_manager_foreach_channel_class (SalutChannelManager *manager,
   g_hash_table_destroy (table);
 }
 
+
+static gboolean
+salut_im_manager_requestotron (SalutImManager *self,
+                               gpointer request_token,
+                               GHashTable *request_properties,
+                               gboolean require_new)
+{
+  SalutImManagerPrivate *priv = SALUT_IM_MANAGER_GET_PRIVATE (self);
+  TpBaseConnection *base_conn = (TpBaseConnection *) priv->connection;
+  TpHandleRepoIface *contact_repo = tp_base_connection_get_handles (
+      base_conn, TP_HANDLE_TYPE_CONTACT);
+  TpHandle handle;
+  GError *error = NULL;
+  SalutExportableChannel *channel;
+
+  if (tp_strdiff (tp_asv_get_string (request_properties,
+          TP_IFACE_CHANNEL ".ChannelType"), TP_IFACE_CHANNEL_TYPE_TEXT))
+    return FALSE;
+
+  if (tp_asv_get_uint32 (request_properties,
+        TP_IFACE_CHANNEL ".TargetHandleType", NULL) != TP_HANDLE_TYPE_CONTACT)
+    return FALSE;
+
+  handle = tp_asv_get_uint32 (request_properties,
+      TP_IFACE_CHANNEL ".TargetHandle", NULL);
+
+  if (!tp_handle_is_valid (contact_repo, handle, &error))
+    goto error;
+
+  /* TODO: fail if there are any other properties. */
+
+  channel = g_hash_table_lookup (priv->channels, GUINT_TO_POINTER (handle));
+
+  if (channel == NULL)
+    {
+      salut_im_manager_new_channel (self, handle, base_conn->self_handle,
+          request_token);
+      return TRUE;
+    }
+
+  if (require_new)
+    {
+      g_set_error (&error, TP_ERRORS, TP_ERROR_NOT_AVAILABLE,
+          "Already chatting with contact #%u in another channel", handle);
+      goto error;
+    }
+
+  salut_channel_manager_emit_request_already_satisfied (self, request_token,
+      channel);
+  return TRUE;
+
+error:
+  salut_channel_manager_emit_request_failed (self, request_token,
+      error->domain, error->code, error->message);
+  g_error_free (error);
+  return TRUE;
+}
+
+
+static gboolean
+salut_im_manager_create_channel (SalutChannelManager *manager,
+                                 gpointer request_token,
+                                 GHashTable *request_properties)
+{
+  SalutImManager *self = SALUT_IM_MANAGER (manager);
+
+  return salut_im_manager_requestotron (self, request_token,
+      request_properties, TRUE);
+}
+
+
+static gboolean
+salut_im_manager_request_channel (SalutChannelManager *manager,
+                                  gpointer request_token,
+                                  GHashTable *request_properties)
+{
+  SalutImManager *self = SALUT_IM_MANAGER (manager);
+
+  return salut_im_manager_requestotron (self, request_token,
+      request_properties, FALSE);
+}
+
+
 static void
 salut_im_manager_channel_manager_iface_init (gpointer g_iface,
                                              gpointer iface_data)
@@ -397,10 +482,8 @@ salut_im_manager_channel_manager_iface_init (gpointer g_iface,
 
   iface->foreach_channel = salut_im_manager_foreach_channel;
   iface->foreach_channel_class = salut_im_manager_foreach_channel_class;
-/*
   iface->create_channel = salut_im_manager_create_channel;
   iface->request_channel = salut_im_manager_request_channel;
-*/
 }
 
 
@@ -413,6 +496,9 @@ im_channel_closed_cb (SalutImChannel *chan,
   SalutImManagerPrivate *priv = SALUT_IM_MANAGER_GET_PRIVATE (self);
   TpHandle handle;
 
+  salut_channel_manager_emit_channel_closed_for_object (self,
+    SALUT_EXPORTABLE_CHANNEL (chan));
+
   if (priv->channels)
     {
       g_object_get (chan, "handle", &handle, NULL);
@@ -424,7 +510,8 @@ im_channel_closed_cb (SalutImChannel *chan,
 static SalutImChannel *
 salut_im_manager_new_channel (SalutImManager *mgr,
                               TpHandle handle,
-                              TpHandle initiator)
+                              TpHandle initiator,
+                              gpointer request)
 {
   SalutImManagerPrivate *priv = SALUT_IM_MANAGER_GET_PRIVATE (mgr);
   TpBaseConnection *base_connection = TP_BASE_CONNECTION (priv->connection);
@@ -434,6 +521,7 @@ salut_im_manager_new_channel (SalutImManager *mgr,
   SalutContact *contact;
   const gchar *name;
   gchar *path = NULL;
+  GSList *requests = NULL;
 
   g_assert (g_hash_table_lookup (priv->channels, GUINT_TO_POINTER (handle))
       == NULL);
@@ -457,8 +545,16 @@ salut_im_manager_new_channel (SalutImManager *mgr,
   g_object_unref (contact);
   g_free (path);
   g_hash_table_insert (priv->channels, GUINT_TO_POINTER (handle), chan);
+
   tp_channel_factory_iface_emit_new_channel (mgr, TP_CHANNEL_IFACE (chan),
       NULL);
+
+  if (request != NULL)
+    requests = g_slist_prepend (requests, request);
+
+  salut_channel_manager_emit_new_channel (mgr, SALUT_EXPORTABLE_CHANNEL (chan),
+    requests);
+
   g_signal_connect (chan, "closed", G_CALLBACK (im_channel_closed_cb), mgr);
 
   return chan;
-- 
1.5.6.5




More information about the Telepathy-commits mailing list