diff options
Diffstat (limited to 'libempathy')
-rw-r--r-- | libempathy/empathy-dispatcher.c | 69 |
1 files changed, 51 insertions, 18 deletions
diff --git a/libempathy/empathy-dispatcher.c b/libempathy/empathy-dispatcher.c index 78e622137..937a16521 100644 --- a/libempathy/empathy-dispatcher.c +++ b/libempathy/empathy-dispatcher.c @@ -614,7 +614,8 @@ dispatcher_connection_new_channel (EmpathyDispatcher *self, guint handle_type, guint handle, GHashTable *properties, - gboolean incoming) + gboolean incoming, + const GPtrArray *requests_satisfied) { EmpathyDispatcherPriv *priv = GET_PRIV (self); TpChannel *channel; @@ -690,21 +691,51 @@ dispatcher_connection_new_channel (EmpathyDispatcher *self, g_object_unref (channel); - if (incoming) + if (!incoming && requests_satisfied != NULL) { - /* Request could either be by us or by a remote party. If there are no - * outstanding requests for this channel type we can assume it's remote. - * Otherwise we wait untill they are all satisfied */ - if (dispatcher_operation_can_start (self, operation, cd)) - dispatcher_start_dispatching (self, operation, cd); - else - g_hash_table_insert (cd->outstanding_channels, - g_strdup (object_path), operation); - } - else - { - dispatcher_start_dispatching (self, operation, cd); + GList *l; + gboolean found = FALSE; + + l = cd->outstanding_requests; + + while (l != NULL) + { + DispatcherRequestData *d = (DispatcherRequestData *) l->data; + guint n; + const gchar *path; + + l = g_list_next (l); + if (d->request == NULL) + continue; + + if (d->operation != NULL) + continue; + + path = tp_proxy_get_object_path (d->channel_request); + for (n = 0; n < requests_satisfied->len ; n++) + { + const gchar *p = g_ptr_array_index (requests_satisfied, n); + if (!tp_strdiff (p, path)) + { + DEBUG ("Channel satified request %s" + "(already dispatched: %d)", p, found); + if (!found) + { + d->operation = operation; + found = TRUE; + continue; + } + else + { + GError err = { TP_ERRORS, TP_ERROR_NOT_YOURS, + "Not yours!" }; + dispatcher_request_failed (dispatcher, d, &err); + } + } + } + } } + dispatcher_start_dispatching (dispatcher, operation, cd); } static void @@ -712,7 +743,8 @@ dispatcher_connection_new_channel_with_properties ( EmpathyDispatcher *self, TpConnection *connection, const gchar *object_path, - GHashTable *properties) + GHashTable *properties, + const GPtrArray *requests_satisfied) { const gchar *channel_type; guint handle_type; @@ -756,7 +788,8 @@ dispatcher_connection_new_channel_with_properties ( } dispatcher_connection_new_channel (self, connection, - object_path, channel_type, handle_type, handle, properties, !requested); + object_path, channel_type, handle_type, handle, properties, !requested, + requests_satisfied); } static void @@ -837,7 +870,7 @@ dispatcher_connection_got_all (TpProxy *proxy, continue; dispatcher_connection_new_channel_with_properties (self, - TP_CONNECTION (proxy), object_path, props); + TP_CONNECTION (proxy), object_path, properties, NULL); } } } @@ -2228,7 +2261,7 @@ empathy_dispatcher_handle_channels (EmpathyHandler *handler, properties = g_value_get_boxed (g_value_array_get_nth (arr, 1)); dispatcher_connection_new_channel_with_properties (self, - connection, object_path, properties); + connection, object_path, properties, requests_satisfied); } return TRUE; |