[telepathy-gabble/master] Create search channels in response to requests

Will Thompson will.thompson at collabora.co.uk
Wed Aug 26 09:21:44 PDT 2009


---
 src/search-manager.c |   49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/src/search-manager.c b/src/search-manager.c
index 72e8364..509dd90 100644
--- a/src/search-manager.c
+++ b/src/search-manager.c
@@ -32,6 +32,7 @@
 #include "caps-channel-manager.h"
 #include "connection.h"
 #include "debug.h"
+#include "search-channel.h"
 
 static void channel_manager_iface_init (gpointer, gpointer);
 static void caps_channel_manager_iface_init (gpointer, gpointer);
@@ -233,6 +234,40 @@ gabble_search_manager_foreach_channel_class (TpChannelManager *manager,
   g_hash_table_destroy (table);
 }
 
+static void
+search_channel_closed_cb (GabbleSearchChannel *chan,
+                          GabbleSearchManager *self)
+{
+  tp_channel_manager_emit_channel_closed_for_object (self,
+      (TpExportableChannel *) chan);
+
+  if (self->priv->channels != NULL)
+    g_hash_table_remove (self->priv->channels, chan);
+}
+
+static void
+new_search_channel (GabbleSearchManager *self,
+                    const gchar *server,
+                    gpointer request_token)
+{
+  GabbleSearchManagerPrivate *priv = self->priv;
+  GabbleSearchChannel *chan;
+  GSList *request_tokens = g_slist_prepend (NULL, request_token);
+
+  g_assert (server != NULL);
+
+  chan = g_object_new (GABBLE_TYPE_SEARCH_CHANNEL,
+      "connection", priv->conn,
+      "server", server,
+      NULL);
+  g_hash_table_insert (priv->channels, chan, priv->channels);
+  g_signal_connect (chan, "closed", (GCallback) search_channel_closed_cb, self);
+
+  tp_channel_manager_emit_new_channel (self, (TpExportableChannel *) chan,
+      request_tokens);
+  g_slist_free (request_tokens);
+}
+
 static gboolean
 gabble_search_manager_create_channel (TpChannelManager *manager,
                                       gpointer request_token,
@@ -241,6 +276,7 @@ gabble_search_manager_create_channel (TpChannelManager *manager,
   GabbleSearchManager *self = GABBLE_SEARCH_MANAGER (manager);
   GError *error = NULL;
   const gchar *channel_type;
+  const gchar *server;
 
   channel_type = tp_asv_get_string (request_properties,
       TP_IFACE_CHANNEL ".ChannelType");
@@ -253,7 +289,18 @@ gabble_search_manager_create_channel (TpChannelManager *manager,
           &error))
     goto error;
 
-  return FALSE;
+  server = tp_asv_get_string (request_properties,
+      GABBLE_IFACE_CHANNEL_TYPE_CONTACT_SEARCH ".Server");
+
+  if (server == NULL)
+    {
+      error = g_error_new (TP_ERRORS, TP_ERROR_INVALID_ARGUMENT,
+          "Server must be specified; default not yet implemented");
+      goto error;
+    }
+
+  new_search_channel (self, server, request_token);
+  return TRUE;
 
 error:
   tp_channel_manager_emit_request_failed (self, request_token,
-- 
1.5.6.5




More information about the telepathy-commits mailing list