From 68fd1cce05e05d738a82646b1c239f5a57a3fb76 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 2 Dec 2010 15:57:09 -0600 Subject: Dropping the library tests --- tests/Makefile.am | 188 +-------------- tests/test-defines.h | 30 --- tests/test-libappindicator-dbus-client.c | 292 ----------------------- tests/test-libappindicator-dbus-server.c | 66 ------ tests/test-libappindicator-fallback-item.c | 153 ------------ tests/test-libappindicator-fallback-watcher.c | 117 ---------- tests/test-libappindicator-status-client.c | 153 ------------ tests/test-libappindicator-status-server.c | 82 ------- tests/test-libappindicator.c | 320 -------------------------- tests/test-simple-app.c | 54 ----- 10 files changed, 3 insertions(+), 1452 deletions(-) delete mode 100644 tests/test-defines.h delete mode 100644 tests/test-libappindicator-dbus-client.c delete mode 100644 tests/test-libappindicator-dbus-server.c delete mode 100644 tests/test-libappindicator-fallback-item.c delete mode 100644 tests/test-libappindicator-fallback-watcher.c delete mode 100644 tests/test-libappindicator-status-client.c delete mode 100644 tests/test-libappindicator-status-server.c delete mode 100644 tests/test-libappindicator.c delete mode 100644 tests/test-simple-app.c (limited to 'tests') diff --git a/tests/Makefile.am b/tests/Makefile.am index f2bdbb2..c012b96 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,104 +1,12 @@ check_PROGRAMS = \ - test-approver \ - test-libappindicator \ - test-libappindicator-dbus-client \ - test-libappindicator-dbus-server \ - test-libappindicator-status-client \ - test-libappindicator-status-server \ - test-libappindicator-fallback-watcher \ - test-libappindicator-fallback-item \ - test-simple-app + test-approver TESTS = DISTCLEANFILES = $(TESTS) EXTRA_DIST = run-xvfb.sh -######################################### -## test-libappindicator -######################################### - -test_libappindicator_SOURCES = \ - test-libappindicator.c - -test_libappindicator_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -Wall -Werror \ - -I$(top_srcdir)/src - -test_libappindicator_LDADD = \ - $(INDICATOR_LIBS) \ - $(top_builddir)/src/libappindicator.la - -######################################### -## test-libappindicator-dbus-client -######################################### - -test_libappindicator_dbus_client_SOURCES = \ - test-defines.h \ - test-libappindicator-dbus-client.c - -test_libappindicator_dbus_client_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -Wall -Werror \ - -I$(top_srcdir)/src - -test_libappindicator_dbus_client_LDADD = \ - $(INDICATOR_LIBS) \ - $(top_builddir)/src/libappindicator.la - -######################################### -## test-libappindicator-dbus-server -######################################### - -test_libappindicator_dbus_server_SOURCES = \ - test-defines.h \ - test-libappindicator-dbus-server.c - -test_libappindicator_dbus_server_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -Wall -Werror \ - -I$(top_srcdir)/src - -test_libappindicator_dbus_server_LDADD = \ - $(INDICATOR_LIBS) \ - $(top_builddir)/src/libappindicator.la - -######################################### -## test-libappindicator-status-client -######################################### - -test_libappindicator_status_client_SOURCES = \ - test-defines.h \ - test-libappindicator-status-client.c - -test_libappindicator_status_client_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -Wall -Werror \ - -I$(top_srcdir)/src - -test_libappindicator_status_client_LDADD = \ - $(INDICATOR_LIBS) \ - $(top_builddir)/src/libappindicator.la - -######################################### -## test-libappindicator-status-server -######################################### - -test_libappindicator_status_server_SOURCES = \ - test-defines.h \ - test-libappindicator-status-server.c - -test_libappindicator_status_server_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -Wall -Werror \ - -I$(top_srcdir)/src - -test_libappindicator_status_server_LDADD = \ - $(INDICATOR_LIBS) \ - $(top_builddir)/src/libappindicator.la - ######################################### ## test-approver ######################################### @@ -108,12 +16,14 @@ test_approver_SOURCES = \ test_approver_CFLAGS = \ $(INDICATOR_CFLAGS) \ + $(TEST_CFLAGS) \ -Wall -Werror \ -I$(top_srcdir)/src \ -I$(top_builddir)/src test_approver_LDADD = \ $(INDICATOR_LIBS) \ + $(TEST_LIBS) \ $(top_builddir)/src/libappindicator.la test-approver-tester: test-approver Makefile.am @@ -126,95 +36,3 @@ test-approver-tester: test-approver Makefile.am TESTS += test-approver-tester -######################################### -## test-libappindicator-fallback -######################################### - -test_libappindicator_fallback_watcher_SOURCES = \ - test-libappindicator-fallback-watcher.c - -test_libappindicator_fallback_watcher_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -Wall -Werror \ - -I$(top_srcdir)/src - -test_libappindicator_fallback_watcher_LDADD = \ - $(INDICATOR_LIBS) \ - $(top_builddir)/src/libappindicator.la - -test_libappindicator_fallback_item_SOURCES = \ - test-libappindicator-fallback-item.c - -test_libappindicator_fallback_item_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -Wall -Werror \ - -I$(top_srcdir)/src - -test_libappindicator_fallback_item_LDADD = \ - $(INDICATOR_LIBS) \ - $(top_builddir)/src/libappindicator.la - -test-libappindicator-fallback: test-libappindicator-fallback-watcher test-libappindicator-fallback-item Makefile.am - @echo "#!/bin/bash" > $@ - @echo . $(srcdir)/run-xvfb.sh >> $@ - @echo $(DBUS_RUNNER) --task ./test-libappindicator-fallback-watcher --task-name Watcher --ignore-return --task ./test-libappindicator-fallback-item --task-name Item >> $@ - @chmod +x $@ - -TESTS += test-libappindicator-fallback - -######################################### -## Actual tests -######################################### - -XML_REPORT = libappindicator-check-results.xml -HTML_REPORT = libappindicator-check-results.html - -libappindicator-tests: libappindicator-tests-gtester Makefile.am - @echo "#!/bin/bash" > $@ - @echo . $(srcdir)/run-xvfb.sh >> $@ - @echo $(DBUS_RUNNER) --task ./libappindicator-tests-gtester >> $@ - @chmod +x $@ - -libappindicator-tests-gtester: test-libappindicator Makefile.am - @echo "#!/bin/sh" > $@ - @echo gtester -k --verbose -o=$(XML_REPORT) ./test-libappindicator >> $@ - @chmod +x $@ - -TESTS += libappindicator-tests -DISTCLEANFILES += $(XML_REPORT) $(HTML_REPORT) libappindicator-tests-gtester - - -DBUS_RUNNER=dbus-test-runner --dbus-config /usr/share/dbus-test-runner/session.conf - -test-libappindicator-dbus: test-libappindicator-dbus-client test-libappindicator-dbus-server Makefile.am - @echo "#!/bin/bash" > test-libappindicator-dbus - @echo . $(srcdir)/run-xvfb.sh >> $@ - @echo $(DBUS_RUNNER) --task ./test-libappindicator-dbus-client --task-name Client --task ./test-libappindicator-dbus-server --task-name Server --ignore-return >> test-libappindicator-dbus - @chmod +x test-libappindicator-dbus - -TESTS += test-libappindicator-dbus - -test-libappindicator-status: test-libappindicator-status-client test-libappindicator-status-server Makefile.am - @echo "#!/bin/bash" > test-libappindicator-status - @echo . $(srcdir)/run-xvfb.sh >> $@ - @echo $(DBUS_RUNNER) --task ./test-libappindicator-status-client --task-name Client --task ./test-libappindicator-status-server --task-name Server --ignore-return >> test-libappindicator-status - @chmod +x test-libappindicator-status - -TESTS += test-libappindicator-status - -######################################### -## test-simple-app -######################################### - -test_simple_app_SOURCES = \ - test-simple-app.c - -test_simple_app_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -Wall -Werror \ - -I$(top_srcdir)/src - -test_simple_app_LDADD = \ - $(INDICATOR_LIBS) \ - $(top_builddir)/src/libappindicator.la - diff --git a/tests/test-defines.h b/tests/test-defines.h deleted file mode 100644 index 2baf728..0000000 --- a/tests/test-defines.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -Testing defines to be shared between various tests. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see . -*/ - -#define TEST_ID "my-id" -#define TEST_ICON_NAME "my-icon-name" -#define TEST_ATTENTION_ICON_NAME "my-attention-icon-name" -#define TEST_STATE APP_INDICATOR_STATUS_ACTIVE -#define TEST_STATE_S "Active" -#define TEST_CATEGORY APP_INDICATOR_CATEGORY_APPLICATION_STATUS -#define TEST_CATEGORY_S "ApplicationStatus" -#define TEST_OBJECT "/an/object/path/to/use" - diff --git a/tests/test-libappindicator-dbus-client.c b/tests/test-libappindicator-dbus-client.c deleted file mode 100644 index 1500213..0000000 --- a/tests/test-libappindicator-dbus-client.c +++ /dev/null @@ -1,292 +0,0 @@ -/* -Tests for the libappindicator library that are over DBus. This is -the client side of those tests. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see . -*/ - - -#include -#include -#include -#include -#include -#include "test-defines.h" - -#include "../src/dbus-shared.h" - -static GMainLoop * mainloop = NULL; -static gboolean passed = TRUE; -static int propcount = 0; - -static void -check_propcount (void) -{ - if (propcount >= 5) { - g_main_loop_quit(mainloop); - } - return; -} - - -static void -prop_id_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting ID failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_ID, g_value_get_string(&value))) { - g_debug("Property ID Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property ID Returned: PASSED"); - } - - check_propcount(); - return; -} - -static void -prop_category_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting category failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_CATEGORY_S, g_value_get_string(&value))) { - g_debug("Property category Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property category Returned: PASSED"); - } - - check_propcount(); - return; -} - -static void -prop_status_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting status failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_STATE_S, g_value_get_string(&value))) { - g_debug("Property status Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property status Returned: PASSED"); - } - - check_propcount(); - return; -} - -static void -prop_icon_name_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting icon name failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_ICON_NAME, g_value_get_string(&value))) { - g_debug("Property icon name Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property icon name Returned: PASSED"); - } - - check_propcount(); - return; -} - -static void -prop_attention_icon_name_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data) -{ - propcount++; - - GError * error = NULL; - GValue value = {0}; - - if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) { - g_warning("Getting attention icon name failed: %s", error->message); - g_error_free(error); - passed = FALSE; - check_propcount(); - return; - } - - if (g_strcmp0(TEST_ATTENTION_ICON_NAME, g_value_get_string(&value))) { - g_debug("Property attention icon name Returned: FAILED"); - passed = FALSE; - } else { - g_debug("Property attention icon name Returned: PASSED"); - } - - check_propcount(); - return; -} - -gboolean -kill_func (gpointer userdata) -{ - g_main_loop_quit(mainloop); - g_warning("Forced to Kill"); - passed = FALSE; - return FALSE; -} - -static DBusHandlerResult -dbus_filter (DBusConnection * connection, DBusMessage * message, void * user_data) -{ - if (dbus_message_is_method_call(message, NOTIFICATION_WATCHER_DBUS_ADDR, "RegisterStatusNotifierItem")) { - DBusMessage * reply = dbus_message_new_method_return(message); - dbus_connection_send(connection, reply, NULL); - dbus_message_unref(reply); - return DBUS_HANDLER_RESULT_HANDLED; - } - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -gint -main (gint argc, gchar * argv[]) -{ - g_type_init(); - - g_usleep(500000); - - GError * error = NULL; - DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); - if (error != NULL) { - g_error("Unable to get session bus: %s", error->message); - return 1; - } - - DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); - guint nameret = 0; - - if (!org_freedesktop_DBus_request_name(bus_proxy, NOTIFICATION_WATCHER_DBUS_ADDR, 0, &nameret, &error)) { - g_error("Unable to call to request name"); - return 1; - } - - if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { - g_error("Unable to get name"); - return 1; - } - - dbus_connection_add_filter(dbus_g_connection_get_connection(session_bus), dbus_filter, NULL, NULL); - - DBusGProxy * props = dbus_g_proxy_new_for_name_owner(session_bus, - ":1.0", - "/org/ayatana/NotificationItem/my_id", - DBUS_INTERFACE_PROPERTIES, - &error); - if (error != NULL) { - g_error("Unable to get property proxy: %s", error->message); - return 1; - } - - dbus_g_proxy_begin_call (props, - "Get", - prop_id_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", - G_TYPE_STRING, "Id", - G_TYPE_INVALID); - dbus_g_proxy_begin_call (props, - "Get", - prop_category_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", - G_TYPE_STRING, "Category", - G_TYPE_INVALID); - dbus_g_proxy_begin_call (props, - "Get", - prop_status_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", - G_TYPE_STRING, "Status", - G_TYPE_INVALID); - dbus_g_proxy_begin_call (props, - "Get", - prop_icon_name_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", - G_TYPE_STRING, "IconName", - G_TYPE_INVALID); - dbus_g_proxy_begin_call (props, - "Get", - prop_attention_icon_name_cb, - NULL, NULL, - G_TYPE_STRING, "org.ayatana.indicator.application.NotificationItem", - G_TYPE_STRING, "AttentionIconName", - G_TYPE_INVALID); - - g_timeout_add_seconds(2, kill_func, NULL); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - if (passed) { - g_debug("Quiting"); - return 0; - } else { - g_debug("Quiting as we're a failure"); - return 1; - } - return 0; -} diff --git a/tests/test-libappindicator-dbus-server.c b/tests/test-libappindicator-dbus-server.c deleted file mode 100644 index 995d49b..0000000 --- a/tests/test-libappindicator-dbus-server.c +++ /dev/null @@ -1,66 +0,0 @@ -/* -Tests for the libappindicator library that are over DBus. This is -the server side of those tests. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see . -*/ - - -#include -#include -#include -#include -#include "test-defines.h" - -static GMainLoop * mainloop = NULL; - -gboolean -kill_func (gpointer userdata) -{ - g_main_loop_quit(mainloop); - return FALSE; -} - -gint -main (gint argc, gchar * argv[]) -{ - gtk_init(&argc, &argv); - - g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL)))); - - AppIndicator * ci = app_indicator_new (TEST_ID, TEST_ICON_NAME, TEST_CATEGORY); - - app_indicator_set_status (ci, TEST_STATE); - app_indicator_set_attention_icon (ci, TEST_ATTENTION_ICON_NAME); - - GtkMenu * menu = GTK_MENU(gtk_menu_new()); - GtkMenuItem * item = GTK_MENU_ITEM(gtk_menu_item_new_with_label("Label")); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(item)); - - app_indicator_set_menu(ci, menu); - - g_timeout_add_seconds(2, kill_func, NULL); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - g_object_unref(G_OBJECT(ci)); - g_debug("Quiting"); - - return 0; -} diff --git a/tests/test-libappindicator-fallback-item.c b/tests/test-libappindicator-fallback-item.c deleted file mode 100644 index 418b779..0000000 --- a/tests/test-libappindicator-fallback-item.c +++ /dev/null @@ -1,153 +0,0 @@ -#include -#include -#include -#include -#include - -#define TEST_LIBAPPINDICATOR_FALLBACK_ITEM_TYPE (test_libappindicator_fallback_item_get_type ()) -#define TEST_LIBAPPINDICATOR_FALLBACK_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_LIBAPPINDICATOR_FALLBACK_ITEM_TYPE, TestLibappindicatorFallbackItem)) -#define TEST_LIBAPPINDICATOR_FALLBACK_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_LIBAPPINDICATOR_FALLBACK_ITEM_TYPE, TestLibappindicatorFallbackItemClass)) -#define IS_TEST_LIBAPPINDICATOR_FALLBACK_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_LIBAPPINDICATOR_FALLBACK_ITEM_TYPE)) -#define IS_TEST_LIBAPPINDICATOR_FALLBACK_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_LIBAPPINDICATOR_FALLBACK_ITEM_TYPE)) -#define TEST_LIBAPPINDICATOR_FALLBACK_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_LIBAPPINDICATOR_FALLBACK_ITEM_TYPE, TestLibappindicatorFallbackItemClass)) - -typedef struct _TestLibappindicatorFallbackItem TestLibappindicatorFallbackItem; -typedef struct _TestLibappindicatorFallbackItemClass TestLibappindicatorFallbackItemClass; - -struct _TestLibappindicatorFallbackItemClass { - AppIndicatorClass parent_class; - -}; - -struct _TestLibappindicatorFallbackItem { - AppIndicator parent; - -}; - -GType test_libappindicator_fallback_item_get_type (void); - -#define TEST_LIBAPPINDICATOR_FALLBACK_ITEM_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), TEST_LIBAPPINDICATOR_FALLBACK_ITEM_TYPE, TestLibappindicatorFallbackItemPrivate)) - -static void test_libappindicator_fallback_item_class_init (TestLibappindicatorFallbackItemClass *klass); -static void test_libappindicator_fallback_item_init (TestLibappindicatorFallbackItem *self); -static GtkStatusIcon * fallback (AppIndicator * indicator); -static void unfallback (AppIndicator * indicator, GtkStatusIcon * status_icon); - -G_DEFINE_TYPE (TestLibappindicatorFallbackItem, test_libappindicator_fallback_item, APP_INDICATOR_TYPE); - -static void -test_libappindicator_fallback_item_class_init (TestLibappindicatorFallbackItemClass *klass) -{ - AppIndicatorClass * aiclass = APP_INDICATOR_CLASS(klass); - - aiclass->fallback = fallback; - aiclass->unfallback = unfallback; -} - -static void -test_libappindicator_fallback_item_init (TestLibappindicatorFallbackItem *self) -{ -} - -GMainLoop * mainloop = NULL; -gboolean passed = FALSE; - -enum { - STATE_INIT, - STATE_FALLBACK, - STATE_UNFALLBACK, - STATE_REFALLBACK, - STATE_REUNFALLBACK -}; - -gint state = STATE_INIT; - -static GtkStatusIcon * -fallback (AppIndicator * indicator) -{ - g_debug("Fallback"); - if (state == STATE_INIT) { - state = STATE_FALLBACK; - } else if (state == STATE_UNFALLBACK) { - state = STATE_REFALLBACK; - } else { - g_debug("Error, fallback in state: %d", state); - passed = FALSE; - } - return (GtkStatusIcon *)5; -} - -static void -unfallback (AppIndicator * indicator, GtkStatusIcon * status_icon) -{ - g_debug("Unfallback"); - if (state == STATE_FALLBACK) { - state = STATE_UNFALLBACK; - } else if (state == STATE_REFALLBACK) { - state = STATE_REUNFALLBACK; - passed = TRUE; - g_main_loop_quit(mainloop); - } else { - g_debug("Error, unfallback in state: %d", state); - passed = FALSE; - } - return; -} - -gboolean -kill_func (gpointer data) -{ - g_debug("Kill Function"); - g_main_loop_quit(mainloop); - return FALSE; -} - -int -main (int argc, char ** argv) -{ - gtk_init(&argc, &argv); - - GError * error = NULL; - DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); - if (error != NULL) { - g_error("Unable to get session bus: %s", error->message); - return 1; - } - - DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); - - guint nameret = 0; - - if (!org_freedesktop_DBus_request_name(bus_proxy, "org.test", 0, &nameret, NULL)) { - g_error("Unable to call to request name"); - return 1; - } - - if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { - g_error("Unable to get name"); - return 1; - } - - TestLibappindicatorFallbackItem * item = g_object_new(TEST_LIBAPPINDICATOR_FALLBACK_ITEM_TYPE, - "id", "test-id", - "category", "Other", - "icon-name", "bob", - NULL); - - GtkWidget * menu = gtk_menu_new(); - app_indicator_set_menu(APP_INDICATOR(item), GTK_MENU(menu)); - - g_timeout_add_seconds(2, kill_func, NULL); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - g_object_unref(G_OBJECT(item)); - - if (passed) { - return 0; - } else { - return 1; - } -} diff --git a/tests/test-libappindicator-fallback-watcher.c b/tests/test-libappindicator-fallback-watcher.c deleted file mode 100644 index 5494082..0000000 --- a/tests/test-libappindicator-fallback-watcher.c +++ /dev/null @@ -1,117 +0,0 @@ -/* -This puts the NotificationWatcher on the bus, kinda. Enough to -trick the Item into unfalling back. - -Copyright 2010 Canonical Ltd. - -Authors: - Ted Gould - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see . -*/ - -#include -#include -#include -#include - -#include "../src/dbus-shared.h" - -gboolean kill_func (gpointer userdata); - -static GMainLoop * mainloop = NULL; - -static DBusHandlerResult -dbus_filter (DBusConnection * connection, DBusMessage * message, void * user_data) -{ - if (dbus_message_is_method_call(message, NOTIFICATION_WATCHER_DBUS_ADDR, "RegisterStatusNotifierItem")) { - DBusMessage * reply = dbus_message_new_method_return(message); - dbus_connection_send(connection, reply, NULL); - dbus_message_unref(reply); - - /* Let the messages get out, but we're done at this point */ - g_timeout_add(50, kill_func, NULL); - - return DBUS_HANDLER_RESULT_HANDLED; - } - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -gboolean -kill_func (gpointer userdata) -{ - g_main_loop_quit(mainloop); - return FALSE; -} - -int -main (int argv, char ** argc) -{ - g_type_init(); - - g_debug("Waiting to init."); - - - GError * error = NULL; - DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); - if (error != NULL) { - g_error("Unable to get session bus: %s", error->message); - return 1; - } - - DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); - - gboolean has_owner = FALSE; - gint owner_count = 0; - while (!has_owner && owner_count < 10000) { - org_freedesktop_DBus_name_has_owner(bus_proxy, "org.test", &has_owner, NULL); - owner_count++; - } - - if (owner_count == 10000) { - g_error("Unable to get name owner after 10000 tries"); - return 1; - } - - g_usleep(500000); - - g_debug("Initing"); - - guint nameret = 0; - - if (!org_freedesktop_DBus_request_name(bus_proxy, NOTIFICATION_WATCHER_DBUS_ADDR, 0, &nameret, &error)) { - g_error("Unable to call to request name"); - return 1; - } - - if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { - g_error("Unable to get name"); - return 1; - } - - dbus_connection_add_filter(dbus_g_connection_get_connection(session_bus), dbus_filter, NULL, NULL); - - /* This is the final kill function. It really shouldn't happen - unless we get an error. */ - g_timeout_add(2000, kill_func, NULL); - - g_debug("Entering Mainloop"); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - g_debug("Exiting"); - - return 0; -} diff --git a/tests/test-libappindicator-status-client.c b/tests/test-libappindicator-status-client.c deleted file mode 100644 index 9e39ed8..0000000 --- a/tests/test-libappindicator-status-client.c +++ /dev/null @@ -1,153 +0,0 @@ -/* -Tests for the libappindicator library that are over DBus. This is -the client side of those tests. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see . -*/ - - -#include -#include -#include -#include -#include "../src/dbus-shared.h" - -static GMainLoop * mainloop = NULL; -static gboolean passed = TRUE; -static gboolean watchdog_hit = TRUE; -static gboolean active = FALSE; -static guint toggle_count = 0; - -#define PASSIVE_STR "Passive" -#define ACTIVE_STR "Active" -#define ATTN_STR "NeedsAttention" - -static DBusHandlerResult -dbus_reg_filter (DBusConnection * connection, DBusMessage * message, void * user_data) -{ - if (dbus_message_is_method_call(message, NOTIFICATION_WATCHER_DBUS_ADDR, "RegisterStatusNotifierItem")) { - DBusMessage * reply = dbus_message_new_method_return(message); - dbus_connection_send(connection, reply, NULL); - dbus_message_unref(reply); - return DBUS_HANDLER_RESULT_HANDLED; - } - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - - -static DBusHandlerResult -dbus_filter (DBusConnection * connection, DBusMessage * message, void * user_data) -{ - if (!dbus_message_is_signal(message, NOTIFICATION_ITEM_DBUS_IFACE, "NewStatus")) { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } - - gchar * string; - - DBusError derror; - dbus_error_init(&derror); - if (!dbus_message_get_args(message, &derror, - DBUS_TYPE_STRING, &string, - DBUS_TYPE_INVALID)) { - g_warning("Couldn't get parameters"); - dbus_error_free(&derror); - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } - - watchdog_hit = TRUE; - - if (g_strcmp0(string, ACTIVE_STR) == 0) { - if (active) { - g_warning("Got active when already active"); - passed = FALSE; - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } - active = TRUE; - } else { - active = FALSE; - } - - toggle_count++; - - if (toggle_count == 100) { - g_main_loop_quit(mainloop); - } - - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} - -gboolean -kill_func (gpointer userdata) -{ - if (watchdog_hit == FALSE) { - g_main_loop_quit(mainloop); - g_warning("Forced to Kill"); - g_warning("Toggle count: %d", toggle_count); - passed = FALSE; - return FALSE; - } - watchdog_hit = FALSE; - return TRUE; -} - -gint -main (gint argc, gchar * argv[]) -{ - g_type_init(); - - GError * error = NULL; - DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); - if (error != NULL) { - g_error("Unable to get session bus: %s", error->message); - return 1; - } - - DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); - guint nameret = 0; - - if (!org_freedesktop_DBus_request_name(bus_proxy, NOTIFICATION_WATCHER_DBUS_ADDR, 0, &nameret, &error)) { - g_error("Unable to call to request name"); - return 1; - } - - if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { - g_error("Unable to get name"); - return 1; - } - - dbus_connection_add_filter(dbus_g_connection_get_connection(session_bus), dbus_reg_filter, NULL, NULL); - - dbus_connection_add_filter(dbus_g_connection_get_connection(session_bus), dbus_filter, NULL, NULL); - dbus_bus_add_match(dbus_g_connection_get_connection(session_bus), "type='signal',interface='" NOTIFICATION_ITEM_DBUS_IFACE "',member='NewStatus'", NULL); - - watchdog_hit = TRUE; - g_timeout_add(1000, kill_func, NULL); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - if (passed) { - g_debug("Quiting"); - return 0; - } else { - g_debug("Quiting as we're a failure"); - return 1; - } - return 0; -} diff --git a/tests/test-libappindicator-status-server.c b/tests/test-libappindicator-status-server.c deleted file mode 100644 index 8cd5571..0000000 --- a/tests/test-libappindicator-status-server.c +++ /dev/null @@ -1,82 +0,0 @@ -/* -Tests for the libappindicator library that are over DBus. This is -the server side of those tests. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see . -*/ - - -#include -#include -#include -#include -#include - -static GMainLoop * mainloop = NULL; -static gboolean active = FALSE; -static guint toggle_count = 0; - -gboolean -toggle (gpointer userdata) -{ - if (active) { - app_indicator_set_status (APP_INDICATOR(userdata), APP_INDICATOR_STATUS_ATTENTION); - active = FALSE; - } else { - app_indicator_set_status (APP_INDICATOR(userdata), APP_INDICATOR_STATUS_ACTIVE); - active = TRUE; - } - - toggle_count++; - - if (toggle_count == 100) { - g_main_loop_quit(mainloop); - return FALSE; - } - - return TRUE; -} - -gint -main (gint argc, gchar * argv[]) -{ - gtk_init(&argc, &argv); - - g_usleep(100000); - - g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL)))); - - AppIndicator * ci = app_indicator_new ("my-id", "my-icon-name", APP_INDICATOR_CATEGORY_APPLICATION_STATUS); - app_indicator_set_attention_icon (ci, "my-attention-icon"); - - GtkMenu * menu = GTK_MENU(gtk_menu_new()); - GtkMenuItem * item = GTK_MENU_ITEM(gtk_menu_item_new_with_label("Label")); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(item)); - - app_indicator_set_menu(ci, menu); - - g_timeout_add(50, toggle, ci); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - g_object_unref(G_OBJECT(ci)); - g_debug("Quiting"); - - return 0; -} diff --git a/tests/test-libappindicator.c b/tests/test-libappindicator.c deleted file mode 100644 index 8d12ac5..0000000 --- a/tests/test-libappindicator.c +++ /dev/null @@ -1,320 +0,0 @@ -/* -Tests for the libappindicator library. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see . -*/ - - -#include -#include - -#include - -void -test_libappindicator_prop_signals_status_helper (AppIndicator * ci, gchar * status, gboolean * signalactivated) -{ - *signalactivated = TRUE; - return; -} - -void -test_libappindicator_prop_signals_helper (AppIndicator * ci, gboolean * signalactivated) -{ - *signalactivated = TRUE; - return; -} - -void -test_libappindicator_prop_signals (void) -{ - AppIndicator * ci = app_indicator_new ("test-app-indicator", - "indicator-messages", - APP_INDICATOR_CATEGORY_APPLICATION_STATUS); - - g_assert(ci != NULL); - - gboolean signaled = FALSE; - gulong handlerid; - - handlerid = 0; - handlerid = g_signal_connect(G_OBJECT(ci), "new-icon", G_CALLBACK(test_libappindicator_prop_signals_helper), &signaled); - g_assert(handlerid != 0); - - handlerid = 0; - handlerid = g_signal_connect(G_OBJECT(ci), "new-attention-icon", G_CALLBACK(test_libappindicator_prop_signals_helper), &signaled); - g_assert(handlerid != 0); - - handlerid = 0; - handlerid = g_signal_connect(G_OBJECT(ci), "new-status", G_CALLBACK(test_libappindicator_prop_signals_status_helper), &signaled); - g_assert(handlerid != 0); - - - signaled = FALSE; - app_indicator_set_icon(ci, "bob"); - g_assert(signaled); - - signaled = FALSE; - app_indicator_set_icon(ci, "bob"); - g_assert(!signaled); - - signaled = FALSE; - app_indicator_set_icon(ci, "al"); - g_assert(signaled); - - - signaled = FALSE; - app_indicator_set_attention_icon(ci, "bob"); - g_assert(signaled); - - signaled = FALSE; - app_indicator_set_attention_icon(ci, "bob"); - g_assert(!signaled); - - signaled = FALSE; - app_indicator_set_attention_icon(ci, "al"); - g_assert(signaled); - - - signaled = FALSE; - app_indicator_set_status(ci, APP_INDICATOR_STATUS_PASSIVE); - g_assert(!signaled); - - signaled = FALSE; - app_indicator_set_status(ci, APP_INDICATOR_STATUS_ACTIVE); - g_assert(signaled); - - signaled = FALSE; - app_indicator_set_status(ci, APP_INDICATOR_STATUS_ACTIVE); - g_assert(!signaled); - - signaled = FALSE; - app_indicator_set_status(ci, APP_INDICATOR_STATUS_ATTENTION); - g_assert(signaled); - - return; -} - -void -test_libappindicator_init_set_props (void) -{ - AppIndicator * ci = app_indicator_new ("my-id", - "my-name", - APP_INDICATOR_CATEGORY_APPLICATION_STATUS); - - g_assert(ci != NULL); - - app_indicator_set_status(ci, APP_INDICATOR_STATUS_ACTIVE); - app_indicator_set_attention_icon(ci, "my-attention-name"); - - g_assert(!g_strcmp0("my-id", app_indicator_get_id(ci))); - g_assert(!g_strcmp0("my-name", app_indicator_get_icon(ci))); - g_assert(!g_strcmp0("my-attention-name", app_indicator_get_attention_icon(ci))); - g_assert(app_indicator_get_status(ci) == APP_INDICATOR_STATUS_ACTIVE); - g_assert(app_indicator_get_category(ci) == APP_INDICATOR_CATEGORY_APPLICATION_STATUS); - - g_object_unref(G_OBJECT(ci)); - return; -} - -void -test_libappindicator_init_with_props (void) -{ - AppIndicator * ci = app_indicator_new ("my-id", - "my-name", - APP_INDICATOR_CATEGORY_APPLICATION_STATUS); - - app_indicator_set_status (ci, APP_INDICATOR_STATUS_ACTIVE); - app_indicator_set_attention_icon (ci, "my-attention-name"); - - g_assert(ci != NULL); - - g_assert(!g_strcmp0("my-id", app_indicator_get_id(ci))); - g_assert(!g_strcmp0("my-name", app_indicator_get_icon(ci))); - g_assert(!g_strcmp0("my-attention-name", app_indicator_get_attention_icon(ci))); - g_assert(app_indicator_get_status(ci) == APP_INDICATOR_STATUS_ACTIVE); - g_assert(app_indicator_get_category(ci) == APP_INDICATOR_CATEGORY_APPLICATION_STATUS); - - g_object_unref(G_OBJECT(ci)); - return; -} - -void -test_libappindicator_init (void) -{ - AppIndicator * ci = app_indicator_new ("my-id", "my-name", APP_INDICATOR_CATEGORY_APPLICATION_STATUS); - g_assert(ci != NULL); - g_object_unref(G_OBJECT(ci)); - return; -} - -void -test_libappindicator_set_label (void) -{ - AppIndicator * ci = app_indicator_new ("my-id", - "my-name", - APP_INDICATOR_CATEGORY_APPLICATION_STATUS); - - g_assert(ci != NULL); - g_assert(app_indicator_get_label(ci) == NULL); - g_assert(app_indicator_get_label_guide(ci) == NULL); - - /* First check all the clearing modes, this is important as - we're going to use them later, we need them to work. */ - app_indicator_set_label(ci, NULL, NULL); - - g_assert(app_indicator_get_label(ci) == NULL); - g_assert(app_indicator_get_label_guide(ci) == NULL); - - app_indicator_set_label(ci, "", NULL); - - g_assert(app_indicator_get_label(ci) == NULL); - g_assert(app_indicator_get_label_guide(ci) == NULL); - - app_indicator_set_label(ci, NULL, ""); - - g_assert(app_indicator_get_label(ci) == NULL); - g_assert(app_indicator_get_label_guide(ci) == NULL); - - app_indicator_set_label(ci, "", ""); - - g_assert(app_indicator_get_label(ci) == NULL); - g_assert(app_indicator_get_label_guide(ci) == NULL); - - app_indicator_set_label(ci, "label", ""); - - g_assert(g_strcmp0(app_indicator_get_label(ci), "label") == 0); - g_assert(app_indicator_get_label_guide(ci) == NULL); - - app_indicator_set_label(ci, NULL, NULL); - - g_assert(app_indicator_get_label(ci) == NULL); - g_assert(app_indicator_get_label_guide(ci) == NULL); - - app_indicator_set_label(ci, "label", "guide"); - - g_assert(g_strcmp0(app_indicator_get_label(ci), "label") == 0); - g_assert(g_strcmp0(app_indicator_get_label_guide(ci), "guide") == 0); - - app_indicator_set_label(ci, "label2", "guide"); - - g_assert(g_strcmp0(app_indicator_get_label(ci), "label2") == 0); - g_assert(g_strcmp0(app_indicator_get_label_guide(ci), "guide") == 0); - - app_indicator_set_label(ci, "trick-label", "trick-guide"); - - g_assert(g_strcmp0(app_indicator_get_label(ci), "trick-label") == 0); - g_assert(g_strcmp0(app_indicator_get_label_guide(ci), "trick-guide") == 0); - - g_object_unref(G_OBJECT(ci)); - return; -} - -void -label_signals_cb (AppIndicator * appindicator, gchar * label, gchar * guide, gpointer user_data) -{ - gint * label_signals_count = (gint *)user_data; - (*label_signals_count)++; - return; -} - -void -label_signals_check (void) -{ - while (g_main_context_pending(NULL)) { - g_main_context_iteration(NULL, TRUE); - } - - return; -} - -void -test_libappindicator_label_signals (void) -{ - gint label_signals_count = 0; - AppIndicator * ci = app_indicator_new ("my-id", - "my-name", - APP_INDICATOR_CATEGORY_APPLICATION_STATUS); - - g_assert(ci != NULL); - g_assert(app_indicator_get_label(ci) == NULL); - g_assert(app_indicator_get_label_guide(ci) == NULL); - - g_signal_connect(G_OBJECT(ci), APP_INDICATOR_SIGNAL_NEW_LABEL, G_CALLBACK(label_signals_cb), &label_signals_count); - - /* Shouldn't be a signal as it should be stuck in idle */ - app_indicator_set_label(ci, "label", "guide"); - g_assert(label_signals_count == 0); - - /* Should show up after idle processing */ - label_signals_check(); - g_assert(label_signals_count == 1); - - /* Shouldn't signal with no change */ - label_signals_count = 0; - app_indicator_set_label(ci, "label", "guide"); - label_signals_check(); - g_assert(label_signals_count == 0); - - /* Change one, we should get one signal */ - app_indicator_set_label(ci, "label2", "guide"); - label_signals_check(); - g_assert(label_signals_count == 1); - - /* Change several times, one signal */ - label_signals_count = 0; - app_indicator_set_label(ci, "label1", "guide0"); - app_indicator_set_label(ci, "label1", "guide1"); - app_indicator_set_label(ci, "label2", "guide2"); - app_indicator_set_label(ci, "label3", "guide3"); - label_signals_check(); - g_assert(label_signals_count == 1); - - /* Clear should signal too */ - label_signals_count = 0; - app_indicator_set_label(ci, NULL, NULL); - label_signals_check(); - g_assert(label_signals_count == 1); - - return; -} - -void -test_libappindicator_props_suite (void) -{ - g_test_add_func ("/indicator-application/libappindicator/init", test_libappindicator_init); - g_test_add_func ("/indicator-application/libappindicator/init_props", test_libappindicator_init_with_props); - g_test_add_func ("/indicator-application/libappindicator/init_set_props", test_libappindicator_init_set_props); - g_test_add_func ("/indicator-application/libappindicator/prop_signals", test_libappindicator_prop_signals); - g_test_add_func ("/indicator-application/libappindicator/set_label", test_libappindicator_set_label); - g_test_add_func ("/indicator-application/libappindicator/label_signals", test_libappindicator_label_signals); - - return; -} - -gint -main (gint argc, gchar * argv[]) -{ - gtk_init(&argc, &argv); - g_test_init(&argc, &argv, NULL); - - /* Test suites */ - test_libappindicator_props_suite(); - - - return g_test_run (); -} diff --git a/tests/test-simple-app.c b/tests/test-simple-app.c deleted file mode 100644 index d60d9b9..0000000 --- a/tests/test-simple-app.c +++ /dev/null @@ -1,54 +0,0 @@ -/* -Test that creates a small test app which links with libappindicator. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould - -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published -by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see . -*/ - - -#include -#include -#include -#include -#include - -static GMainLoop * mainloop = NULL; - -int -main (int argc, char ** argv) -{ - g_type_init(); - - DbusmenuServer * dms = dbusmenu_server_new("/menu"); - DbusmenuMenuitem * dmi = dbusmenu_menuitem_new(); - dbusmenu_menuitem_property_set(dmi, "label", "Bob"); - - AppIndicator * ci = APP_INDICATOR(g_object_new(APP_INDICATOR_TYPE, - "id", "test-application", - "status-enum", APP_INDICATOR_STATUS_ACTIVE, - "icon-name", "system-shutdown", - "menu-object", dms, - NULL)); - - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - g_object_unref(G_OBJECT(ci)); - g_debug("Quiting"); - - return 0; -} -- cgit v1.2.3 From 6456a3f6beacbfbf4866ebfcc60bb95cb17fe71c Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 2 Dec 2010 16:56:23 -0600 Subject: Fixing up the test so it builds and runs --- tests/Makefile.am | 5 +++-- tests/test-approver.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'tests') diff --git a/tests/Makefile.am b/tests/Makefile.am index c012b96..cef1eda 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -7,6 +7,8 @@ DISTCLEANFILES = $(TESTS) EXTRA_DIST = run-xvfb.sh +DBUS_RUNNER=dbus-test-runner --dbus-config /usr/share/dbus-test-runner/session.conf + ######################################### ## test-approver ######################################### @@ -23,8 +25,7 @@ test_approver_CFLAGS = \ test_approver_LDADD = \ $(INDICATOR_LIBS) \ - $(TEST_LIBS) \ - $(top_builddir)/src/libappindicator.la + $(TEST_LIBS) test-approver-tester: test-approver Makefile.am @echo "#!/bin/bash" > $@ diff --git a/tests/test-approver.c b/tests/test-approver.c index 2665505..adad4a7 100644 --- a/tests/test-approver.c +++ b/tests/test-approver.c @@ -5,7 +5,7 @@ #include "notification-watcher-client.h" #include "dbus-shared.h" -#include "app-indicator.h" +#include "libappindicator/app-indicator.h" #define APPROVER_PATH "/my/approver" -- cgit v1.2.3 From af582ad4697437ea7eb76889f2242e3928d06ead Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Tue, 11 Jan 2011 17:32:32 -0600 Subject: port to gdbus --- .bzrignore | 7 +- configure.ac | 3 + src/Makefile.am | 26 +- src/application-service-appstore.c | 892 +++++++++++++++++++------------------ src/application-service.c | 1 - src/dbus-properties.xml | 23 - src/indicator-application.c | 293 ++++++------ src/notification-item.xml | 39 -- tests/test-approver.c | 8 +- 9 files changed, 636 insertions(+), 656 deletions(-) delete mode 100644 src/dbus-properties.xml delete mode 100644 src/notification-item.xml (limited to 'tests') diff --git a/.bzrignore b/.bzrignore index 6f66217..beef564 100644 --- a/.bzrignore +++ b/.bzrignore @@ -4,8 +4,6 @@ m4/ src/indicator-application-service src/libappindicator.la src/libappindicator_la-indicator-application.lo -src/notification-item-client.h -src/notification-item-server.h src/notification-watcher-client.h src/notification-watcher-server.h src/libappindicator.la @@ -23,13 +21,12 @@ tests/test-libappindicator-dbus-client tests/test-libappindicator-dbus-server tests/libappindicator-tests tests/test-libappindicator-dbus -src/application-service-client.h +src/gen-application-service.xml.c +src/gen-application-service.xml.h src/application-service-server.h src/application-service-marshal.c src/application-service-marshal.h src/stamp-marshal -src/dbus-properties-client.h -src/dbus-properties-server.h tests/test-simple-app example/.deps example/.libs diff --git a/configure.ac b/configure.ac index 87211d0..ebc0659 100644 --- a/configure.ac +++ b/configure.ac @@ -31,6 +31,7 @@ PKG_PROG_PKG_CONFIG GTK_REQUIRED_VERSION=2.18 GTK3_REQUIRED_VERSION=2.91 +GIO_REQUIRED_VERSION=2.26 INDICATOR_REQUIRED_VERSION=0.3.5 DBUSMENUGTK_REQUIRED_VERSION=0.2.2 JSON_GLIB_REQUIRED_VERSION=0.7.6 @@ -43,6 +44,7 @@ AC_ARG_WITH([gtk], [with_gtk=2]) AS_IF([test "x$with_gtk" = x3], [PKG_CHECK_MODULES(INDICATOR, gtk+-3.0 >= $GTK3_REQUIRED_VERSION + gio-2.0 >= $GIO_REQUIRED_VERSION indicator3 >= $INDICATOR_REQUIRED_VERSION json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION @@ -53,6 +55,7 @@ AS_IF([test "x$with_gtk" = x3], ], [test "x$with_gtk" = x2], [PKG_CHECK_MODULES(INDICATOR, gtk+-2.0 >= $GTK_REQUIRED_VERSION + gio-2.0 >= $GIO_REQUIRED_VERSION indicator >= $INDICATOR_REQUIRED_VERSION json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION diff --git a/src/Makefile.am b/src/Makefile.am index 23f5727..49a4d6a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,11 +39,8 @@ libapplication_la_LDFLAGS = -module -avoid-version libexec_PROGRAMS = indicator-application-service BUILT_SOURCES += \ - application-service-server.h \ application-service-marshal.h \ application-service-marshal.c \ - dbus-properties-client.h \ - notification-item-client.h \ notification-watcher-server.h indicator_application_service_SOURCES = \ @@ -53,6 +50,7 @@ indicator_application_service_SOURCES = \ application-service-marshal.c \ application-service-watcher.h \ application-service-watcher.c \ + gen-application-service.xml.c \ app-indicator-enum-types.c \ dbus-shared.h \ generate-id.h \ @@ -81,11 +79,11 @@ DISTCLEANFILES += app-indicator-enum-types.c # DBus Specs ################################## +GDBUS_SPECS = \ + application-service.xml + DBUS_SPECS = \ - dbus-properties.xml \ - application-service.xml \ notification-approver.xml \ - notification-item.xml \ notification-watcher.xml %-client.h: %.xml @@ -102,10 +100,22 @@ DBUS_SPECS = \ --output=$@ \ $< +gen-%.xml.c: %.xml + @echo "Building $@ from $<" + @echo "const char * _$(subst -,_,$(subst .,_,$(basename $<))) = " > $@ + @sed -e "s:\":\\\\\":g" -e s:^:\": -e s:\$$:\\\\n\": $< >> $@ + @echo ";" >> $@ + +gen-%.xml.h: %.xml + @echo "Building $@ from $<" + @echo "extern const char * _$(subst -,_,$(subst .,_,$(basename $<)));" > $@ + BUILT_SOURCES += \ $(DBUS_SPECS:.xml=-client.h) \ - $(DBUS_SPECS:.xml=-server.h) + $(DBUS_SPECS:.xml=-server.h) \ + gen-application-service.xml.c \ + gen-application-service.xml.h CLEANFILES += $(BUILT_SOURCES) -EXTRA_DIST += $(DBUS_SPECS) +EXTRA_DIST += $(DBUS_SPECS) $(GDBUS_SPECS) diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c index 6e05739..469135b 100644 --- a/src/application-service-appstore.c +++ b/src/application-service-appstore.c @@ -24,20 +24,18 @@ with this program. If not, see . #include "config.h" #endif -#include #include "libappindicator/app-indicator.h" #include "app-indicator-enum-types.h" #include "application-service-appstore.h" #include "application-service-marshal.h" -#include "dbus-properties-client.h" #include "dbus-shared.h" -#include "notification-approver-client.h" #include "generate-id.h" /* DBus Prototypes */ -static gboolean _application_service_server_get_applications (ApplicationServiceAppstore * appstore, GPtrArray ** apps, GError ** error); +static GVariant * get_applications (ApplicationServiceAppstore * appstore); +static void bus_method_call (GDBusConnection * connection, const gchar * sender, const gchar * path, const gchar * interface, const gchar * method, GVariant * params, GDBusMethodInvocation * invocation, gpointer user_data); -#include "application-service-server.h" +#include "gen-application-service.xml.h" #define NOTIFICATION_ITEM_PROP_ID "Id" #define NOTIFICATION_ITEM_PROP_CATEGORY "Category" @@ -61,7 +59,9 @@ static gboolean _application_service_server_get_applications (ApplicationService /* Private Stuff */ struct _ApplicationServiceAppstorePrivate { - DBusGConnection * bus; + GCancellable * bus_cancel; + GDBusConnection * bus; + guint dbus_registration; GList * applications; GList * approvers; GHashTable * ordering_overrides; @@ -76,8 +76,9 @@ typedef enum { typedef struct _Approver Approver; struct _Approver { - DBusGProxy * proxy; - gboolean destroy_by_proxy; + ApplicationServiceAppstore * appstore; /* not ref'd */ + GCancellable * proxy_cancel; + GDBusProxy * proxy; }; typedef struct _Application Application; @@ -87,8 +88,8 @@ struct _Application { gchar * dbus_name; gchar * dbus_object; ApplicationServiceAppstore * appstore; /* not ref'd */ - DBusGProxy * dbus_proxy; - DBusGProxy * prop_proxy; + GCancellable * dbus_proxy_cancel; + GDBusProxy * dbus_proxy; gboolean validated; /* Whether we've gotten all the parameters and they look good. */ AppIndicatorStatus status; gchar * icon; @@ -106,18 +107,15 @@ struct _Application { #define APPLICATION_SERVICE_APPSTORE_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), APPLICATION_SERVICE_APPSTORE_TYPE, ApplicationServiceAppstorePrivate)) -/* Signals Stuff */ -enum { - APPLICATION_ADDED, - APPLICATION_REMOVED, - APPLICATION_ICON_CHANGED, - APPLICATION_LABEL_CHANGED, - APPLICATION_ICON_THEME_PATH_CHANGED, - LAST_SIGNAL +/* GDBus Stuff */ +static GDBusNodeInfo * node_info = NULL; +static GDBusInterfaceInfo * interface_info = NULL; +static GDBusInterfaceVTable interface_table = { + method_call: bus_method_call, + get_property: NULL, /* No properties */ + set_property: NULL /* No properties */ }; -static guint signals[LAST_SIGNAL] = { 0 }; - /* GObject stuff */ static void application_service_appstore_class_init (ApplicationServiceAppstoreClass *klass); static void application_service_appstore_init (ApplicationServiceAppstore *self); @@ -132,6 +130,11 @@ static void approver_free (gpointer papprover, gpointer user_data); static void check_with_new_approver (gpointer papp, gpointer papprove); static void check_with_old_approver (gpointer papprove, gpointer papp); static Application * find_application (ApplicationServiceAppstore * appstore, const gchar * address, const gchar * object); +static void bus_get_cb (GObject * object, GAsyncResult * res, gpointer user_data); +static void dbus_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data); +static void app_receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data); +static void approver_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data); +static void approver_receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data); G_DEFINE_TYPE (ApplicationServiceAppstore, application_service_appstore, G_TYPE_OBJECT); @@ -145,56 +148,24 @@ application_service_appstore_class_init (ApplicationServiceAppstoreClass *klass) object_class->dispose = application_service_appstore_dispose; object_class->finalize = application_service_appstore_finalize; - signals[APPLICATION_ADDED] = g_signal_new ("application-added", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationServiceAppstoreClass, application_added), - NULL, NULL, - _application_service_marshal_VOID__STRING_INT_STRING_STRING_STRING_STRING_STRING, - G_TYPE_NONE, 7, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_NONE); - signals[APPLICATION_REMOVED] = g_signal_new ("application-removed", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationServiceAppstoreClass, application_removed), - NULL, NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, 1, G_TYPE_INT, G_TYPE_NONE); - signals[APPLICATION_ICON_CHANGED] = g_signal_new ("application-icon-changed", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationServiceAppstoreClass, application_icon_changed), - NULL, NULL, - _application_service_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING, G_TYPE_NONE); - signals[APPLICATION_ICON_THEME_PATH_CHANGED] = g_signal_new ("application-icon-theme-path-changed", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationServiceAppstoreClass, application_icon_theme_path_changed), - NULL, NULL, - _application_service_marshal_VOID__INT_STRING, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING, G_TYPE_NONE); - signals[APPLICATION_LABEL_CHANGED] = g_signal_new ("application-label-changed", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationServiceAppstoreClass, application_label_changed), - NULL, NULL, - _application_service_marshal_VOID__INT_STRING_STRING, - G_TYPE_NONE, 3, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_NONE); - - dbus_g_object_register_marshaller(_application_service_marshal_VOID__STRING_STRING, - G_TYPE_NONE, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_object_register_marshaller(_application_service_marshal_VOID__BOOLEAN_STRING_OBJECT, - G_TYPE_NONE, - G_TYPE_BOOLEAN, - G_TYPE_STRING, - G_TYPE_OBJECT, - G_TYPE_INVALID); - - dbus_g_object_type_install_info(APPLICATION_SERVICE_APPSTORE_TYPE, - &dbus_glib__application_service_server_object_info); + /* Setting up the DBus interfaces */ + if (node_info == NULL) { + GError * error = NULL; + + node_info = g_dbus_node_info_new_for_xml(_application_service, &error); + if (error != NULL) { + g_error("Unable to parse Application Service Interface description: %s", error->message); + g_error_free(error); + } + } + + if (interface_info == NULL) { + interface_info = g_dbus_node_info_lookup_interface(node_info, INDICATOR_APPLICATION_DBUS_IFACE); + + if (interface_info == NULL) { + g_error("Unable to find interface '" INDICATOR_APPLICATION_DBUS_IFACE "'"); + } + } return; } @@ -207,6 +178,8 @@ application_service_appstore_init (ApplicationServiceAppstore *self) priv->applications = NULL; priv->approvers = NULL; + priv->bus_cancel = NULL; + priv->dbus_registration = 0; priv->ordering_overrides = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); @@ -214,21 +187,76 @@ application_service_appstore_init (ApplicationServiceAppstore *self) gchar * userfile = g_build_filename(g_get_user_data_dir(), "indicators", "application", OVERRIDE_FILE_NAME, NULL); load_override_file(priv->ordering_overrides, userfile); g_free(userfile); - + + priv->bus_cancel = g_cancellable_new(); + g_bus_get(G_BUS_TYPE_SESSION, + priv->bus_cancel, + bus_get_cb, + self); + + self->priv = priv; + + return; +} + +static void +bus_get_cb (GObject * object, GAsyncResult * res, gpointer user_data) +{ GError * error = NULL; - priv->bus = dbus_g_bus_get(DBUS_BUS_STARTER, &error); + GDBusConnection * connection = g_bus_get_finish(res, &error); + + if (error != NULL) { + g_error("OMG! Unable to get a connection to DBus: %s", error->message); + g_error_free(error); + return; + } + + ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE (user_data); + + g_warn_if_fail(priv->bus == NULL); + priv->bus = connection; + + if (priv->bus_cancel != NULL) { + g_object_unref(priv->bus_cancel); + priv->bus_cancel = NULL; + } + + /* Now register our object on our new connection */ + priv->dbus_registration = g_dbus_connection_register_object(priv->bus, + INDICATOR_APPLICATION_DBUS_OBJ, + interface_info, + &interface_table, + user_data, + NULL, + &error); + if (error != NULL) { - g_error("Unable to get session bus: %s", error->message); + g_error("Unable to register the object to DBus: %s", error->message); g_error_free(error); return; } - dbus_g_connection_register_g_object(priv->bus, - INDICATOR_APPLICATION_DBUS_OBJ, - G_OBJECT(self)); - - self->priv = priv; + return; +} + +/* A method has been called from our dbus inteface. Figure out what it + is and dispatch it. */ +static void +bus_method_call (GDBusConnection * connection, const gchar * sender, + const gchar * path, const gchar * interface, + const gchar * method, GVariant * params, + GDBusMethodInvocation * invocation, gpointer user_data) +{ + ApplicationServiceAppstore * service = APPLICATION_SERVICE_APPSTORE(user_data); + GVariant * retval = NULL; + if (g_strcmp0(method, "GetApplications") == 0) { + retval = get_applications(service); + } else { + g_warning("Calling method '%s' on the indicator service and it's unknown", method); + } + + g_dbus_method_invocation_return_value(invocation, retval); return; } @@ -249,6 +277,23 @@ application_service_appstore_dispose (GObject *object) priv->approvers = NULL; } + if (priv->dbus_registration != 0) { + g_dbus_connection_unregister_object(priv->bus, priv->dbus_registration); + /* Don't care if it fails, there's nothing we can do */ + priv->dbus_registration = 0; + } + + if (priv->bus != NULL) { + g_object_unref(priv->bus); + priv->bus = NULL; + } + + if (priv->bus_cancel != NULL) { + g_cancellable_cancel(priv->bus_cancel); + g_object_unref(priv->bus_cancel); + priv->bus_cancel = NULL; + } + G_OBJECT_CLASS (application_service_appstore_parent_class)->dispose (object); return; } @@ -326,79 +371,87 @@ load_override_file (GHashTable * hash, const gchar * filename) and making sure we have everythign that we need. If we do, then we'll move on up to sending this onto the indicator. */ static void -get_all_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * error, gpointer data) +get_all_properties (Application * app) { - if (error != NULL) { - g_warning("Unable to get properties: %s", error->message); - /* TODO: We need to free all the application data here */ - return; - } - - Application * app = (Application *)data; - - if (g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_MENU) == NULL || - g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ID) == NULL || - g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_CATEGORY) == NULL || - g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_STATUS) == NULL || - g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ICON_NAME) == NULL) { + ApplicationServiceAppstorePrivate * priv = app->appstore->priv; + GVariant * menu, * id, * category, * status, * icon_name; + + menu = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_MENU); + id = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_ID); + category = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_CATEGORY); + status = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_STATUS); + icon_name = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_ICON_NAME); + + if (menu == NULL || id == NULL || category == NULL || status == NULL || + icon_name == NULL) { g_warning("Notification Item on object %s of %s doesn't have enough properties.", app->dbus_object, app->dbus_name); + if (menu) g_variant_unref (menu); + if (id) g_variant_unref (id); + if (category) g_variant_unref (category); + if (status) g_variant_unref (status); + if (icon_name) g_variant_unref (icon_name); g_free(app); // Need to do more than this, but it gives the idea of the flow we're going for. return; } app->validated = TRUE; - app->id = g_value_dup_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ID)); - app->category = g_value_dup_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_CATEGORY)); - app->status = string_to_status(g_value_get_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_STATUS))); - - ApplicationServiceAppstorePrivate * priv = app->appstore->priv; - - app->icon = g_value_dup_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ICON_NAME)); - - GValue * menuval = (GValue *)g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_MENU); - if (G_VALUE_TYPE(menuval) == G_TYPE_STRING) { - /* This is here to support an older version where we - were using strings instea of object paths. */ - app->menu = g_value_dup_string(menuval); - } else { - app->menu = g_strdup((gchar *)g_value_get_boxed(menuval)); - } - - if (g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_AICON_NAME) != NULL) { - app->aicon = g_value_dup_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_AICON_NAME)); + app->id = g_variant_dup_string(id, NULL); + app->category = g_variant_dup_string(category, NULL); + app->status = string_to_status(g_variant_get_string(status, NULL)); + app->icon = g_variant_dup_string(icon_name, NULL); + app->menu = g_variant_dup_string(menu, NULL); + + /* Now the optional properties */ + + GVariant * aicon_name, * icon_theme_path, * index, * label, * guide; + + aicon_name = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_AICON_NAME); + icon_theme_path = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_ICON_THEME_PATH); + index = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_ORDERING_INDEX); + label = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_LABEL); + guide = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_LABEL_GUIDE); + + if (aicon_name != NULL) { + app->aicon = g_variant_dup_string(aicon_name, NULL); } - gpointer icon_theme_path_data = g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ICON_THEME_PATH); - if (icon_theme_path_data != NULL) { - app->icon_theme_path = g_value_dup_string((GValue *)icon_theme_path_data); + if (icon_theme_path != NULL) { + app->icon_theme_path = g_variant_dup_string(icon_theme_path, NULL); } else { app->icon_theme_path = g_strdup(""); } gpointer ordering_index_over = g_hash_table_lookup(priv->ordering_overrides, app->id); if (ordering_index_over == NULL) { - gpointer ordering_index_data = g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ORDERING_INDEX); - if (ordering_index_data == NULL || g_value_get_uint(ordering_index_data) == 0) { + if (index == NULL || g_variant_get_uint32(index) == 0) { app->ordering_index = generate_id(string_to_cat(app->category), app->id); } else { - app->ordering_index = g_value_get_uint(ordering_index_data); + app->ordering_index = g_variant_get_uint32(index); } } else { app->ordering_index = GPOINTER_TO_UINT(ordering_index_over); } g_debug("'%s' ordering index is '%X'", app->id, app->ordering_index); - gpointer label_data = g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_LABEL); - if (label_data != NULL) { - app->label = g_value_dup_string((GValue *)label_data); + if (label != NULL) { + app->label = g_variant_dup_string(label, NULL); } else { app->label = g_strdup(""); } - gpointer guide_data = g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_LABEL_GUIDE); - if (guide_data != NULL) { - app->guide = g_value_dup_string((GValue *)guide_data); + if (guide != NULL) { + app->guide = g_variant_dup_string(guide, NULL); } else { app->guide = g_strdup(""); } @@ -408,6 +461,17 @@ get_all_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * err apply_status(app); + g_variant_unref (menu); + g_variant_unref (id); + g_variant_unref (category); + g_variant_unref (status); + g_variant_unref (icon_name); + if (aicon_name) g_variant_unref (aicon_name); + if (icon_theme_path) g_variant_unref (icon_theme_path); + if (index) g_variant_unref (index); + if (label) g_variant_unref (label); + if (guide) g_variant_unref (guide); + return; } @@ -511,8 +575,11 @@ application_free (Application * app) if (app->dbus_proxy) { g_object_unref(app->dbus_proxy); } - if (app->prop_proxy) { - g_object_unref(app->prop_proxy); + + if (app->dbus_proxy_cancel != NULL) { + g_cancellable_cancel(app->dbus_proxy_cancel); + g_object_unref(app->dbus_proxy_cancel); + app->dbus_proxy_cancel = NULL; } if (app->id != NULL) { @@ -553,12 +620,25 @@ application_free (Application * app) return; } -/* Gets called when the proxy is destroyed, which is usually when it +/* Gets called when the proxy changes owners, which is usually when it drops off of the bus. */ static void -application_removed_cb (DBusGProxy * proxy, gpointer userdata) +application_owner_changed (GObject * gobject, GParamSpec * pspec, + gpointer user_data) { - Application * app = (Application *)userdata; + Application * app = (Application *)user_data; + GDBusProxy * proxy = G_DBUS_PROXY(gobject); + + if (proxy != NULL) { /* else if NULL, assume dead */ + gchar * owner = g_dbus_proxy_get_name_owner(proxy); + if (owner != NULL) { + get_all_properties(app); /* Regrab properties for new owner */ + g_free (owner); + return; + } + } + + /* Application died */ g_debug("Application proxy destroyed '%s'", app->id); /* Remove from the panel */ @@ -583,6 +663,30 @@ app_sort_func (gconstpointer a, gconstpointer b, gpointer userdata) return (appb->ordering_index/2) - (appa->ordering_index/2); } +static void +emit_signal (ApplicationServiceAppstore * appstore, const gchar * name, + GVariant * variant) +{ + ApplicationServiceAppstorePrivate * priv = appstore->priv; + GError * error = NULL; + + g_dbus_connection_emit_signal (priv->bus, + NULL, + INDICATOR_APPLICATION_DBUS_OBJ, + INDICATOR_APPLICATION_DBUS_IFACE, + name, + variant, + &error); + + if (error != NULL) { + g_error("Unable to send %s signal: %s", name, error->message); + g_error_free(error); + return; + } + + return; +} + /* Change the status of the application. If we're going passive it removes it from the panel. If we're coming online, then it add it to the panel. Otherwise it changes the icon. */ @@ -620,9 +724,8 @@ apply_status (Application * app) gint position = get_position(app); if (position == -1) return; - g_signal_emit(G_OBJECT(appstore), - signals[APPLICATION_REMOVED], 0, - position, TRUE); + emit_signal (appstore, "ApplicationRemoved", + g_variant_new ("(i)", position)); } else { /* Figure out which icon we should be using */ gchar * newicon = app->icon; @@ -633,24 +736,19 @@ apply_status (Application * app) /* Determine whether we're already shown or not */ if (app->visible_state == VISIBLE_STATE_HIDDEN) { /* Put on panel */ - g_signal_emit(G_OBJECT(app->appstore), - signals[APPLICATION_ADDED], 0, - newicon, - get_position(app), /* Position */ - app->dbus_name, - app->menu, - app->icon_theme_path, - app->label, - app->guide, - TRUE); + emit_signal (appstore, "ApplicationAdded", + g_variant_new ("(sisosss)", newicon, + get_position(app), + app->dbus_name, app->menu, + app->icon_theme_path, + app->label, app->guide)); } else { /* Icon update */ gint position = get_position(app); if (position == -1) return; - g_signal_emit(G_OBJECT(appstore), - signals[APPLICATION_ICON_CHANGED], 0, - position, newicon, TRUE); + emit_signal (appstore, "ApplicationIconChanged", + g_variant_new ("(is)", position, newicon)); } } @@ -659,26 +757,17 @@ apply_status (Application * app) return; } -/* Gets the data back on an updated icon signal. Hopefully - a new fun icon. */ +/* Called when the Notification Item signals that it + has a new icon. */ static void -new_icon_cb (DBusGProxy * proxy, GValue value, GError * error, gpointer userdata) +new_icon (Application * app, const gchar * newicon) { - /* Check for errors */ - if (error != NULL) { - g_warning("Unable to get updated icon name: %s", error->message); - return; - } - /* Grab the icon and make sure we have one */ - const gchar * newicon = g_value_get_string(&value); if (newicon == NULL) { g_warning("Bad new icon :("); return; } - Application * app = (Application *) userdata; - if (g_strcmp0(newicon, app->icon)) { /* If the new icon is actually a new icon */ if (app->icon != NULL) g_free(app->icon); @@ -688,35 +777,25 @@ new_icon_cb (DBusGProxy * proxy, GValue value, GError * error, gpointer userdata gint position = get_position(app); if (position == -1) return; - g_signal_emit(G_OBJECT(app->appstore), - signals[APPLICATION_ICON_CHANGED], 0, - position, newicon, TRUE); + emit_signal (app->appstore, "ApplicationIconChanged", + g_variant_new ("(is)", position, newicon)); } } return; } -/* Gets the data back on an updated aicon signal. Hopefully - a new fun icon. */ +/* Called when the Notification Item signals that it + has a new attention icon. */ static void -new_aicon_cb (DBusGProxy * proxy, GValue value, GError * error, gpointer userdata) +new_aicon (Application * app, const gchar * newicon) { - /* Check for errors */ - if (error != NULL) { - g_warning("Unable to get updated icon name: %s", error->message); - return; - } - /* Grab the icon and make sure we have one */ - const gchar * newicon = g_value_get_string(&value); if (newicon == NULL) { g_warning("Bad new icon :("); return; } - Application * app = (Application *) userdata; - if (g_strcmp0(newicon, app->aicon)) { /* If the new icon is actually a new icon */ if (app->aicon != NULL) g_free(app->aicon); @@ -726,56 +805,19 @@ new_aicon_cb (DBusGProxy * proxy, GValue value, GError * error, gpointer userdat gint position = get_position(app); if (position == -1) return; - g_signal_emit(G_OBJECT(app->appstore), - signals[APPLICATION_ICON_CHANGED], 0, - position, newicon, TRUE); + emit_signal (app->appstore, "ApplicationIconChanged", + g_variant_new ("(is)", position, newicon)); } } return; } -/* Called when the Notification Item signals that it - has a new icon. */ -static void -new_icon (DBusGProxy * proxy, gpointer data) -{ - Application * app = (Application *)data; - if (!app->validated) return; - - org_freedesktop_DBus_Properties_get_async(app->prop_proxy, - NOTIFICATION_ITEM_DBUS_IFACE, - NOTIFICATION_ITEM_PROP_ICON_NAME, - new_icon_cb, - app); - return; -} - -/* Called when the Notification Item signals that it - has a new attention icon. */ -static void -new_aicon (DBusGProxy * proxy, gpointer data) -{ - Application * app = (Application *)data; - if (!app->validated) return; - - org_freedesktop_DBus_Properties_get_async(app->prop_proxy, - NOTIFICATION_ITEM_DBUS_IFACE, - NOTIFICATION_ITEM_PROP_AICON_NAME, - new_aicon_cb, - app); - - return; -} - /* Called when the Notification Item signals that it has a new status. */ static void -new_status (DBusGProxy * proxy, const gchar * status, gpointer data) +new_status (Application * app, const gchar * status) { - Application * app = (Application *)data; - if (!app->validated) return; - app->status = string_to_status(status); apply_status(app); @@ -785,11 +827,8 @@ new_status (DBusGProxy * proxy, const gchar * status, gpointer data) /* Called when the Notification Item signals that it has a new icon theme path. */ static void -new_icon_theme_path (DBusGProxy * proxy, const gchar * icon_theme_path, gpointer data) +new_icon_theme_path (Application * app, const gchar * icon_theme_path) { - Application * app = (Application *)data; - if (!app->validated) return; - if (g_strcmp0(icon_theme_path, app->icon_theme_path)) { /* If the new icon theme path is actually a new icon theme path */ if (app->icon_theme_path != NULL) g_free(app->icon_theme_path); @@ -799,9 +838,10 @@ new_icon_theme_path (DBusGProxy * proxy, const gchar * icon_theme_path, gpointer gint position = get_position(app); if (position == -1) return; - g_signal_emit(G_OBJECT(app->appstore), - signals[APPLICATION_ICON_THEME_PATH_CHANGED], 0, - position, app->icon_theme_path, TRUE); + emit_signal (app->appstore, + "ApplicationIconThemePathChanged", + g_variant_new ("(is)", position, + app->icon_theme_path)); } } @@ -811,11 +851,8 @@ new_icon_theme_path (DBusGProxy * proxy, const gchar * icon_theme_path, gpointer /* Called when the Notification Item signals that it has a new label. */ static void -new_label (DBusGProxy * proxy, const gchar * label, const gchar * guide, gpointer data) +new_label (Application * app, const gchar * label, const gchar * guide) { - Application * app = (Application *)data; - if (!app->validated) return; - gboolean changed = FALSE; if (g_strcmp0(app->label, label) != 0) { @@ -840,11 +877,10 @@ new_label (DBusGProxy * proxy, const gchar * label, const gchar * guide, gpointe gint position = get_position(app); if (position == -1) return; - g_signal_emit(app->appstore, signals[APPLICATION_LABEL_CHANGED], 0, - position, - app->label != NULL ? app->label : "", - app->guide != NULL ? app->guide : "", - TRUE); + emit_signal (app->appstore, "ApplicationLabelChanged", + g_variant_new ("(iss)", position, + app->label != NULL ? app->label : "", + app->guide != NULL ? app->guide : "")); } return; @@ -862,15 +898,11 @@ application_service_appstore_application_add (ApplicationServiceAppstore * appst g_return_if_fail(IS_APPLICATION_SERVICE_APPSTORE(appstore)); g_return_if_fail(dbus_name != NULL && dbus_name[0] != '\0'); g_return_if_fail(dbus_object != NULL && dbus_object[0] != '\0'); - ApplicationServiceAppstorePrivate * priv = appstore->priv; Application * app = find_application(appstore, dbus_name, dbus_object); if (app != NULL) { g_warning("Application already exists! Rerequesting properties."); - org_freedesktop_DBus_Properties_get_all_async(app->prop_proxy, - NOTIFICATION_ITEM_DBUS_IFACE, - get_all_properties_cb, - app); + get_all_properties(app); return; } @@ -895,93 +927,101 @@ application_service_appstore_application_add (ApplicationServiceAppstore * appst app->visible_state = VISIBLE_STATE_HIDDEN; /* Get the DBus proxy for the NotificationItem interface */ + app->dbus_proxy_cancel = g_cancellable_new(); + g_dbus_proxy_new_for_bus(G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + app->dbus_name, + app->dbus_object, + NOTIFICATION_ITEM_DBUS_IFACE, + app->dbus_proxy_cancel, + dbus_proxy_cb, + app); + + /* We're returning, nothing is yet added until the properties + come back and give us more info. */ + return; +} + +/* Callback from trying to create the proxy for the app. */ +static void +dbus_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data) +{ GError * error = NULL; - app->dbus_proxy = dbus_g_proxy_new_for_name_owner(priv->bus, - app->dbus_name, - app->dbus_object, - NOTIFICATION_ITEM_DBUS_IFACE, - &error); + + Application * app = (Application *)user_data; + g_return_if_fail(app != NULL); + + GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error); + + if (app->dbus_proxy_cancel != NULL) { + g_object_unref(app->dbus_proxy_cancel); + app->dbus_proxy_cancel = NULL; + } if (error != NULL) { - g_warning("Unable to get notification item proxy for object '%s' on host '%s': %s", dbus_object, dbus_name, error->message); + g_error("Could not grab DBus proxy for %s: %s", app->dbus_name, error->message); g_error_free(error); - g_free(app); return; } - + + /* Okay, we're good to grab the proxy at this point, we're + sure that it's ours. */ + app->dbus_proxy = proxy; + /* We've got it, let's watch it for destruction */ - g_signal_connect(G_OBJECT(app->dbus_proxy), "destroy", G_CALLBACK(application_removed_cb), app); + g_signal_connect(proxy, "notify::g-name-owner", + G_CALLBACK(application_owner_changed), app); + g_signal_connect(proxy, "g-signal", G_CALLBACK(app_receive_signal), app); - /* Grab the property proxy interface */ - app->prop_proxy = dbus_g_proxy_new_for_name_owner(priv->bus, - app->dbus_name, - app->dbus_object, - DBUS_INTERFACE_PROPERTIES, - &error); + get_all_properties(app); - if (error != NULL) { - g_warning("Unable to get property proxy for object '%s' on host '%s': %s", dbus_object, dbus_name, error->message); - g_error_free(error); - g_object_unref(app->dbus_proxy); - g_free(app); - return; - } + return; +} - /* Connect to signals */ - dbus_g_proxy_add_signal(app->dbus_proxy, - NOTIFICATION_ITEM_SIG_NEW_ICON, - G_TYPE_INVALID); - dbus_g_proxy_add_signal(app->dbus_proxy, - NOTIFICATION_ITEM_SIG_NEW_AICON, - G_TYPE_INVALID); - dbus_g_proxy_add_signal(app->dbus_proxy, - NOTIFICATION_ITEM_SIG_NEW_STATUS, - G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_add_signal(app->dbus_proxy, - NOTIFICATION_ITEM_SIG_NEW_ICON_THEME_PATH, - G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_add_signal(app->dbus_proxy, - NOTIFICATION_ITEM_SIG_NEW_LABEL, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_INVALID); - - dbus_g_proxy_connect_signal(app->dbus_proxy, - NOTIFICATION_ITEM_SIG_NEW_ICON, - G_CALLBACK(new_icon), - app, - NULL); - dbus_g_proxy_connect_signal(app->dbus_proxy, - NOTIFICATION_ITEM_SIG_NEW_AICON, - G_CALLBACK(new_aicon), - app, - NULL); - dbus_g_proxy_connect_signal(app->dbus_proxy, - NOTIFICATION_ITEM_SIG_NEW_STATUS, - G_CALLBACK(new_status), - app, - NULL); - dbus_g_proxy_connect_signal(app->dbus_proxy, - NOTIFICATION_ITEM_SIG_NEW_ICON_THEME_PATH, - G_CALLBACK(new_icon_theme_path), - app, - NULL); - dbus_g_proxy_connect_signal(app->dbus_proxy, - NOTIFICATION_ITEM_SIG_NEW_LABEL, - G_CALLBACK(new_label), - app, - NULL); - - /* Get all the propertiees */ - org_freedesktop_DBus_Properties_get_all_async(app->prop_proxy, - NOTIFICATION_ITEM_DBUS_IFACE, - get_all_properties_cb, - app); +/* Receives all signals from the service, routed to the appropriate functions */ +static void +app_receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, + GVariant * parameters, gpointer user_data) +{ + Application * app = (Application *)user_data; + + if (!app->validated) return; + + if (g_strcmp0(signal_name, NOTIFICATION_ITEM_SIG_NEW_ICON) == 0) { + /* icon name isn't provided by signal, so look it up */ + GVariant * icon_name = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_ICON_NAME); + if (icon_name) { + new_icon(app, g_variant_get_string(icon_name, NULL)); + g_variant_unref(icon_name); + } + } + else if (g_strcmp0(signal_name, NOTIFICATION_ITEM_SIG_NEW_AICON) == 0) { + /* aicon name isn't provided by signal, so look it up */ + GVariant * aicon_name = g_dbus_proxy_get_cached_property(app->dbus_proxy, + NOTIFICATION_ITEM_PROP_AICON_NAME); + if (aicon_name) { + new_aicon(app, g_variant_get_string(aicon_name, NULL)); + g_variant_unref(aicon_name); + } + } + else if (g_strcmp0(signal_name, NOTIFICATION_ITEM_SIG_NEW_STATUS) == 0) { + const gchar * status; + g_variant_get(parameters, "(&s)", &status); + new_status(app, status); + } + else if (g_strcmp0(signal_name, NOTIFICATION_ITEM_SIG_NEW_ICON_THEME_PATH) == 0) { + const gchar * icon_theme_path; + g_variant_get(parameters, "(&s)", &icon_theme_path); + new_icon_theme_path(app, icon_theme_path); + } + else if (g_strcmp0(signal_name, NOTIFICATION_ITEM_SIG_NEW_LABEL) == 0) { + const gchar * label, * guide; + g_variant_get(parameters, "(&s&s)", &label, &guide); + new_label(app, label, guide); + } - /* We're returning, nothing is yet added until the properties - come back and give us more info. */ return; } @@ -1014,7 +1054,7 @@ application_service_appstore_application_remove (ApplicationServiceAppstore * ap Application * app = find_application(appstore, dbus_name, dbus_object); if (app != NULL) { - application_removed_cb(NULL, app); + application_owner_changed(NULL, NULL, app); } else { g_warning("Unable to find application %s:%s", dbus_name, dbus_object); } @@ -1050,12 +1090,12 @@ application_service_appstore_new (void) } /* DBus Interface */ -static gboolean -_application_service_server_get_applications (ApplicationServiceAppstore * appstore, GPtrArray ** apps, GError ** error) +static GVariant * +get_applications (ApplicationServiceAppstore * appstore) { ApplicationServiceAppstorePrivate * priv = appstore->priv; - *apps = g_ptr_array_new(); + GVariantBuilder * builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); GList * listpntr; gint position = 0; @@ -1065,56 +1105,13 @@ _application_service_server_get_applications (ApplicationServiceAppstore * appst continue; } - GValueArray * values = g_value_array_new(5); - - GValue value = {0}; - - /* Icon name */ - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, app->icon); - g_value_array_append(values, &value); - g_value_unset(&value); - - /* Position */ - g_value_init(&value, G_TYPE_INT); - g_value_set_int(&value, position++); - g_value_array_append(values, &value); - g_value_unset(&value); - - /* DBus Address */ - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, app->dbus_name); - g_value_array_append(values, &value); - g_value_unset(&value); - - /* DBus Object */ - g_value_init(&value, DBUS_TYPE_G_OBJECT_PATH); - g_value_set_static_boxed(&value, app->menu); - g_value_array_append(values, &value); - g_value_unset(&value); - - /* Icon path */ - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, app->icon_theme_path); - g_value_array_append(values, &value); - g_value_unset(&value); - - /* Label */ - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, app->label); - g_value_array_append(values, &value); - g_value_unset(&value); - - /* Guide */ - g_value_init(&value, G_TYPE_STRING); - g_value_set_string(&value, app->guide); - g_value_array_append(values, &value); - g_value_unset(&value); - - g_ptr_array_add(*apps, values); + g_variant_builder_add (builder, "(sisosss)", app->icon, + position++, app->dbus_name, app->menu, + app->icon_theme_path, app->label, + app->guide); } - return TRUE; + return g_variant_new("(a(sisosss))", builder); } /* Removes and approver from our list of approvers and @@ -1140,29 +1137,41 @@ approver_free (gpointer papprover, gpointer user_data) g_list_foreach(appstore->priv->applications, remove_approver, approver->proxy); if (approver->proxy != NULL) { - if (!approver->destroy_by_proxy) { - g_object_unref(approver->proxy); - } + g_object_unref(approver->proxy); approver->proxy = NULL; } + if (approver->proxy_cancel != NULL) { + g_cancellable_cancel(approver->proxy_cancel); + g_object_unref(approver->proxy_cancel); + approver->proxy_cancel = NULL; + } + g_free(approver); return; } /* What did the approver tell us? */ static void -approver_request_cb (DBusGProxy *proxy, gboolean OUT_approved, GError *error, gpointer userdata) +approver_request_cb (GObject *object, GAsyncResult *res, gpointer user_data) { + GDBusProxy * proxy = G_DBUS_PROXY(object); + Application * app = (Application *)user_data; + GError * error = NULL; + gboolean approved = TRUE; /* default to approved */ + GVariant * result; + + result = g_dbus_proxy_call_finish(proxy, res, &error); + if (error == NULL) { - g_debug("Approver responded: %s", OUT_approved ? "approve" : "rejected"); - } else { + g_variant_get(result, "(b)", &approved); + g_debug("Approver responded: %s", approved ? "approve" : "rejected"); + } + else { g_debug("Approver responded error: %s", error->message); } - Application * app = (Application *)userdata; - - if (OUT_approved || error != NULL) { + if (approved) { app->approved_by = g_list_prepend(app->approved_by, proxy); } else { app->approved_by = g_list_remove(app->approved_by, proxy); @@ -1179,48 +1188,34 @@ check_with_new_approver (gpointer papp, gpointer papprove) Application * app = (Application *)papp; Approver * approver = (Approver *)papprove; - org_ayatana_StatusNotifierApprover_approve_item_async(approver->proxy, - app->id, - app->category, - 0, - app->dbus_name, - app->dbus_object, - approver_request_cb, - app); + g_dbus_proxy_call(approver->proxy, "ApproveItem", + g_variant_new("(ssuso)", app->id, app->category, + 0, app->dbus_name, app->dbus_object), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + approver_request_cb, app); return; } -/* Look through all the approvers and find the one with a given - proxy. */ -static gint -approver_find_by_proxy (gconstpointer papprover, gconstpointer pproxy) -{ - Approver * approver = (Approver *)papprover; - - if (approver->proxy == pproxy) { - return 0; - } - - return -1; -} - /* Tracks when a proxy gets destroyed so that we know that the approver has dropped off the bus. */ static void -approver_destroyed (gpointer pproxy, gpointer pappstore) +approver_owner_changed (GObject * gobject, GParamSpec * pspec, + gpointer user_data) { - ApplicationServiceAppstore * appstore = APPLICATION_SERVICE_APPSTORE(pappstore); - - GList * lapprover = g_list_find_custom(appstore->priv->approvers, pproxy, approver_find_by_proxy); - if (lapprover == NULL) { - g_warning("Approver proxy died, but we don't seem to have that approver."); + Approver * approver = (Approver *)user_data; + ApplicationServiceAppstore * appstore = approver->appstore; + GDBusProxy * proxy = G_DBUS_PROXY(gobject); + + gchar * owner = g_dbus_proxy_get_name_owner(proxy); + if (owner != NULL) { + /* Reapprove everything with new owner */ + g_list_foreach(appstore->priv->applications, check_with_new_approver, approver); + g_free (owner); return; } - Approver * approver = (Approver *)lapprover->data; - approver->destroy_by_proxy = TRUE; - + /* Approver died */ appstore->priv->approvers = g_list_remove(appstore->priv->approvers, approver); approver_free(approver, appstore); @@ -1230,17 +1225,12 @@ approver_destroyed (gpointer pproxy, gpointer pappstore) /* A signal when an approver changes the why that it thinks about a particular indicator. */ void -approver_revise_judgement (DBusGProxy * proxy, gboolean new_status, gchar * address, DBusGProxy * get_path, gpointer user_data) +approver_revise_judgement (Approver * approver, gboolean new_status, const gchar * address, const gchar * path) { - g_return_if_fail(IS_APPLICATION_SERVICE_APPSTORE(user_data)); g_return_if_fail(address != NULL && address[0] != '\0'); - g_return_if_fail(get_path != NULL); - const gchar * path = dbus_g_proxy_get_path(get_path); g_return_if_fail(path != NULL && path[0] != '\0'); - ApplicationServiceAppstore * appstore = APPLICATION_SERVICE_APPSTORE(user_data); - - Application * app = find_application(appstore, address, path); + Application * app = find_application(approver->appstore, address, path); if (app == NULL) { g_warning("Unable to update approver status of application (%s:%s) as it was not found", address, path); @@ -1248,9 +1238,9 @@ approver_revise_judgement (DBusGProxy * proxy, gboolean new_status, gchar * addr } if (new_status) { - app->approved_by = g_list_prepend(app->approved_by, proxy); + app->approved_by = g_list_prepend(app->approved_by, approver->proxy); } else { - app->approved_by = g_list_remove(app->approved_by, proxy); + app->approved_by = g_list_remove(app->approved_by, approver->proxy); } apply_status(app); @@ -1267,39 +1257,79 @@ application_service_appstore_approver_add (ApplicationServiceAppstore * appstore ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE (appstore); Approver * approver = g_new0(Approver, 1); - approver->destroy_by_proxy = FALSE; + approver->appstore = appstore; + approver->proxy_cancel = NULL; + approver->proxy = NULL; + + approver->proxy_cancel = g_cancellable_new(); + g_dbus_proxy_new_for_bus(G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + dbus_name, + dbus_object, + NOTIFICATION_APPROVER_DBUS_IFACE, + approver->proxy_cancel, + approver_proxy_cb, + approver); + + priv->approvers = g_list_prepend(priv->approvers, approver); + + return; +} +/* Callback from trying to create the proxy for the approver. */ +static void +approver_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data) +{ GError * error = NULL; - approver->proxy = dbus_g_proxy_new_for_name_owner(priv->bus, - dbus_name, - dbus_object, - NOTIFICATION_APPROVER_DBUS_IFACE, - &error); + + Approver * approver = (Approver *)user_data; + g_return_if_fail(approver != NULL); + + GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error); + ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE (approver->appstore); + + if (approver->proxy_cancel != NULL) { + g_object_unref(approver->proxy_cancel); + approver->proxy_cancel = NULL; + } + if (error != NULL) { - g_warning("Unable to get approver interface on '%s:%s' : %s", dbus_name, dbus_object, error->message); + g_error("Could not grab DBus proxy for approver: %s", error->message); g_error_free(error); - g_free(approver); return; } - g_signal_connect(G_OBJECT(approver->proxy), "destroy", G_CALLBACK(approver_destroyed), appstore); - - dbus_g_proxy_add_signal(approver->proxy, - "ReviseJudgement", - G_TYPE_BOOLEAN, - G_TYPE_STRING, - DBUS_TYPE_G_OBJECT_PATH, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal(approver->proxy, - "ReviseJudgement", - G_CALLBACK(approver_revise_judgement), - appstore, - NULL); + /* Okay, we're good to grab the proxy at this point, we're + sure that it's ours. */ + approver->proxy = proxy; - priv->approvers = g_list_prepend(priv->approvers, approver); + /* We've got it, let's watch it for destruction */ + g_signal_connect(proxy, "notify::g-name-owner", + G_CALLBACK(approver_owner_changed), approver); + g_signal_connect(proxy, "g-signal", G_CALLBACK(approver_receive_signal), + approver); g_list_foreach(priv->applications, check_with_new_approver, approver); return; } +/* Receives all signals from the service, routed to the appropriate functions */ +static void +approver_receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, + GVariant * parameters, gpointer user_data) +{ + Approver * approver = (Approver *)user_data; + + if (g_strcmp0(signal_name, "ReviseJudgement") == 0) { + gboolean approved; + const gchar * address; + const gchar * path; + g_variant_get(parameters, "(b&s&o)", &approved, &address, &path); + approver_revise_judgement(approver, approved, address, path); + } + + return; +} + diff --git a/src/application-service.c b/src/application-service.c index 94e7d2e..68ac264 100644 --- a/src/application-service.c +++ b/src/application-service.c @@ -22,7 +22,6 @@ with this program. If not, see . #include "libindicator/indicator-service.h" -#include "notification-item-client.h" #include "application-service-appstore.h" #include "application-service-watcher.h" #include "dbus-shared.h" diff --git a/src/dbus-properties.xml b/src/dbus-properties.xml deleted file mode 100644 index c172895..0000000 --- a/src/dbus-properties.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/indicator-application.c b/src/indicator-application.c index ecf19e8..5bfde3b 100644 --- a/src/indicator-application.c +++ b/src/indicator-application.c @@ -28,10 +28,10 @@ with this program. If not, see . /* G Stuff */ #include #include +#include #include /* DBus Stuff */ -#include #ifdef HAVE_GTK3 #include #else @@ -46,7 +46,7 @@ with this program. If not, see . /* Local Stuff */ #include "dbus-shared.h" -#include "application-service-client.h" +#include "gen-application-service.xml.h" #include "application-service-marshal.h" #define PANEL_ICON_SUFFIX "panel" @@ -81,8 +81,8 @@ INDICATOR_SET_TYPE(INDICATOR_APPLICATION_TYPE) typedef struct _IndicatorApplicationPrivate IndicatorApplicationPrivate; struct _IndicatorApplicationPrivate { IndicatorServiceManager * sm; - DBusGConnection * bus; - DBusGProxy * service_proxy; + GCancellable * service_proxy_cancel; + GDBusProxy * service_proxy; GList * applications; GHashTable * theme_dirs; guint disconnect_kill; @@ -114,15 +114,17 @@ static void disconnected (IndicatorApplication * application); static void disconnected_helper (gpointer data, gpointer user_data); static gboolean disconnected_kill (gpointer user_data); static void disconnected_kill_helper (gpointer data, gpointer user_data); -static void application_added (DBusGProxy * proxy, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, const gchar * icon_theme_path, const gchar * label, const gchar * guide, IndicatorApplication * application); -static void application_removed (DBusGProxy * proxy, gint position , IndicatorApplication * application); -static void application_label_changed (DBusGProxy * proxy, gint position, const gchar * label, const gchar * guide, IndicatorApplication * application); -static void application_icon_changed (DBusGProxy * proxy, gint position, const gchar * iconname, IndicatorApplication * application); -static void application_icon_theme_path_changed (DBusGProxy * proxy, gint position, const gchar * icon_theme_path, IndicatorApplication * application); -static void get_applications (DBusGProxy *proxy, GPtrArray *OUT_applications, GError *error, gpointer userdata); -static void get_applications_helper (gpointer data, gpointer user_data); +static void application_added (IndicatorApplication * application, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, const gchar * icon_theme_path, const gchar * label, const gchar * guide); +static void application_removed (IndicatorApplication * application, gint position); +static void application_label_changed (IndicatorApplication * application, gint position, const gchar * label, const gchar * guide); +static void application_icon_changed (IndicatorApplication * application, gint position, const gchar * iconname); +static void application_icon_theme_path_changed (IndicatorApplication * application, gint position, const gchar * icon_theme_path); +static void get_applications (GObject * obj, GAsyncResult * res, gpointer user_data); +static void get_applications_helper (IndicatorApplication * self, GVariant * variant); static void theme_dir_unref(IndicatorApplication * ia, const gchar * dir); static void theme_dir_ref(IndicatorApplication * ia, const gchar * dir); +static void service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data); +static void receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data); G_DEFINE_TYPE (IndicatorApplication, indicator_application, INDICATOR_OBJECT_TYPE); @@ -141,28 +143,6 @@ indicator_application_class_init (IndicatorApplicationClass *klass) io_class->get_entries = get_entries; io_class->get_location = get_location; - dbus_g_object_register_marshaller(_application_service_marshal_VOID__STRING_INT_STRING_STRING_STRING_STRING_STRING, - G_TYPE_NONE, - G_TYPE_STRING, - G_TYPE_INT, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_object_register_marshaller(_application_service_marshal_VOID__INT_STRING, - G_TYPE_NONE, - G_TYPE_INT, - G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_object_register_marshaller(_application_service_marshal_VOID__INT_STRING_STRING, - G_TYPE_NONE, - G_TYPE_INT, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_INVALID); - return; } @@ -172,7 +152,7 @@ indicator_application_init (IndicatorApplication *self) IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(self); /* These are built in the connection phase */ - priv->bus = NULL; + priv->service_proxy_cancel = NULL; priv->service_proxy = NULL; priv->theme_dirs = NULL; priv->disconnect_kill = 0; @@ -197,9 +177,8 @@ indicator_application_dispose (GObject *object) } while (priv->applications != NULL) { - application_removed(priv->service_proxy, - 0, - INDICATOR_APPLICATION(object)); + application_removed(INDICATOR_APPLICATION(object), + 0); } if (priv->sm != NULL) { @@ -207,16 +186,17 @@ indicator_application_dispose (GObject *object) priv->sm = NULL; } - if (priv->bus != NULL) { - /* We're not incrementing the ref count on this one. */ - priv->bus = NULL; - } - if (priv->service_proxy != NULL) { g_object_unref(G_OBJECT(priv->service_proxy)); priv->service_proxy = NULL; } + if (priv->service_proxy_cancel != NULL) { + g_cancellable_cancel(priv->service_proxy_cancel); + g_object_unref(priv->service_proxy_cancel); + priv->service_proxy_cancel = NULL; + } + if (priv->theme_dirs != NULL) { while (g_hash_table_size(priv->theme_dirs)) { GList * keys = g_hash_table_get_keys(priv->theme_dirs); @@ -260,93 +240,59 @@ connected (IndicatorApplication * application) IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); g_debug("Connected to Application Indicator Service."); + if (priv->service_proxy_cancel == NULL && priv->service_proxy == NULL) { + /* Build the service proxy */ + priv->service_proxy_cancel = g_cancellable_new(); + + g_dbus_proxy_new_for_bus(G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + INDICATOR_APPLICATION_DBUS_ADDR, + INDICATOR_APPLICATION_DBUS_OBJ, + INDICATOR_APPLICATION_DBUS_IFACE, + priv->service_proxy_cancel, + service_proxy_cb, + application); + } + + return; +} + +/* Callback from trying to create the proxy for the service, this + could include starting the service. */ +static void +service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data) +{ GError * error = NULL; - /* Grab the session bus */ - if (priv->bus == NULL) { - priv->bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + IndicatorApplication * self = INDICATOR_APPLICATION(user_data); + g_return_if_fail(self != NULL); - if (error != NULL) { - g_error("Unable to get session bus: %s", error->message); - g_error_free(error); - return; - } + IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(self); + GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error); + + if (priv->service_proxy_cancel != NULL) { + g_object_unref(priv->service_proxy_cancel); + priv->service_proxy_cancel = NULL; } - if (priv->service_proxy == NULL) { - /* Build the service proxy */ - priv->service_proxy = dbus_g_proxy_new_for_name(priv->bus, - INDICATOR_APPLICATION_DBUS_ADDR, - INDICATOR_APPLICATION_DBUS_OBJ, - INDICATOR_APPLICATION_DBUS_IFACE); - - /* Set up proxy signals */ - g_debug("Setup proxy signals"); - dbus_g_proxy_add_signal(priv->service_proxy, - "ApplicationAdded", - G_TYPE_STRING, - G_TYPE_INT, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_add_signal(priv->service_proxy, - "ApplicationRemoved", - G_TYPE_INT, - G_TYPE_INVALID); - dbus_g_proxy_add_signal(priv->service_proxy, - "ApplicationIconChanged", - G_TYPE_INT, - G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_add_signal(priv->service_proxy, - "ApplicationIconThemePathChanged", - G_TYPE_INT, - G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_add_signal(priv->service_proxy, - "ApplicationLabelChanged", - G_TYPE_INT, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_INVALID); - - /* Connect to them */ - g_debug("Connect to them."); - dbus_g_proxy_connect_signal(priv->service_proxy, - "ApplicationAdded", - G_CALLBACK(application_added), - application, - NULL /* Disconnection Signal */); - dbus_g_proxy_connect_signal(priv->service_proxy, - "ApplicationRemoved", - G_CALLBACK(application_removed), - application, - NULL /* Disconnection Signal */); - dbus_g_proxy_connect_signal(priv->service_proxy, - "ApplicationIconChanged", - G_CALLBACK(application_icon_changed), - application, - NULL /* Disconnection Signal */); - dbus_g_proxy_connect_signal(priv->service_proxy, - "ApplicationIconThemePathChanged", - G_CALLBACK(application_icon_theme_path_changed), - application, - NULL /* Disconnection Signal */); - dbus_g_proxy_connect_signal(priv->service_proxy, - "ApplicationLabelChanged", - G_CALLBACK(application_label_changed), - application, - NULL /* Disconnection Signal */); + if (error != NULL) { + g_error("Could not grab DBus proxy for %s: %s", INDICATOR_APPLICATION_DBUS_ADDR, error->message); + g_error_free(error); + return; } + /* Okay, we're good to grab the proxy at this point, we're + sure that it's ours. */ + priv->service_proxy = proxy; + + g_signal_connect(proxy, "g-signal", G_CALLBACK(receive_signal), self); + /* Query it for existing applications */ g_debug("Request current apps"); - org_ayatana_indicator_application_service_get_applications_async(priv->service_proxy, - get_applications, - application); + g_dbus_proxy_call(priv->service_proxy, "GetApplications", NULL, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + get_applications, self); return; } @@ -397,7 +343,7 @@ disconnected_kill_helper (gpointer data, gpointer user_data) IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(user_data); ApplicationEntry * entry = (ApplicationEntry *)data; if (entry->old_service) { - application_removed(NULL, g_list_index(priv->applications, data), INDICATOR_APPLICATION(user_data)); + application_removed(INDICATOR_APPLICATION(user_data), g_list_index(priv->applications, data)); } return; } @@ -495,7 +441,7 @@ guess_label_size (ApplicationEntry * app) ApplicationEntry and signaling the indicator host that we've got a new indicator. */ static void -application_added (DBusGProxy * proxy, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, const gchar * icon_theme_path, const gchar * label, const gchar * guide, IndicatorApplication * application) +application_added (IndicatorApplication * application, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, const gchar * icon_theme_path, const gchar * label, const gchar * guide) { g_return_if_fail(IS_INDICATOR_APPLICATION(application)); g_debug("Building new application entry: %s with icon: %s", dbusaddress, iconname); @@ -574,7 +520,7 @@ application_added (DBusGProxy * proxy, const gchar * iconname, gint position, co /* This removes the application from the list and free's all of the memory associated with it. */ static void -application_removed (DBusGProxy * proxy, gint position, IndicatorApplication * application) +application_removed (IndicatorApplication * application, gint position) { g_return_if_fail(IS_INDICATOR_APPLICATION(application)); IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); @@ -621,7 +567,7 @@ application_removed (DBusGProxy * proxy, gint position, IndicatorApplication * a /* The callback for the signal that the label for an application has changed. */ static void -application_label_changed (DBusGProxy * proxy, gint position, const gchar * label, const gchar * guide, IndicatorApplication * application) +application_label_changed (IndicatorApplication * application, gint position, const gchar * label, const gchar * guide) { IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position); @@ -702,7 +648,7 @@ application_label_changed (DBusGProxy * proxy, gint position, const gchar * labe /* The callback for the signal that the icon for an application has changed. */ static void -application_icon_changed (DBusGProxy * proxy, gint position, const gchar * iconname, IndicatorApplication * application) +application_icon_changed (IndicatorApplication * application, gint position, const gchar * iconname) { IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position); @@ -732,7 +678,7 @@ application_icon_changed (DBusGProxy * proxy, gint position, const gchar * iconn /* The callback for the signal that the icon theme path for an application has changed. */ static void -application_icon_theme_path_changed (DBusGProxy * proxy, gint position, const gchar * icon_theme_path, IndicatorApplication * application) +application_icon_theme_path_changed (IndicatorApplication * application, gint position, const gchar * icon_theme_path) { IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position); @@ -758,16 +704,78 @@ application_icon_theme_path_changed (DBusGProxy * proxy, gint position, const gc return; } -/* This repsonds to the list of applications that the service +/* Receives all signals from the service, routed to the appropriate functions */ +static void +receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, + GVariant * parameters, gpointer user_data) +{ + IndicatorApplication * self = INDICATOR_APPLICATION(user_data); + + if (g_strcmp0(signal_name, "ApplicationAdded") == 0) { + const gchar * iconname; + gint position; + const gchar * dbusaddress; + const gchar * dbusobject; + const gchar * icon_theme_path; + const gchar * label; + const gchar * guide; + g_variant_get (parameters, "(&si&s&o&s&s&s)", &iconname, + &position, &dbusaddress, &dbusobject, + &icon_theme_path, &label, &guide); + application_added(self, iconname, position, dbusaddress, + dbusobject, icon_theme_path, label, guide); + } + else if (g_strcmp0(signal_name, "ApplicationRemoved") == 0) { + gint position; + g_variant_get (parameters, "(i)", &position); + application_removed(self, position); + } + else if (g_strcmp0(signal_name, "ApplicationIconChanged") == 0) { + gint position; + const gchar * iconname; + g_variant_get (parameters, "(i&s)", &position, &iconname); + application_icon_changed(self, position, iconname); + } + else if (g_strcmp0(signal_name, "ApplicationIconThemePathChanged") == 0) { + gint position; + const gchar * icon_theme_path; + g_variant_get (parameters, "(i&s)", &position, &icon_theme_path); + application_icon_theme_path_changed(self, position, icon_theme_path); + } + else if (g_strcmp0(signal_name, "ApplicationLabelChanged") == 0) { + gint position; + const gchar * label; + const gchar * guide; + g_variant_get (parameters, "(i&s&s)", &position, &label, &guide); + application_label_changed(self, position, label, guide); + } + + return; +} + +/* This responds to the list of applications that the service has and calls application_added on each one of them. */ static void -get_applications (DBusGProxy *proxy, GPtrArray *OUT_applications, GError *error, gpointer userdata) +get_applications (GObject * obj, GAsyncResult * res, gpointer user_data) { + IndicatorApplication * self = INDICATOR_APPLICATION(user_data); + IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(self); + GError * error = NULL; + GVariant * result; + GVariant * child; + GVariantIter * iter; + + result = g_dbus_proxy_call_finish(priv->service_proxy, res, &error); + if (error != NULL) { g_warning("Unable to get application list: %s", error->message); return; } - g_ptr_array_foreach(OUT_applications, get_applications_helper, userdata); + + g_variant_get(result, "a(sisosss)", &iter); + while ((child = g_variant_iter_next_value (iter))) + get_applications_helper(self, child); + g_variant_iter_free (iter); return; } @@ -775,21 +783,20 @@ get_applications (DBusGProxy *proxy, GPtrArray *OUT_applications, GError *error, /* A little helper that takes apart the DBus structure and calls application_added on every entry in the list. */ static void -get_applications_helper (gpointer data, gpointer user_data) +get_applications_helper (IndicatorApplication * self, GVariant * variant) { - GValueArray * array = (GValueArray *)data; - - g_return_if_fail(array->n_values == 7); - - const gchar * icon_name = g_value_get_string(g_value_array_get_nth(array, 0)); - gint position = g_value_get_int(g_value_array_get_nth(array, 1)); - const gchar * dbus_address = g_value_get_string(g_value_array_get_nth(array, 2)); - const gchar * dbus_object = g_value_get_boxed(g_value_array_get_nth(array, 3)); - const gchar * icon_theme_path = g_value_get_string(g_value_array_get_nth(array, 4)); - const gchar * label = g_value_get_string(g_value_array_get_nth(array, 5)); - const gchar * guide = g_value_get_string(g_value_array_get_nth(array, 6)); - - return application_added(NULL, icon_name, position, dbus_address, dbus_object, icon_theme_path, label, guide, user_data); + const gchar * icon_name; + gint position; + const gchar * dbus_address; + const gchar * dbus_object; + const gchar * icon_theme_path; + const gchar * label; + const gchar * guide; + g_variant_get(variant, "(sisosss)", &icon_name, &position, + &dbus_address, &dbus_object, &icon_theme_path, &label, + &guide); + + return application_added(self, icon_name, position, dbus_address, dbus_object, icon_theme_path, label, guide); } /* Unrefs a theme directory. This may involve removing it from diff --git a/src/notification-item.xml b/src/notification-item.xml deleted file mode 100644 index 05afd83..0000000 --- a/src/notification-item.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test-approver.c b/tests/test-approver.c index adad4a7..47fb97d 100644 --- a/tests/test-approver.c +++ b/tests/test-approver.c @@ -1,8 +1,6 @@ #include #include -#include - #include "notification-watcher-client.h" #include "dbus-shared.h" #include "libappindicator/app-indicator.h" @@ -37,11 +35,9 @@ static void test_approver_class_init (TestApproverClass *klass); static void test_approver_init (TestApprover *self); static gboolean _notification_approver_server_approve_item (TestApprover * ta, const gchar * id, const gchar * category, guint pid, const gchar * address, const gchar * path, gboolean * approved, GError ** error); -#include "../src/notification-approver-server.h" - GMainLoop * main_loop = NULL; -DBusGConnection * session_bus = NULL; -DBusGProxy * bus_proxy = NULL; +GDBusConnection * session_bus = NULL; +GDBusProxy * bus_proxy = NULL; AppIndicator * app_indicator = NULL; gboolean passed = FALSE; -- cgit v1.2.3 From 4b0e0720e7b2d0ace18dc6bffc7c073b59af5565 Mon Sep 17 00:00:00 2001 From: Michael Terry Date: Wed, 12 Jan 2011 11:16:55 -0500 Subject: fix bug with gvariant string; port test --- src/Makefile.am | 8 +-- src/indicator-application.c | 2 +- tests/Makefile.am | 1 + tests/test-approver.c | 126 +++++++++++++++++++++++++++++++++++--------- 4 files changed, 107 insertions(+), 30 deletions(-) (limited to 'tests') diff --git a/src/Makefile.am b/src/Makefile.am index 49a4d6a..35c40c5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -80,10 +80,10 @@ DISTCLEANFILES += app-indicator-enum-types.c ################################## GDBUS_SPECS = \ - application-service.xml + application-service.xml \ + notification-approver.xml DBUS_SPECS = \ - notification-approver.xml \ notification-watcher.xml %-client.h: %.xml @@ -114,7 +114,9 @@ BUILT_SOURCES += \ $(DBUS_SPECS:.xml=-client.h) \ $(DBUS_SPECS:.xml=-server.h) \ gen-application-service.xml.c \ - gen-application-service.xml.h + gen-application-service.xml.h \ + gen-notification-approver.xml.c \ + gen-notification-approver.xml.h CLEANFILES += $(BUILT_SOURCES) diff --git a/src/indicator-application.c b/src/indicator-application.c index 5bfde3b..1de8785 100644 --- a/src/indicator-application.c +++ b/src/indicator-application.c @@ -772,7 +772,7 @@ get_applications (GObject * obj, GAsyncResult * res, gpointer user_data) return; } - g_variant_get(result, "a(sisosss)", &iter); + g_variant_get(result, "(a(sisosss))", &iter); while ((child = g_variant_iter_next_value (iter))) get_applications_helper(self, child); g_variant_iter_free (iter); diff --git a/tests/Makefile.am b/tests/Makefile.am index cef1eda..a885dff 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -14,6 +14,7 @@ DBUS_RUNNER=dbus-test-runner --dbus-config /usr/share/dbus-test-runner/session.c ######################################### test_approver_SOURCES = \ + $(top_srcdir)/src/gen-notification-approver.xml.c \ test-approver.c test_approver_CFLAGS = \ diff --git a/tests/test-approver.c b/tests/test-approver.c index 47fb97d..6fc75c5 100644 --- a/tests/test-approver.c +++ b/tests/test-approver.c @@ -1,9 +1,10 @@ #include #include +#include -#include "notification-watcher-client.h" #include "dbus-shared.h" #include "libappindicator/app-indicator.h" +#include "gen-notification-approver.xml.h" #define APPROVER_PATH "/my/approver" @@ -33,11 +34,22 @@ GType test_approver_get_type (void); static void test_approver_class_init (TestApproverClass *klass); static void test_approver_init (TestApprover *self); -static gboolean _notification_approver_server_approve_item (TestApprover * ta, const gchar * id, const gchar * category, guint pid, const gchar * address, const gchar * path, gboolean * approved, GError ** error); +static GVariant * approve_item (TestApprover * ta, const gchar * id); +static void bus_method_call (GDBusConnection * connection, const gchar * sender, const gchar * path, const gchar * interface, const gchar * method, GVariant * params, GDBusMethodInvocation * invocation, gpointer user_data); + +/* GDBus Stuff */ +static GDBusNodeInfo * node_info = NULL; +static GDBusInterfaceInfo * interface_info = NULL; +static GDBusInterfaceVTable interface_table = { + method_call: bus_method_call, + get_property: NULL, /* No properties */ + set_property: NULL /* No properties */ +}; GMainLoop * main_loop = NULL; GDBusConnection * session_bus = NULL; GDBusProxy * bus_proxy = NULL; +GDBusProxy * watcher_proxy = NULL; AppIndicator * app_indicator = NULL; gboolean passed = FALSE; @@ -46,8 +58,24 @@ G_DEFINE_TYPE (TestApprover, test_approver, G_TYPE_OBJECT); static void test_approver_class_init (TestApproverClass *klass) { - dbus_g_object_type_install_info(TEST_APPROVER_TYPE, - &dbus_glib__notification_approver_server_object_info); + /* Setting up the DBus interfaces */ + if (node_info == NULL) { + GError * error = NULL; + + node_info = g_dbus_node_info_new_for_xml(_notification_approver, &error); + if (error != NULL) { + g_error("Unable to parse Approver Service Interface description: %s", error->message); + g_error_free(error); + } + } + + if (interface_info == NULL) { + interface_info = g_dbus_node_info_lookup_interface(node_info, NOTIFICATION_APPROVER_DBUS_IFACE); + + if (interface_info == NULL) { + g_error("Unable to find interface '" NOTIFICATION_APPROVER_DBUS_IFACE "'"); + } + } return; } @@ -55,17 +83,29 @@ test_approver_class_init (TestApproverClass *klass) static void test_approver_init (TestApprover *self) { - dbus_g_connection_register_g_object(session_bus, - APPROVER_PATH, - G_OBJECT(self)); + GError * error = NULL; + + /* Now register our object on our new connection */ + g_dbus_connection_register_object(session_bus, + APPROVER_PATH, + interface_info, + &interface_table, + self, + NULL, + &error); + + if (error != NULL) { + g_error("Unable to register the object to DBus: %s", error->message); + g_error_free(error); + return; + } return; } -static gboolean -_notification_approver_server_approve_item (TestApprover * ta, const gchar * id, const gchar * category, guint pid, const gchar * address, const gchar * path, gboolean * approved, GError ** error) +static GVariant * +approve_item (TestApprover * ta, const gchar * id) { - *approved = TRUE; g_debug("Asked to approve indicator"); if (g_strcmp0(id, INDICATOR_ID) == 0) { @@ -74,12 +114,41 @@ _notification_approver_server_approve_item (TestApprover * ta, const gchar * id, g_main_loop_quit(main_loop); - return TRUE; + return g_variant_new("(b)", TRUE); } +/* A method has been called from our dbus inteface. Figure out what it + is and dispatch it. */ static void -register_cb (DBusGProxy * proxy, GError * error, gpointer user_data) +bus_method_call (GDBusConnection * connection, const gchar * sender, + const gchar * path, const gchar * interface, + const gchar * method, GVariant * params, + GDBusMethodInvocation * invocation, gpointer user_data) { + TestApprover * ta = (TestApprover *)user_data; + GVariant * retval = NULL; + + if (g_strcmp0(method, "ApproveItem") == 0) { + const gchar * id; + g_variant_get(params, "(&ssuso)", &id, NULL, NULL, NULL, NULL); + retval = approve_item(ta, id); + } else { + g_warning("Calling method '%s' on the indicator service and it's unknown", method); + } + + g_dbus_method_invocation_return_value(invocation, retval); + return; +} + +static void +register_cb (GObject *object, GAsyncResult *res, gpointer user_data) +{ + GDBusProxy * proxy = G_DBUS_PROXY(object); + GError * error = NULL; + GVariant * result; + + result = g_dbus_proxy_call_finish(proxy, res, &error); + if (error != NULL) { g_warning("Unable to register approver: %s", error->message); g_error_free(error); @@ -114,18 +183,17 @@ check_for_service (gpointer user_data) owner_count++; gboolean has_owner = FALSE; - org_freedesktop_DBus_name_has_owner(bus_proxy, NOTIFICATION_WATCHER_DBUS_ADDR, &has_owner, NULL); + gchar * owner = g_dbus_proxy_get_name_owner(bus_proxy); + has_owner = (owner != NULL); + g_free (owner); if (has_owner) { - const char * cats = NULL; - DBusGProxy * proxy = dbus_g_proxy_new_for_name(session_bus, - NOTIFICATION_WATCHER_DBUS_ADDR, - NOTIFICATION_WATCHER_DBUS_OBJ, - NOTIFICATION_WATCHER_DBUS_IFACE); - g_debug("Registering Approver"); - org_kde_StatusNotifierWatcher_x_ayatana_register_notification_approver_async (proxy, APPROVER_PATH, &cats, register_cb, NULL); - + GVariantBuilder * builder = g_variant_builder_new(G_VARIANT_TYPE("as")); + g_dbus_proxy_call(bus_proxy, "XAyatanaRegisterNotificationApprover", + g_variant_new("(oas)", APPROVER_PATH, builder), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, register_cb, + NULL); return FALSE; } @@ -148,16 +216,22 @@ main (int argc, char ** argv) gtk_init(&argc, &argv); g_debug("Initing"); - session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + session_bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error); + TestApprover * approver = g_object_new(TEST_APPROVER_TYPE, NULL); + + bus_proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, NULL, NOTIFICATION_WATCHER_DBUS_ADDR, NOTIFICATION_WATCHER_DBUS_OBJ, NOTIFICATION_WATCHER_DBUS_IFACE, NULL, &error); if (error != NULL) { - g_warning("Unable to get session bus: %s", error->message); + g_warning("Unable to get bus proxy: %s", error->message); g_error_free(error); return -1; } - TestApprover * approver = g_object_new(TEST_APPROVER_TYPE, NULL); - - bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + watcher_proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, NULL, NOTIFICATION_WATCHER_DBUS_ADDR, NOTIFICATION_WATCHER_DBUS_OBJ, NOTIFICATION_WATCHER_DBUS_IFACE, NULL, &error); + if (error != NULL) { + g_warning("Unable to get watcher bus: %s", error->message); + g_error_free(error); + return -1; + } g_timeout_add(100, check_for_service, NULL); g_timeout_add_seconds(2, fail_timeout, NULL); -- cgit v1.2.3