1
2#include "gdbus-object-manager-example/objectmanager-gen.h"
3
4/* ---------------------------------------------------------------------------------------------------- */
5
6static void
7print_objects (GDBusObjectManager *manager)
8{
9 GList *objects;
10 GList *l;
11
12 g_print ("Object manager at %s\n", g_dbus_object_manager_get_object_path (manager));
13 objects = g_dbus_object_manager_get_objects (manager);
14 for (l = objects; l != NULL; l = l->next)
15 {
16 ExampleObject *object = EXAMPLE_OBJECT (l->data);
17 GList *interfaces;
18 GList *ll;
19 g_print (" - Object at %s\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
20
21 interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object));
22 for (ll = interfaces; ll != NULL; ll = ll->next)
23 {
24 GDBusInterface *interface = G_DBUS_INTERFACE (ll->data);
25 g_print (" - Interface %s\n", g_dbus_interface_get_info (interface)->name);
26
27 /* Note that @interface is really a GDBusProxy instance - and additionally also
28 * an ExampleAnimal or ExampleCat instance - either of these can be used to
29 * invoke methods on the remote object. For example, the generated function
30 *
31 * void example_animal_call_poke_sync (ExampleAnimal *proxy,
32 * gboolean make_sad,
33 * gboolean make_happy,
34 * GCancellable *cancellable,
35 * GError **error);
36 *
37 * can be used to call the Poke() D-Bus method on the .Animal interface.
38 * Additionally, the generated function
39 *
40 * const gchar *example_animal_get_mood (ExampleAnimal *object);
41 *
42 * can be used to get the value of the :Mood property.
43 */
44 }
45 g_list_free_full (interfaces, g_object_unref);
46 }
47 g_list_free_full (objects, g_object_unref);
48}
49
50static void
51on_object_added (GDBusObjectManager *manager,
52 GDBusObject *object,
53 gpointer user_data)
54{
55 gchar *owner;
56 owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
57 g_print ("Added object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner);
58 g_free (owner);
59}
60
61static void
62on_object_removed (GDBusObjectManager *manager,
63 GDBusObject *object,
64 gpointer user_data)
65{
66 gchar *owner;
67 owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
68 g_print ("Removed object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner);
69 g_free (owner);
70}
71
72static void
73on_notify_name_owner (GObject *object,
74 GParamSpec *pspec,
75 gpointer user_data)
76{
77 GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (object);
78 gchar *name_owner;
79
80 name_owner = g_dbus_object_manager_client_get_name_owner (manager);
81 g_print ("name-owner: %s\n", name_owner);
82 g_free (name_owner);
83}
84
85static void
86on_interface_proxy_properties_changed (GDBusObjectManagerClient *manager,
87 GDBusObjectProxy *object_proxy,
88 GDBusProxy *interface_proxy,
89 GVariant *changed_properties,
90 const gchar *const *invalidated_properties,
91 gpointer user_data)
92{
93 GVariantIter iter;
94 const gchar *key;
95 GVariant *value;
96 gchar *s;
97
98 g_print ("Properties Changed on %s:\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object_proxy)));
99 g_variant_iter_init (&iter, changed_properties);
100 while (g_variant_iter_next (&iter, "{&sv}", &key, &value))
101 {
102 s = g_variant_print (value, TRUE);
103 g_print (" %s -> %s\n", key, s);
104 g_variant_unref (value);
105 g_free (s);
106 }
107}
108
109gint
110main (gint argc, gchar *argv[])
111{
112 GDBusObjectManager *manager;
113 GMainLoop *loop;
114 GError *error;
115 gchar *name_owner;
116
117 manager = NULL;
118 loop = NULL;
119
120 loop = g_main_loop_new (NULL, FALSE);
121
122 error = NULL;
123 manager = example_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SESSION,
124 G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
125 "org.gtk.GDBus.Examples.ObjectManager",
126 "/example/Animals",
127 NULL, /* GCancellable */
128 &error);
129 if (manager == NULL)
130 {
131 g_printerr ("Error getting object manager client: %s", error->message);
132 g_error_free (error);
133 goto out;
134 }
135
136 name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
137 g_print ("name-owner: %s\n", name_owner);
138 g_free (name_owner);
139
140 print_objects (manager);
141
142 g_signal_connect (manager,
143 "notify::name-owner",
144 G_CALLBACK (on_notify_name_owner),
145 NULL);
146 g_signal_connect (manager,
147 "object-added",
148 G_CALLBACK (on_object_added),
149 NULL);
150 g_signal_connect (manager,
151 "object-removed",
152 G_CALLBACK (on_object_removed),
153 NULL);
154 g_signal_connect (manager,
155 "interface-proxy-properties-changed",
156 G_CALLBACK (on_interface_proxy_properties_changed),
157 NULL);
158
159 g_main_loop_run (loop);
160
161 out:
162 if (manager != NULL)
163 g_object_unref (manager);
164 if (loop != NULL)
165 g_main_loop_unref (loop);
166
167 return 0;
168}
169

source code of gtk/subprojects/glib/gio/tests/gdbus-example-objectmanager-client.c