[telepathy-mission-control/master] McdDispatcher: keep clients in a McdClientRegistry, not a GHashTable
Simon McVittie
simon.mcvittie at collabora.co.uk
Mon Oct 19 07:01:04 PDT 2009
---
src/mcd-dispatcher.c | 82 ++++++++++++++++++++++----------------------------
1 files changed, 36 insertions(+), 46 deletions(-)
diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c
index be1b2f0..1ae20b3 100644
--- a/src/mcd-dispatcher.c
+++ b/src/mcd-dispatcher.c
@@ -42,6 +42,7 @@
#include <dbus/dbus-glib-lowlevel.h>
+#include "client-registry.h"
#include "mcd-signals-marshal.h"
#include "mcd-account-priv.h"
#include "mcd-client-priv.h"
@@ -166,7 +167,7 @@ struct _McdDispatcherPrivate
/* hash table containing clients
* char *bus_name -> McdClientProxy */
- GHashTable *clients;
+ McdClientRegistry *clients;
McdHandlerMap *handler_map;
@@ -193,10 +194,6 @@ struct _McdDispatcherPrivate
* property. */
gboolean operation_list_active;
- /* Not really handles as such, but TpHandleRepoIface gives us a convenient
- * reference-counted string pool */
- TpHandleRepoIface *string_pool;
-
gboolean is_disposed;
};
@@ -551,7 +548,7 @@ mcd_dispatcher_guess_request_handler (McdDispatcher *dispatcher,
/* FIXME: return the "most preferred" handler, not just any handler that
* can take it */
- g_hash_table_iter_init (&iter, dispatcher->priv->clients);
+ _mcd_client_registry_init_hash_iter (dispatcher->priv->clients, &iter);
while (g_hash_table_iter_next (&iter, NULL, &client))
{
if (!tp_proxy_has_interface_by_id (client,
@@ -709,7 +706,7 @@ mcd_dispatcher_dup_possible_handlers (McdDispatcher *self,
guint i;
GStrv ret;
- g_hash_table_iter_init (&client_iter, self->priv->clients);
+ _mcd_client_registry_init_hash_iter (self->priv->clients, &client_iter);
while (g_hash_table_iter_next (&client_iter, NULL, &client_p))
{
@@ -887,7 +884,7 @@ mcd_dispatcher_run_handlers (McdDispatcherContext *context)
{
gchar *bus_name = g_strconcat (TP_CLIENT_BUS_NAME_BASE,
approved_handler, NULL);
- McdClientProxy *handler = g_hash_table_lookup (
+ McdClientProxy *handler = _mcd_client_registry_lookup (
self->priv->clients, bus_name);
gboolean failed = _mcd_dispatch_operation_get_handler_failed
(context->operation, bus_name);
@@ -919,8 +916,8 @@ mcd_dispatcher_run_handlers (McdDispatcherContext *context)
for (iter = possible_handlers; iter != NULL && *iter != NULL; iter++)
{
- McdClientProxy *handler = g_hash_table_lookup (self->priv->clients,
- *iter);
+ McdClientProxy *handler = _mcd_client_registry_lookup (
+ self->priv->clients, *iter);
gboolean failed = _mcd_dispatch_operation_get_handler_failed
(context->operation, *iter);
@@ -1060,7 +1057,7 @@ mcd_dispatcher_run_observers (McdDispatcherContext *context)
channels = context->channels;
observer_info = g_hash_table_new (g_str_hash, g_str_equal);
- g_hash_table_iter_init (&iter, priv->clients);
+ _mcd_client_registry_init_hash_iter (priv->clients, &iter);
while (g_hash_table_iter_next (&iter, NULL, &client_p))
{
McdClientProxy *client = MCD_CLIENT_PROXY (client_p);
@@ -1216,7 +1213,7 @@ mcd_dispatcher_run_approvers (McdDispatcherContext *context)
context->approvers_pending = 1;
channels = context->channels;
- g_hash_table_iter_init (&iter, priv->clients);
+ _mcd_client_registry_init_hash_iter (priv->clients, &iter);
while (g_hash_table_iter_next (&iter, NULL, &client_p))
{
McdClientProxy *client = MCD_CLIENT_PROXY (client_p);
@@ -1286,8 +1283,8 @@ handlers_can_bypass_approval (McdDispatcherContext *context)
for (iter = possible_handlers; iter != NULL && *iter != NULL; iter++)
{
- McdClientProxy *handler = g_hash_table_lookup (self->priv->clients,
- *iter);
+ McdClientProxy *handler = _mcd_client_registry_lookup (
+ self->priv->clients, *iter);
/* If the best handler that still exists bypasses approval, then
* we're going to bypass approval.
@@ -1768,8 +1765,6 @@ static void
_mcd_dispatcher_dispose (GObject * object)
{
McdDispatcherPrivate *priv = MCD_DISPATCHER_PRIV (object);
- gpointer client_p;
- GHashTableIter iter;
if (priv->is_disposed)
{
@@ -1783,15 +1778,23 @@ _mcd_dispatcher_dispose (GObject * object)
priv->handler_map = NULL;
}
- g_hash_table_iter_init (&iter, priv->clients);
-
- while (g_hash_table_iter_next (&iter, NULL, &client_p))
+ if (priv->clients != NULL)
{
- mcd_dispatcher_discard_client ((McdDispatcher *) object, client_p);
- g_hash_table_iter_remove (&iter);
+ gpointer client_p;
+ GHashTableIter iter;
+
+ _mcd_client_registry_init_hash_iter (priv->clients, &iter);
+
+ while (g_hash_table_iter_next (&iter, NULL, &client_p))
+ {
+ mcd_dispatcher_discard_client ((McdDispatcher *) object, client_p);
+ g_hash_table_iter_remove (&iter);
+ }
+
+ g_object_unref (priv->clients);
+ priv->clients = NULL;
}
- g_hash_table_destroy (priv->clients);
g_hash_table_destroy (priv->connections);
if (priv->master)
@@ -1806,12 +1809,6 @@ _mcd_dispatcher_dispose (GObject * object)
priv->dbus_daemon = NULL;
}
- if (priv->string_pool != NULL)
- {
- g_object_unref (priv->string_pool);
- priv->string_pool = NULL;
- }
-
G_OBJECT_CLASS (mcd_dispatcher_parent_class)->dispose (object);
}
@@ -1932,7 +1929,7 @@ mcd_dispatcher_add_client (McdDispatcher *self,
return;
}
- client = g_hash_table_lookup (priv->clients, name);
+ client = _mcd_client_registry_lookup (priv->clients, name);
if (client)
{
@@ -1958,12 +1955,9 @@ mcd_dispatcher_add_client (McdDispatcher *self,
if (!self->priv->startup_completed)
self->priv->startup_lock++;
- client = _mcd_client_proxy_new (
- self->priv->dbus_daemon, self->priv->string_pool,
+ client = _mcd_client_registry_add_new (self->priv->clients,
name, owner, activatable);
- g_hash_table_insert (priv->clients, g_strdup (name), client);
-
g_signal_connect (client, "ready",
G_CALLBACK (mcd_dispatcher_client_ready_cb),
self);
@@ -2093,7 +2087,7 @@ name_owner_changed_cb (TpDBusDaemon *proxy,
* or unique */
McdClientProxy *client;
- client = g_hash_table_lookup (priv->clients, name);
+ client = _mcd_client_registry_lookup (priv->clients, name);
if (client)
{
@@ -2108,7 +2102,7 @@ name_owner_changed_cb (TpDBusDaemon *proxy,
mcd_dispatcher_update_client_caps (self, client);
mcd_dispatcher_discard_client (self, client);
- g_hash_table_remove (priv->clients, name);
+ _mcd_client_registry_remove (priv->clients, name);
}
}
@@ -2141,6 +2135,8 @@ mcd_dispatcher_constructed (GObject *object)
McdDispatcherPrivate *priv = MCD_DISPATCHER_PRIV (object);
GError *error = NULL;
+ priv->clients = _mcd_client_registry_new (priv->dbus_daemon);
+
DEBUG ("Starting to look for clients");
priv->startup_completed = FALSE;
priv->startup_lock = 1; /* the ListNames call we're about to make */
@@ -2318,16 +2314,9 @@ mcd_dispatcher_init (McdDispatcher * dispatcher)
priv->operation_list_active = FALSE;
- priv->clients = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
- g_object_unref);
-
priv->handler_map = _mcd_handler_map_new ();
priv->connections = g_hash_table_new (NULL, NULL);
-
- /* Dummy handle type, we're just using this as a string pool */
- priv->string_pool = tp_dynamic_handle_repo_new (TP_HANDLE_TYPE_CONTACT,
- NULL, NULL);
}
McdDispatcher *
@@ -2671,7 +2660,7 @@ _mcd_dispatcher_get_channel_capabilities (McdDispatcher *dispatcher)
channel_handler_caps = g_ptr_array_new ();
/* Add the capabilities from the new-style clients */
- g_hash_table_iter_init (&iter, priv->clients);
+ _mcd_client_registry_init_hash_iter (priv->clients, &iter);
while (g_hash_table_iter_next (&iter, &key, &value))
{
McdClientProxy *client = value;
@@ -2709,7 +2698,7 @@ _mcd_dispatcher_get_channel_enhanced_capabilities (McdDispatcher *dispatcher)
gpointer key, value;
GPtrArray *caps = g_ptr_array_new ();
- g_hash_table_iter_init (&iter, priv->clients);
+ _mcd_client_registry_init_hash_iter (priv->clients, &iter);
while (g_hash_table_iter_next (&iter, &key, &value))
{
McdClientProxy *client = value;
@@ -3334,14 +3323,15 @@ _mcd_dispatcher_dup_client_caps (McdDispatcher *self)
g_return_val_if_fail (MCD_IS_DISPATCHER (self), NULL);
- vas = g_ptr_array_sized_new (g_hash_table_size (self->priv->clients));
+ vas = g_ptr_array_sized_new (
+ _mcd_client_registry_size (self->priv->clients));
if (!self->priv->startup_completed)
{
return NULL;
}
- g_hash_table_iter_init (&iter, self->priv->clients);
+ _mcd_client_registry_init_hash_iter (self->priv->clients, &iter);
while (g_hash_table_iter_next (&iter, NULL, &p))
{
--
1.5.6.5
More information about the telepathy-commits
mailing list