diff options
Diffstat (limited to 'src/empathy-tubes-chandler.c')
-rw-r--r-- | src/empathy-tubes-chandler.c | 267 |
1 files changed, 0 insertions, 267 deletions
diff --git a/src/empathy-tubes-chandler.c b/src/empathy-tubes-chandler.c deleted file mode 100644 index 5745d8014..000000000 --- a/src/empathy-tubes-chandler.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright (C) 2008 Collabora Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Authors: Elliot Fairweather <elliot.fairweather@collabora.co.uk> - */ - -#include <config.h> - -#include <telepathy-glib/channel.h> -#include <telepathy-glib/connection.h> -#include <telepathy-glib/proxy-subclass.h> -#include <telepathy-glib/dbus.h> - -#include <extensions/extensions.h> - -#include <libempathy/empathy-tube-handler.h> -#include <libempathy/empathy-chandler.h> -#include <libempathy/empathy-debug.h> -#include <libempathy/empathy-utils.h> - -#define DEBUG_DOMAIN "TubesChandler" - -static GMainLoop *loop = NULL; - - -static void -async_cb (TpProxy *channel, - const GError *error, - gpointer user_data, - GObject *weak_object) -{ - if (error) - empathy_debug (DEBUG_DOMAIN, "Error %s: %s", user_data, error->message); -} - -static void -new_tube_cb (TpChannel *channel, - guint id, - guint initiator, - guint type, - const gchar *service, - GHashTable *parameters, - guint state, - gpointer user_data, - GObject *weak_object) -{ - GHashTable *channels = (GHashTable *) user_data; - TpProxy *connection; - gchar *object_path; - guint handle_type; - guint handle; - gpointer value; - guint number; - TpProxy *thandler; - gchar *thandler_bus_name; - gchar *thandler_object_path; - - /* Increase tube count */ - value = g_hash_table_lookup (channels, channel); - number = GPOINTER_TO_UINT (value); - g_hash_table_replace (channels, g_object_ref (channel), - GUINT_TO_POINTER (++number)); - empathy_debug (DEBUG_DOMAIN, "Increased tube count for channel %p: %d", - channel, number); - - /* We dispatch only local pending tubes */ - if (state != TP_TUBE_STATE_LOCAL_PENDING) - return; - - thandler_bus_name = empathy_tube_handler_build_bus_name (type, service); - thandler_object_path = empathy_tube_handler_build_object_path (type, service); - - empathy_debug (DEBUG_DOMAIN, "Dispatching channel %p id=%d to tube handler: " - "object_path=%s bus_name=%s", channel, id, thandler_object_path, - thandler_bus_name); - - /* Create the proxy for the tube handler */ - thandler = g_object_new (TP_TYPE_PROXY, - "dbus-connection", tp_get_bus (), - "bus-name", thandler_bus_name, - "object-path", thandler_object_path, - NULL); - tp_proxy_add_interface_by_id (thandler, EMP_IFACE_QUARK_TUBE_HANDLER); - - /* Give the tube to the handler */ - g_object_get (channel, - "connection", &connection, - "object-path", &object_path, - "handle_type", &handle_type, - "handle", &handle, - NULL); - emp_cli_tube_handler_call_handle_tube (thandler, -1, - connection->bus_name, - connection->object_path, - object_path, handle_type, handle, id, - async_cb, "handling tube", NULL, NULL); - - g_free (thandler_bus_name); - g_free (thandler_object_path); - g_object_unref (thandler); - g_object_unref (connection); - g_free (object_path); -} - -static void -list_tubes_cb (TpChannel *channel, - const GPtrArray *tubes, - const GError *error, - gpointer user_data, - GObject *weak_object) -{ - guint i; - - if (error) - { - empathy_debug (DEBUG_DOMAIN, "Error listing tubes: %s", error->message); - return; - } - - for (i = 0; i < tubes->len; i++) - { - GValueArray *values; - - values = g_ptr_array_index (tubes, i); - new_tube_cb (channel, - g_value_get_uint (g_value_array_get_nth (values, 0)), - g_value_get_uint (g_value_array_get_nth (values, 1)), - g_value_get_uint (g_value_array_get_nth (values, 2)), - g_value_get_string (g_value_array_get_nth (values, 3)), - g_value_get_boxed (g_value_array_get_nth (values, 4)), - g_value_get_uint (g_value_array_get_nth (values, 5)), - user_data, weak_object); - } -} - -static void -channel_invalidated_cb (TpProxy *proxy, - guint domain, - gint code, - gchar *message, - GHashTable *channels) -{ - empathy_debug (DEBUG_DOMAIN, "Channel invalidated: %p", proxy); - g_hash_table_remove (channels, proxy); - if (g_hash_table_size (channels) == 0) - { - empathy_debug (DEBUG_DOMAIN, "All channels are closed, leaving"); - g_main_loop_quit (loop); - } -} - -static void -tube_closed_cb (TpChannel *channel, - guint id, - gpointer user_data, - GObject *weak_object) -{ - gpointer value; - guint number; - GHashTable *channels = (GHashTable *) user_data; - - value = g_hash_table_lookup (channels, channel); - - if (value) - { - number = GPOINTER_TO_UINT (value); - - if (number == 1) - { - empathy_debug (DEBUG_DOMAIN, "Ended tube count for channel %p, " - "closing channel", channel); - tp_cli_channel_call_close (channel, -1, NULL, NULL, NULL, NULL); - } - else if (number > 1) - { - g_hash_table_replace (channels, channel, GUINT_TO_POINTER (--number)); - empathy_debug (DEBUG_DOMAIN, "Decreased tube count for channel %p: %d", - channel, number); - } - } -} - -static void -new_channel_cb (EmpathyChandler *chandler, - TpChannel *channel, - GHashTable *channels) -{ - if (g_hash_table_lookup (channels, channel)) - return; - - empathy_debug (DEBUG_DOMAIN, "Handling new channel"); - - g_hash_table_insert (channels, g_object_ref (channel), GUINT_TO_POINTER (0)); - - g_signal_connect (channel, "invalidated", - G_CALLBACK (channel_invalidated_cb), - channels); - - tp_cli_channel_type_tubes_connect_to_tube_closed (channel, - tube_closed_cb, channels, NULL, NULL, NULL); - tp_cli_channel_type_tubes_connect_to_new_tube (channel, - new_tube_cb, channels, NULL, NULL, NULL); - tp_cli_channel_type_tubes_call_list_tubes (channel, -1, - list_tubes_cb, channels, NULL, NULL); -} - -static guint -channel_hash (gconstpointer key) -{ - TpProxy *channel = TP_PROXY (key); - - return g_str_hash (channel->object_path); -} - -static gboolean -channel_equal (gconstpointer a, - gconstpointer b) -{ - TpProxy *channel_a = TP_PROXY (a); - TpProxy *channel_b = TP_PROXY (b); - - return g_str_equal (channel_a->object_path, channel_b->object_path); -} - -int -main (int argc, char *argv[]) -{ - EmpathyChandler *chandler; - GHashTable *channels; - - g_type_init (); - emp_cli_init (); - - channels = g_hash_table_new_full (channel_hash, channel_equal, - g_object_unref, NULL); - - chandler = empathy_chandler_new ("org.gnome.Empathy.TubesChandler", - "/org/gnome/Empathy/TubesChandler"); - g_signal_connect (chandler, "new-channel", - G_CALLBACK (new_channel_cb), channels); - - empathy_debug (DEBUG_DOMAIN, "Ready to handle new tubes channels"); - - loop = g_main_loop_new (NULL, FALSE); - g_main_loop_run (loop); - - g_main_loop_unref (loop); - g_hash_table_destroy (channels); - g_object_unref (chandler); - - return EXIT_SUCCESS; -} - |