From f57e5d9f6a6f07fe87c2f9b60b40a832d8831097 Mon Sep 17 00:00:00 2001 From: Philip Van Hoof Date: Mon, 17 Jan 2011 13:47:54 +0100 Subject: 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(-) (limited to 'examples') diff --git a/examples/class-signal/Makefile.am b/examples/class-signal/Makefile.am index 313b8fdaf..a4400c95c 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 de36281da..65750c2dc 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 -#include +#include #include -#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; } -- cgit v1.2.1