aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk/empathy-share-my-desktop.c
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-06-18 18:28:13 +0800
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-06-21 14:54:50 +0800
commit43db9e78ea221b6fc5deea18a395086ea34aa238 (patch)
treec34316a788914e80b021a7f8063c0503e91e57d4 /libempathy-gtk/empathy-share-my-desktop.c
parent7ed9fa5ef0cf9091ae3ea1b1e326440fe6d5727e (diff)
downloadgsoc2013-empathy-43db9e78ea221b6fc5deea18a395086ea34aa238.tar
gsoc2013-empathy-43db9e78ea221b6fc5deea18a395086ea34aa238.tar.gz
gsoc2013-empathy-43db9e78ea221b6fc5deea18a395086ea34aa238.tar.bz2
gsoc2013-empathy-43db9e78ea221b6fc5deea18a395086ea34aa238.tar.lz
gsoc2013-empathy-43db9e78ea221b6fc5deea18a395086ea34aa238.tar.xz
gsoc2013-empathy-43db9e78ea221b6fc5deea18a395086ea34aa238.tar.zst
gsoc2013-empathy-43db9e78ea221b6fc5deea18a395086ea34aa238.zip
share-my-desktop: request the tube using the CDO
Recent Vino are now proper handlers so all we have to do is to request the channel and let MC dispatch it to Vino.
Diffstat (limited to 'libempathy-gtk/empathy-share-my-desktop.c')
-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);
}