[vinagre] Port old Empathy Tube handler to real Telepathy Client using TpHandler



commit 664aca138fc4e36d04109186b158c7b336ce6d4f
Author: Danielle Madeley <danielle madeley collabora co uk>
Date:   Wed Nov 25 13:50:19 2009 +1100

    Port old Empathy Tube handler to real Telepathy Client using TpHandler
    
    This removes the requirement on Empathy to dispatch Tubes, but instead
    requires Mission Control 5.

 vinagre/vinagre-tubes-manager.c |  199 ++++++++++++---------------------------
 vinagre/vinagre-tubes-manager.h |    9 +-
 2 files changed, 67 insertions(+), 141 deletions(-)
---
diff --git a/vinagre/vinagre-tubes-manager.c b/vinagre/vinagre-tubes-manager.c
index 1a4e15a..0c19ffd 100644
--- a/vinagre/vinagre-tubes-manager.c
+++ b/vinagre/vinagre-tubes-manager.c
@@ -19,6 +19,7 @@
  *
  * Authors:
  *      Arnaud Maillet <arnaud maillet collabora co uk>
+ *      Danielle Madeley <danielle madeley collabora co uk>
  */
 
 #include <glib-object.h>
@@ -29,26 +30,19 @@
 #include <telepathy-glib/enums.h>
 #include <telepathy-glib/dbus.h>
 #include <telepathy-glib/interfaces.h>
+#include <telepathy-glib/defs.h>
 
 #include "vinagre-tubes-manager.h"
 #include "vinagre-tube-handler.h"
 #include "vinagre-debug.h"
 
-#define BUS_NAME "org.gnome.Empathy.StreamTubeHandler.rfb"
-#define OBJECT_PATH "/org/gnome/Empathy/StreamTubeHandler/rfb"
+#define CLIENT_NAME "Vinagre"
+#define SERVICE "rfb"
 
-static gboolean
-vinagre_tubes_manager_handle_tube (VinagreTubesManager *object,
-    const gchar *bus_name,
-    const gchar *connection,
-    const gchar *channel,
-    guint handle_type,
-    guint handle,
-    GError **error);
+#define BUS_NAME TP_CLIENT_BUS_NAME_BASE CLIENT_NAME
+#define OBJECT_PATH TP_CLIENT_OBJECT_PATH_BASE CLIENT_NAME
 
-#include "dbus-interface-glue.h"
-
-G_DEFINE_TYPE (VinagreTubesManager, vinagre_tubes_manager, G_TYPE_OBJECT);
+G_DEFINE_TYPE (VinagreTubesManager, vinagre_tubes_manager, TP_TYPE_HANDLER);
 
 #define VINAGRE_TUBES_MANAGER_GET_PRIVATE(obj)\
     (G_TYPE_INSTANCE_GET_PRIVATE ((obj), VINAGRE_TYPE_TUBES_MANAGER,\
@@ -68,16 +62,6 @@ enum
   PROP_VINAGRE_WINDOW
 };
 
-typedef struct
-{
-  VinagreTubesManager *tmanager;
-  gchar *bus_name;
-  gchar *connection;
-  gchar *channel;
-  guint handle_type;
-  guint handle;
-} IdleData;
-
 static void
 vinagre_tubes_manager_dispose (GObject *object)
 {
@@ -150,143 +134,62 @@ vinagre_tubes_manager_disconnected_cb (VinagreTubeHandler *htube,
 }
 
 static void
-vinagre_tubes_manager_tube_ready_destroy_notify (gpointer data)
+vinagre_tubes_manager_handle_channels (TpHandler         *self,
+                                       TpAccount         *account,
+                                       TpConnection      *connection,
+                                       TpChannel        **channels,
+                                       TpChannelRequest **requests,
+                                       guint64            user_action_time,
+                                       GHashTable        *handler_info)
 {
-  IdleData *idle_data = data;
-
-  g_free (idle_data->bus_name);
-  g_free (idle_data->connection);
-  g_free (idle_data->channel);
-  g_slice_free (IdleData, idle_data);
-}
-
-static void
-vinagre_tubes_manager_channel_ready_cb (TpChannel *channel,
-    const GError *error,
-    gpointer data)
-{
-  IdleData *idle_data = data;
-  VinagreTubeHandler *htube;
-  VinagreTubesManagerPrivate *priv = VINAGRE_TUBES_MANAGER_GET_PRIVATE
-      (idle_data->tmanager);
+  VinagreTubesManagerPrivate *priv = VINAGRE_TUBES_MANAGER_GET_PRIVATE (self);
+  TpChannel *channel, **ptr;
 
-  if (error != NULL)
+  for (ptr = channels; channel = *ptr; ptr++)
     {
-      vinagre_debug_message (DEBUG_TUBE,"channel has been invalidated: %s", error->message);
-      vinagre_tubes_manager_tube_ready_destroy_notify (data);
-      g_object_unref (channel);
-      return;
-    }
-
-  htube = vinagre_tube_handler_new (priv->window, channel);
-
-  priv->tubes_handler = g_slist_prepend (priv->tubes_handler, htube);
+      VinagreTubeHandler *htube;
 
-  g_signal_connect (G_OBJECT (htube), "disconnected", G_CALLBACK
-      (vinagre_tubes_manager_disconnected_cb), idle_data->tmanager);
+      htube = vinagre_tube_handler_new (priv->window, channel);
+      priv->tubes_handler = g_slist_prepend (priv->tubes_handler, htube);
 
-  vinagre_tubes_manager_tube_ready_destroy_notify (data);
-}
-
-static void
-vinagre_tubes_manager_connection_ready_cb (TpConnection *connection,
-    const GError *error,
-    gpointer data)
-{
-  TpChannel *channel;
-  IdleData *idle_data = data;
-
-  if (error != NULL)
-    {
-      vinagre_debug_message (DEBUG_TUBE,"connection has been invalidated: %s", error->message);
-      vinagre_tubes_manager_tube_ready_destroy_notify (data);
-      g_object_unref (connection);
-      return;
+      g_signal_connect (G_OBJECT (htube), "disconnected", G_CALLBACK
+          (vinagre_tubes_manager_disconnected_cb), self);
     }
-
-  channel = tp_channel_new (connection, idle_data->channel,
-      TP_IFACE_CHANNEL_TYPE_TUBES, idle_data->handle_type,
-      idle_data->handle, NULL);
-  tp_channel_call_when_ready (channel,
-      vinagre_tubes_manager_channel_ready_cb, idle_data);
-}
-
-static gboolean
-vinagre_tubes_manager_handle_tube_idle_cb (gpointer data)
-{
-  IdleData *idle_data = data;
-  TpConnection *connection;
-  static TpDBusDaemon *daemon = NULL;
-
-  vinagre_debug_message (DEBUG_TUBE,"New tube to be handled");
-
-  if (!daemon)
-    daemon = tp_dbus_daemon_new (tp_get_bus ());
-
-  connection = tp_connection_new (daemon, idle_data->bus_name,
-      idle_data->connection, NULL);
-  tp_connection_call_when_ready (connection,
-      vinagre_tubes_manager_connection_ready_cb, idle_data);
-
-  g_object_unref (connection);
-  return FALSE;
-}
-
-static gboolean
-vinagre_tubes_manager_handle_tube (VinagreTubesManager *object,
-    const gchar *bus_name,
-    const gchar *connection,
-    const gchar *channel,
-    guint handle_type,
-    guint handle,
-    GError **error)
-{
-  VinagreTubesManager * self = VINAGRE_TUBES_MANAGER (object);
-  IdleData *data;
-
-  data = g_slice_new (IdleData);
-  data->tmanager = self;
-  data->bus_name = g_strdup (bus_name);
-  data->connection = g_strdup (connection);
-  data->channel = g_strdup (channel);
-  data->handle_type = handle_type;
-  data->handle = handle;
-
-  g_idle_add_full (G_PRIORITY_HIGH, vinagre_tubes_manager_handle_tube_idle_cb,
-      data, NULL);
-  return TRUE;
 }
 
 static void
 vinagre_tubes_manager_register_tube_handler (GObject *object)
 {
-  DBusGProxy *proxy;
+  TpDBusDaemon *bus;
   guint result;
   GError *error = NULL;
 
-  dbus_g_object_type_install_info (VINAGRE_TYPE_TUBES_MANAGER,
-      &dbus_glib_vinagre_tubes_manager_object_info);
-
-  proxy = dbus_g_proxy_new_for_name (tp_get_bus (), DBUS_SERVICE_DBUS,
-      DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
+  bus = tp_dbus_daemon_dup (&error);
+  if (error != NULL)
+    {
+      vinagre_debug_message (DEBUG_TUBE, "Failed to connect to bus: %s",
+          error ? error->message : "No error given");
+      g_clear_error (&error);
+      goto OUT;
+    }
 
-  if (!dbus_g_proxy_call (proxy, "RequestName", &error,
-      G_TYPE_STRING, BUS_NAME, G_TYPE_UINT, DBUS_NAME_FLAG_DO_NOT_QUEUE,
-      G_TYPE_INVALID, G_TYPE_UINT, &result, G_TYPE_INVALID))
+  if (!tp_dbus_daemon_request_name (bus, BUS_NAME, FALSE, &error))
     {
-      vinagre_debug_message (DEBUG_TUBE,"Failed to request name: %s",
+      vinagre_debug_message (DEBUG_TUBE, "Failed to request name: %s",
           error ? error->message : "No error given");
       g_clear_error (&error);
       goto OUT;
     }
 
-  vinagre_debug_message (DEBUG_TUBE,"Creating tube handler %s object_path:%s\n", BUS_NAME,
-      OBJECT_PATH);
-  dbus_g_connection_register_g_object (tp_get_bus (), OBJECT_PATH,
-      G_OBJECT (object));
+  vinagre_debug_message (DEBUG_TUBE,
+      "Creating tube handler %s object_path:%s\n",
+      BUS_NAME, OBJECT_PATH);
+  dbus_g_connection_register_g_object (
+      tp_proxy_get_dbus_connection (TP_PROXY (bus)),
+      OBJECT_PATH, G_OBJECT (object));
 
 OUT:
-  g_object_unref (proxy);
+  g_object_unref (bus);
 }
 
 static void
@@ -329,7 +232,27 @@ vinagre_tubes_manager_init (VinagreTubesManager *object)
 VinagreTubesManager *
 vinagre_tubes_manager_new (VinagreWindow *vinagre_window)
 {
-  return g_object_new (VINAGRE_TYPE_TUBES_MANAGER,
+  VinagreTubesManager *self;
+  GPtrArray *filter = g_ptr_array_new ();
+  GHashTable *map = tp_asv_new (
+      TP_IFACE_CHANNEL ".ChannelType", G_TYPE_STRING,
+              TP_IFACE_CHANNEL_TYPE_STREAM_TUBE,
+      TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_UINT,
+              TP_HANDLE_TYPE_CONTACT,
+      TP_IFACE_CHANNEL_TYPE_STREAM_TUBE ".Service", G_TYPE_STRING,
+              SERVICE,
+      NULL);
+  g_ptr_array_add (filter, map);
+
+  self = g_object_new (VINAGRE_TYPE_TUBES_MANAGER,
+      "channel-filter", filter,
+      "bypass-approval", FALSE,
+      "handle-channels-cb", vinagre_tubes_manager_handle_channels,
       "vinagre-window", vinagre_window,
       NULL);
+
+  g_hash_table_destroy (map);
+  g_ptr_array_free (filter, TRUE);
+
+  return self;
 }
diff --git a/vinagre/vinagre-tubes-manager.h b/vinagre/vinagre-tubes-manager.h
index bdcdf4e..bb231a2 100644
--- a/vinagre/vinagre-tubes-manager.h
+++ b/vinagre/vinagre-tubes-manager.h
@@ -19,6 +19,7 @@
  *
  * Authors:
  *      Arnaud Maillet <arnaud maillet collabora co uk>
+ *      Danielle Madeley <danielle madeley collabora co uk>
  */
 
 #ifndef __VINAGRE_TUBES_MANAGER_H__
@@ -26,6 +27,8 @@
 
 #include <glib-object.h>
 
+#include <telepathy-glib/handler.h>
+
 #include "vinagre-window.h"
 
 G_BEGIN_DECLS
@@ -48,12 +51,12 @@ typedef struct _VinagreTubesManagerClass VinagreTubesManagerClass;
 
 struct _VinagreTubesManager
 {
-  GObject parent_instance;
+  TpHandler parent_instance;
 };
 
 struct _VinagreTubesManagerClass
 {
-  GObjectClass parent_class;
+  TpHandlerClass parent_class;
 };
 
 GType vinagre_tubes_manager_get_type (void) G_GNUC_CONST;
@@ -62,4 +65,4 @@ VinagreTubesManager* vinagre_tubes_manager_new (VinagreWindow
 
 G_END_DECLS
 
-#endif
\ No newline at end of file
+#endif



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]