[kdbus] Update kdbus interface header (commit: b620b72c9127) 14/10/16
[platform/upstream/glib.git] / gio / gdbusobjectmanagerserver.c
index 70ed766..bb6f8c2 100644 (file)
@@ -13,9 +13,7 @@
  * 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.
+ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
  *
  * Author: David Zeuthen <davidz@redhat.com>
  */
@@ -40,8 +38,8 @@
  * @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>
+ * the standardized
+ * [org.freedesktop.DBus.ObjectManager](http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager)
  * 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
@@ -81,7 +79,7 @@ static gboolean g_dbus_object_manager_server_unexport_unlocked (GDBusObjectManag
 
 struct _GDBusObjectManagerServerPrivate
 {
-  GMutex *lock;
+  GMutex lock;
   GDBusConnection *connection;
   gchar *object_path;
   gchar *object_path_ending_in_slash;
@@ -99,7 +97,8 @@ enum
 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));
+                         G_ADD_PRIVATE (GDBusObjectManagerServer)
+                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT_MANAGER, dbus_object_manager_interface_init))
 
 static void g_dbus_object_manager_server_constructed (GObject *object);
 
@@ -117,7 +116,7 @@ g_dbus_object_manager_server_finalize (GObject *object)
   g_free (manager->priv->object_path);
   g_free (manager->priv->object_path_ending_in_slash);
 
-  g_mutex_free (manager->priv->lock);
+  g_mutex_clear (&manager->priv->lock);
 
   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);
@@ -134,9 +133,9 @@ g_dbus_object_manager_server_get_property (GObject    *object,
   switch (prop_id)
     {
     case PROP_CONNECTION:
-      g_mutex_lock (manager->priv->lock);
+      g_mutex_lock (&manager->priv->lock);
       g_value_set_object (value, manager->priv->connection);
-      g_mutex_unlock (manager->priv->lock);
+      g_mutex_unlock (&manager->priv->lock);
       break;
 
     case PROP_OBJECT_PATH:
@@ -220,17 +219,13 @@ g_dbus_object_manager_server_class_init (GDBusObjectManagerServerClass *klass)
                                                         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);
-  manager->priv->lock = g_mutex_new ();
+  manager->priv = g_dbus_object_manager_server_get_instance_private (manager);
+  g_mutex_init (&manager->priv->lock);
   manager->priv->map_object_path_to_data = g_hash_table_new_full (g_str_hash,
                                                                   g_str_equal,
                                                                   g_free,
@@ -277,11 +272,11 @@ g_dbus_object_manager_server_set_connection (GDBusObjectManagerServer  *manager,
   g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager));
   g_return_if_fail (connection == NULL || G_IS_DBUS_CONNECTION (connection));
 
-  g_mutex_lock (manager->priv->lock);
+  g_mutex_lock (&manager->priv->lock);
 
   if (manager->priv->connection == connection)
     {
-      g_mutex_unlock (manager->priv->lock);
+      g_mutex_unlock (&manager->priv->lock);
       goto out;
     }
 
@@ -296,7 +291,7 @@ g_dbus_object_manager_server_set_connection (GDBusObjectManagerServer  *manager,
   if (manager->priv->connection != NULL)
     export_all (manager);
 
-  g_mutex_unlock (manager->priv->lock);
+  g_mutex_unlock (&manager->priv->lock);
 
   g_object_notify (G_OBJECT (manager), "connection");
  out:
@@ -320,9 +315,9 @@ g_dbus_object_manager_server_get_connection (GDBusObjectManagerServer *manager)
 {
   GDBusConnection *ret;
   g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), NULL);
-  g_mutex_lock (manager->priv->lock);
+  g_mutex_lock (&manager->priv->lock);
   ret = manager->priv->connection != NULL ? g_object_ref (manager->priv->connection) : NULL;
-  g_mutex_unlock (manager->priv->lock);
+  g_mutex_unlock (&manager->priv->lock);
   return ret;
 }
 
@@ -406,10 +401,10 @@ on_interface_added (GDBusObject    *object,
 {
   RegistrationData *data = user_data;
   const gchar *object_path;
-  g_mutex_lock (data->manager->priv->lock);
+  g_mutex_lock (&data->manager->priv->lock);
   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);
-  g_mutex_unlock (data->manager->priv->lock);
+  g_mutex_unlock (&data->manager->priv->lock);
 }
 
 static void
@@ -418,9 +413,9 @@ on_interface_removed (GDBusObject    *object,
                       gpointer        user_data)
 {
   RegistrationData *data = user_data;
-  g_mutex_lock (data->manager->priv->lock);
+  g_mutex_lock (&data->manager->priv->lock);
   registration_data_unexport_interface (data, G_DBUS_INTERFACE_SKELETON (interface));
-  g_mutex_unlock (data->manager->priv->lock);
+  g_mutex_unlock (&data->manager->priv->lock);
 }
 
 /* ---------------------------------------------------------------------------------------------------- */
@@ -497,8 +492,7 @@ g_dbus_object_manager_server_export_unlocked (GDBusObjectManagerServer  *manager
       registration_data_export_interface (data, interface_skeleton, object_path);
       g_ptr_array_add (interface_names, g_dbus_interface_skeleton_get_info (interface_skeleton)->name);
     }
-  g_list_foreach (existing_interfaces, (GFunc) g_object_unref, NULL);
-  g_list_free (existing_interfaces);
+  g_list_free_full (existing_interfaces, g_object_unref);
   g_ptr_array_add (interface_names, NULL);
 
   data->exported = TRUE;
@@ -535,10 +529,10 @@ g_dbus_object_manager_server_export (GDBusObjectManagerServer  *manager,
                                      GDBusObjectSkeleton       *object)
 {
   g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager));
-  g_mutex_lock (manager->priv->lock);
+  g_mutex_lock (&manager->priv->lock);
   g_dbus_object_manager_server_export_unlocked (manager, object,
                                                 g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
-  g_mutex_unlock (manager->priv->lock);
+  g_mutex_unlock (&manager->priv->lock);
 }
 
 /**
@@ -547,10 +541,9 @@ g_dbus_object_manager_server_export (GDBusObjectManagerServer  *manager,
  * @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
- * already exists. As such, the #GDBusObjectProxy:g-object-path property
- * of @object may be modified.
+ * the form _N (with N being a natural number) to @object's object path
+ * if an object with the given path already exists. As such, the
+ * #GDBusObjectProxy:g-object-path property of @object may be modified.
  *
  * Since: 2.30
  */
@@ -569,7 +562,7 @@ g_dbus_object_manager_server_export_uniquely (GDBusObjectManagerServer *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));
 
-  g_mutex_lock (manager->priv->lock);
+  g_mutex_lock (&manager->priv->lock);
 
   object_path = g_strdup (orig_object_path);
   count = 1;
@@ -589,7 +582,7 @@ g_dbus_object_manager_server_export_uniquely (GDBusObjectManagerServer *manager,
 
   g_dbus_object_manager_server_export_unlocked (manager, object, object_path);
 
-  g_mutex_unlock (manager->priv->lock);
+  g_mutex_unlock (&manager->priv->lock);
 
   if (modified)
     g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), object_path);
@@ -599,6 +592,40 @@ g_dbus_object_manager_server_export_uniquely (GDBusObjectManagerServer *manager,
 
 }
 
+/**
+ * g_dbus_object_manager_server_is_exported:
+ * @manager: A #GDBusObjectManagerServer.
+ * @object: An object.
+ *
+ * Returns whether @object is currently exported on @manager.
+ *
+ * Returns: %TRUE if @object is exported
+ *
+ * Since: 2.34
+ **/
+gboolean
+g_dbus_object_manager_server_is_exported (GDBusObjectManagerServer *manager,
+                                          GDBusObjectSkeleton      *object)
+{
+  RegistrationData *data = NULL;
+  const gchar *object_path;
+  gboolean object_is_exported;
+
+  g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), FALSE);
+  g_return_val_if_fail (G_IS_DBUS_OBJECT (object), FALSE);
+
+  g_mutex_lock (&manager->priv->lock);
+
+  object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (object));
+  if (object_path != NULL)
+    data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path);
+  object_is_exported = (data != NULL);
+
+  g_mutex_unlock (&manager->priv->lock);
+
+  return object_is_exported;
+}
+
 /* ---------------------------------------------------------------------------------------------------- */
 
 static gboolean
@@ -658,9 +685,9 @@ g_dbus_object_manager_server_unexport (GDBusObjectManagerServer  *manager,
 {
   gboolean ret;
   g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), FALSE);
-  g_mutex_lock (manager->priv->lock);
+  g_mutex_lock (&manager->priv->lock);
   ret = g_dbus_object_manager_server_unexport_unlocked (manager, object_path);
-  g_mutex_unlock (manager->priv->lock);
+  g_mutex_unlock (&manager->priv->lock);
   return ret;
 }
 
@@ -798,7 +825,7 @@ manager_method_call (GDBusConnection       *connection,
   GHashTableIter object_iter;
   RegistrationData *data;
 
-  g_mutex_lock (manager->priv->lock);
+  g_mutex_lock (&manager->priv->lock);
 
   if (g_strcmp0 (method_name, "GetManagedObjects") == 0)
     {
@@ -840,7 +867,7 @@ manager_method_call (GDBusConnection       *connection,
                                              "Unknown method %s - only GetManagedObjects() is supported",
                                              method_name);
     }
-  g_mutex_unlock (manager->priv->lock);
+  g_mutex_unlock (&manager->priv->lock);
 }
 
 static const GDBusInterfaceVTable manager_interface_vtable =
@@ -948,7 +975,7 @@ g_dbus_object_manager_server_get_objects (GDBusObjectManager  *_manager)
   GHashTableIter iter;
   RegistrationData *data;
 
-  g_mutex_lock (manager->priv->lock);
+  g_mutex_lock (&manager->priv->lock);
 
   ret = NULL;
   g_hash_table_iter_init (&iter, manager->priv->map_object_path_to_data);
@@ -957,7 +984,7 @@ g_dbus_object_manager_server_get_objects (GDBusObjectManager  *_manager)
       ret = g_list_prepend (ret, g_object_ref (data->object));
     }
 
-  g_mutex_unlock (manager->priv->lock);
+  g_mutex_unlock (&manager->priv->lock);
 
   return ret;
 }
@@ -979,11 +1006,11 @@ g_dbus_object_manager_server_get_object (GDBusObjectManager *_manager,
 
   ret = NULL;
 
-  g_mutex_lock (manager->priv->lock);
+  g_mutex_lock (&manager->priv->lock);
   data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path);
   if (data != NULL)
     ret = g_object_ref (data->object);
-  g_mutex_unlock (manager->priv->lock);
+  g_mutex_unlock (&manager->priv->lock);
 
   return ret;
 }