summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2012-05-15 20:06:36 -0400
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2012-07-20 14:28:38 +0100
commitd8da0aa2b9144d26da3926a6cf8f6f154cd5729c (patch)
treef22c77ebc860b04c0ea8b231ac6ba76c57cce125
parent01e04709772936a6791330b49c02167b0ea7fafa (diff)
McdDispatchOperation: collect_satisfied_requests: only take one channel
https://bugs.freedesktop.org/show_bug.cgi?id=52305
-rw-r--r--src/mcd-dispatch-operation.c52
1 files changed, 26 insertions, 26 deletions
diff --git a/src/mcd-dispatch-operation.c b/src/mcd-dispatch-operation.c
index 0a3b58a8..1b7ed578 100644
--- a/src/mcd-dispatch-operation.c
+++ b/src/mcd-dispatch-operation.c
@@ -2008,36 +2008,25 @@ observe_channels_cb (TpClient *proxy, const GError *error,
* request-properties for Observer_Info or Handler_Info
*/
static void
-collect_satisfied_requests (const GList *channels,
+collect_satisfied_requests (McdChannel *channel,
GPtrArray **paths_out,
GHashTable **props_out)
{
- const GList *c;
- GHashTable *set;
GHashTableIter it;
gpointer path, value;
GPtrArray *satisfied_requests;
GHashTable *request_properties;
+ GHashTable *reqs;
- set = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, g_object_unref);
+ reqs = _mcd_channel_get_satisfied_requests (channel, NULL);
- for (c = channels; c != NULL; c = c->next)
- {
- GHashTable *reqs = _mcd_channel_get_satisfied_requests (c->data,
- NULL);
- tp_g_hash_table_update (set, reqs,
- (GBoxedCopyFunc) g_strdup, (GBoxedCopyFunc) g_object_ref);
- g_hash_table_unref (reqs);
- }
-
- satisfied_requests = g_ptr_array_sized_new (g_hash_table_size (set));
+ satisfied_requests = g_ptr_array_sized_new (g_hash_table_size (reqs));
g_ptr_array_set_free_func (satisfied_requests, g_free);
request_properties = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, (GDestroyNotify) g_hash_table_unref);
- g_hash_table_iter_init (&it, set);
+ g_hash_table_iter_init (&it, reqs);
while (g_hash_table_iter_next (&it, &path, &value))
{
@@ -2049,7 +2038,7 @@ collect_satisfied_requests (const GList *channels,
g_hash_table_insert (request_properties, g_strdup (path), props);
}
- g_hash_table_unref (set);
+ g_hash_table_unref (reqs);
if (paths_out != NULL)
*paths_out = satisfied_requests;
@@ -2077,7 +2066,7 @@ _mcd_dispatch_operation_run_observers (McdDispatchOperation *self)
while (g_hash_table_iter_next (&iter, NULL, &client_p))
{
McdClientProxy *client = MCD_CLIENT_PROXY (client_p);
- GList *observed = NULL;
+ gboolean observed = FALSE;
const gchar *account_path, *connection_path;
GPtrArray *channels_array, *satisfied_requests;
GHashTable *request_properties;
@@ -2099,7 +2088,7 @@ _mcd_dispatch_operation_run_observers (McdDispatchOperation *self)
if (_mcd_client_match_filters (properties,
_mcd_client_proxy_get_observer_filters (client),
FALSE))
- observed = g_list_prepend (observed, channel);
+ observed = TRUE;
}
if (!observed) continue;
@@ -2110,10 +2099,11 @@ _mcd_dispatch_operation_run_observers (McdDispatchOperation *self)
/* TODO: there's room for optimization here: reuse the channels_array,
* if the observed list is the same */
- channels_array = _mcd_tp_channel_details_build_from_list (observed);
+ channels_array =
+ _mcd_tp_channel_details_build_from_list (self->priv->channels);
- collect_satisfied_requests (observed, &satisfied_requests,
- &request_properties);
+ collect_satisfied_requests (self->priv->channels->data,
+ &satisfied_requests, &request_properties);
/* transfer ownership into observer_info */
tp_asv_take_boxed (observer_info, "request-properties",
@@ -2140,8 +2130,6 @@ _mcd_dispatch_operation_run_observers (McdDispatchOperation *self)
g_ptr_array_unref (satisfied_requests);
_mcd_tp_channel_details_free (channels_array);
-
- g_list_free (observed);
}
g_hash_table_unref (observer_info);
@@ -2341,9 +2329,21 @@ mcd_dispatch_operation_handle_channels (McdDispatchOperation *self)
return;
}
+ /* FIXME: it shouldn't be possible to get here without a channel */
+ if (self->priv->channels != NULL)
+ {
+ g_assert (self->priv->channels->next == NULL);
+
+ collect_satisfied_requests (self->priv->channels->data, NULL,
+ &request_properties);
+ }
+ else
+ {
+ request_properties = g_hash_table_new_full (g_str_hash,
+ g_str_equal, g_free, (GDestroyNotify) g_hash_table_unref);
+ }
+
handler_info = tp_asv_new (NULL, NULL);
- collect_satisfied_requests (self->priv->channels, NULL,
- &request_properties);
tp_asv_take_boxed (handler_info, "request-properties",
TP_HASH_TYPE_OBJECT_IMMUTABLE_PROPERTIES_MAP, request_properties);
request_properties = NULL;