Branch data Line data Source code
1 : :
2 : : #include "gdbus-object-manager-example/objectmanager-gen.h"
3 : :
4 : : /* ---------------------------------------------------------------------------------------------------- */
5 : :
6 : : static void
7 : 0 : print_objects (GDBusObjectManager *manager)
8 : : {
9 : : GList *objects;
10 : : GList *l;
11 : :
12 : 0 : g_print ("Object manager at %s\n", g_dbus_object_manager_get_object_path (manager));
13 : 0 : objects = g_dbus_object_manager_get_objects (manager);
14 : 0 : for (l = objects; l != NULL; l = l->next)
15 : : {
16 : 0 : ExampleObject *object = EXAMPLE_OBJECT (l->data);
17 : : GList *interfaces;
18 : : GList *ll;
19 : 0 : g_print (" - Object at %s\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
20 : :
21 : 0 : interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object));
22 : 0 : for (ll = interfaces; ll != NULL; ll = ll->next)
23 : : {
24 : 0 : GDBusInterface *interface = G_DBUS_INTERFACE (ll->data);
25 : 0 : 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 : 0 : g_list_free_full (interfaces, g_object_unref);
46 : : }
47 : 0 : g_list_free_full (objects, g_object_unref);
48 : 0 : }
49 : :
50 : : static void
51 : 0 : on_object_added (GDBusObjectManager *manager,
52 : : GDBusObject *object,
53 : : gpointer user_data)
54 : : {
55 : : gchar *owner;
56 : 0 : owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
57 : 0 : g_print ("Added object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner);
58 : 0 : g_free (owner);
59 : 0 : }
60 : :
61 : : static void
62 : 0 : on_object_removed (GDBusObjectManager *manager,
63 : : GDBusObject *object,
64 : : gpointer user_data)
65 : : {
66 : : gchar *owner;
67 : 0 : owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
68 : 0 : g_print ("Removed object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner);
69 : 0 : g_free (owner);
70 : 0 : }
71 : :
72 : : static void
73 : 0 : on_notify_name_owner (GObject *object,
74 : : GParamSpec *pspec,
75 : : gpointer user_data)
76 : : {
77 : 0 : GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (object);
78 : : gchar *name_owner;
79 : :
80 : 0 : name_owner = g_dbus_object_manager_client_get_name_owner (manager);
81 : 0 : g_print ("name-owner: %s\n", name_owner);
82 : 0 : g_free (name_owner);
83 : 0 : }
84 : :
85 : : static void
86 : 0 : on_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 : 0 : g_print ("Properties Changed on %s:\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object_proxy)));
99 : 0 : g_variant_iter_init (&iter, changed_properties);
100 : 0 : while (g_variant_iter_next (&iter, "{&sv}", &key, &value))
101 : : {
102 : 0 : s = g_variant_print (value, TRUE);
103 : 0 : g_print (" %s -> %s\n", key, s);
104 : 0 : g_variant_unref (value);
105 : 0 : g_free (s);
106 : : }
107 : 0 : }
108 : :
109 : : gint
110 : 0 : main (gint argc, gchar *argv[])
111 : : {
112 : : GDBusObjectManager *manager;
113 : : GMainLoop *loop;
114 : : GError *error;
115 : : gchar *name_owner;
116 : :
117 : 0 : manager = NULL;
118 : 0 : loop = NULL;
119 : :
120 : 0 : loop = g_main_loop_new (NULL, FALSE);
121 : :
122 : 0 : error = NULL;
123 : 0 : 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 : 0 : if (manager == NULL)
130 : : {
131 : 0 : g_printerr ("Error getting object manager client: %s", error->message);
132 : 0 : g_error_free (error);
133 : 0 : goto out;
134 : : }
135 : :
136 : 0 : name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
137 : 0 : g_print ("name-owner: %s\n", name_owner);
138 : 0 : g_free (name_owner);
139 : :
140 : 0 : print_objects (manager);
141 : :
142 : 0 : g_signal_connect (manager,
143 : : "notify::name-owner",
144 : : G_CALLBACK (on_notify_name_owner),
145 : : NULL);
146 : 0 : g_signal_connect (manager,
147 : : "object-added",
148 : : G_CALLBACK (on_object_added),
149 : : NULL);
150 : 0 : g_signal_connect (manager,
151 : : "object-removed",
152 : : G_CALLBACK (on_object_removed),
153 : : NULL);
154 : 0 : g_signal_connect (manager,
155 : : "interface-proxy-properties-changed",
156 : : G_CALLBACK (on_interface_proxy_properties_changed),
157 : : NULL);
158 : :
159 : 0 : g_main_loop_run (loop);
160 : :
161 : 0 : out:
162 : 0 : if (manager != NULL)
163 : 0 : g_object_unref (manager);
164 : 0 : if (loop != NULL)
165 : 0 : g_main_loop_unref (loop);
166 : :
167 : 0 : return 0;
168 : : }
|