← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~mterry/indicator-application/gdbus into lp:indicator-application

 

Michael Terry has proposed merging lp:~mterry/indicator-application/gdbus into lp:indicator-application.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)

For more details, see:
https://code.launchpad.net/~mterry/indicator-application/gdbus/+merge/46009
-- 
https://code.launchpad.net/~mterry/indicator-application/gdbus/+merge/46009
Your team ayatana-commits is subscribed to branch lp:indicator-application.
=== modified file '.bzrignore'
--- .bzrignore	2010-08-11 16:10:03 +0000
+++ .bzrignore	2011-01-12 16:51:50 +0000
@@ -4,8 +4,6 @@
 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-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

=== modified file 'configure.ac'
--- configure.ac	2010-12-08 19:16:13 +0000
+++ configure.ac	2011-01-12 16:51:50 +0000
@@ -31,6 +31,7 @@
 
 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 @@
   [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 @@
         ],
       [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

=== modified file 'src/Makefile.am'
--- src/Makefile.am	2010-12-08 19:09:39 +0000
+++ src/Makefile.am	2011-01-12 16:51:50 +0000
@@ -39,11 +39,8 @@
 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 @@
 	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 @@
 # DBus Specs
 ##################################
 
+GDBUS_SPECS = \
+	application-service.xml \
+	notification-approver.xml
+
 DBUS_SPECS = \
-	dbus-properties.xml \
-	application-service.xml \
-	notification-approver.xml \
-	notification-item.xml \
 	notification-watcher.xml
 
 %-client.h: %.xml
@@ -102,10 +100,24 @@
 		--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 \
+	gen-notification-approver.xml.c \
+	gen-notification-approver.xml.h
 
 CLEANFILES += $(BUILT_SOURCES)
 
-EXTRA_DIST += $(DBUS_SPECS)
+EXTRA_DIST += $(DBUS_SPECS) $(GDBUS_SPECS)

=== modified file 'src/application-service-appstore.c'
--- src/application-service-appstore.c	2010-12-02 22:49:42 +0000
+++ src/application-service-appstore.c	2011-01-12 16:51:50 +0000
@@ -24,20 +24,18 @@
 #include "config.h"
 #endif
 
-#include <dbus/dbus-glib.h>
 #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 @@
 
 /* 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 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 @@
 	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 @@
 #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 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 @@
 	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 @@
 
 	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 @@
 	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);
-	if (error != NULL) {
-		g_error("Unable to get session bus: %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;
-
+	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 register the object to DBus: %s", error->message);
+		g_error_free(error);
+		return;
+	}
+
+	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 @@
 		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 @@
    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));
-	}
-
-	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);
+	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);
+	}
+
+	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 @@
 
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 		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 @@
 		/* 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 @@
 	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 @@
 			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,9 +805,8 @@
 			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));
 		}
 	}
 
@@ -736,46 +814,10 @@
 }
 
 /* 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 @@
 /* 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 @@
 			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 @@
 /* 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 @@
 		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 @@
 	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,96 +927,104 @@
 	app->visible_state = VISIBLE_STATE_HIDDEN;
 
 	/* Get the DBus proxy for the NotificationItem interface */
-	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);
-
-	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_free(error);
-		g_free(app);
-		return;
-	}
-	
-	/* 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);
-
-	/* 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);
-
-	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;
-	}
-
-	/* 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);
+	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;
+
+	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_error("Could not grab DBus proxy for %s: %s", app->dbus_name, 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. */
+	app->dbus_proxy = proxy;
+
+	/* We've got it, let's watch it for destruction */
+	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);
+
+	get_all_properties(app);
+
+	return;
+}
+
+/* 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);
+	}
+
+	return;
+}
+
 /* Looks for an application in the list of applications */
 static Application *
 find_application (ApplicationServiceAppstore * appstore, const gchar * address, const gchar * object)
@@ -1014,7 +1054,7 @@
 
 	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 @@
 }
 
 /* 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 @@
 			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 @@
 	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 @@
 	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);
+	Approver * approver = (Approver *)user_data;
+	ApplicationServiceAppstore * appstore = approver->appstore;
+	GDBusProxy * proxy = G_DBUS_PROXY(gobject);
 
-	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.");
+	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 @@
 /* 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 @@
 	}
 
 	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 @@
 	ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE (appstore);
 
 	Approver * approver = g_new0(Approver, 1);
-	approver->destroy_by_proxy = FALSE;
-
-	GError * error = NULL;
-	approver->proxy = dbus_g_proxy_new_for_name_owner(priv->bus,
-	                                                  dbus_name,
-	                                                  dbus_object,
-	                                                  NOTIFICATION_APPROVER_DBUS_IFACE,
-	                                                  &error);
-	if (error != NULL) {
-		g_warning("Unable to get approver interface on '%s:%s' : %s", dbus_name, dbus_object, 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);
+	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 * 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_error("Could not grab DBus proxy for approver: %s", 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. */
+	approver->proxy = proxy;
+
+	/* 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;
+}
+

=== modified file 'src/application-service.c'
--- src/application-service.c	2010-08-10 19:47:23 +0000
+++ src/application-service.c	2011-01-12 16:51:50 +0000
@@ -22,7 +22,6 @@
 
 
 #include "libindicator/indicator-service.h"
-#include "notification-item-client.h"
 #include "application-service-appstore.h"
 #include "application-service-watcher.h"
 #include "dbus-shared.h"

=== removed file 'src/dbus-properties.xml'
--- src/dbus-properties.xml	2009-11-07 04:50:48 +0000
+++ src/dbus-properties.xml	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<node name="/">
-	<interface name="org.freedesktop.DBus.Properties">
-
-	<method name="Get">
-		<arg direction="in" type="s" name="Interface_Name"/>
-		<arg direction="in" type="s" name="Property_Name"/>
-		<arg direction="out" type="v" name="Value"/>
-	</method>
-
-	<method name="Set">
-		<arg direction="in" type="s" name="Interface_Name"/>
-		<arg direction="in" type="s" name="Property_Name"/>
-		<arg direction="in" type="v" name="Value"/>
-	</method>
-
-	<method name="GetAll">
-		<arg direction="in" type="s" name="Interface_Name"/>
-		<arg direction="out" type="a{sv}" name="Properties"/>
-	</method>
-
-	</interface>
-</node>

=== modified file 'src/indicator-application.c'
--- src/indicator-application.c	2010-12-04 03:21:06 +0000
+++ src/indicator-application.c	2011-01-12 16:51:50 +0000
@@ -28,10 +28,10 @@
 /* G Stuff */
 #include <glib.h>
 #include <glib-object.h>
+#include <gio/gio.h>
 #include <gtk/gtk.h>
 
 /* DBus Stuff */
-#include <dbus/dbus-glib.h>
 #ifdef HAVE_GTK3
 #include <libdbusmenu-gtk3/menu.h>
 #else
@@ -46,7 +46,7 @@
 
 /* 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 @@
 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_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 @@
 	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 @@
 	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 @@
 	}
 
 	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 @@
 		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 @@
 	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);
-
-		if (error != NULL) {
-			g_error("Unable to get session bus: %s", error->message);
-			g_error_free(error);
-			return;
-		}
-	}
-
-	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 */);
-	}
+	IndicatorApplication * self = INDICATOR_APPLICATION(user_data);
+	g_return_if_fail(self != NULL);
+
+	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 (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 @@
 	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 @@
    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 @@
 /* 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 @@
 /* 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 @@
 /* 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 @@
 /* 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 @@
 	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 @@
 /* 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

=== removed file 'src/notification-item.xml'
--- src/notification-item.xml	2010-08-11 20:55:25 +0000
+++ src/notification-item.xml	1970-01-01 00:00:00 +0000
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<node name="/StatusNotifierItem">
-	<interface name="org.kde.StatusNotifierItem">
-
-<!-- Properties -->
-		<property name="Id" type="s" access="read" />
-		<property name="Category" type="s" access="read" />
-		<property name="Status" type="s" access="read" />
-		<property name="IconName" type="s" access="read" />
-		<property name="AttentionIconName" type="s" access="read" />
-		<!-- An additional path to add to the theme search path
-		     to find the icons specified above. -->
-		<property name="IconThemePath" type="s" access="read" />
-		<property name="Menu" type="o" access="read" />
-		<property name="XAyatanaLabel" type="s" access="read" />
-		<property name="XAyatanaLabelGuide" type="s" access="read" />
-		<property name="XAyatanaOrderingIndex" type="u" access="read" />
-
-<!-- Methods -->
-		<!-- None currently -->
-
-<!-- Signals -->
-		<signal name="NewIcon">
-		</signal>
-		<signal name="NewIconThemePath">
-		    <arg type="s" name="icon_theme_path" direction="out" />
-	    </signal>
-		<signal name="NewAttentionIcon">
-		</signal>
-		<signal name="NewStatus">
-			<arg type="s" name="status" direction="out" />
-		</signal>
-		<signal name="XAyatanaNewLabel">
-			<arg type="s" name="label" direction="out" />
-			<arg type="s" name="guide" direction="out" />
-		</signal>
-
-	</interface>
-</node>

=== modified file 'tests/Makefile.am'
--- tests/Makefile.am	2010-12-02 22:56:23 +0000
+++ tests/Makefile.am	2011-01-12 16:51:50 +0000
@@ -14,6 +14,7 @@
 #########################################
 
 test_approver_SOURCES = \
+	$(top_srcdir)/src/gen-notification-approver.xml.c \
 	test-approver.c
 
 test_approver_CFLAGS = \

=== modified file 'tests/test-approver.c'
--- tests/test-approver.c	2010-12-02 22:56:23 +0000
+++ tests/test-approver.c	2011-01-12 16:51:50 +0000
@@ -1,11 +1,10 @@
 #include <glib.h>
 #include <glib-object.h>
-
-#include <dbus/dbus-glib-bindings.h>
-
-#include "notification-watcher-client.h"
+#include <gio/gio.h>
+
 #include "dbus-shared.h"
 #include "libappindicator/app-indicator.h"
+#include "gen-notification-approver.xml.h"
 
 #define APPROVER_PATH  "/my/approver"
 
@@ -35,13 +34,22 @@
 
 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);
 
-#include "../src/notification-approver-server.h"
+/* 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;
-DBusGConnection * session_bus = NULL;
-DBusGProxy * bus_proxy = NULL;
+GDBusConnection * session_bus = NULL;
+GDBusProxy * bus_proxy = NULL;
+GDBusProxy * watcher_proxy = NULL;
 AppIndicator * app_indicator = NULL;
 gboolean passed = FALSE;
 
@@ -50,8 +58,24 @@
 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;
 }
@@ -59,17 +83,29 @@
 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) {
@@ -78,12 +114,41 @@
 
 	g_main_loop_quit(main_loop);
 
-	return TRUE;
-}
-
-static void
-register_cb (DBusGProxy * proxy, GError * error, gpointer user_data)
-{
+	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
+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);
@@ -118,18 +183,17 @@
 	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;
 	}
 
@@ -152,16 +216,22 @@
 	gtk_init(&argc, &argv);
 	g_debug("Initing");
 
-	session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
-	if (error != NULL) {
-		g_warning("Unable to get session bus: %s", error->message);
-		g_error_free(error);
-		return -1;
-	}
-
+	session_bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
 	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);
+	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 bus proxy: %s", error->message);
+		g_error_free(error);
+		return -1;
+	}
+
+	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);


Follow ups