From 8276d0e557259154beaf3f2997276ba32ee9c1ee Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Tue, 12 Apr 2011 09:28:09 -0400 Subject: [PATCH] Spiff up the "Migrating to GDBus" docs a bit Signed-off-by: David Zeuthen --- docs/reference/gio/migrating-gdbus.xml | 17 ++++--- gio/tests/Makefile.am | 2 +- gio/tests/gdbus-example-objectmanager-client.c | 65 ++++++++++++++++++++------ gio/tests/gdbus-example-objectmanager-server.c | 34 ++++++++++---- gio/tests/gdbus-example-objectmanager.xml | 18 ++++++- 5 files changed, 106 insertions(+), 30 deletions(-) diff --git a/docs/reference/gio/migrating-gdbus.xml b/docs/reference/gio/migrating-gdbus.xml index 2d0dd8a..770f5b1 100644 --- a/docs/reference/gio/migrating-gdbus.xml +++ b/docs/reference/gio/migrating-gdbus.xml @@ -84,8 +84,8 @@ g_dbus_proxy_new_for_bus_sync(), also see g_dbus_proxy_new() dbus_g_proxy_add_signal()not needed, use the generic #GDBusProxy::g-signal dbus_g_proxy_connect_signal()use g_signal_connect() with #GDBusProxy::g-signal - dbus_g_connection_register_g_object()g_dbus_connection_register_object() - dbus_g_connection_unregister_g_object()g_dbus_connection_unregister_object() + dbus_g_connection_register_g_object()g_dbus_connection_register_object() - also see g_dbus_object_manager_server_export() + dbus_g_connection_unregister_g_object()g_dbus_connection_unregister_object() - also see g_dbus_object_manager_server_unexport() dbus_g_object_type_install_info()introspection data is installed while registering an object, see g_dbus_connection_register_object() dbus_g_proxy_begin_call()g_dbus_proxy_call() @@ -259,11 +259,15 @@ gdbus-codegen --c-namespace Example \ ]]> then two files generated-code.h and generated-code.c are - generated. Additionally a single XML file - generated-docs-org.gtk.GDBus.Example.ObjectManager.Animal - with Docbook XML is generated. For an example of what the docs look + generated. Additionally, two XML files + generated-docs-org.gtk.GDBus.Example.ObjectManager.Animal and + generated-docs-org.gtk.GDBus.Example.ObjectManager.Cat + with Docbook XML are generated. For an example of what the docs look like see this page. + linkend="gdbus-interface-org-gtk-GDBus-Example-ObjectManager-Animal">the Animal D-Bus interface documentation. + and + the Cat D-Bus interface documentation. While the contents of generated-code.h and @@ -283,5 +287,6 @@ gdbus-codegen --c-namespace Example \ + diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am index 0d2928e..be16488 100644 --- a/gio/tests/Makefile.am +++ b/gio/tests/Makefile.am @@ -486,7 +486,7 @@ test.mo: de.po $(MKDIR_P) de/LC_MESSAGES; \ cp -f test.mo de/LC_MESSAGES -CLEANFILES = gdbus-test-codegen-generated.[ch] gdbus-test-codegen-generated-doc-*.xml +CLEANFILES = gdbus-test-codegen-generated.[ch] gdbus-test-codegen-generated-doc-*.xml gdbus-example-objectmanager-generated-*.xml DISTCLEANFILES = \ applications/mimeinfo.cache \ diff --git a/gio/tests/gdbus-example-objectmanager-client.c b/gio/tests/gdbus-example-objectmanager-client.c index cdef0ae..19a3c82 100644 --- a/gio/tests/gdbus-example-objectmanager-client.c +++ b/gio/tests/gdbus-example-objectmanager-client.c @@ -4,13 +4,59 @@ /* ---------------------------------------------------------------------------------------------------- */ static void +print_objects (GDBusObjectManager *manager) +{ + GList *objects; + GList *l; + + g_print ("Object manager at %s\n", g_dbus_object_manager_get_object_path (manager)); + objects = g_dbus_object_manager_get_objects (manager); + for (l = objects; l != NULL; l = l->next) + { + GDBusObject *object = G_DBUS_OBJECT (l->data); + GList *interfaces; + GList *ll; + g_print (" - Object at %s\n", g_dbus_object_get_object_path (object)); + + interfaces = g_dbus_object_get_interfaces (object); + for (ll = interfaces; ll != NULL; ll = ll->next) + { + GDBusInterface *interface = G_DBUS_INTERFACE (ll->data); + g_print (" - Interface %s\n", g_dbus_interface_get_info (interface)->name); + + /* Note that @interface is really a GDBusProxy instance - and additionally also + * an ExampleAnimal or ExampleCat instance - either of these can be used to + * invoke methods on the remote object. For example, the generated function + * + * void example_animal_call_poke_sync (ExampleAnimal *proxy, + * gboolean make_sad, + * gboolean make_happy, + * GCancellable *cancellable, + * GError **error); + * + * can be used to call the Poke() D-Bus method on the .Animal interface. + * Additionally, the generated function + * + * const gchar *example_animal_get_mood (ExampleAnimal *object); + * + * can be used to get the value of the :Mood property. + */ + } + g_list_foreach (interfaces, (GFunc) g_object_unref, NULL); + g_list_free (interfaces); + } + g_list_foreach (objects, (GFunc) g_object_unref, NULL); + g_list_free (objects); +} + +static void on_object_added (GDBusObjectManager *manager, GDBusObject *object, gpointer user_data) { gchar *owner; owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager)); - g_debug ("added object at %s (owner %s)", g_dbus_object_get_object_path (object), owner); + g_print ("Added object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner); g_free (owner); } @@ -21,7 +67,7 @@ on_object_removed (GDBusObjectManager *manager, { gchar *owner; owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager)); - g_debug ("removed object at %s (owner %s)", g_dbus_object_get_object_path (object), owner); + g_print ("Removed object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner); g_free (owner); } @@ -34,7 +80,7 @@ on_notify_name_owner (GObject *object, gchar *name_owner; name_owner = g_dbus_object_manager_client_get_name_owner (manager); - g_debug ("name-owner: %s", name_owner); + g_print ("name-owner: %s\n", name_owner); g_free (name_owner); } @@ -69,8 +115,6 @@ main (gint argc, gchar *argv[]) GMainLoop *loop; GError *error; gchar *name_owner; - GList *objects; - GList *l; manager = NULL; loop = NULL; @@ -94,17 +138,10 @@ main (gint argc, gchar *argv[]) } name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager)); - g_debug ("name-owner: %s", name_owner); + g_print ("name-owner: %s\n", name_owner); g_free (name_owner); - objects = g_dbus_object_manager_get_objects (manager); - for (l = objects; l != NULL; l = l->next) - { - GDBusObject *object = G_DBUS_OBJECT (l->data); - g_debug ("proxy has object at %s", g_dbus_object_get_object_path (object)); - } - g_list_foreach (objects, (GFunc) g_object_unref, NULL); - g_list_free (objects); + print_objects (manager); g_signal_connect (manager, "notify::name-owner", diff --git a/gio/tests/gdbus-example-objectmanager-server.c b/gio/tests/gdbus-example-objectmanager-server.c index f66839f..97e39b1 100644 --- a/gio/tests/gdbus-example-objectmanager-server.c +++ b/gio/tests/gdbus-example-objectmanager-server.c @@ -12,7 +12,6 @@ on_animal_poke (ExampleAnimal *animal, gboolean make_happy, gpointer user_data) { - if ((make_sad && make_happy) || (!make_sad && !make_happy)) { g_dbus_method_invocation_return_dbus_error (invocation, @@ -66,30 +65,49 @@ on_bus_acquired (GDBusConnection *connection, GDBusObjectStub *object; guint n; - g_debug ("bus acquired"); + g_print ("Acquired a message bus connection\n"); + /* Create a new org.freedesktop.DBus.ObjectManager rooted at /example/Animals */ manager = g_dbus_object_manager_server_new (connection, "/example/Animals"); + for (n = 0; n < 10; n++) { gchar *s; ExampleAnimal *animal; + /* Create a new D-Bus object at the path /example/Animals/N where N is 000..009 */ s = g_strdup_printf ("/example/Animals/%03d", n); object = g_dbus_object_stub_new (s); g_free (s); + /* Make the newly created object export the interface + * org.gtk.GDBus.Example.ObjectManager.Animal (note + * that @object takes its own reference to @animal). + */ animal = example_animal_stub_new (); example_animal_set_mood (animal, "Happy"); + g_dbus_object_stub_add_interface (object, G_DBUS_INTERFACE_STUB (animal)); + g_object_unref (animal); + + /* Cats are odd animals - so some of our objects implement the + * org.gtk.GDBus.Example.ObjectManager.Cat interface in addition + * to the .Animal interface + */ + if (n % 2 == 1) + { + ExampleCat *cat; + cat = example_cat_stub_new (); + g_dbus_object_stub_add_interface (object, G_DBUS_INTERFACE_STUB (cat)); + g_object_unref (cat); + } - /* Handle Poke() method invocations */ + /* Handle Poke() D-Bus method invocations on the .Animal interface */ g_signal_connect (animal, "handle-poke", G_CALLBACK (on_animal_poke), NULL); /* user_data */ - g_dbus_object_stub_add_interface (object, G_DBUS_INTERFACE_STUB (animal)); - g_object_unref (animal); - + /* Export the object (@manager takes its own reference to @object) */ g_dbus_object_manager_server_export (manager, object); g_object_unref (object); } @@ -100,7 +118,7 @@ on_name_acquired (GDBusConnection *connection, const gchar *name, gpointer user_data) { - g_debug ("name acquired"); + g_print ("Acquired the name %s\n", name); } static void @@ -108,7 +126,7 @@ on_name_lost (GDBusConnection *connection, const gchar *name, gpointer user_data) { - g_debug ("name lost"); + g_print ("Lost the name %s\n", name); } diff --git a/gio/tests/gdbus-example-objectmanager.xml b/gio/tests/gdbus-example-objectmanager.xml index 591e072..4e00c22 100644 --- a/gio/tests/gdbus-example-objectmanager.xml +++ b/gio/tests/gdbus-example-objectmanager.xml @@ -1,6 +1,6 @@ @@ -42,4 +42,20 @@ + + + + -- 2.7.4