diff options
-rw-r--r-- | src/Makefile.am | 8 | ||||
-rw-r--r-- | src/indicator-application.c | 2 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/test-approver.c | 126 |
4 files changed, 107 insertions, 30 deletions
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 <glib.h> #include <glib-object.h> +#include <gio/gio.h> -#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); |