[tracker/gdbus] examples: class-signal: GDBus port of the class signal example



commit 1b83707294990c0a8760a1c03d583c2ead071b4b
Author: Philip Van Hoof <philip codeminded be>
Date:   Mon Jan 17 13:47:54 2011 +0100

    examples: class-signal: GDBus port of the class signal example

 examples/class-signal/Makefile.am    |   23 +++------
 examples/class-signal/class-signal.c |   84 ++++++++++++++-------------------
 2 files changed, 43 insertions(+), 64 deletions(-)
---
diff --git a/examples/class-signal/Makefile.am b/examples/class-signal/Makefile.am
index 313b8fd..a4400c9 100644
--- a/examples/class-signal/Makefile.am
+++ b/examples/class-signal/Makefile.am
@@ -2,23 +2,14 @@ include $(top_srcdir)/Makefile.decl
 
 noinst_PROGRAMS = class-signal
 
-AM_CPPFLAGS =                                          \
-	$(BUILD_CFLAGS)                                \
-	-I$(top_srcdir)/src                            \
-	$(LIBTRACKER_SPARQL_CFLAGS)                    \
-	$(TRACKER_DBUS_CFLAGS)
+AM_CPPFLAGS = \
+	$(BUILD_CFLAGS) \
+	-I$(top_srcdir)/src \
+	$(LIBTRACKER_SPARQL_CFLAGS)
 
-LDADD =                                                \
+LDADD = \
 	$(top_builddir)/src/libtracker-sparql/libtracker-sparql-$(TRACKER_API_VERSION).la \
-	$(BUILD_LIBS)                                  \
-	$(LIBTRACKER_SPARQL_LIBS)                      \
-	$(TRACKER_DBUS_LIBS)
-
-# NOTE: class-signal needed to have gio/dbus/dbus-glib-1 CFLAGS/LIBS
-# added. The reason for this is that the
-# LIBTRACKER_SPARQL_{CFLAGS|LIBS} no longer include dbus/dbus-glib-1
-# so these tests fail without that. The fix is to update the test
-# cases to use gdbus. For now this is a temporary fix for these tests,
-# -mr.
+	$(BUILD_LIBS) \
+	$(LIBTRACKER_SPARQL_LIBS)
 
 class_signal_SOURCES = class-signal.c
diff --git a/examples/class-signal/class-signal.c b/examples/class-signal/class-signal.c
index de36281..65750c2 100644
--- a/examples/class-signal/class-signal.c
+++ b/examples/class-signal/class-signal.c
@@ -17,17 +17,10 @@
  * Boston, MA  02110-1301, USA.
  */
 
-#include <dbus/dbus-glib-bindings.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gio/gio.h>
 
 #include <libtracker-sparql/tracker-sparql.h>
 
-#define DBUS_MATCH_STR	                                  \
-	"type='signal', "                                 \
-	"sender='" TRACKER_DBUS_SERVICE "', "             \
-	"path='" TRACKER_DBUS_OBJECT_RESOURCES "', "      \
-	"interface='" TRACKER_DBUS_INTERFACE_RESOURCES "'"
-
 static TrackerSparqlConnection *con;
 
 static void
@@ -56,68 +49,63 @@ handle_statement (gint subject, gint predicate)
 }
 
 static void
-class_signal_cb (DBusMessage *message)
+class_signal_cb (GDBusConnection *connection,
+                 const gchar     *sender_name,
+                 const gchar     *object_path,
+                 const gchar     *interface_name,
+                 const gchar     *signal_name,
+                 GVariant        *parameters,
+                 gpointer         user_data)
+
 {
-	DBusMessageIter iter, arr;
+	GVariantIter *iter1, *iter2;
 	gchar *class_name;
-	gint arg_type, i;
+	gint graph = 0, subject = 0, predicate = 0, object = 0;
 
-	dbus_message_iter_init (message, &iter);
-	dbus_message_iter_get_basic (&iter, &class_name);
+	g_variant_get (parameters, "(&sa(iiii)a(iiii))", &class_name, &iter1, &iter2);
 	g_print ("%s:\n", class_name);
 
-	for (i = 0; i < 2; i++) {
-		dbus_message_iter_next (&iter);
-		dbus_message_iter_recurse (&iter, &arr);
-
-		while ((arg_type = dbus_message_iter_get_arg_type (&arr)) != DBUS_TYPE_INVALID) {
-			DBusMessageIter strct;
-			gint graph = 0, subject = 0, predicate = 0, object = 0;
-
-			dbus_message_iter_recurse (&arr, &strct);
-			dbus_message_iter_get_basic (&strct, &graph);
-			dbus_message_iter_next (&strct);
-			dbus_message_iter_get_basic (&strct, &subject);
-			dbus_message_iter_next (&strct);
-			dbus_message_iter_get_basic (&strct, &predicate);
-			dbus_message_iter_next (&strct);
-			dbus_message_iter_get_basic (&strct, &object);
-			handle_statement (subject, predicate);
-			dbus_message_iter_next (&arr);
-		}
+	while (g_variant_iter_loop (iter1, "(iiii)", &graph, &subject, &predicate, &object)) {
+		handle_statement (subject, predicate);
 	}
-}
 
-static DBusHandlerResult
-message_filter (DBusConnection *connection, DBusMessage *message, gpointer ud)
-{
-	if (dbus_message_is_signal (message, TRACKER_DBUS_INTERFACE_RESOURCES, "GraphUpdated")) {
-		class_signal_cb (message);
-		return DBUS_HANDLER_RESULT_HANDLED;
+	while (g_variant_iter_loop (iter2, "(iiii)", &graph, &subject, &predicate, &object)) {
+		handle_statement (subject, predicate);
 	}
-	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
 
+	g_variant_iter_free (iter1);
+	g_variant_iter_free (iter2);
+}
 
 gint
 main (gint argc, gchar *argv[])
 {
 	GMainLoop *loop;
 	GError *error = NULL;
-	DBusConnection *connection;
+	GDBusConnection *connection;
+	guint signal_id;
 
 	g_type_init ();
 	loop = g_main_loop_new (NULL, FALSE);
 	con = tracker_sparql_connection_get (NULL, &error);
-	connection = dbus_bus_get_private (DBUS_BUS_SESSION, NULL);
-	dbus_bus_request_name (connection, TRACKER_DBUS_SERVICE, 0, NULL);
-	dbus_connection_add_filter (connection, message_filter, NULL, NULL);
-	dbus_bus_add_match (connection, DBUS_MATCH_STR, NULL);
-	dbus_connection_setup_with_g_main (connection, NULL);
+	connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
+
+	signal_id = g_dbus_connection_signal_subscribe (connection,
+	                                                TRACKER_DBUS_SERVICE,
+	                                                TRACKER_DBUS_INTERFACE_RESOURCES,
+	                                                "GraphUpdated",
+	                                                TRACKER_DBUS_OBJECT_RESOURCES,
+	                                                NULL, /* Use class-name here */
+	                                                G_DBUS_SIGNAL_FLAGS_NONE,
+	                                                class_signal_cb,
+	                                                NULL,
+	                                                NULL);
+
 	g_main_loop_run (loop);
+	g_dbus_connection_signal_unsubscribe (connection, signal_id);
 	g_main_loop_unref (loop);
 	g_object_unref (con);
-	dbus_connection_unref (connection);
+	g_object_unref (connection);
 
 	return 0;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]