From 8a1912e7b9f8a7a0351ef252359ae04ff9fc4402 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 1 Dec 2009 09:58:05 -0600 Subject: Add an unwatch function with a basic handler. --- libindicator/indicator-service.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'libindicator/indicator-service.c') diff --git a/libindicator/indicator-service.c b/libindicator/indicator-service.c index 69422c5..dda00a9 100644 --- a/libindicator/indicator-service.c +++ b/libindicator/indicator-service.c @@ -8,6 +8,7 @@ /* DBus Prototypes */ static gboolean _indicator_service_server_watch (IndicatorService * service, DBusGMethodInvocation * method); +static gboolean _indicator_service_server_un_watch (IndicatorService * service, DBusGMethodInvocation * method); #include "indicator-service-server.h" #include "dbus-shared.h" @@ -309,6 +310,31 @@ _indicator_service_server_watch (IndicatorService * service, DBusGMethodInvocati return TRUE; } +static gboolean +_indicator_service_server_un_watch (IndicatorService * service, DBusGMethodInvocation * method) +{ + g_return_val_if_fail(INDICATOR_IS_SERVICE(service), FALSE); + IndicatorServicePrivate * priv = INDICATOR_SERVICE_GET_PRIVATE(service); + + /* Remove us from the watcher list here */ + + + /* If we're out of watchers set the timeout for shutdown */ + if (priv->watchers == NULL) { + if (priv->timeout != 0) { + /* This should never really happen, but let's ensure that + bad things don't happen if it does. */ + g_warning("No watchers timeout set twice. Resolving, but odd."); + g_source_remove(priv->timeout); + priv->timeout = 0; + } + priv->timeout = g_timeout_add(500, timeout_no_watchers, service); + } + + dbus_g_method_return(method); + return TRUE; +} + /* API */ /** -- cgit v1.2.3 From c0e2510ba29adc62b7816995031d46f8655d208a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 1 Dec 2009 10:11:50 -0600 Subject: Finding the watcher and removing him from the list. --- libindicator/indicator-service.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'libindicator/indicator-service.c') diff --git a/libindicator/indicator-service.c b/libindicator/indicator-service.c index dda00a9..c6ef077 100644 --- a/libindicator/indicator-service.c +++ b/libindicator/indicator-service.c @@ -310,6 +310,12 @@ _indicator_service_server_watch (IndicatorService * service, DBusGMethodInvocati return TRUE; } +static gint +find_watcher (gconstpointer a, gconstpointer b) +{ + return g_strcmp0((const gchar *)a, (const gchar *)b); +} + static gboolean _indicator_service_server_un_watch (IndicatorService * service, DBusGMethodInvocation * method) { @@ -317,7 +323,16 @@ _indicator_service_server_un_watch (IndicatorService * service, DBusGMethodInvoc IndicatorServicePrivate * priv = INDICATOR_SERVICE_GET_PRIVATE(service); /* Remove us from the watcher list here */ - + GList * watcher_item = g_list_find_custom(priv->watchers, dbus_g_method_get_sender(method), find_watcher); + if (watcher_item != NULL) { + /* Free the watcher */ + gchar * name = watcher_item->data; + priv->watchers = g_list_remove(priv->watchers, name); + g_free(name); + } else { + /* Odd that we couldn't find the person, but, eh */ + g_warning("Unable to find watcher who is unwatching: %s", dbus_g_method_get_sender(method)); + } /* If we're out of watchers set the timeout for shutdown */ if (priv->watchers == NULL) { @@ -328,6 +343,7 @@ _indicator_service_server_un_watch (IndicatorService * service, DBusGMethodInvoc g_source_remove(priv->timeout); priv->timeout = 0; } + /* If we don't get a new watcher quickly, we'll shutdown. */ priv->timeout = g_timeout_add(500, timeout_no_watchers, service); } -- cgit v1.2.3 From 67aef7b9c7d1044c60801a2b021bf1f7234feb18 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 1 Dec 2009 10:12:51 -0600 Subject: Using the define for the version on both sides --- libindicator/indicator-service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libindicator/indicator-service.c') diff --git a/libindicator/indicator-service.c b/libindicator/indicator-service.c index c6ef077..5fb939d 100644 --- a/libindicator/indicator-service.c +++ b/libindicator/indicator-service.c @@ -306,7 +306,7 @@ _indicator_service_server_watch (IndicatorService * service, DBusGMethodInvocati priv->timeout = 0; } - dbus_g_method_return(method, 1); + dbus_g_method_return(method, INDICATOR_SERVICE_VERSION); return TRUE; } -- cgit v1.2.3