1
2#include "gdbus-object-manager-example/objectmanager-gen.h"
3
4/* ---------------------------------------------------------------------------------------------------- */
5
6static GDBusObjectManagerServer *manager = NULL;
7
8static gboolean
9on_animal_poke (ExampleAnimal *animal,
10 GDBusMethodInvocation *invocation,
11 gboolean make_sad,
12 gboolean make_happy,
13 gpointer user_data)
14{
15 if ((make_sad && make_happy) || (!make_sad && !make_happy))
16 {
17 g_dbus_method_invocation_return_dbus_error (invocation,
18 "org.gtk.GDBus.Examples.ObjectManager.Error.Failed",
19 "Exactly one of make_sad or make_happy must be TRUE");
20 goto out;
21 }
22
23 if (make_sad)
24 {
25 if (g_strcmp0 (example_animal_get_mood (animal), "Sad") == 0)
26 {
27 g_dbus_method_invocation_return_dbus_error (invocation,
28 "org.gtk.GDBus.Examples.ObjectManager.Error.SadAnimalIsSad",
29 "Sad animal is already sad");
30 goto out;
31 }
32
33 example_animal_set_mood (animal, "Sad");
34 example_animal_complete_poke (animal, invocation);
35 goto out;
36 }
37
38 if (make_happy)
39 {
40 if (g_strcmp0 (example_animal_get_mood (animal), "Happy") == 0)
41 {
42 g_dbus_method_invocation_return_dbus_error (invocation,
43 "org.gtk.GDBus.Examples.ObjectManager.Error.HappyAnimalIsHappy",
44 "Happy animal is already happy");
45 goto out;
46 }
47
48 example_animal_set_mood (animal, "Happy");
49 example_animal_complete_poke (animal, invocation);
50 goto out;
51 }
52
53 g_assert_not_reached ();
54
55 out:
56 return G_DBUS_METHOD_INVOCATION_HANDLED;
57}
58
59
60static void
61on_bus_acquired (GDBusConnection *connection,
62 const gchar *name,
63 gpointer user_data)
64{
65 ExampleObjectSkeleton *object;
66 guint n;
67
68 g_print ("Acquired a message bus connection\n");
69
70 /* Create a new org.freedesktop.DBus.ObjectManager rooted at /example/Animals */
71 manager = g_dbus_object_manager_server_new ("/example/Animals");
72
73 for (n = 0; n < 10; n++)
74 {
75 gchar *s;
76 ExampleAnimal *animal;
77
78 /* Create a new D-Bus object at the path /example/Animals/N where N is 000..009 */
79 s = g_strdup_printf ("/example/Animals/%03d", n);
80 object = example_object_skeleton_new (s);
81 g_free (s);
82
83 /* Make the newly created object export the interface
84 * org.gtk.GDBus.Example.ObjectManager.Animal (note
85 * that @object takes its own reference to @animal).
86 */
87 animal = example_animal_skeleton_new ();
88 example_animal_set_mood (animal, "Happy");
89 example_object_skeleton_set_animal (object, animal);
90 g_object_unref (animal);
91
92 /* Cats are odd animals - so some of our objects implement the
93 * org.gtk.GDBus.Example.ObjectManager.Cat interface in addition
94 * to the .Animal interface
95 */
96 if (n % 2 == 1)
97 {
98 ExampleCat *cat;
99 cat = example_cat_skeleton_new ();
100 example_object_skeleton_set_cat (object, cat);
101 g_object_unref (cat);
102 }
103
104 /* Handle Poke() D-Bus method invocations on the .Animal interface */
105 g_signal_connect (animal,
106 "handle-poke",
107 G_CALLBACK (on_animal_poke),
108 NULL); /* user_data */
109
110 /* Export the object (@manager takes its own reference to @object) */
111 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
112 g_object_unref (object);
113 }
114
115 /* Export all objects */
116 g_dbus_object_manager_server_set_connection (manager, connection);
117}
118
119static void
120on_name_acquired (GDBusConnection *connection,
121 const gchar *name,
122 gpointer user_data)
123{
124 g_print ("Acquired the name %s\n", name);
125}
126
127static void
128on_name_lost (GDBusConnection *connection,
129 const gchar *name,
130 gpointer user_data)
131{
132 g_print ("Lost the name %s\n", name);
133}
134
135
136gint
137main (gint argc, gchar *argv[])
138{
139 GMainLoop *loop;
140 guint id;
141
142 loop = g_main_loop_new (NULL, FALSE);
143
144 id = g_bus_own_name (G_BUS_TYPE_SESSION,
145 "org.gtk.GDBus.Examples.ObjectManager",
146 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
147 G_BUS_NAME_OWNER_FLAGS_REPLACE,
148 on_bus_acquired,
149 on_name_acquired,
150 on_name_lost,
151 loop,
152 NULL);
153
154 g_main_loop_run (loop);
155
156 g_bus_unown_name (id);
157 g_main_loop_unref (loop);
158
159 return 0;
160}
161

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