mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-10-31 00:12:19 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			161 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #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;
 | |
| }
 |