aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy-gtk')
-rw-r--r--libempathy-gtk/empathy-share-my-desktop.c231
1 files changed, 28 insertions, 203 deletions
diff --git a/libempathy-gtk/empathy-share-my-desktop.c b/libempathy-gtk/empathy-share-my-desktop.c
index 01c2e183f..879fc96f8 100644
--- a/libempathy-gtk/empathy-share-my-desktop.c
+++ b/libempathy-gtk/empathy-share-my-desktop.c
@@ -25,223 +25,48 @@
#include <telepathy-glib/contact.h>
#include <telepathy-glib/channel.h>
#include <telepathy-glib/interfaces.h>
+
+#include <libempathy/empathy-dispatcher.h>
+
#define DEBUG_FLAG EMPATHY_DEBUG_SHARE_DESKTOP
#include <libempathy/empathy-debug.h>
#include "empathy-share-my-desktop.h"
-#define DBUS_SERVICE "org.gnome.Vino"
-#define DBUS_INTERFACE "org.gnome.VinoScreen"
-
-typedef struct {
- TpContact *contact;
- TpChannel *channel;
- gulong signal_invalidated_id;
-} EmpathyShareMyDesktopPrivate;
-
-
-static void
-empathy_share_my_desktop_tube_invalidated (TpProxy *channel,
- guint domain,
- gint code,
- gchar *message,
- gpointer object)
-{
- EmpathyShareMyDesktopPrivate *data = (EmpathyShareMyDesktopPrivate *) object;
-
- DEBUG ("Tube is invalidated");
-
- g_signal_handler_disconnect (G_OBJECT (data->channel),
- data->signal_invalidated_id);
-
- if (data->channel != NULL)
- {
- g_object_unref (data->channel);
- data->channel = NULL;
- }
-
- g_slice_free (EmpathyShareMyDesktopPrivate, data);
-}
-
-static void
-empathy_share_my_desktop_channel_ready (TpChannel *channel,
- const GError *error_failed,
- gpointer object)
-{
- EmpathyShareMyDesktopPrivate *data = (EmpathyShareMyDesktopPrivate *) object;
- TpConnection *connection;
- gchar * connection_path;
- gchar * tube_path;
- DBusGConnection *dbus_g_connection;
- GHashTable *channel_properties;
- DBusGProxy *proxy;
- GError *error = NULL;
- GdkScreen *screen;
- gchar *obj_path;
- GtkWidget *window;
-
- if (channel == NULL)
- {
- DEBUG ("The channel is not ready: %s", error_failed->message);
- return;
- }
-
- data->channel = channel;
-
- data->signal_invalidated_id = g_signal_connect (G_OBJECT (channel),
- "invalidated", G_CALLBACK (empathy_share_my_desktop_tube_invalidated),
- data);
-
- dbus_g_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-
- if (dbus_g_connection == NULL)
- {
- DEBUG ("Failed to open connection to bus: %s", error->message);
- g_clear_error (&error);
- return;
- }
-
- screen = gdk_screen_get_default ();
- obj_path = g_strdup_printf ("/org/gnome/vino/screens/%d",
- gdk_screen_get_number (screen));
-
- proxy = dbus_g_proxy_new_for_name (dbus_g_connection, DBUS_SERVICE,
- obj_path, DBUS_INTERFACE);
-
- connection = tp_channel_borrow_connection (channel);
-
- g_object_get (connection, "object-path", &connection_path, NULL);
-
- DEBUG ("connection path : %s", connection_path);
-
- g_object_get (channel, "object-path", &tube_path, "channel-properties",
- &channel_properties, NULL);
-
- DEBUG ("tube path : %s", tube_path);
-
- if (!dbus_g_proxy_call (proxy, "ShareWithTube", &error,
- DBUS_TYPE_G_OBJECT_PATH, connection_path,
- DBUS_TYPE_G_OBJECT_PATH, tube_path,
- dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
- channel_properties,
- G_TYPE_INVALID, G_TYPE_INVALID))
- {
- window = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- "Vino doesn't support telepathy");
- gtk_dialog_run (GTK_DIALOG (window));
- gtk_widget_destroy (window);
- DEBUG ("Failed to request name: %s",
- error ? error->message : "No error given");
- g_clear_error (&error);
- }
-
- g_hash_table_unref (channel_properties);
- g_free (connection_path);
- g_free (tube_path);
- g_free (obj_path);
- g_object_unref (proxy);
-}
-
-static void
-empathy_share_my_desktop_create_channel_cb (TpConnection *connection,
- const gchar *object_path,
- GHashTable *channel_properties,
- const GError *error_failed,
- gpointer user_data,
- GObject *object)
-{
- EmpathyShareMyDesktopPrivate *data = (EmpathyShareMyDesktopPrivate *)
- user_data;
-
- TpChannel *channel;
- GError *error = NULL;
-
- if (object_path == NULL)
- {
- DEBUG ("CreateChannel failed: %s", error_failed->message);
- return;
- }
-
- DEBUG ("Offering a new stream tube");
-
- channel = tp_channel_new_from_properties (connection, object_path,
- channel_properties, &error);
-
- if (channel == NULL)
- {
- DEBUG ("Error requesting channel: %s", error->message);
- g_clear_error (&error);
- return;
- }
-
- tp_channel_call_when_ready (channel,
- empathy_share_my_desktop_channel_ready, data);
-}
-
-static void
-empathy_share_my_desktop_connection_ready (TpConnection *connection,
- const GError *error,
- gpointer object)
-{
- EmpathyShareMyDesktopPrivate *data = (EmpathyShareMyDesktopPrivate *) object;
- GHashTable *request;
- GValue *value;
-
- if (connection == NULL)
- {
- DEBUG ("The connection is not ready: %s", error->message);
- return;
- }
-
- request = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
- (GDestroyNotify) tp_g_value_slice_free);
-
- /* org.freedesktop.Telepathy.Channel.ChannelType */
- value = tp_g_value_slice_new_static_string
- (TP_IFACE_CHANNEL_TYPE_STREAM_TUBE);
- g_hash_table_insert (request, TP_IFACE_CHANNEL ".ChannelType", value);
-
- /* org.freedesktop.Telepathy.Channel.TargetHandleType */
- value = tp_g_value_slice_new_uint (TP_HANDLE_TYPE_CONTACT);
- g_hash_table_insert (request, TP_IFACE_CHANNEL ".TargetHandleType", value);
-
- /* org.freedesktop.Telepathy.Channel.TargetHandleType */
- value = tp_g_value_slice_new_uint (tp_contact_get_handle
- (data->contact));
- g_hash_table_insert (request, TP_IFACE_CHANNEL ".TargetHandle", value);
-
- /* org.freedesktop.Telepathy.Channel.Type.StreamTube.Service */
- value = tp_g_value_slice_new_static_string ("rfb");
- g_hash_table_insert (request,
- TP_IFACE_CHANNEL_TYPE_STREAM_TUBE ".Service",
- value);
-
- tp_cli_connection_interface_requests_call_create_channel
- (connection, -1, request, empathy_share_my_desktop_create_channel_cb,
- data, NULL, NULL);
-
- g_hash_table_destroy (request);
-}
-
void
empathy_share_my_desktop_share_with_contact (EmpathyContact *contact)
{
- TpConnection *connection;
- EmpathyShareMyDesktopPrivate *data;
- data = g_slice_new (EmpathyShareMyDesktopPrivate);
- data->contact = empathy_contact_get_tp_contact (contact);
+ EmpathyDispatcher *dispatcher;
+ GHashTable *request;
+ TpContact *tp_contact;
+
+ tp_contact = empathy_contact_get_tp_contact (contact);
DEBUG ("Creation of ShareMyDesktop");
- if (!TP_IS_CONTACT (data->contact))
+ if (!TP_IS_CONTACT (tp_contact))
{
DEBUG ("It's not a tp contact");
return;
}
- connection = tp_contact_get_connection (data->contact);
-
- tp_connection_call_when_ready (connection,
- empathy_share_my_desktop_connection_ready, data);
+ dispatcher = empathy_dispatcher_dup_singleton ();
+
+ request = tp_asv_new (
+ TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING,
+ TP_IFACE_CHANNEL_TYPE_STREAM_TUBE,
+ TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT,
+ TP_HANDLE_TYPE_CONTACT,
+ TP_PROP_CHANNEL_TARGET_HANDLE, G_TYPE_UINT,
+ tp_contact_get_handle (tp_contact),
+ TP_PROP_CHANNEL_TYPE_STREAM_TUBE_SERVICE, G_TYPE_STRING, "rfb",
+ NULL);
+
+ empathy_dispatcher_create_channel (dispatcher,
+ tp_contact_get_connection (tp_contact), request,
+ EMPATHY_DISPATCHER_CURRENT_TIME,
+ NULL, NULL);
+
+ g_object_unref (dispatcher);
+ g_hash_table_unref (request);
}