(root)/
glib-2.79.0/
gio/
tests/
gdbus-example-objectmanager-server.c
       1  
       2  #include "gdbus-object-manager-example/objectmanager-gen.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    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
      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
     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
     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
     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  }