GDBus: Add ObjectManager example
[platform/upstream/glib.git] / gio / tests / gdbus-example-objectmanager-client.c
1
2 #include "gdbus-example-objectmanager-generated.h"
3
4 /* ---------------------------------------------------------------------------------------------------- */
5
6 static void
7 on_object_added (GDBusObjectManager *manager,
8                  GDBusObject        *object,
9                  gpointer            user_data)
10 {
11   gchar *owner;
12   owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
13   g_debug ("added object at %s (owner %s)", g_dbus_object_get_object_path (object), owner);
14   g_free (owner);
15 }
16
17 static void
18 on_object_removed (GDBusObjectManager *manager,
19                    GDBusObject        *object,
20                    gpointer            user_data)
21 {
22   gchar *owner;
23   owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
24   g_debug ("removed object at %s (owner %s)", g_dbus_object_get_object_path (object), owner);
25   g_free (owner);
26 }
27
28 static void
29 on_notify_name_owner (GObject    *object,
30                       GParamSpec *pspec,
31                       gpointer    user_data)
32 {
33   GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (object);
34   gchar *name_owner;
35
36   name_owner = g_dbus_object_manager_client_get_name_owner (manager);
37   g_debug ("name-owner: %s", name_owner);
38   g_free (name_owner);
39 }
40
41 static void
42 on_interface_proxy_properties_changed (GDBusObjectManagerClient *manager,
43                                        GDBusObjectProxy         *object_proxy,
44                                        GDBusProxy               *interface_proxy,
45                                        GVariant                 *changed_properties,
46                                        const gchar *const       *invalidated_properties,
47                                        gpointer                  user_data)
48 {
49   GVariantIter iter;
50   const gchar *key;
51   GVariant *value;
52   gchar *s;
53
54   g_print ("Properties Changed on %s:\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object_proxy)));
55   g_variant_iter_init (&iter, changed_properties);
56   while (g_variant_iter_next (&iter, "{&sv}", &key, &value))
57     {
58       s = g_variant_print (value, TRUE);
59       g_print ("  %s -> %s\n", key, s);
60       g_variant_unref (value);
61       g_free (s);
62     }
63 }
64
65 gint
66 main (gint argc, gchar *argv[])
67 {
68   GDBusObjectManager *manager;
69   GMainLoop *loop;
70   GError *error;
71   gchar *name_owner;
72   GList *objects;
73   GList *l;
74
75   manager = NULL;
76   loop = NULL;
77
78   g_type_init ();
79
80   loop = g_main_loop_new (NULL, FALSE);
81
82   error = NULL;
83   manager = example_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SESSION,
84                                                             G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
85                                                             "org.gtk.GDBus.Examples.ObjectManager",
86                                                             "/example/Animals",
87                                                             NULL, /* GCancellable */
88                                                             &error);
89   if (manager == NULL)
90     {
91       g_printerr ("Error getting object manager client: %s", error->message);
92       g_error_free (error);
93       goto out;
94     }
95
96   name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
97   g_debug ("name-owner: %s", name_owner);
98   g_free (name_owner);
99
100   objects = g_dbus_object_manager_get_objects (manager);
101   for (l = objects; l != NULL; l = l->next)
102     {
103       GDBusObject *object = G_DBUS_OBJECT (l->data);
104       g_debug ("proxy has object at %s", g_dbus_object_get_object_path (object));
105     }
106   g_list_foreach (objects, (GFunc) g_object_unref, NULL);
107   g_list_free (objects);
108
109   g_signal_connect (manager,
110                     "notify::name-owner",
111                     G_CALLBACK (on_notify_name_owner),
112                     NULL);
113   g_signal_connect (manager,
114                     "object-added",
115                     G_CALLBACK (on_object_added),
116                     NULL);
117   g_signal_connect (manager,
118                     "object-removed",
119                     G_CALLBACK (on_object_removed),
120                     NULL);
121   g_signal_connect (manager,
122                     "interface-proxy-properties-changed",
123                     G_CALLBACK (on_interface_proxy_properties_changed),
124                     NULL);
125
126   g_main_loop_run (loop);
127
128  out:
129   if (manager != NULL)
130     g_object_unref (manager);
131   if (loop != NULL)
132     g_main_loop_unref (loop);
133
134   return 0;
135 }