diff options
author | David Zeuthen <davidz@redhat.com> | 2011-03-08 11:58:40 -0500 |
---|---|---|
committer | David Zeuthen <davidz@redhat.com> | 2011-03-08 11:58:40 -0500 |
commit | b2b3375586152985c1d3bf49178419546f55c2af (patch) | |
tree | b6fcca526c8d297d817f1c2d0de9c7872603ec3a | |
parent | 7dc0d1001df48dfa458834a80400ed2c38a4f0d8 (diff) |
Switch to using the org.freedesktop.DBus.ObjectManager interface
Screenshot: http://people.freedesktop.org/~david/ObjectManager-in-dfeet.png
Signed-off-by: David Zeuthen <davidz@redhat.com>
-rw-r--r-- | src/gdbusobjectmanager.c | 110 | ||||
-rw-r--r-- | src/gdbusproxymanager.c | 17 | ||||
-rw-r--r-- | src/test.c | 22 |
3 files changed, 63 insertions, 86 deletions
diff --git a/src/gdbusobjectmanager.c b/src/gdbusobjectmanager.c index f3666e0..4cf655f 100644 --- a/src/gdbusobjectmanager.c +++ b/src/gdbusobjectmanager.c @@ -32,42 +32,13 @@ * @include: gio/gio.h * * #GDBusObjectManager is used to export #GDBusObject instances using - * a D-Bus API that is efficient and easy to work with. For example, - * remote D-Bus clients can get all objects and properties in a single - * call. Additionally, any change in the object hierarchy is broadcast - * using signals. This means that D-Bus clients can keep caches up to - * date by only listening to D-Bus signals. - * - * The D-Bus interface used is the following: - * - * <programlisting><![CDATA[ - * <interface name="org.gtk.GDBus.ObjectManager"> - * <method name="GetAll"> - * <arg type="a{oa{sa{sv}}}" name="object_paths_interfaces_and_properties" direction="out"/> - * </method> - * <signal name="InterfacesAdded"> - * <arg type="o" name="object_path"/> - * <arg type="a{sa{sv}}" name="interfaces_and_properties"/> - * </signal> - * <signal name="InterfacesRemoved"> - * <arg type="o" name="object_path"/> - * <arg type="as" name="interfaces"/> - * </signal> - * </interface> - * ]]></programlisting> - * - * Clients start priming their caches by calling the - * <literal>org.gtk.GDBus.ObjectManager.GetAll()</literal> - * method. This returns dictionary of all existing objects along with - * the interfaces and properties for each object. Every time a new - * object is added (or an existing object gains one or more new - * interfaces), the - * <literal>org.gtk.GDBus.ObjectManager::InterfacesAdded</literal> - * signal is emitted. This signal contains all properties for the - * added interfaces. Similarly, every time an object is removed (or an - * existing object loses one or more interfaces) the - * <literal>org.gtk.GDBus.ObjectManager::InterfacesRemoved</literal> - * signal is emitted. + * the standardized <ulink + * url="http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager">org.freedesktop.DBus.ObjectManager</ulink> + * interface. For example, remote D-Bus clients can get all objects + * and properties in a single call. Additionally, any change in the + * object hierarchy is broadcast using signals. This means that D-Bus + * clients can keep caches up to date by only listening to D-Bus + * signals. * * See #GDBusProxyManager for the client-side code that is intended to * be used with #GDBusObjectManager. @@ -704,7 +675,7 @@ static const GDBusArgInfo * const manager_get_all_method_info_out_arg_pointers[] static const GDBusMethodInfo manager_get_all_method_info = { -1, - "GetAll", + "GetManagedObjects", (GDBusArgInfo**) NULL, (GDBusArgInfo**) &manager_get_all_method_info_out_arg_pointers, (GDBusAnnotationInfo**) NULL @@ -721,7 +692,7 @@ static const GDBusMethodInfo * const manager_method_info_pointers[] = static const GDBusInterfaceInfo manager_interface_info = { -1, - "org.gtk.GDBus.ObjectManager", + "org.freedesktop.DBus.ObjectManager", (GDBusMethodInfo **) manager_method_info_pointers, (GDBusSignalInfo **) manager_signal_info_pointers, (GDBusPropertyInfo **) NULL, @@ -743,37 +714,46 @@ manager_method_call (GDBusConnection *connection, GHashTableIter object_iter; RegistrationData *data; - g_assert_cmpstr (method_name, ==, "GetAll"); - - g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a{oa{sa{sv}}}")); - g_hash_table_iter_init (&object_iter, manager->priv->map_object_path_to_data); - while (g_hash_table_iter_next (&object_iter, NULL, (gpointer) &data)) + if (g_strcmp0 (method_name, "GetManagedObjects") == 0) { - GVariantBuilder interfaces_builder; - GHashTableIter interface_iter; - IfaceData *iface_data; - gchar *object_path; - - g_variant_builder_init (&interfaces_builder, G_VARIANT_TYPE ("a{sa{sv}}")); - g_hash_table_iter_init (&interface_iter, data->map_iface_name_to_iface_data); - while (g_hash_table_iter_next (&interface_iter, NULL, (gpointer) &iface_data)) + g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a{oa{sa{sv}}}")); + g_hash_table_iter_init (&object_iter, manager->priv->map_object_path_to_data); + while (g_hash_table_iter_next (&object_iter, NULL, (gpointer) &data)) { - g_variant_builder_add_value (&interfaces_builder, - g_variant_new ("{s@a{sv}}", - g_dbus_interface_get_info (iface_data->interface)->name, - g_dbus_interface_get_properties (iface_data->interface))); + GVariantBuilder interfaces_builder; + GHashTableIter interface_iter; + IfaceData *iface_data; + gchar *object_path; + + g_variant_builder_init (&interfaces_builder, G_VARIANT_TYPE ("a{sa{sv}}")); + g_hash_table_iter_init (&interface_iter, data->map_iface_name_to_iface_data); + while (g_hash_table_iter_next (&interface_iter, NULL, (gpointer) &iface_data)) + { + g_variant_builder_add_value (&interfaces_builder, + g_variant_new ("{s@a{sv}}", + g_dbus_interface_get_info (iface_data->interface)->name, + g_dbus_interface_get_properties (iface_data->interface))); + } + object_path = g_dbus_object_get_object_path (data->object); + g_variant_builder_add (&array_builder, + "{oa{sa{sv}}}", + object_path, + &interfaces_builder); + g_free (object_path); } - object_path = g_dbus_object_get_object_path (data->object); - g_variant_builder_add (&array_builder, - "{oa{sa{sv}}}", - object_path, - &interfaces_builder); - g_free (object_path); - } - g_dbus_method_invocation_return_value (invocation, - g_variant_new ("(a{oa{sa{sv}}})", - &array_builder)); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(a{oa{sa{sv}}})", + &array_builder)); + } + else + { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, + G_DBUS_ERROR_UNKNOWN_METHOD, + "Unknown method %s - only GetManagedObjects() is supported", + method_name); + } } static const GDBusInterfaceVTable manager_interface_vtable = diff --git a/src/gdbusproxymanager.c b/src/gdbusproxymanager.c index 5b0d8f0..2599a0b 100644 --- a/src/gdbusproxymanager.c +++ b/src/gdbusproxymanager.c @@ -33,12 +33,9 @@ * * #GDBusProxyManager is used to create, monitor and delete object * proxies for remote objects exported by a #GDBusObjectManager or - * compatible API. At object construction time, the - * <literal>org.gtk.GDBus.ObjectManager.GetAll()</literal> method is - * called and during the lifetime of the object, - * <literal>org.gtk.GDBus.ObjectManager::InterfacesAdded</literal> and - * <literal>org.gtk.GDBus.ObjectManager::InterfacesRemoved</literal> - * signals are received and processed. + * compatible API implementing the <ulink + * url="http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager">org.freedesktop.DBus.ObjectManager</ulink> + * interface. * * It's easy to use #GDBusProxyManager – simply create the manager * object, connect to the #GDBusProxyManager::object-proxy-added and @@ -1269,7 +1266,7 @@ on_notify_g_name_owner (GObject *object, new_name_owner); error = NULL; value = g_dbus_proxy_call_sync (manager->priv->control_proxy, - "GetAll", + "GetManagedObjects", NULL, /* parameters */ G_DBUS_CALL_FLAGS_NONE, -1, @@ -1278,7 +1275,7 @@ on_notify_g_name_owner (GObject *object, if (value == NULL) { maybe_unsubscribe_signals (manager); - g_warning ("Error calling GetAll() when name owner %s for name %s came back: %s", + g_warning ("Error calling GetManagedObjects() when name owner %s for name %s came back: %s", new_name_owner, manager->priv->name, error->message); @@ -1329,7 +1326,7 @@ initable_init (GInitable *initable, NULL, /* GDBusInterfaceInfo* */ manager->priv->name, manager->priv->object_path, - "org.gtk.GDBus.ObjectManager", + "org.freedesktop.DBus.ObjectManager", cancellable, error); if (manager->priv->control_proxy == NULL) @@ -1357,7 +1354,7 @@ initable_init (GInitable *initable, subscribe_signals (manager, manager->priv->name_owner); value = g_dbus_proxy_call_sync (manager->priv->control_proxy, - "GetAll", + "GetManagedObjects", NULL, /* parameters */ G_DBUS_CALL_FLAGS_NONE, -1, @@ -1017,14 +1017,14 @@ has_interface (GDBusNodeInfo *info, typedef struct { GMainLoop *loop; GVariant *result; -} OMGetAllData; +} OMGetManagedObjectsData; static void om_get_all_cb (GDBusConnection *connection, GAsyncResult *res, gpointer user_data) { - OMGetAllData *data = user_data; + OMGetManagedObjectsData *data = user_data; GError *error; error = NULL; @@ -1041,7 +1041,7 @@ om_check_get_all (GDBusConnection *c, GMainLoop *loop, const gchar *str) { - OMGetAllData data; + OMGetManagedObjectsData data; gchar *s; data.loop = loop; @@ -1051,8 +1051,8 @@ om_check_get_all (GDBusConnection *c, g_dbus_connection_call (c, g_dbus_connection_get_unique_name (c), "/managed", - "org.gtk.GDBus.ObjectManager", - "GetAll", + "org.freedesktop.DBus.ObjectManager", + "GetManagedObjects", NULL, /* params */ G_VARIANT_TYPE ("(a{oa{sa{sv}}})"), G_DBUS_CALL_FLAGS_NONE, @@ -1422,7 +1422,7 @@ check_object_manager (void) om_signal_id = g_dbus_connection_signal_subscribe (c, NULL, /* sender */ - "org.gtk.GDBus.ObjectManager", + "org.freedesktop.DBus.ObjectManager", NULL, /* member */ NULL, /* object_path */ NULL, /* arg0 */ @@ -1457,11 +1457,11 @@ check_object_manager (void) /* Check that the manager object is visible */ info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop); g_assert_cmpint (count_interfaces (info), ==, 4); /* ObjectManager + Properties,Introspectable,Peer */ - g_assert (has_interface (info, "org.gtk.GDBus.ObjectManager")); + g_assert (has_interface (info, "org.freedesktop.DBus.ObjectManager")); g_assert_cmpint (count_nodes (info), ==, 0); g_dbus_node_info_unref (info); - /* Check GetAll() - should be empty since we have no objects */ + /* Check GetManagedObjects() - should be empty since we have no objects */ om_check_get_all (c, loop, "(@a{oa{sa{sv}}} {},)"); @@ -1645,7 +1645,7 @@ check_object_manager (void) g_assert (has_interface (info, "com.acme.Coyote")); g_dbus_node_info_unref (info); - /* Check GetAll() - should be just the Coyote */ + /* Check GetManagedObjects() - should be just the Coyote */ om_check_get_all (c, loop, "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}},)"); @@ -1674,7 +1674,7 @@ check_object_manager (void) /* -------------------------------------------------- */ /* Now that we have a couple of objects with interfaces, check - * that ObjectManager.GetAll() works + * that ObjectManager.GetManagedObjects() works */ om_check_get_all (c, loop, "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}, '/managed/second': {'org.project.Bar': {'y': <byte 0x00>, 'b': <false>, 'n': <int16 0>, 'q': <uint16 0>, 'i': <0>, 'u': <uint32 0>, 'x': <int64 0>, 't': <uint64 0>, 'd': <0.0>, 's': <''>, 'o': <objectpath '/'>, 'g': <signature ''>, 'ay': <b''>, 'as': <@as []>, 'aay': <@aay []>, 'ao': <@ao []>, 'ag': <@ag []>, 'FinallyNormalName': <''>, 'ReadonlyProperty': <''>, 'unset_i': <0>, 'unset_d': <0.0>, 'unset_s': <''>, 'unset_o': <objectpath '/'>, 'unset_g': <signature ''>, 'unset_ay': <b''>, 'unset_as': <@as []>, 'unset_ao': <@ao []>, 'unset_ag': <@ag []>, 'unset_struct': <(0, 0.0, '', objectpath '/', signature '', @ay [], @as [], @ao [], @ag [])>}, 'org.project.Bat': {'force_i': <0>, 'force_s': <''>, 'force_ay': <@ay []>, 'force_struct': <(0,)>}}},)"); @@ -1777,7 +1777,7 @@ check_object_manager (void) g_assert_cmpint (count_interfaces (info), ==, 0); g_dbus_node_info_unref (info); - /* Check GetAll() again */ + /* Check GetManagedObjects() again */ om_check_get_all (c, loop, "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}},)"); |