Blame gio/tests/gdbus-example-objectmanager-server.c

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