| #include "gdbus-object-manager-example/objectmanager-gen.h" | |
| /* ---------------------------------------------------------------------------------------------------- */ | |
| static GDBusObjectManagerServer *manager = NULL; | |
| static gboolean | |
| on_animal_poke (ExampleAnimal *animal, | |
| GDBusMethodInvocation *invocation, | |
| gboolean make_sad, | |
| gboolean make_happy, | |
| gpointer user_data) | |
| { | |
| if ((make_sad && make_happy) || (!make_sad && !make_happy)) | |
| { | |
| g_dbus_method_invocation_return_dbus_error (invocation, | |
| "org.gtk.GDBus.Examples.ObjectManager.Error.Failed", | |
| "Exactly one of make_sad or make_happy must be TRUE"); | |
| goto out; | |
| } | |
| if (make_sad) | |
| { | |
| if (g_strcmp0 (example_animal_get_mood (animal), "Sad") == 0) | |
| { | |
| g_dbus_method_invocation_return_dbus_error (invocation, | |
| "org.gtk.GDBus.Examples.ObjectManager.Error.SadAnimalIsSad", | |
| "Sad animal is already sad"); | |
| goto out; | |
| } | |
| example_animal_set_mood (animal, "Sad"); | |
| example_animal_complete_poke (animal, invocation); | |
| goto out; | |
| } | |
| if (make_happy) | |
| { | |
| if (g_strcmp0 (example_animal_get_mood (animal), "Happy") == 0) | |
| { | |
| g_dbus_method_invocation_return_dbus_error (invocation, | |
| "org.gtk.GDBus.Examples.ObjectManager.Error.HappyAnimalIsHappy", | |
| "Happy animal is already happy"); | |
| goto out; | |
| } | |
| example_animal_set_mood (animal, "Happy"); | |
| example_animal_complete_poke (animal, invocation); | |
| goto out; | |
| } | |
| g_assert_not_reached (); | |
| out: | |
| return G_DBUS_METHOD_INVOCATION_HANDLED; | |
| } | |
| static void | |
| on_bus_acquired (GDBusConnection *connection, | |
| const gchar *name, | |
| gpointer user_data) | |
| { | |
| ExampleObjectSkeleton *object; | |
| guint n; | |
| g_print ("Acquired a message bus connection\n"); | |
| /* Create a new org.freedesktop.DBus.ObjectManager rooted at /example/Animals */ | |
| manager = g_dbus_object_manager_server_new ("/example/Animals"); | |
| for (n = 0; n < 10; n++) | |
| { | |
| gchar *s; | |
| ExampleAnimal *animal; | |
| /* Create a new D-Bus object at the path /example/Animals/N where N is 000..009 */ | |
| s = g_strdup_printf ("/example/Animals/%03d", n); | |
| object = example_object_skeleton_new (s); | |
| g_free (s); | |
| /* Make the newly created object export the interface | |
| * org.gtk.GDBus.Example.ObjectManager.Animal (note | |
| * that @object takes its own reference to @animal). | |
| */ | |
| animal = example_animal_skeleton_new (); | |
| example_animal_set_mood (animal, "Happy"); | |
| example_object_skeleton_set_animal (object, animal); | |
| g_object_unref (animal); | |
| /* Cats are odd animals - so some of our objects implement the | |
| * org.gtk.GDBus.Example.ObjectManager.Cat interface in addition | |
| * to the .Animal interface | |
| */ | |
| if (n % 2 == 1) | |
| { | |
| ExampleCat *cat; | |
| cat = example_cat_skeleton_new (); | |
| example_object_skeleton_set_cat (object, cat); | |
| g_object_unref (cat); | |
| } | |
| /* Handle Poke() D-Bus method invocations on the .Animal interface */ | |
| g_signal_connect (animal, | |
| "handle-poke", | |
| G_CALLBACK (on_animal_poke), | |
| NULL); /* user_data */ | |
| /* Export the object (@manager takes its own reference to @object) */ | |
| g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object)); | |
| g_object_unref (object); | |
| } | |
| /* Export all objects */ | |
| g_dbus_object_manager_server_set_connection (manager, connection); | |
| } | |
| static void | |
| on_name_acquired (GDBusConnection *connection, | |
| const gchar *name, | |
| gpointer user_data) | |
| { | |
| g_print ("Acquired the name %s\n", name); | |
| } | |
| static void | |
| on_name_lost (GDBusConnection *connection, | |
| const gchar *name, | |
| gpointer user_data) | |
| { | |
| g_print ("Lost the name %s\n", name); | |
| } | |
| gint | |
| main (gint argc, gchar *argv[]) | |
| { | |
| GMainLoop *loop; | |
| guint id; | |
| loop = g_main_loop_new (NULL, FALSE); | |
| id = g_bus_own_name (G_BUS_TYPE_SESSION, | |
| "org.gtk.GDBus.Examples.ObjectManager", | |
| G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | | |
| G_BUS_NAME_OWNER_FLAGS_REPLACE, | |
| on_bus_acquired, | |
| on_name_acquired, | |
| on_name_lost, | |
| loop, | |
| NULL); | |
| g_main_loop_run (loop); | |
| g_bus_unown_name (id); | |
| g_main_loop_unref (loop); | |
| return 0; | |
| } |