GDBus: Add ObjectManager example
[platform/upstream/glib.git] / gio / tests / gdbus-example-objectmanager-server.c
1
2 #include "gdbus-example-objectmanager-generated.h"
3
4 /* ---------------------------------------------------------------------------------------------------- */
5
6 static GDBusObjectManagerServer *manager = NULL;
7
8 static gboolean
9 on_animal_poke (ExampleAnimal          *animal,
10                 GDBusMethodInvocation  *invocation,
11                 gboolean                make_sad,
12                 gboolean                make_happy,
13                 gpointer                user_data)
14 {
15
16   if ((make_sad && make_happy) || (!make_sad && !make_happy))
17     {
18       g_dbus_method_invocation_return_dbus_error (invocation,
19                                                   "org.gtk.GDBus.Examples.ObjectManager.Error.Failed",
20                                                   "Exactly one of make_sad or make_happy must be TRUE");
21       goto out;
22     }
23
24   if (make_sad)
25     {
26       if (g_strcmp0 (example_animal_get_mood (animal), "Sad") == 0)
27         {
28           g_dbus_method_invocation_return_dbus_error (invocation,
29                                                       "org.gtk.GDBus.Examples.ObjectManager.Error.SadAnimalIsSad",
30                                                       "Sad animal is already sad");
31           goto out;
32         }
33
34       example_animal_set_mood (animal, "Sad");
35       example_animal_complete_poke (animal, invocation);
36       goto out;
37     }
38
39   if (make_happy)
40     {
41       if (g_strcmp0 (example_animal_get_mood (animal), "Happy") == 0)
42         {
43           g_dbus_method_invocation_return_dbus_error (invocation,
44                                                       "org.gtk.GDBus.Examples.ObjectManager.Error.HappyAnimalIsHappy",
45                                                       "Happy animal is already happy");
46           goto out;
47         }
48
49       example_animal_set_mood (animal, "Happy");
50       example_animal_complete_poke (animal, invocation);
51       goto out;
52     }
53
54   g_assert_not_reached ();
55
56  out:
57   return TRUE; /* to indicate that the method was handled */
58 }
59
60
61 static void
62 on_bus_acquired (GDBusConnection *connection,
63                  const gchar     *name,
64                  gpointer         user_data)
65 {
66   GDBusObjectStub *object;
67   guint n;
68
69   g_debug ("bus acquired");
70
71   manager = g_dbus_object_manager_server_new (connection, "/example/Animals");
72   for (n = 0; n < 10; n++)
73     {
74       gchar *s;
75       ExampleAnimal *animal;
76
77       s = g_strdup_printf ("/example/Animals/%03d", n);
78       object = g_dbus_object_stub_new (s);
79       g_free (s);
80
81       animal = example_animal_stub_new ();
82       example_animal_set_mood (animal, "Happy");
83
84       /* Handle Poke() method invocations */
85       g_signal_connect (animal,
86                         "handle-poke",
87                         G_CALLBACK (on_animal_poke),
88                         NULL); /* user_data */
89
90       g_dbus_object_stub_add_interface (object, G_DBUS_INTERFACE_STUB (animal));
91       g_object_unref (animal);
92
93       g_dbus_object_manager_server_export (manager, object);
94       g_object_unref (object);
95     }
96 }
97
98 static void
99 on_name_acquired (GDBusConnection *connection,
100                   const gchar     *name,
101                   gpointer         user_data)
102 {
103   g_debug ("name acquired");
104 }
105
106 static void
107 on_name_lost (GDBusConnection *connection,
108               const gchar     *name,
109               gpointer         user_data)
110 {
111   g_debug ("name lost");
112 }
113
114
115 gint
116 main (gint argc, gchar *argv[])
117 {
118   GMainLoop *loop;
119   guint id;
120
121   g_type_init ();
122
123   loop = g_main_loop_new (NULL, FALSE);
124
125   id = g_bus_own_name (G_BUS_TYPE_SESSION,
126                        "org.gtk.GDBus.Examples.ObjectManager",
127                        G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
128                        G_BUS_NAME_OWNER_FLAGS_REPLACE,
129                        on_bus_acquired,
130                        on_name_acquired,
131                        on_name_lost,
132                        loop,
133                        NULL);
134
135   g_main_loop_run (loop);
136
137   g_bus_unown_name (id);
138   g_main_loop_unref (loop);
139
140   return 0;
141 }