From 82c65bf328a43be2906c6a3feb6870dd352c15b3 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 29 Jan 2009 09:31:00 -0600 Subject: Okay, moving all of the variables from the listener class into a private object. This is to make the GObject introspection not need dbus, and thus we can reduce our build deps significantly. --- libindicate/listener.c | 101 +++++++++++++++++++++++++++++++------------------ libindicate/listener.h | 12 ------ 2 files changed, 65 insertions(+), 48 deletions(-) diff --git a/libindicate/listener.c b/libindicate/listener.c index ee4d543..ef0b79d 100644 --- a/libindicate/listener.c +++ b/libindicate/listener.c @@ -21,6 +21,25 @@ enum { static guint signals[LAST_SIGNAL] = { 0 }; +typedef struct _IndicateListenerPrivate IndicateListenerPrivate; +struct _IndicateListenerPrivate +{ + DBusGConnection * session_bus; + DBusGConnection * system_bus; + + DBusGProxy * dbus_proxy_session; + DBusGProxy * dbus_proxy_system; + + GHashTable * proxies_working; + GHashTable * proxies_possible; + + GArray * proxy_todo; + guint todo_idle; +}; + +#define INDICATE_LISTENER_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATE_TYPE_LISTENER, IndicateListenerPrivate)) + typedef struct { DBusGProxy * proxy; gchar * name; @@ -57,6 +76,8 @@ indicate_listener_class_init (IndicateListenerClass * class) GObjectClass * gobj; gobj = G_OBJECT_CLASS(class); + g_type_class_add_private (class, sizeof (IndicateListenerPrivate)); + gobj->finalize = indicate_listener_finalize; signals[INDICATOR_ADDED] = g_signal_new(INDICATE_LISTENER_SIGNAL_INDICATOR_ADDED, @@ -108,17 +129,18 @@ static void indicate_listener_init (IndicateListener * listener) { /* g_debug("Listener Object Initialized"); */ + IndicateListenerPrivate * priv = INDICATE_LISTENER_GET_PRIVATE(listener); GError *error = NULL; /* Get the buses */ - listener->session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + priv->session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); if (error != NULL) { g_error("Unable to get session bus: %s", error->message); g_error_free(error); return; } - listener->system_bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); + priv->system_bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); if (error != NULL) { g_error("Unable to get system bus: %s", error->message); g_error_free(error); @@ -126,7 +148,7 @@ indicate_listener_init (IndicateListener * listener) } /* Set up the DBUS service proxies */ - listener->dbus_proxy_session = dbus_g_proxy_new_for_name_owner (listener->session_bus, + priv->dbus_proxy_session = dbus_g_proxy_new_for_name_owner (priv->session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, @@ -137,7 +159,7 @@ indicate_listener_init (IndicateListener * listener) return; } - listener->dbus_proxy_system = dbus_g_proxy_new_for_name_owner (listener->system_bus, + priv->dbus_proxy_system = dbus_g_proxy_new_for_name_owner (priv->system_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, @@ -149,32 +171,32 @@ indicate_listener_init (IndicateListener * listener) } /* Set up name change signals */ - dbus_g_proxy_add_signal(listener->dbus_proxy_session, "NameOwnerChanged", + dbus_g_proxy_add_signal(priv->dbus_proxy_session, "NameOwnerChanged", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(listener->dbus_proxy_session, "NameOwnerChanged", + dbus_g_proxy_connect_signal(priv->dbus_proxy_session, "NameOwnerChanged", G_CALLBACK(dbus_owner_change), listener, NULL); - dbus_g_proxy_add_signal(listener->dbus_proxy_system, "NameOwnerChanged", + dbus_g_proxy_add_signal(priv->dbus_proxy_system, "NameOwnerChanged", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); - dbus_g_proxy_connect_signal(listener->dbus_proxy_system, "NameOwnerChanged", + dbus_g_proxy_connect_signal(priv->dbus_proxy_system, "NameOwnerChanged", G_CALLBACK(dbus_owner_change), listener, NULL); /* Initialize Data structures */ - listener->proxies_working = g_hash_table_new(g_str_hash, g_str_equal); - listener->proxies_possible = g_hash_table_new(g_str_hash, g_str_equal); + priv->proxies_working = g_hash_table_new(g_str_hash, g_str_equal); + priv->proxies_possible = g_hash_table_new(g_str_hash, g_str_equal); /* TODO: Look at some common scenarios and find out how to make this sized */ - listener->proxy_todo = g_array_new(FALSE, TRUE, sizeof(proxy_todo_t)); - listener->todo_idle = 0; + priv->proxy_todo = g_array_new(FALSE, TRUE, sizeof(proxy_todo_t)); + priv->todo_idle = 0; /* WARNING */ /* Starting massive asynchronisity */ /* */ /* Build todo list */ - org_freedesktop_DBus_list_names_async (listener->dbus_proxy_session, build_todo_list_cb, listener); - org_freedesktop_DBus_list_names_async (listener->dbus_proxy_system, build_todo_list_cb, listener); + org_freedesktop_DBus_list_names_async (priv->dbus_proxy_session, build_todo_list_cb, listener); + org_freedesktop_DBus_list_names_async (priv->dbus_proxy_system, build_todo_list_cb, listener); return; } @@ -198,13 +220,15 @@ indicate_listener_new (void) static void dbus_owner_change (DBusGProxy * proxy, const gchar * name, const gchar * prev, const gchar * new, IndicateListener * listener) { + IndicateListenerPrivate * priv = INDICATE_LISTENER_GET_PRIVATE(listener); + DBusGConnection * bus; gchar * bus_name; - if (proxy == listener->dbus_proxy_system) { - bus = listener->system_bus; + if (proxy == priv->dbus_proxy_system) { + bus = priv->system_bus; bus_name = "system"; } else { - bus = listener->session_bus; + bus = priv->session_bus; bus_name = "session"; } @@ -215,14 +239,14 @@ dbus_owner_change (DBusGProxy * proxy, const gchar * name, const gchar * prev, c } if (new != NULL && new[0] == '\0') { proxy_t * proxyt; - proxyt = g_hash_table_lookup(listener->proxies_working, name); + proxyt = g_hash_table_lookup(priv->proxies_working, name); if (proxyt != NULL) { - g_hash_table_remove(listener->proxies_working, name); + g_hash_table_remove(priv->proxies_working, name); proxy_struct_destroy(proxyt); } - proxyt = g_hash_table_lookup(listener->proxies_possible, name); + proxyt = g_hash_table_lookup(priv->proxies_possible, name); if (proxyt != NULL) { - g_hash_table_remove(listener->proxies_possible, name); + g_hash_table_remove(priv->proxies_possible, name); proxy_struct_destroy(proxyt); } } @@ -296,13 +320,15 @@ todo_list_add (const gchar * name, DBusGProxy * proxy, IndicateListener * listen return; } + IndicateListenerPrivate * priv = INDICATE_LISTENER_GET_PRIVATE(listener); + DBusGConnection * bus; gchar * bus_name; - if (proxy == listener->dbus_proxy_system) { - bus = listener->system_bus; + if (proxy == priv->dbus_proxy_system) { + bus = priv->system_bus; bus_name = "system"; } else { - bus = listener->session_bus; + bus = priv->session_bus; bus_name = "session"; } /* g_debug ("Adding on %s bus: %s", bus_name, name); */ @@ -311,10 +337,10 @@ todo_list_add (const gchar * name, DBusGProxy * proxy, IndicateListener * listen todo.name = g_strdup(name); todo.bus = bus; - g_array_append_val(listener->proxy_todo, todo); + g_array_append_val(priv->proxy_todo, todo); - if (listener->todo_idle == 0) { - listener->todo_idle = g_idle_add(todo_idle, listener); + if (priv->todo_idle == 0) { + priv->todo_idle = g_idle_add(todo_idle, listener); } return; @@ -326,19 +352,20 @@ todo_idle (gpointer data) IndicateListener * listener = INDICATE_LISTENER(data); if (listener == NULL) { g_error("Listener got lost in todo_idle"); - listener->todo_idle = 0; return FALSE; } - if (listener->proxy_todo->len == 0) { + IndicateListenerPrivate * priv = INDICATE_LISTENER_GET_PRIVATE(listener); + + if (priv->proxy_todo->len == 0) { /* Basically if we have no todo, we need to stop running. This * is done this way to make the function error handling simpler * and results in an extra run */ - listener->todo_idle = 0; + priv->todo_idle = 0; return FALSE; } - proxy_todo_t * todo = &g_array_index(listener->proxy_todo, proxy_todo_t, listener->proxy_todo->len - 1); + proxy_todo_t * todo = &g_array_index(priv->proxy_todo, proxy_todo_t, priv->proxy_todo->len - 1); proxy_t * proxyt = g_new(proxy_t, 1); proxyt->name = todo->name; @@ -349,7 +376,7 @@ todo_idle (gpointer data) proxyt->listener = listener; proxyt->indicators = NULL; - listener->proxy_todo = g_array_remove_index(listener->proxy_todo, listener->proxy_todo->len - 1); + priv->proxy_todo = g_array_remove_index(priv->proxy_todo, priv->proxy_todo->len - 1); if (proxyt->proxy == NULL) { g_warning("Unable to create proxy for %s", proxyt->name); @@ -363,7 +390,7 @@ todo_idle (gpointer data) org_freedesktop_indicator_get_indicator_list_async(proxyt->proxy, proxy_get_indicator_list, proxyt); - g_hash_table_insert(listener->proxies_possible, proxyt->name, proxyt); + g_hash_table_insert(priv->proxies_possible, proxyt->name, proxyt); return TRUE; } @@ -420,8 +447,9 @@ proxy_indicator_added (DBusGProxy * proxy, guint id, const gchar * type, proxy_t proxyt->indicators = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, proxy_indicators_free); /* Elevate to working */ - g_hash_table_remove(proxyt->listener->proxies_possible, proxyt->name); - g_hash_table_insert(proxyt->listener->proxies_working, proxyt->name, proxyt); + IndicateListenerPrivate * priv = INDICATE_LISTENER_GET_PRIVATE(proxyt->listener); + g_hash_table_remove(priv->proxies_possible, proxyt->name); + g_hash_table_insert(priv->proxies_working, proxyt->name, proxyt); dbus_g_proxy_add_signal(proxyt->proxy, "IndicatorRemoved", G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INVALID); @@ -546,8 +574,9 @@ void indicate_listener_get_property (IndicateListener * listener, IndicateListenerServer * server, IndicateListenerIndicator * indicator, gchar * property, indicate_listener_get_property_cb callback, gpointer data) { /* TODO: Do we need to somehow refcount the server/indicator while we're waiting on this? */ + IndicateListenerPrivate * priv = INDICATE_LISTENER_GET_PRIVATE(listener); - proxy_t * proxyt = g_hash_table_lookup(listener->proxies_working, server); + proxy_t * proxyt = g_hash_table_lookup(priv->proxies_working, server); if (proxyt == NULL) { g_error("Trying to get property '%s' on server '%s' that currently isn't set to working.", property, (gchar *)server); return; diff --git a/libindicate/listener.h b/libindicate/listener.h index cadc487..1bc5f8d 100644 --- a/libindicate/listener.h +++ b/libindicate/listener.h @@ -35,18 +35,6 @@ typedef guint IndicateListenerIndicator; typedef struct _IndicateListener IndicateListener; struct _IndicateListener { GObject parent; - - DBusGConnection * session_bus; - DBusGConnection * system_bus; - - DBusGProxy * dbus_proxy_session; - DBusGProxy * dbus_proxy_system; - - GHashTable * proxies_working; - GHashTable * proxies_possible; - - GArray * proxy_todo; - guint todo_idle; }; typedef struct _IndicateListenerClass IndicateListenerClass; -- cgit v1.2.3