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