| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | /* GDBus - GLib D-Bus Library
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2008-2010 Red Hat, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |  * version 2 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General | 
					
						
							|  |  |  |  * Public License along with this library; if not, write to the | 
					
						
							|  |  |  |  * Free Software Foundation, Inc., 59 Temple Place, Suite 330, | 
					
						
							|  |  |  |  * Boston, MA 02111-1307, USA. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Author: David Zeuthen <davidz@redhat.com> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "config.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "gdbusobjectmanager.h"
 | 
					
						
							|  |  |  | #include "gdbusobjectmanagerserver.h"
 | 
					
						
							|  |  |  | #include "gdbusobject.h"
 | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  | #include "gdbusobjectskeleton.h"
 | 
					
						
							|  |  |  | #include "gdbusinterfaceskeleton.h"
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | #include "gdbusconnection.h"
 | 
					
						
							|  |  |  | #include "gdbusintrospection.h"
 | 
					
						
							|  |  |  | #include "gdbusmethodinvocation.h"
 | 
					
						
							|  |  |  | #include "gdbuserror.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "glibintl.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * SECTION:gdbusobjectmanagerserver | 
					
						
							|  |  |  |  * @short_description: Service-side object manager | 
					
						
							|  |  |  |  * @include: gio/gio.h | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * #GDBusObjectManagerServer is used to export #GDBusObject instances using | 
					
						
							|  |  |  |  * the standardized <ulink | 
					
						
							|  |  |  |  * url="http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager">org.freedesktop.DBus.ObjectManager</ulink> | 
					
						
							|  |  |  |  * interface. For example, remote D-Bus clients can get all objects | 
					
						
							|  |  |  |  * and properties in a single call. Additionally, any change in the | 
					
						
							|  |  |  |  * object hierarchy is broadcast using signals. This means that D-Bus | 
					
						
							|  |  |  |  * clients can keep caches up to date by only listening to D-Bus | 
					
						
							|  |  |  |  * signals. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-04-29 13:11:22 -04:00
										 |  |  |  * See #GDBusObjectManagerClient for the client-side code that is | 
					
						
							|  |  |  |  * intended to be used with #GDBusObjectManagerServer or any D-Bus | 
					
						
							|  |  |  |  * object implementing the org.freedesktop.DBus.ObjectManager | 
					
						
							|  |  |  |  * interface. | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |   GDBusObjectSkeleton *object; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   GDBusObjectManagerServer *manager; | 
					
						
							|  |  |  |   GHashTable *map_iface_name_to_iface; | 
					
						
							|  |  |  |   gboolean exported; | 
					
						
							|  |  |  | } RegistrationData; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void registration_data_free (RegistrationData *data); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  | static void export_all (GDBusObjectManagerServer *manager); | 
					
						
							|  |  |  | static void unexport_all (GDBusObjectManagerServer *manager, gboolean only_manager); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | static void g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *manager, | 
					
						
							|  |  |  |                                                          RegistrationData   *data, | 
					
						
							| 
									
										
										
										
											2011-09-19 16:45:05 -04:00
										 |  |  |                                                          const gchar *const *interfaces, | 
					
						
							|  |  |  |                                                          const gchar *object_path); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void g_dbus_object_manager_server_emit_interfaces_removed (GDBusObjectManagerServer *manager, | 
					
						
							|  |  |  |                                                            RegistrationData   *data, | 
					
						
							|  |  |  |                                                            const gchar *const *interfaces); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | static gboolean g_dbus_object_manager_server_unexport_unlocked (GDBusObjectManagerServer  *manager, | 
					
						
							|  |  |  |                                                                 const gchar               *object_path); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | struct _GDBusObjectManagerServerPrivate | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   GMutex lock; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   GDBusConnection *connection; | 
					
						
							|  |  |  |   gchar *object_path; | 
					
						
							|  |  |  |   gchar *object_path_ending_in_slash; | 
					
						
							|  |  |  |   GHashTable *map_object_path_to_data; | 
					
						
							|  |  |  |   guint manager_reg_id; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   PROP_0, | 
					
						
							|  |  |  |   PROP_CONNECTION, | 
					
						
							|  |  |  |   PROP_OBJECT_PATH | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void dbus_object_manager_interface_init (GDBusObjectManagerIface *iface); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | G_DEFINE_TYPE_WITH_CODE (GDBusObjectManagerServer, g_dbus_object_manager_server, G_TYPE_OBJECT, | 
					
						
							|  |  |  |                          G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT_MANAGER, dbus_object_manager_interface_init)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void g_dbus_object_manager_server_constructed (GObject *object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_dbus_object_manager_server_finalize (GObject *object) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |   if (manager->priv->connection != NULL) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       unexport_all (manager, TRUE); | 
					
						
							|  |  |  |       g_object_unref (manager->priv->connection); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   g_hash_table_unref (manager->priv->map_object_path_to_data); | 
					
						
							|  |  |  |   g_free (manager->priv->object_path); | 
					
						
							|  |  |  |   g_free (manager->priv->object_path_ending_in_slash); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_clear (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   if (G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->finalize != NULL) | 
					
						
							|  |  |  |     G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->finalize (object); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  | g_dbus_object_manager_server_get_property (GObject    *object, | 
					
						
							|  |  |  |                                            guint       prop_id, | 
					
						
							|  |  |  |                                            GValue     *value, | 
					
						
							|  |  |  |                                            GParamSpec *pspec) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |   GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   switch (prop_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     case PROP_CONNECTION: | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |       g_mutex_lock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |       g_value_set_object (value, manager->priv->connection); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |       g_mutex_unlock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |       break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     case PROP_OBJECT_PATH: | 
					
						
							|  |  |  |       g_value_set_string (value, g_dbus_object_manager_get_object_path (G_DBUS_OBJECT_MANAGER (manager))); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     default: | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  | g_dbus_object_manager_server_set_property (GObject       *object, | 
					
						
							|  |  |  |                                            guint          prop_id, | 
					
						
							|  |  |  |                                            const GValue  *value, | 
					
						
							|  |  |  |                                            GParamSpec    *pspec) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |   GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   switch (prop_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     case PROP_CONNECTION: | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |       g_dbus_object_manager_server_set_connection (manager, g_value_get_object (value)); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |       break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     case PROP_OBJECT_PATH: | 
					
						
							|  |  |  |       g_assert (manager->priv->object_path == NULL); | 
					
						
							|  |  |  |       g_assert (g_variant_is_object_path (g_value_get_string (value))); | 
					
						
							|  |  |  |       manager->priv->object_path = g_value_dup_string (value); | 
					
						
							|  |  |  |       manager->priv->object_path_ending_in_slash = g_strdup_printf ("%s/", manager->priv->object_path); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     default: | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_dbus_object_manager_server_class_init (GDBusObjectManagerServerClass *klass) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GObjectClass *gobject_class = G_OBJECT_CLASS (klass); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   gobject_class->finalize     = g_dbus_object_manager_server_finalize; | 
					
						
							|  |  |  |   gobject_class->constructed  = g_dbus_object_manager_server_constructed; | 
					
						
							|  |  |  |   gobject_class->set_property = g_dbus_object_manager_server_set_property; | 
					
						
							|  |  |  |   gobject_class->get_property = g_dbus_object_manager_server_get_property; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /**
 | 
					
						
							|  |  |  |    * GDBusObjectManagerServer:connection: | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    * The #GDBusConnection to export objects on. | 
					
						
							| 
									
										
										
										
											2011-04-08 16:29:48 -04:00
										 |  |  |    * | 
					
						
							|  |  |  |    * Since: 2.30 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |    */ | 
					
						
							|  |  |  |   g_object_class_install_property (gobject_class, | 
					
						
							|  |  |  |                                    PROP_CONNECTION, | 
					
						
							|  |  |  |                                    g_param_spec_object ("connection", | 
					
						
							|  |  |  |                                                         "Connection", | 
					
						
							|  |  |  |                                                         "The connection to export objects on", | 
					
						
							|  |  |  |                                                         G_TYPE_DBUS_CONNECTION, | 
					
						
							|  |  |  |                                                         G_PARAM_READABLE | | 
					
						
							|  |  |  |                                                         G_PARAM_WRITABLE | | 
					
						
							|  |  |  |                                                         G_PARAM_STATIC_STRINGS)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /**
 | 
					
						
							|  |  |  |    * GDBusObjectManagerServer:object-path: | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    * The object path to register the manager object at. | 
					
						
							| 
									
										
										
										
											2011-04-08 16:29:48 -04:00
										 |  |  |    * | 
					
						
							|  |  |  |    * Since: 2.30 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |    */ | 
					
						
							|  |  |  |   g_object_class_install_property (gobject_class, | 
					
						
							|  |  |  |                                    PROP_OBJECT_PATH, | 
					
						
							|  |  |  |                                    g_param_spec_string ("object-path", | 
					
						
							|  |  |  |                                                         "Object Path", | 
					
						
							|  |  |  |                                                         "The object path to register the manager object at", | 
					
						
							|  |  |  |                                                         NULL, | 
					
						
							|  |  |  |                                                         G_PARAM_READABLE | | 
					
						
							|  |  |  |                                                         G_PARAM_WRITABLE | | 
					
						
							|  |  |  |                                                         G_PARAM_CONSTRUCT_ONLY | | 
					
						
							|  |  |  |                                                         G_PARAM_STATIC_STRINGS)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_type_class_add_private (klass, sizeof (GDBusObjectManagerServerPrivate)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_dbus_object_manager_server_init (GDBusObjectManagerServer *manager) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, | 
					
						
							|  |  |  |                                                G_TYPE_DBUS_OBJECT_MANAGER_SERVER, | 
					
						
							|  |  |  |                                                GDBusObjectManagerServerPrivate); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_init (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   manager->priv->map_object_path_to_data = g_hash_table_new_full (g_str_hash, | 
					
						
							|  |  |  |                                                                   g_str_equal, | 
					
						
							|  |  |  |                                                                   g_free, | 
					
						
							|  |  |  |                                                                   (GDestroyNotify) registration_data_free); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * g_dbus_object_manager_server_new: | 
					
						
							|  |  |  |  * @object_path: The object path to export the manager object at. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Creates a new #GDBusObjectManagerServer object. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |  * The returned server isn't yet exported on any connection. To do so, | 
					
						
							|  |  |  |  * use g_dbus_object_manager_server_set_connection(). Normally you | 
					
						
							|  |  |  |  * want to export all of your objects before doing so to avoid <ulink | 
					
						
							|  |  |  |  * url="http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager">InterfacesAdded</ulink> | 
					
						
							|  |  |  |  * signals being emitted. | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Returns: A #GDBusObjectManagerServer object. Free with g_object_unref(). | 
					
						
							| 
									
										
										
										
											2011-04-08 16:29:48 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.30 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | GDBusObjectManagerServer * | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  | g_dbus_object_manager_server_new (const gchar     *object_path) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | { | 
					
						
							|  |  |  |   g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); | 
					
						
							|  |  |  |   return G_DBUS_OBJECT_MANAGER_SERVER (g_object_new (G_TYPE_DBUS_OBJECT_MANAGER_SERVER, | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |                                                      "object-path", object_path, | 
					
						
							|  |  |  |                                                      NULL)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * g_dbus_object_manager_server_set_connection: | 
					
						
							|  |  |  |  * @manager: A #GDBusObjectManagerServer. | 
					
						
							|  |  |  |  * @connection: (allow-none): A #GDBusConnection or %NULL. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Exports all objects managed by @manager on @connection. If | 
					
						
							|  |  |  |  * @connection is %NULL, stops exporting objects. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | g_dbus_object_manager_server_set_connection (GDBusObjectManagerServer  *manager, | 
					
						
							|  |  |  |                                              GDBusConnection           *connection) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); | 
					
						
							|  |  |  |   g_return_if_fail (connection == NULL || G_IS_DBUS_CONNECTION (connection)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_lock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |   if (manager->priv->connection == connection) | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |       g_mutex_unlock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  |       goto out; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (manager->priv->connection != NULL) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       unexport_all (manager, FALSE); | 
					
						
							|  |  |  |       g_object_unref (manager->priv->connection); | 
					
						
							|  |  |  |       manager->priv->connection = NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   manager->priv->connection = connection != NULL ? g_object_ref (connection) : NULL; | 
					
						
							|  |  |  |   if (manager->priv->connection != NULL) | 
					
						
							|  |  |  |     export_all (manager); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_unlock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |   g_object_notify (G_OBJECT (manager), "connection"); | 
					
						
							|  |  |  |  out: | 
					
						
							|  |  |  |   ; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * g_dbus_object_manager_server_get_connection: | 
					
						
							|  |  |  |  * @manager: A #GDBusObjectManagerServer | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Gets the #GDBusConnection used by @manager. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |  * Returns: (transfer full): A #GDBusConnection object or %NULL if | 
					
						
							|  |  |  |  *   @manager isn't exported on a connection. The returned object should | 
					
						
							|  |  |  |  *   be freed with g_object_unref(). | 
					
						
							| 
									
										
										
										
											2011-04-08 16:29:48 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.30 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | GDBusConnection * | 
					
						
							|  |  |  | g_dbus_object_manager_server_get_connection (GDBusObjectManagerServer *manager) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  |   GDBusConnection *ret; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), NULL); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_lock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  |   ret = manager->priv->connection != NULL ? g_object_ref (manager->priv->connection) : NULL; | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_unlock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  |   return ret; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  | registration_data_export_interface (RegistrationData        *data, | 
					
						
							| 
									
										
										
										
											2011-09-19 16:45:05 -04:00
										 |  |  |                                     GDBusInterfaceSkeleton  *interface_skeleton, | 
					
						
							|  |  |  |                                     const gchar             *object_path) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | { | 
					
						
							|  |  |  |   GDBusInterfaceInfo *info; | 
					
						
							|  |  |  |   GError *error; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |   info = g_dbus_interface_skeleton_get_info (interface_skeleton); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   error = NULL; | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |   if (data->manager->priv->connection != NULL) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |       if (!g_dbus_interface_skeleton_export (interface_skeleton, | 
					
						
							|  |  |  |                                              data->manager->priv->connection, | 
					
						
							|  |  |  |                                              object_path, | 
					
						
							|  |  |  |                                              &error)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           g_warning ("%s: Error registering object at %s with interface %s: %s", | 
					
						
							|  |  |  |                      G_STRLOC, | 
					
						
							|  |  |  |                      object_path, | 
					
						
							|  |  |  |                      info->name, | 
					
						
							|  |  |  |                      error->message); | 
					
						
							|  |  |  |           g_error_free (error); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_assert (g_hash_table_lookup (data->map_iface_name_to_iface, info->name) == NULL); | 
					
						
							|  |  |  |   g_hash_table_insert (data->map_iface_name_to_iface, | 
					
						
							|  |  |  |                        info->name, | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |                        g_object_ref (interface_skeleton)); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* if we are already exported, then... */ | 
					
						
							|  |  |  |   if (data->exported) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       const gchar *interfaces[2]; | 
					
						
							|  |  |  |       /* emit InterfacesAdded on the ObjectManager object */ | 
					
						
							|  |  |  |       interfaces[0] = info->name; | 
					
						
							|  |  |  |       interfaces[1] = NULL; | 
					
						
							| 
									
										
										
										
											2011-09-19 16:45:05 -04:00
										 |  |  |       g_dbus_object_manager_server_emit_interfaces_added (data->manager, data, interfaces, object_path); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  | registration_data_unexport_interface (RegistrationData       *data, | 
					
						
							|  |  |  |                                       GDBusInterfaceSkeleton *interface_skeleton) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | { | 
					
						
							|  |  |  |   GDBusInterfaceInfo *info; | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |   GDBusInterfaceSkeleton *iface; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |   info = g_dbus_interface_skeleton_get_info (interface_skeleton); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   iface = g_hash_table_lookup (data->map_iface_name_to_iface, info->name); | 
					
						
							|  |  |  |   g_assert (iface != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |   if (data->manager->priv->connection != NULL) | 
					
						
							|  |  |  |     g_dbus_interface_skeleton_unexport (iface); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   g_warn_if_fail (g_hash_table_remove (data->map_iface_name_to_iface, info->name)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* if we are already exported, then... */ | 
					
						
							|  |  |  |   if (data->exported) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       const gchar *interfaces[2]; | 
					
						
							|  |  |  |       /* emit InterfacesRemoved on the ObjectManager object */ | 
					
						
							|  |  |  |       interfaces[0] = info->name; | 
					
						
							|  |  |  |       interfaces[1] = NULL; | 
					
						
							|  |  |  |       g_dbus_object_manager_server_emit_interfaces_removed (data->manager, data, interfaces); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | on_interface_added (GDBusObject    *object, | 
					
						
							|  |  |  |                     GDBusInterface *interface, | 
					
						
							|  |  |  |                     gpointer        user_data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   RegistrationData *data = user_data; | 
					
						
							| 
									
										
										
										
											2011-09-19 16:45:05 -04:00
										 |  |  |   const gchar *object_path; | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_lock (&data->manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-09-19 16:45:05 -04:00
										 |  |  |   object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object)); | 
					
						
							|  |  |  |   registration_data_export_interface (data, G_DBUS_INTERFACE_SKELETON (interface), object_path); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_unlock (&data->manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | on_interface_removed (GDBusObject    *object, | 
					
						
							|  |  |  |                       GDBusInterface *interface, | 
					
						
							|  |  |  |                       gpointer        user_data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   RegistrationData *data = user_data; | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_lock (&data->manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |   registration_data_unexport_interface (data, G_DBUS_INTERFACE_SKELETON (interface)); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_unlock (&data->manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | registration_data_free (RegistrationData *data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GHashTableIter iter; | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |   GDBusInterfaceSkeleton *iface; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   data->exported = FALSE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_hash_table_iter_init (&iter, data->map_iface_name_to_iface); | 
					
						
							|  |  |  |   while (g_hash_table_iter_next (&iter, NULL, (gpointer) &iface)) | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |       if (data->manager->priv->connection != NULL) | 
					
						
							|  |  |  |         g_dbus_interface_skeleton_unexport (iface); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   g_signal_handlers_disconnect_by_func (data->object, G_CALLBACK (on_interface_added), data); | 
					
						
							|  |  |  |   g_signal_handlers_disconnect_by_func (data->object, G_CALLBACK (on_interface_removed), data); | 
					
						
							|  |  |  |   g_object_unref (data->object); | 
					
						
							|  |  |  |   g_hash_table_destroy (data->map_iface_name_to_iface); | 
					
						
							|  |  |  |   g_free (data); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | static void | 
					
						
							|  |  |  | g_dbus_object_manager_server_export_unlocked (GDBusObjectManagerServer  *manager, | 
					
						
							|  |  |  |                                               GDBusObjectSkeleton       *object, | 
					
						
							|  |  |  |                                               const gchar               *object_path) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | { | 
					
						
							|  |  |  |   RegistrationData *data; | 
					
						
							|  |  |  |   GList *existing_interfaces; | 
					
						
							|  |  |  |   GList *l; | 
					
						
							|  |  |  |   GPtrArray *interface_names; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); | 
					
						
							|  |  |  |   g_return_if_fail (G_IS_DBUS_OBJECT (object)); | 
					
						
							|  |  |  |   g_return_if_fail (g_str_has_prefix (object_path, manager->priv->object_path_ending_in_slash)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   interface_names = g_ptr_array_new (); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); | 
					
						
							|  |  |  |   if (data != NULL) | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  |     g_dbus_object_manager_server_unexport_unlocked (manager, object_path); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   data = g_new0 (RegistrationData, 1); | 
					
						
							|  |  |  |   data->object = g_object_ref (object); | 
					
						
							|  |  |  |   data->manager = manager; | 
					
						
							|  |  |  |   data->map_iface_name_to_iface = g_hash_table_new_full (g_str_hash, | 
					
						
							|  |  |  |                                                          g_str_equal, | 
					
						
							|  |  |  |                                                          NULL, | 
					
						
							|  |  |  |                                                          (GDestroyNotify) g_object_unref); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_signal_connect (object, | 
					
						
							|  |  |  |                     "interface-added", | 
					
						
							|  |  |  |                     G_CALLBACK (on_interface_added), | 
					
						
							|  |  |  |                     data); | 
					
						
							|  |  |  |   g_signal_connect (object, | 
					
						
							|  |  |  |                     "interface-removed", | 
					
						
							|  |  |  |                     G_CALLBACK (on_interface_removed), | 
					
						
							|  |  |  |                     data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* Register all known interfaces - note that data->exported is FALSE so
 | 
					
						
							|  |  |  |    * we don't emit any InterfacesAdded signals. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   existing_interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object)); | 
					
						
							|  |  |  |   for (l = existing_interfaces; l != NULL; l = l->next) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |       GDBusInterfaceSkeleton *interface_skeleton = G_DBUS_INTERFACE_SKELETON (l->data); | 
					
						
							| 
									
										
										
										
											2011-09-19 16:45:05 -04:00
										 |  |  |       registration_data_export_interface (data, interface_skeleton, object_path); | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |       g_ptr_array_add (interface_names, g_dbus_interface_skeleton_get_info (interface_skeleton)->name); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-01-02 16:30:11 +01:00
										 |  |  |   g_list_free_full (existing_interfaces, g_object_unref); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   g_ptr_array_add (interface_names, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   data->exported = TRUE; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* now emit InterfacesAdded() for all the interfaces */ | 
					
						
							| 
									
										
										
										
											2011-09-19 16:45:05 -04:00
										 |  |  |   g_dbus_object_manager_server_emit_interfaces_added (manager, data, (const gchar *const *) interface_names->pdata, object_path); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   g_ptr_array_unref (interface_names); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_hash_table_insert (manager->priv->map_object_path_to_data, | 
					
						
							|  |  |  |                        g_strdup (object_path), | 
					
						
							|  |  |  |                        data); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * g_dbus_object_manager_server_export: | 
					
						
							|  |  |  |  * @manager: A #GDBusObjectManagerServer. | 
					
						
							|  |  |  |  * @object: A #GDBusObjectSkeleton. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Exports @object on @manager. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * If there is already a #GDBusObject exported at the object path, | 
					
						
							|  |  |  |  * then the old object is removed. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The object path for @object must be in the hierarchy rooted by the | 
					
						
							|  |  |  |  * object path for @manager. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Note that @manager will take a reference on @object for as long as | 
					
						
							|  |  |  |  * it is exported. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.30 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | g_dbus_object_manager_server_export (GDBusObjectManagerServer  *manager, | 
					
						
							|  |  |  |                                      GDBusObjectSkeleton       *object) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_lock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  |   g_dbus_object_manager_server_export_unlocked (manager, object, | 
					
						
							|  |  |  |                                                 g_dbus_object_get_object_path (G_DBUS_OBJECT (object))); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_unlock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2011-04-12 20:15:48 -04:00
										 |  |  |  * g_dbus_object_manager_server_export_uniquely: | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |  * @manager: A #GDBusObjectManagerServer. | 
					
						
							|  |  |  |  * @object: An object. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Like g_dbus_object_manager_server_export() but appends a string of | 
					
						
							|  |  |  |  * the form <literal>_N</literal> (with N being a natural number) to | 
					
						
							|  |  |  |  * @object<!-- -->'s object path if an object with the given path | 
					
						
							| 
									
										
										
										
											2011-09-21 08:16:43 -04:00
										 |  |  |  * already exists. As such, the #GDBusObjectProxy:g-object-path property | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |  * of @object may be modified. | 
					
						
							| 
									
										
										
										
											2011-04-08 16:29:48 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.30 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  | g_dbus_object_manager_server_export_uniquely (GDBusObjectManagerServer *manager, | 
					
						
							|  |  |  |                                               GDBusObjectSkeleton      *object) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | { | 
					
						
							|  |  |  |   gchar *orig_object_path; | 
					
						
							|  |  |  |   gchar *object_path; | 
					
						
							|  |  |  |   guint count; | 
					
						
							|  |  |  |   gboolean modified; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   orig_object_path = g_strdup (g_dbus_object_get_object_path (G_DBUS_OBJECT (object))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); | 
					
						
							|  |  |  |   g_return_if_fail (G_IS_DBUS_OBJECT (object)); | 
					
						
							|  |  |  |   g_return_if_fail (g_str_has_prefix (orig_object_path, manager->priv->object_path_ending_in_slash)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_lock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   object_path = g_strdup (orig_object_path); | 
					
						
							|  |  |  |   count = 1; | 
					
						
							|  |  |  |   modified = FALSE; | 
					
						
							|  |  |  |   while (TRUE) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       RegistrationData *data; | 
					
						
							|  |  |  |       data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); | 
					
						
							|  |  |  |       if (data == NULL) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       g_free (object_path); | 
					
						
							|  |  |  |       object_path = g_strdup_printf ("%s_%d", orig_object_path, count++); | 
					
						
							|  |  |  |       modified = TRUE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  |   g_dbus_object_manager_server_export_unlocked (manager, object, object_path); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_unlock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   if (modified) | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |     g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), object_path); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   g_free (object_path); | 
					
						
							|  |  |  |   g_free (orig_object_path); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gboolean | 
					
						
							|  |  |  | g_dbus_object_manager_server_unexport_unlocked (GDBusObjectManagerServer  *manager, | 
					
						
							|  |  |  |                                                 const gchar               *object_path) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | { | 
					
						
							|  |  |  |   RegistrationData *data; | 
					
						
							| 
									
										
										
										
											2011-04-20 11:54:24 -04:00
										 |  |  |   gboolean ret; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-20 11:54:24 -04:00
										 |  |  |   g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), FALSE); | 
					
						
							|  |  |  |   g_return_val_if_fail (g_variant_is_object_path (object_path), FALSE); | 
					
						
							|  |  |  |   g_return_val_if_fail (g_str_has_prefix (object_path, manager->priv->object_path_ending_in_slash), FALSE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ret = FALSE; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); | 
					
						
							|  |  |  |   if (data != NULL) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       GPtrArray *interface_names; | 
					
						
							|  |  |  |       GHashTableIter iter; | 
					
						
							|  |  |  |       const gchar *iface_name; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       interface_names = g_ptr_array_new (); | 
					
						
							|  |  |  |       g_hash_table_iter_init (&iter, data->map_iface_name_to_iface); | 
					
						
							|  |  |  |       while (g_hash_table_iter_next (&iter, (gpointer) &iface_name, NULL)) | 
					
						
							|  |  |  |         g_ptr_array_add (interface_names, (gpointer) iface_name); | 
					
						
							|  |  |  |       g_ptr_array_add (interface_names, NULL); | 
					
						
							|  |  |  |       /* now emit InterfacesRemoved() for all the interfaces */ | 
					
						
							|  |  |  |       g_dbus_object_manager_server_emit_interfaces_removed (manager, data, (const gchar *const *) interface_names->pdata); | 
					
						
							|  |  |  |       g_ptr_array_unref (interface_names); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       g_hash_table_remove (manager->priv->map_object_path_to_data, object_path); | 
					
						
							| 
									
										
										
										
											2011-04-20 11:54:24 -04:00
										 |  |  |       ret = TRUE; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-20 11:54:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return ret; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * g_dbus_object_manager_server_unexport: | 
					
						
							|  |  |  |  * @manager: A #GDBusObjectManagerServer. | 
					
						
							|  |  |  |  * @object_path: An object path. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * If @manager has an object at @path, removes the object. Otherwise | 
					
						
							|  |  |  |  * does nothing. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Note that @object_path must be in the hierarchy rooted by the | 
					
						
							|  |  |  |  * object path for @manager. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Returns: %TRUE if object at @object_path was removed, %FALSE otherwise. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.30 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | gboolean | 
					
						
							|  |  |  | g_dbus_object_manager_server_unexport (GDBusObjectManagerServer  *manager, | 
					
						
							|  |  |  |                                        const gchar         *object_path) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   gboolean ret; | 
					
						
							|  |  |  |   g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), FALSE); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_lock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  |   ret = g_dbus_object_manager_server_unexport_unlocked (manager, object_path); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_unlock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  |   return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusArgInfo manager_interfaces_added_signal_info_arg0 = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   -1, | 
					
						
							|  |  |  |   "object_path", | 
					
						
							|  |  |  |   "o", | 
					
						
							|  |  |  |   (GDBusAnnotationInfo**) NULL, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusArgInfo manager_interfaces_added_signal_info_arg1 = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   -1, | 
					
						
							|  |  |  |   "interfaces_and_properties", | 
					
						
							|  |  |  |   "a{sa{sv}}", | 
					
						
							|  |  |  |   (GDBusAnnotationInfo**) NULL, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusArgInfo * const manager_interfaces_added_signal_info_arg_pointers[] = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   &manager_interfaces_added_signal_info_arg0, | 
					
						
							|  |  |  |   &manager_interfaces_added_signal_info_arg1, | 
					
						
							|  |  |  |   NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusSignalInfo manager_interfaces_added_signal_info = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   -1, | 
					
						
							|  |  |  |   "InterfacesAdded", | 
					
						
							|  |  |  |   (GDBusArgInfo**) &manager_interfaces_added_signal_info_arg_pointers, | 
					
						
							|  |  |  |   (GDBusAnnotationInfo**) NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusArgInfo manager_interfaces_removed_signal_info_arg0 = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   -1, | 
					
						
							|  |  |  |   "object_path", | 
					
						
							|  |  |  |   "o", | 
					
						
							|  |  |  |   (GDBusAnnotationInfo**) NULL, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusArgInfo manager_interfaces_removed_signal_info_arg1 = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   -1, | 
					
						
							|  |  |  |   "interfaces", | 
					
						
							|  |  |  |   "as", | 
					
						
							|  |  |  |   (GDBusAnnotationInfo**) NULL, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusArgInfo * const manager_interfaces_removed_signal_info_arg_pointers[] = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   &manager_interfaces_removed_signal_info_arg0, | 
					
						
							|  |  |  |   &manager_interfaces_removed_signal_info_arg1, | 
					
						
							|  |  |  |   NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusSignalInfo manager_interfaces_removed_signal_info = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   -1, | 
					
						
							|  |  |  |   "InterfacesRemoved", | 
					
						
							|  |  |  |   (GDBusArgInfo**) &manager_interfaces_removed_signal_info_arg_pointers, | 
					
						
							|  |  |  |   (GDBusAnnotationInfo**) NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusSignalInfo * const manager_signal_info_pointers[] = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   &manager_interfaces_added_signal_info, | 
					
						
							|  |  |  |   &manager_interfaces_removed_signal_info, | 
					
						
							|  |  |  |   NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusArgInfo manager_get_all_method_info_out_arg0 = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   -1, | 
					
						
							|  |  |  |   "object_paths_interfaces_and_properties", | 
					
						
							|  |  |  |   "a{oa{sa{sv}}}", | 
					
						
							|  |  |  |   (GDBusAnnotationInfo**) NULL, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusArgInfo * const manager_get_all_method_info_out_arg_pointers[] = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   &manager_get_all_method_info_out_arg0, | 
					
						
							|  |  |  |   NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusMethodInfo manager_get_all_method_info = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   -1, | 
					
						
							|  |  |  |   "GetManagedObjects", | 
					
						
							|  |  |  |   (GDBusArgInfo**) NULL, | 
					
						
							|  |  |  |   (GDBusArgInfo**) &manager_get_all_method_info_out_arg_pointers, | 
					
						
							|  |  |  |   (GDBusAnnotationInfo**) NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusMethodInfo * const manager_method_info_pointers[] = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   &manager_get_all_method_info, | 
					
						
							|  |  |  |   NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusInterfaceInfo manager_interface_info = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   -1, | 
					
						
							|  |  |  |   "org.freedesktop.DBus.ObjectManager", | 
					
						
							|  |  |  |   (GDBusMethodInfo **) manager_method_info_pointers, | 
					
						
							|  |  |  |   (GDBusSignalInfo **) manager_signal_info_pointers, | 
					
						
							|  |  |  |   (GDBusPropertyInfo **) NULL, | 
					
						
							|  |  |  |   (GDBusAnnotationInfo **) NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | manager_method_call (GDBusConnection       *connection, | 
					
						
							|  |  |  |                      const gchar           *sender, | 
					
						
							|  |  |  |                      const gchar           *object_path, | 
					
						
							|  |  |  |                      const gchar           *interface_name, | 
					
						
							|  |  |  |                      const gchar           *method_name, | 
					
						
							|  |  |  |                      GVariant              *parameters, | 
					
						
							|  |  |  |                      GDBusMethodInvocation *invocation, | 
					
						
							|  |  |  |                      gpointer               user_data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (user_data); | 
					
						
							|  |  |  |   GVariantBuilder array_builder; | 
					
						
							|  |  |  |   GHashTableIter object_iter; | 
					
						
							|  |  |  |   RegistrationData *data; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_lock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   if (g_strcmp0 (method_name, "GetManagedObjects") == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a{oa{sa{sv}}}")); | 
					
						
							|  |  |  |       g_hash_table_iter_init (&object_iter, manager->priv->map_object_path_to_data); | 
					
						
							|  |  |  |       while (g_hash_table_iter_next (&object_iter, NULL, (gpointer) &data)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           GVariantBuilder interfaces_builder; | 
					
						
							|  |  |  |           GHashTableIter interface_iter; | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |           GDBusInterfaceSkeleton *iface; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |           const gchar *iter_object_path; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           g_variant_builder_init (&interfaces_builder, G_VARIANT_TYPE ("a{sa{sv}}")); | 
					
						
							|  |  |  |           g_hash_table_iter_init (&interface_iter, data->map_iface_name_to_iface); | 
					
						
							|  |  |  |           while (g_hash_table_iter_next (&interface_iter, NULL, (gpointer) &iface)) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2011-07-12 02:56:57 +02:00
										 |  |  |               GVariant *properties = g_dbus_interface_skeleton_get_properties (iface); | 
					
						
							|  |  |  |               g_variant_builder_add (&interfaces_builder, "{s@a{sv}}", | 
					
						
							|  |  |  |                                      g_dbus_interface_skeleton_get_info (iface)->name, | 
					
						
							|  |  |  |                                      properties); | 
					
						
							|  |  |  |               g_variant_unref (properties); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |             } | 
					
						
							|  |  |  |           iter_object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object)); | 
					
						
							|  |  |  |           g_variant_builder_add (&array_builder, | 
					
						
							|  |  |  |                                  "{oa{sa{sv}}}", | 
					
						
							|  |  |  |                                  iter_object_path, | 
					
						
							|  |  |  |                                  &interfaces_builder); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       g_dbus_method_invocation_return_value (invocation, | 
					
						
							|  |  |  |                                              g_variant_new ("(a{oa{sa{sv}}})", | 
					
						
							|  |  |  |                                                             &array_builder)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       g_dbus_method_invocation_return_error (invocation, | 
					
						
							|  |  |  |                                              G_DBUS_ERROR, | 
					
						
							|  |  |  |                                              G_DBUS_ERROR_UNKNOWN_METHOD, | 
					
						
							|  |  |  |                                              "Unknown method %s - only GetManagedObjects() is supported", | 
					
						
							|  |  |  |                                              method_name); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_unlock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const GDBusInterfaceVTable manager_interface_vtable = | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   manager_method_call, /* handle_method_call */ | 
					
						
							|  |  |  |   NULL, /* get_property */ | 
					
						
							|  |  |  |   NULL  /* set_property */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_dbus_object_manager_server_constructed (GObject *object) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |   if (manager->priv->connection != NULL) | 
					
						
							|  |  |  |     export_all (manager); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->constructed != NULL) | 
					
						
							|  |  |  |     G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->constructed (object); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *manager, | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |                                                     RegistrationData   *data, | 
					
						
							| 
									
										
										
										
											2011-09-19 16:45:05 -04:00
										 |  |  |                                                     const gchar *const *interfaces, | 
					
						
							|  |  |  |                                                     const gchar *object_path) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | { | 
					
						
							|  |  |  |   GVariantBuilder array_builder; | 
					
						
							|  |  |  |   GError *error; | 
					
						
							|  |  |  |   guint n; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |   if (data->manager->priv->connection == NULL) | 
					
						
							|  |  |  |     goto out; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a{sa{sv}}")); | 
					
						
							|  |  |  |   for (n = 0; interfaces[n] != NULL; n++) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-04-13 16:33:51 -04:00
										 |  |  |       GDBusInterfaceSkeleton *iface; | 
					
						
							| 
									
										
										
										
											2011-07-12 02:56:57 +02:00
										 |  |  |       GVariant *properties; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |       iface = g_hash_table_lookup (data->map_iface_name_to_iface, interfaces[n]); | 
					
						
							|  |  |  |       g_assert (iface != NULL); | 
					
						
							| 
									
										
										
										
											2011-07-12 02:56:57 +02:00
										 |  |  |       properties = g_dbus_interface_skeleton_get_properties (iface); | 
					
						
							|  |  |  |       g_variant_builder_add (&array_builder, "{s@a{sv}}", interfaces[n], properties); | 
					
						
							|  |  |  |       g_variant_unref (properties); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   error = NULL; | 
					
						
							|  |  |  |   g_dbus_connection_emit_signal (data->manager->priv->connection, | 
					
						
							|  |  |  |                                  NULL, /* destination_bus_name */ | 
					
						
							|  |  |  |                                  manager->priv->object_path, | 
					
						
							|  |  |  |                                  manager_interface_info.name, | 
					
						
							|  |  |  |                                  "InterfacesAdded", | 
					
						
							|  |  |  |                                  g_variant_new ("(oa{sa{sv}})", | 
					
						
							|  |  |  |                                                 object_path, | 
					
						
							|  |  |  |                                                 &array_builder), | 
					
						
							|  |  |  |                                  &error); | 
					
						
							|  |  |  |   g_assert_no_error (error); | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |  out: | 
					
						
							|  |  |  |   ; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_dbus_object_manager_server_emit_interfaces_removed (GDBusObjectManagerServer *manager, | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |                                                       RegistrationData   *data, | 
					
						
							|  |  |  |                                                       const gchar *const *interfaces) | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | { | 
					
						
							|  |  |  |   GVariantBuilder array_builder; | 
					
						
							|  |  |  |   GError *error; | 
					
						
							|  |  |  |   guint n; | 
					
						
							|  |  |  |   const gchar *object_path; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |   if (data->manager->priv->connection == NULL) | 
					
						
							|  |  |  |     goto out; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("as")); | 
					
						
							|  |  |  |   for (n = 0; interfaces[n] != NULL; n++) | 
					
						
							|  |  |  |     g_variant_builder_add (&array_builder, "s", interfaces[n]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   error = NULL; | 
					
						
							|  |  |  |   object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object)); | 
					
						
							|  |  |  |   g_dbus_connection_emit_signal (data->manager->priv->connection, | 
					
						
							|  |  |  |                                  NULL, /* destination_bus_name */ | 
					
						
							|  |  |  |                                  manager->priv->object_path, | 
					
						
							|  |  |  |                                  manager_interface_info.name, | 
					
						
							|  |  |  |                                  "InterfacesRemoved", | 
					
						
							|  |  |  |                                  g_variant_new ("(oas)", | 
					
						
							|  |  |  |                                                 object_path, | 
					
						
							|  |  |  |                                                 &array_builder), | 
					
						
							|  |  |  |                                  &error); | 
					
						
							|  |  |  |   g_assert_no_error (error); | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  |  out: | 
					
						
							|  |  |  |   ; | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static GList * | 
					
						
							|  |  |  | g_dbus_object_manager_server_get_objects (GDBusObjectManager  *_manager) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (_manager); | 
					
						
							|  |  |  |   GList *ret; | 
					
						
							|  |  |  |   GHashTableIter iter; | 
					
						
							|  |  |  |   RegistrationData *data; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_lock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   ret = NULL; | 
					
						
							|  |  |  |   g_hash_table_iter_init (&iter, manager->priv->map_object_path_to_data); | 
					
						
							|  |  |  |   while (g_hash_table_iter_next (&iter, NULL, (gpointer) &data)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       ret = g_list_prepend (ret, g_object_ref (data->object)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_unlock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const gchar * | 
					
						
							|  |  |  | g_dbus_object_manager_server_get_object_path (GDBusObjectManager *_manager) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (_manager); | 
					
						
							|  |  |  |   return manager->priv->object_path; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static GDBusObject * | 
					
						
							|  |  |  | g_dbus_object_manager_server_get_object (GDBusObjectManager *_manager, | 
					
						
							|  |  |  |                                          const gchar        *object_path) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (_manager); | 
					
						
							|  |  |  |   GDBusObject *ret; | 
					
						
							|  |  |  |   RegistrationData *data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ret = NULL; | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_lock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); | 
					
						
							|  |  |  |   if (data != NULL) | 
					
						
							|  |  |  |     ret = g_object_ref (data->object); | 
					
						
							| 
									
										
										
										
											2011-10-03 23:26:55 -04:00
										 |  |  |   g_mutex_unlock (&manager->priv->lock); | 
					
						
							| 
									
										
										
										
											2011-08-29 16:46:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 15:14:47 -04:00
										 |  |  |   return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static GDBusInterface * | 
					
						
							|  |  |  | g_dbus_object_manager_server_get_interface  (GDBusObjectManager  *_manager, | 
					
						
							|  |  |  |                                              const gchar         *object_path, | 
					
						
							|  |  |  |                                              const gchar         *interface_name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GDBusInterface *ret; | 
					
						
							|  |  |  |   GDBusObject *object; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ret = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   object = g_dbus_object_manager_get_object (_manager, object_path); | 
					
						
							|  |  |  |   if (object == NULL) | 
					
						
							|  |  |  |     goto out; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ret = g_dbus_object_get_interface (object, interface_name); | 
					
						
							|  |  |  |   g_object_unref (object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  out: | 
					
						
							|  |  |  |   return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | dbus_object_manager_interface_init (GDBusObjectManagerIface *iface) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   iface->get_object_path = g_dbus_object_manager_server_get_object_path; | 
					
						
							|  |  |  |   iface->get_objects     = g_dbus_object_manager_server_get_objects; | 
					
						
							|  |  |  |   iface->get_object      = g_dbus_object_manager_server_get_object; | 
					
						
							|  |  |  |   iface->get_interface   = g_dbus_object_manager_server_get_interface; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-05-04 03:37:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | export_all (GDBusObjectManagerServer *manager) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GHashTableIter iter; | 
					
						
							|  |  |  |   const gchar *object_path; | 
					
						
							|  |  |  |   RegistrationData *data; | 
					
						
							|  |  |  |   GHashTableIter iface_iter; | 
					
						
							|  |  |  |   GDBusInterfaceSkeleton *iface; | 
					
						
							|  |  |  |   GError *error; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_return_if_fail (manager->priv->connection != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   error = NULL; | 
					
						
							|  |  |  |   g_warn_if_fail (manager->priv->manager_reg_id == 0); | 
					
						
							|  |  |  |   manager->priv->manager_reg_id = g_dbus_connection_register_object (manager->priv->connection, | 
					
						
							|  |  |  |                                                                      manager->priv->object_path, | 
					
						
							|  |  |  |                                                                      (GDBusInterfaceInfo *) &manager_interface_info, | 
					
						
							|  |  |  |                                                                      &manager_interface_vtable, | 
					
						
							|  |  |  |                                                                      manager, | 
					
						
							|  |  |  |                                                                      NULL, /* user_data_free_func */ | 
					
						
							|  |  |  |                                                                      &error); | 
					
						
							|  |  |  |   if (manager->priv->manager_reg_id == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       g_warning ("%s: Error registering manager at %s: %s", | 
					
						
							|  |  |  |                  G_STRLOC, | 
					
						
							|  |  |  |                  manager->priv->object_path, | 
					
						
							|  |  |  |                  error->message); | 
					
						
							|  |  |  |       g_error_free (error); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_hash_table_iter_init (&iter, manager->priv->map_object_path_to_data); | 
					
						
							|  |  |  |   while (g_hash_table_iter_next (&iter, (gpointer) &object_path, (gpointer) &data)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       g_hash_table_iter_init (&iface_iter, data->map_iface_name_to_iface); | 
					
						
							|  |  |  |       while (g_hash_table_iter_next (&iface_iter, NULL, (gpointer) &iface)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           g_warn_if_fail (g_dbus_interface_skeleton_get_connection (iface) == NULL); | 
					
						
							|  |  |  |           error = NULL; | 
					
						
							|  |  |  |           if (!g_dbus_interface_skeleton_export (iface, | 
					
						
							|  |  |  |                                                  manager->priv->connection, | 
					
						
							|  |  |  |                                                  object_path, | 
					
						
							|  |  |  |                                                  &error)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               g_warning ("%s: Error registering object at %s with interface %s: %s", | 
					
						
							|  |  |  |                          G_STRLOC, | 
					
						
							|  |  |  |                          object_path, | 
					
						
							|  |  |  |                          g_dbus_interface_skeleton_get_info (iface)->name, | 
					
						
							|  |  |  |                          error->message); | 
					
						
							|  |  |  |               g_error_free (error); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | unexport_all (GDBusObjectManagerServer *manager, gboolean only_manager) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GHashTableIter iter; | 
					
						
							|  |  |  |   RegistrationData *data; | 
					
						
							|  |  |  |   GHashTableIter iface_iter; | 
					
						
							|  |  |  |   GDBusInterfaceSkeleton *iface; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_return_if_fail (manager->priv->connection != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_warn_if_fail (manager->priv->manager_reg_id > 0); | 
					
						
							|  |  |  |   if (manager->priv->manager_reg_id > 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       g_warn_if_fail (g_dbus_connection_unregister_object (manager->priv->connection, | 
					
						
							|  |  |  |                                                            manager->priv->manager_reg_id)); | 
					
						
							|  |  |  |       manager->priv->manager_reg_id = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   if (only_manager) | 
					
						
							|  |  |  |     goto out; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_hash_table_iter_init (&iter, manager->priv->map_object_path_to_data); | 
					
						
							|  |  |  |   while (g_hash_table_iter_next (&iter, NULL, (gpointer) &data)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       g_hash_table_iter_init (&iface_iter, data->map_iface_name_to_iface); | 
					
						
							|  |  |  |       while (g_hash_table_iter_next (&iface_iter, NULL, (gpointer) &iface)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           g_warn_if_fail (g_dbus_interface_skeleton_get_connection (iface) != NULL); | 
					
						
							|  |  |  |           g_dbus_interface_skeleton_unexport (iface); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |  out: | 
					
						
							|  |  |  |   ; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------------------------------------------- */ |