(root)/
glib-2.79.0/
gio/
tests/
gdbus-example-objectmanager-client.c
       1  
       2  #include "gdbus-object-manager-example/objectmanager-gen.h"
       3  
       4  /* ---------------------------------------------------------------------------------------------------- */
       5  
       6  static void
       7  print_objects (GDBusObjectManager *manager)
       8  {
       9    GList *objects;
      10    GList *l;
      11  
      12    g_print ("Object manager at %s\n", g_dbus_object_manager_get_object_path (manager));
      13    objects = g_dbus_object_manager_get_objects (manager);
      14    for (l = objects; l != NULL; l = l->next)
      15      {
      16        ExampleObject *object = EXAMPLE_OBJECT (l->data);
      17        GList *interfaces;
      18        GList *ll;
      19        g_print (" - Object at %s\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
      20  
      21        interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object));
      22        for (ll = interfaces; ll != NULL; ll = ll->next)
      23          {
      24            GDBusInterface *interface = G_DBUS_INTERFACE (ll->data);
      25            g_print ("   - Interface %s\n", g_dbus_interface_get_info (interface)->name);
      26  
      27            /* Note that @interface is really a GDBusProxy instance - and additionally also
      28             * an ExampleAnimal or ExampleCat instance - either of these can be used to
      29             * invoke methods on the remote object. For example, the generated function
      30             *
      31             *  void example_animal_call_poke_sync (ExampleAnimal  *proxy,
      32             *                                      gboolean        make_sad,
      33             *                                      gboolean        make_happy,
      34             *                                      GCancellable   *cancellable,
      35             *                                      GError        **error);
      36             *
      37             * can be used to call the Poke() D-Bus method on the .Animal interface.
      38             * Additionally, the generated function
      39             *
      40             *  const gchar *example_animal_get_mood (ExampleAnimal *object);
      41             *
      42             * can be used to get the value of the :Mood property.
      43             */
      44          }
      45        g_list_free_full (interfaces, g_object_unref);
      46      }
      47    g_list_free_full (objects, g_object_unref);
      48  }
      49  
      50  static void
      51  on_object_added (GDBusObjectManager *manager,
      52                   GDBusObject        *object,
      53                   gpointer            user_data)
      54  {
      55    gchar *owner;
      56    owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
      57    g_print ("Added object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner);
      58    g_free (owner);
      59  }
      60  
      61  static void
      62  on_object_removed (GDBusObjectManager *manager,
      63                     GDBusObject        *object,
      64                     gpointer            user_data)
      65  {
      66    gchar *owner;
      67    owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
      68    g_print ("Removed object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner);
      69    g_free (owner);
      70  }
      71  
      72  static void
      73  on_notify_name_owner (GObject    *object,
      74                        GParamSpec *pspec,
      75                        gpointer    user_data)
      76  {
      77    GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (object);
      78    gchar *name_owner;
      79  
      80    name_owner = g_dbus_object_manager_client_get_name_owner (manager);
      81    g_print ("name-owner: %s\n", name_owner);
      82    g_free (name_owner);
      83  }
      84  
      85  static void
      86  on_interface_proxy_properties_changed (GDBusObjectManagerClient *manager,
      87                                         GDBusObjectProxy         *object_proxy,
      88                                         GDBusProxy               *interface_proxy,
      89                                         GVariant                 *changed_properties,
      90                                         const gchar *const       *invalidated_properties,
      91                                         gpointer                  user_data)
      92  {
      93    GVariantIter iter;
      94    const gchar *key;
      95    GVariant *value;
      96    gchar *s;
      97  
      98    g_print ("Properties Changed on %s:\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object_proxy)));
      99    g_variant_iter_init (&iter, changed_properties);
     100    while (g_variant_iter_next (&iter, "{&sv}", &key, &value))
     101      {
     102        s = g_variant_print (value, TRUE);
     103        g_print ("  %s -> %s\n", key, s);
     104        g_variant_unref (value);
     105        g_free (s);
     106      }
     107  }
     108  
     109  gint
     110  main (gint argc, gchar *argv[])
     111  {
     112    GDBusObjectManager *manager;
     113    GMainLoop *loop;
     114    GError *error;
     115    gchar *name_owner;
     116  
     117    manager = NULL;
     118    loop = NULL;
     119  
     120    loop = g_main_loop_new (NULL, FALSE);
     121  
     122    error = NULL;
     123    manager = example_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SESSION,
     124                                                              G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
     125                                                              "org.gtk.GDBus.Examples.ObjectManager",
     126                                                              "/example/Animals",
     127                                                              NULL, /* GCancellable */
     128                                                              &error);
     129    if (manager == NULL)
     130      {
     131        g_printerr ("Error getting object manager client: %s", error->message);
     132        g_error_free (error);
     133        goto out;
     134      }
     135  
     136    name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
     137    g_print ("name-owner: %s\n", name_owner);
     138    g_free (name_owner);
     139  
     140    print_objects (manager);
     141  
     142    g_signal_connect (manager,
     143                      "notify::name-owner",
     144                      G_CALLBACK (on_notify_name_owner),
     145                      NULL);
     146    g_signal_connect (manager,
     147                      "object-added",
     148                      G_CALLBACK (on_object_added),
     149                      NULL);
     150    g_signal_connect (manager,
     151                      "object-removed",
     152                      G_CALLBACK (on_object_removed),
     153                      NULL);
     154    g_signal_connect (manager,
     155                      "interface-proxy-properties-changed",
     156                      G_CALLBACK (on_interface_proxy_properties_changed),
     157                      NULL);
     158  
     159    g_main_loop_run (loop);
     160  
     161   out:
     162    if (manager != NULL)
     163      g_object_unref (manager);
     164    if (loop != NULL)
     165      g_main_loop_unref (loop);
     166  
     167    return 0;
     168  }