summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Zeuthen <davidz@redhat.com>2011-03-08 11:58:40 -0500
committerDavid Zeuthen <davidz@redhat.com>2011-03-08 11:58:40 -0500
commitb2b3375586152985c1d3bf49178419546f55c2af (patch)
treeb6fcca526c8d297d817f1c2d0de9c7872603ec3a
parent7dc0d1001df48dfa458834a80400ed2c38a4f0d8 (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.c110
-rw-r--r--src/gdbusproxymanager.c17
-rw-r--r--src/test.c22
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,
diff --git a/src/test.c b/src/test.c
index a7ee52d..0aaa838 100644
--- a/src/test.c
+++ b/src/test.c
@@ -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': <''>}}},)");