• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 #include "gdbus-object-manager-example/objectmanager-gen.h"
3 
4 /* ---------------------------------------------------------------------------------------------------- */
5 
6 static GDBusObjectManagerServer *manager = NULL;
7 
8 static gboolean
on_animal_poke(ExampleAnimal * animal,GDBusMethodInvocation * invocation,gboolean make_sad,gboolean make_happy,gpointer user_data)9 on_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 
60 static void
on_bus_acquired(GDBusConnection * connection,const gchar * name,gpointer user_data)61 on_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 
119 static void
on_name_acquired(GDBusConnection * connection,const gchar * name,gpointer user_data)120 on_name_acquired (GDBusConnection *connection,
121                   const gchar     *name,
122                   gpointer         user_data)
123 {
124   g_print ("Acquired the name %s\n", name);
125 }
126 
127 static void
on_name_lost(GDBusConnection * connection,const gchar * name,gpointer user_data)128 on_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 
136 gint
main(gint argc,gchar * argv[])137 main (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