|
Packit |
ae235b |
|
|
Packit |
ae235b |
#include "gdbus-object-manager-example/gdbus-example-objectmanager-generated.h"
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
/* ---------------------------------------------------------------------------------------------------- */
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
print_objects (GDBusObjectManager *manager)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GList *objects;
|
|
Packit |
ae235b |
GList *l;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_print ("Object manager at %s\n", g_dbus_object_manager_get_object_path (manager));
|
|
Packit |
ae235b |
objects = g_dbus_object_manager_get_objects (manager);
|
|
Packit |
ae235b |
for (l = objects; l != NULL; l = l->next)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
ExampleObject *object = EXAMPLE_OBJECT (l->data);
|
|
Packit |
ae235b |
GList *interfaces;
|
|
Packit |
ae235b |
GList *ll;
|
|
Packit |
ae235b |
g_print (" - Object at %s\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object));
|
|
Packit |
ae235b |
for (ll = interfaces; ll != NULL; ll = ll->next)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GDBusInterface *interface = G_DBUS_INTERFACE (ll->data);
|
|
Packit |
ae235b |
g_print (" - Interface %s\n", g_dbus_interface_get_info (interface)->name);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
/* Note that @interface is really a GDBusProxy instance - and additionally also
|
|
Packit |
ae235b |
* an ExampleAnimal or ExampleCat instance - either of these can be used to
|
|
Packit |
ae235b |
* invoke methods on the remote object. For example, the generated function
|
|
Packit |
ae235b |
*
|
|
Packit |
ae235b |
* void example_animal_call_poke_sync (ExampleAnimal *proxy,
|
|
Packit |
ae235b |
* gboolean make_sad,
|
|
Packit |
ae235b |
* gboolean make_happy,
|
|
Packit |
ae235b |
* GCancellable *cancellable,
|
|
Packit |
ae235b |
* GError **error);
|
|
Packit |
ae235b |
*
|
|
Packit |
ae235b |
* can be used to call the Poke() D-Bus method on the .Animal interface.
|
|
Packit |
ae235b |
* Additionally, the generated function
|
|
Packit |
ae235b |
*
|
|
Packit |
ae235b |
* const gchar *example_animal_get_mood (ExampleAnimal *object);
|
|
Packit |
ae235b |
*
|
|
Packit |
ae235b |
* can be used to get the value of the :Mood property.
|
|
Packit |
ae235b |
*/
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
g_list_free_full (interfaces, g_object_unref);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
g_list_free_full (objects, g_object_unref);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
on_object_added (GDBusObjectManager *manager,
|
|
Packit |
ae235b |
GDBusObject *object,
|
|
Packit |
ae235b |
gpointer user_data)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
gchar *owner;
|
|
Packit |
ae235b |
owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
|
|
Packit |
ae235b |
g_print ("Added object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner);
|
|
Packit |
ae235b |
g_free (owner);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
on_object_removed (GDBusObjectManager *manager,
|
|
Packit |
ae235b |
GDBusObject *object,
|
|
Packit |
ae235b |
gpointer user_data)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
gchar *owner;
|
|
Packit |
ae235b |
owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
|
|
Packit |
ae235b |
g_print ("Removed object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner);
|
|
Packit |
ae235b |
g_free (owner);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
on_notify_name_owner (GObject *object,
|
|
Packit |
ae235b |
GParamSpec *pspec,
|
|
Packit |
ae235b |
gpointer user_data)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (object);
|
|
Packit |
ae235b |
gchar *name_owner;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
name_owner = g_dbus_object_manager_client_get_name_owner (manager);
|
|
Packit |
ae235b |
g_print ("name-owner: %s\n", name_owner);
|
|
Packit |
ae235b |
g_free (name_owner);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
static void
|
|
Packit |
ae235b |
on_interface_proxy_properties_changed (GDBusObjectManagerClient *manager,
|
|
Packit |
ae235b |
GDBusObjectProxy *object_proxy,
|
|
Packit |
ae235b |
GDBusProxy *interface_proxy,
|
|
Packit |
ae235b |
GVariant *changed_properties,
|
|
Packit |
ae235b |
const gchar *const *invalidated_properties,
|
|
Packit |
ae235b |
gpointer user_data)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GVariantIter iter;
|
|
Packit |
ae235b |
const gchar *key;
|
|
Packit |
ae235b |
GVariant *value;
|
|
Packit |
ae235b |
gchar *s;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_print ("Properties Changed on %s:\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object_proxy)));
|
|
Packit |
ae235b |
g_variant_iter_init (&iter, changed_properties);
|
|
Packit |
ae235b |
while (g_variant_iter_next (&iter, "{&sv}", &key, &value))
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
s = g_variant_print (value, TRUE);
|
|
Packit |
ae235b |
g_print (" %s -> %s\n", key, s);
|
|
Packit |
ae235b |
g_variant_unref (value);
|
|
Packit |
ae235b |
g_free (s);
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
gint
|
|
Packit |
ae235b |
main (gint argc, gchar *argv[])
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
GDBusObjectManager *manager;
|
|
Packit |
ae235b |
GMainLoop *loop;
|
|
Packit |
ae235b |
GError *error;
|
|
Packit |
ae235b |
gchar *name_owner;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
manager = NULL;
|
|
Packit |
ae235b |
loop = NULL;
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
loop = g_main_loop_new (NULL, FALSE);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
error = NULL;
|
|
Packit |
ae235b |
manager = example_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
|
Packit |
ae235b |
G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
|
|
Packit |
ae235b |
"org.gtk.GDBus.Examples.ObjectManager",
|
|
Packit |
ae235b |
"/example/Animals",
|
|
Packit |
ae235b |
NULL, /* GCancellable */
|
|
Packit |
ae235b |
&error);
|
|
Packit |
ae235b |
if (manager == NULL)
|
|
Packit |
ae235b |
{
|
|
Packit |
ae235b |
g_printerr ("Error getting object manager client: %s", error->message);
|
|
Packit |
ae235b |
g_error_free (error);
|
|
Packit |
ae235b |
goto out;
|
|
Packit |
ae235b |
}
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager));
|
|
Packit |
ae235b |
g_print ("name-owner: %s\n", name_owner);
|
|
Packit |
ae235b |
g_free (name_owner);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
print_objects (manager);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_signal_connect (manager,
|
|
Packit |
ae235b |
"notify::name-owner",
|
|
Packit |
ae235b |
G_CALLBACK (on_notify_name_owner),
|
|
Packit |
ae235b |
NULL);
|
|
Packit |
ae235b |
g_signal_connect (manager,
|
|
Packit |
ae235b |
"object-added",
|
|
Packit |
ae235b |
G_CALLBACK (on_object_added),
|
|
Packit |
ae235b |
NULL);
|
|
Packit |
ae235b |
g_signal_connect (manager,
|
|
Packit |
ae235b |
"object-removed",
|
|
Packit |
ae235b |
G_CALLBACK (on_object_removed),
|
|
Packit |
ae235b |
NULL);
|
|
Packit |
ae235b |
g_signal_connect (manager,
|
|
Packit |
ae235b |
"interface-proxy-properties-changed",
|
|
Packit |
ae235b |
G_CALLBACK (on_interface_proxy_properties_changed),
|
|
Packit |
ae235b |
NULL);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
g_main_loop_run (loop);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
out:
|
|
Packit |
ae235b |
if (manager != NULL)
|
|
Packit |
ae235b |
g_object_unref (manager);
|
|
Packit |
ae235b |
if (loop != NULL)
|
|
Packit |
ae235b |
g_main_loop_unref (loop);
|
|
Packit |
ae235b |
|
|
Packit |
ae235b |
return 0;
|
|
Packit |
ae235b |
}
|