]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
dbus/dbus-object-tree.c (unregister_subtree): New function
authorThomas Fitzsimmons <fitzsim@cisco.com>
Wed, 27 Mar 2013 19:47:35 +0000 (15:47 -0400)
committerThomas Fitzsimmons <fitzsim@cisco.com>
Wed, 27 Mar 2013 19:47:35 +0000 (15:47 -0400)
dbus/dbus-object-tree.c

index 94a11a43df5d9dc4fa3615941eb317ac7585b2f3..d496d219dac81dc8437043bb3f0c00161bc741ae 100644 (file)
@@ -433,6 +433,51 @@ _dbus_object_tree_register (DBusObjectTree              *tree,
   return TRUE;
 }
 
+/**
+ * Attempts to unregister the given subtree.  If the subtree is registered,
+ * stores its unregister function and user data for later use and returns
+ * #TRUE.  If subtree is not registered, simply returns #FALSE.  Does not free
+ * subtree or remove it from the object tree.
+ *
+ * @param subtree the subtree to unregister
+ * @param unregister_function_out stores subtree's unregister_function
+ * @param user_data_out stores subtree's user_data
+ * @return #FALSE if the subtree was not registered, #TRUE on success
+ */
+static dbus_bool_t
+unregister_subtree (DBusObjectSubtree                 *subtree,
+                    DBusObjectPathUnregisterFunction  *unregister_function_out,
+                    void                             **user_data_out)
+{
+  _dbus_assert (subtree != NULL);
+  _dbus_assert (unregister_function_out != NULL);
+  _dbus_assert (user_data_out != NULL);
+
+  /* Confirm subtree is registered */
+  if (subtree->message_function != NULL)
+    {
+      subtree->message_function = NULL;
+
+      *unregister_function_out = subtree->unregister_function;
+      *user_data_out = subtree->user_data;
+
+      subtree->unregister_function = NULL;
+      subtree->user_data = NULL;
+
+      return TRUE;
+    }
+  else
+    {
+      /* Assert that this unregistered subtree is either the root node or has
+         children, otherwise we have a dangling path which should never
+         happen */
+      _dbus_assert (subtree->parent == NULL || subtree->n_subtrees > 0);
+
+      /* The subtree is not registered */
+      return FALSE;
+    }
+}
+
 /**
  * Unregisters an object subtree that was registered with the
  * same path.