diff options
author | Xavier Claessens <xclaesse@gmail.com> | 2009-02-16 07:25:10 +0800 |
---|---|---|
committer | Xavier Claessens <xclaesse@gmail.com> | 2009-04-22 18:17:00 +0800 |
commit | d18c8688bf0d78ff372f68f5a6d8a92dc3f01f9b (patch) | |
tree | ed878fc4af786a526fc7e81f630b297478362bdd | |
parent | c019af59e75c99e173ae926689a494416cfa1162 (diff) | |
download | gsoc2013-empathy-d18c8688bf0d78ff372f68f5a6d8a92dc3f01f9b.tar gsoc2013-empathy-d18c8688bf0d78ff372f68f5a6d8a92dc3f01f9b.tar.gz gsoc2013-empathy-d18c8688bf0d78ff372f68f5a6d8a92dc3f01f9b.tar.bz2 gsoc2013-empathy-d18c8688bf0d78ff372f68f5a6d8a92dc3f01f9b.tar.lz gsoc2013-empathy-d18c8688bf0d78ff372f68f5a6d8a92dc3f01f9b.tar.xz gsoc2013-empathy-d18c8688bf0d78ff372f68f5a6d8a92dc3f01f9b.tar.zst gsoc2013-empathy-d18c8688bf0d78ff372f68f5a6d8a92dc3f01f9b.zip |
Port EmpathyDispatchOperation to new API
-rw-r--r-- | libempathy/empathy-dispatch-operation.c | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/libempathy/empathy-dispatch-operation.c b/libempathy/empathy-dispatch-operation.c index 1786e4169..80bb3dfb6 100644 --- a/libempathy/empathy-dispatch-operation.c +++ b/libempathy/empathy-dispatch-operation.c @@ -24,6 +24,7 @@ #include "empathy-dispatch-operation.h" #include <libempathy/empathy-enum-types.h> +#include <libempathy/empathy-tp-contact-factory.h> #include <libempathy/empathy-tp-chat.h> #include <libempathy/empathy-tp-call.h> #include <libempathy/empathy-tp-file.h> @@ -173,10 +174,29 @@ empathy_dispatch_operation_invalidated (TpProxy *proxy, guint domain, } static void +dispatcher_operation_got_contact_cb (EmpathyTpContactFactory *factory, + GList *contacts, + gpointer user_data, + GObject *self) +{ + EmpathyDispatchOperationPriv *priv = GET_PRIV (self); + + if (priv->contact != NULL) + g_object_unref (priv->contact); + priv->contact = g_object_ref (contacts->data); + g_object_notify (G_OBJECT (self), "contact"); + + tp_channel_call_when_ready (priv->channel, + empathy_dispatch_operation_channel_ready_cb, self); +} + +static void empathy_dispatch_operation_constructed (GObject *object) { EmpathyDispatchOperation *self = EMPATHY_DISPATCH_OPERATION (object); EmpathyDispatchOperationPriv *priv = GET_PRIV (self); + TpHandle handle; + TpHandleType handle_type; empathy_dispatch_operation_set_status (self, EMPATHY_DISPATCHER_OPERATION_STATE_PREPARING); @@ -185,6 +205,19 @@ empathy_dispatch_operation_constructed (GObject *object) g_signal_connect (priv->channel, "invalidated", G_CALLBACK (empathy_dispatch_operation_invalidated), self); + handle = tp_channel_get_handle (priv->channel, &handle_type); + + if (handle_type == TP_CONN_HANDLE_TYPE_CONTACT && priv->contact == NULL) + { + EmpathyTpContactFactory *factory; + + factory = empathy_tp_contact_factory_dup_singleton (priv->connection); + empathy_tp_contact_factory_get_from_handles (factory, 1, &handle, + dispatcher_operation_got_contact_cb, NULL, NULL, object); + g_object_unref (factory); + return; + } + tp_channel_call_when_ready (priv->channel, empathy_dispatch_operation_channel_ready_cb, self); } @@ -365,6 +398,23 @@ empathy_dispatcher_operation_tp_chat_ready_cb (GObject *object, } static void +empathy_dispatcher_operation_tp_file_ready_cb (GObject *object, + GParamSpec *spec, gpointer user_data) +{ + EmpathyDispatchOperation *self = EMPATHY_DISPATCH_OPERATION (user_data); + EmpathyDispatchOperationPriv *priv = GET_PRIV (self); + + if (!empathy_tp_file_is_ready (EMPATHY_TP_FILE (priv->channel_wrapper))) + return; + + g_signal_handler_disconnect (priv->channel_wrapper, priv->ready_handler); + priv->ready_handler = 0; + + empathy_dispatch_operation_set_status (self, + EMPATHY_DISPATCHER_OPERATION_STATE_PENDING); +} + +static void empathy_dispatch_operation_channel_ready_cb (TpChannel *channel, const GError *error, gpointer user_data) { @@ -395,18 +445,23 @@ empathy_dispatch_operation_channel_ready_cb (TpChannel *channel, G_CALLBACK (empathy_dispatcher_operation_tp_chat_ready_cb), self); return; } - } else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_STREAMED_MEDIA) { - EmpathyTpCall *call = empathy_tp_call_new (channel); - priv->channel_wrapper = G_OBJECT (call); - + EmpathyTpCall *call = empathy_tp_call_new (channel); + priv->channel_wrapper = G_OBJECT (call); } else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_FILE_TRANSFER) { - EmpathyTpFile *file = empathy_tp_file_new (channel); - priv->channel_wrapper = G_OBJECT (file); + EmpathyTpFile *file = empathy_tp_file_new (channel); + priv->channel_wrapper = G_OBJECT (file); + + if (!empathy_tp_file_is_ready (file)) + { + priv->ready_handler = g_signal_connect (file, "notify::ready", + G_CALLBACK (empathy_dispatcher_operation_tp_file_ready_cb), self); + return; + } } ready: |