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