2005-04-23 Havoc Pennington <hp@redhat.com>
authorHavoc Pennington <hp@redhat.com>
Sun, 24 Apr 2005 14:04:16 +0000 (14:04 +0000)
committerHavoc Pennington <hp@redhat.com>
Sun, 24 Apr 2005 14:04:16 +0000 (14:04 +0000)
* dbus/dbus-message.c (dbus_message_append_args): fix doc comment,
reported by Tony Houghton

* test/test-service.c (main): test
dbus_connection_get_object_path_data()

* dbus/dbus-object-tree.c (find_handler): be sure we always init
the exact_match
(_dbus_object_tree_get_user_data_unlocked): new function used by
dbus_connection_get_object_path_data()
(do_register): add assertion test for get_user_data_unlocked
(object_tree_test_iteration): more tests

* dbus/dbus-connection.c (dbus_connection_get_object_path_data):
new function from Dan Reed to let you get the user data from
dbus_connection_register_object_path()

ChangeLog
dbus/dbus-connection.c
dbus/dbus-connection.h
dbus/dbus-message.c
dbus/dbus-object-tree.c
dbus/dbus-object-tree.h
test/test-service.c

index 56301ee..0368b11 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2005-04-23  Havoc Pennington  <hp@redhat.com>
+
+       * dbus/dbus-message.c (dbus_message_append_args): fix doc comment,
+       reported by Tony Houghton
+
+       * test/test-service.c (main): test
+       dbus_connection_get_object_path_data()
+
+       * dbus/dbus-object-tree.c (find_handler): be sure we always init
+       the exact_match
+       (_dbus_object_tree_get_user_data_unlocked): new function used by
+       dbus_connection_get_object_path_data()
+       (do_register): add assertion test for get_user_data_unlocked
+       (object_tree_test_iteration): more tests
+
+       * dbus/dbus-connection.c (dbus_connection_get_object_path_data):
+       new function from Dan Reed to let you get the user data from 
+       dbus_connection_register_object_path()
+
 2005-04-23  John (J5) Palmieri  <johnp@redhat.com>
 
        * dbus/dbus-marshal-recursive-util.c: Fixed buffer overflow
index df8de93..edc57b8 100644 (file)
@@ -4301,6 +4301,43 @@ dbus_connection_unregister_object_path (DBusConnection              *connection,
 }
 
 /**
+ * Gets the user data passed to dbus_connection_register_object_path()
+ * or dbus_connection_register_fallback(). If nothing was registered
+ * at this path, the data is filled in with #NULL.
+ *
+ * @param connection the connection
+ * @param path the path you registered with
+ * @param data_p location to store the user data, or #NULL
+ * @returns #FALSE if not enough memory
+ */
+dbus_bool_t
+dbus_connection_get_object_path_data (DBusConnection *connection,
+                                      const char     *path,
+                                      void          **data_p)
+{
+  char **decomposed_path;
+
+  _dbus_return_val_if_fail (connection != NULL, FALSE);
+  _dbus_return_val_if_fail (path != NULL, FALSE);
+  _dbus_return_val_if_fail (data_p != NULL, FALSE);
+
+  *data_p = NULL;
+  
+  if (!_dbus_decompose_path (path, strlen (path), &decomposed_path, NULL))
+    return FALSE;
+  
+  CONNECTION_LOCK (connection);
+
+  *data_p = _dbus_object_tree_get_user_data_unlocked (connection->objects, (const char**) decomposed_path);
+
+  CONNECTION_UNLOCK (connection);
+
+  dbus_free_string_array (decomposed_path);
+
+  return TRUE;
+}
+
+/**
  * Lists the registered fallback handlers and object path handlers at
  * the given parent_path. The returned array should be freed with
  * dbus_free_string_array().
index 2c0b7f2..25a5b0e 100644 (file)
@@ -243,6 +243,10 @@ dbus_bool_t dbus_connection_register_fallback      (DBusConnection
 dbus_bool_t dbus_connection_unregister_object_path (DBusConnection              *connection,
                                                     const char                  *path);
 
+dbus_bool_t dbus_connection_get_object_path_data   (DBusConnection              *connection,
+                                                    const char                  *path,
+                                                    void                       **data_p);
+
 dbus_bool_t dbus_connection_list_registered        (DBusConnection              *connection,
                                                     const char                  *parent_path,
                                                     char                      ***child_entries);
index b090fab..8a9014c 100644 (file)
@@ -1142,25 +1142,15 @@ dbus_message_get_type (DBusMessage *message)
  * rather than this function.
  *
  * To append a basic type, specify its type code followed by the
- * value. For example:
+ * address of the value. For example:
  *
  * @code
- * DBUS_TYPE_INT32, 42,
- * DBUS_TYPE_STRING, "Hello World"
- * @endcode
- * or
- * @code
- * dbus_int32_t val = 42;
- * DBUS_TYPE_INT32, val
- * @endcode
  *
- * Be sure that your provided value is the right size. For example, this
- * won't work:
- * @code
- * DBUS_TYPE_INT64, 42
+ * dbus_int32_t v_INT32 = 42;
+ * const char *v_STRING = "Hello World";
+ * DBUS_TYPE_INT32, &v_INT32,
+ * DBUS_TYPE_STRING, &v_STRING,
  * @endcode
- * Because the "42" will be a 32-bit integer. You need to cast to
- * 64-bit.
  *
  * To append an array of fixed-length basic types, pass in the
  * DBUS_TYPE_ARRAY typecode, the element typecode, the address of
index 1d6029a..73d4bef 100644 (file)
@@ -373,6 +373,9 @@ find_handler (DBusObjectTree *tree,
   _dbus_verbose ("Looking for deepest handler\n");
 #endif
   _dbus_assert (exact_match != NULL);
+
+  *exact_match = FALSE; /* ensure always initialized */
+  
   return find_subtree_recurse (tree->root, path, FALSE, NULL, exact_match);
 }
 
@@ -903,6 +906,37 @@ _dbus_object_tree_dispatch_and_unlock (DBusObjectTree          *tree,
 }
 
 /**
+ * Looks up the data passed to _dbus_object_tree_register() for a
+ * handler at the given path.
+ *
+ * @param tree the global object tree
+ * @param path NULL-terminated array of path elements giving path to subtree
+ * @returns the object's user_data or #NULL if none found
+ */
+void*
+_dbus_object_tree_get_user_data_unlocked (DBusObjectTree *tree,
+                                          const char    **path)
+{
+  dbus_bool_t exact_match;
+  DBusObjectSubtree *subtree;
+
+  _dbus_assert (tree != NULL);
+  _dbus_assert (path != NULL);
+  
+  /* Find the deepest path that covers the path in the message */
+  subtree = find_handler (tree, (const char**) path, &exact_match);
+
+  if ((subtree == NULL) || !exact_match)
+    {
+      _dbus_verbose ("%s: No object at specified path found\n",
+                     _DBUS_FUNCTION_NAME);
+      return NULL;
+    }
+
+  return subtree->user_data;
+}
+
+/**
  * Allocates a subtree object.
  *
  * @param name name to duplicate.
@@ -1311,6 +1345,9 @@ do_register (DBusObjectTree *tree,
                                    &tree_test_data[i]))
     return FALSE;
 
+  _dbus_assert (_dbus_object_tree_get_user_data_unlocked (tree, path) ==
+                &tree_test_data[i]);
+  
   return TRUE;
 }
 
@@ -1717,6 +1754,7 @@ object_tree_test_iteration (void *data)
     goto out;
 
   _dbus_object_tree_unregister_and_unlock (tree, path0);
+  _dbus_assert (_dbus_object_tree_get_user_data_unlocked (tree, path0) == NULL);
 
   _dbus_assert (!find_subtree (tree, path0, NULL));
   _dbus_assert (find_subtree (tree, path1, NULL));
@@ -1729,6 +1767,7 @@ object_tree_test_iteration (void *data)
   _dbus_assert (find_subtree (tree, path8, NULL));
   
   _dbus_object_tree_unregister_and_unlock (tree, path1);
+  _dbus_assert (_dbus_object_tree_get_user_data_unlocked (tree, path1) == NULL);
 
   _dbus_assert (!find_subtree (tree, path0, NULL));
   _dbus_assert (!find_subtree (tree, path1, NULL));
@@ -1741,6 +1780,7 @@ object_tree_test_iteration (void *data)
   _dbus_assert (find_subtree (tree, path8, NULL));
 
   _dbus_object_tree_unregister_and_unlock (tree, path2);
+  _dbus_assert (_dbus_object_tree_get_user_data_unlocked (tree, path2) == NULL);
 
   _dbus_assert (!find_subtree (tree, path0, NULL));
   _dbus_assert (!find_subtree (tree, path1, NULL));
@@ -1753,6 +1793,7 @@ object_tree_test_iteration (void *data)
   _dbus_assert (find_subtree (tree, path8, NULL));
   
   _dbus_object_tree_unregister_and_unlock (tree, path3);
+  _dbus_assert (_dbus_object_tree_get_user_data_unlocked (tree, path3) == NULL);
 
   _dbus_assert (!find_subtree (tree, path0, NULL));
   _dbus_assert (!find_subtree (tree, path1, NULL));
@@ -1765,6 +1806,7 @@ object_tree_test_iteration (void *data)
   _dbus_assert (find_subtree (tree, path8, NULL));
   
   _dbus_object_tree_unregister_and_unlock (tree, path4);
+  _dbus_assert (_dbus_object_tree_get_user_data_unlocked (tree, path4) == NULL);
 
   _dbus_assert (!find_subtree (tree, path0, NULL));
   _dbus_assert (!find_subtree (tree, path1, NULL));
@@ -1777,6 +1819,7 @@ object_tree_test_iteration (void *data)
   _dbus_assert (find_subtree (tree, path8, NULL));
   
   _dbus_object_tree_unregister_and_unlock (tree, path5);
+  _dbus_assert (_dbus_object_tree_get_user_data_unlocked (tree, path5) == NULL);
 
   _dbus_assert (!find_subtree (tree, path0, NULL));
   _dbus_assert (!find_subtree (tree, path1, NULL));
@@ -1789,6 +1832,7 @@ object_tree_test_iteration (void *data)
   _dbus_assert (find_subtree (tree, path8, NULL));
   
   _dbus_object_tree_unregister_and_unlock (tree, path6);
+  _dbus_assert (_dbus_object_tree_get_user_data_unlocked (tree, path6) == NULL);
 
   _dbus_assert (!find_subtree (tree, path0, NULL));
   _dbus_assert (!find_subtree (tree, path1, NULL));
@@ -1801,6 +1845,7 @@ object_tree_test_iteration (void *data)
   _dbus_assert (find_subtree (tree, path8, NULL));
 
   _dbus_object_tree_unregister_and_unlock (tree, path7);
+  _dbus_assert (_dbus_object_tree_get_user_data_unlocked (tree, path7) == NULL);
 
   _dbus_assert (!find_subtree (tree, path0, NULL));
   _dbus_assert (!find_subtree (tree, path1, NULL));
@@ -1813,6 +1858,7 @@ object_tree_test_iteration (void *data)
   _dbus_assert (find_subtree (tree, path8, NULL));
 
   _dbus_object_tree_unregister_and_unlock (tree, path8);
+  _dbus_assert (_dbus_object_tree_get_user_data_unlocked (tree, path8) == NULL);
 
   _dbus_assert (!find_subtree (tree, path0, NULL));
   _dbus_assert (!find_subtree (tree, path1, NULL));
index 6d8484e..d1c04b4 100644 (file)
@@ -33,16 +33,19 @@ DBusObjectTree* _dbus_object_tree_new   (DBusConnection *connection);
 DBusObjectTree* _dbus_object_tree_ref   (DBusObjectTree *tree);
 void            _dbus_object_tree_unref (DBusObjectTree *tree);
 
-dbus_bool_t       _dbus_object_tree_register              (DBusObjectTree              *tree,
-                                                           dbus_bool_t                  fallback,
-                                                           const char                 **path,
-                                                           const DBusObjectPathVTable  *vtable,
-                                                           void                        *user_data);
-void              _dbus_object_tree_unregister_and_unlock (DBusObjectTree              *tree,
-                                                           const char                 **path);
-DBusHandlerResult _dbus_object_tree_dispatch_and_unlock   (DBusObjectTree              *tree,
-                                                           DBusMessage                 *message);
-void              _dbus_object_tree_free_all_unlocked     (DBusObjectTree              *tree);
+dbus_bool_t       _dbus_object_tree_register               (DBusObjectTree              *tree,
+                                                            dbus_bool_t                  fallback,
+                                                            const char                 **path,
+                                                            const DBusObjectPathVTable  *vtable,
+                                                            void                        *user_data);
+void              _dbus_object_tree_unregister_and_unlock  (DBusObjectTree              *tree,
+                                                            const char                 **path);
+DBusHandlerResult _dbus_object_tree_dispatch_and_unlock    (DBusObjectTree              *tree,
+                                                            DBusMessage                 *message);
+void*             _dbus_object_tree_get_user_data_unlocked (DBusObjectTree              *tree,
+                                                            const char                 **path);
+void              _dbus_object_tree_free_all_unlocked      (DBusObjectTree              *tree);
+
 
 dbus_bool_t _dbus_object_tree_list_registered_and_unlock (DBusObjectTree *tree,
                                                           const char    **parent_path,
index 9316b62..040a030 100644 (file)
@@ -188,9 +188,17 @@ main (int    argc,
   if (!dbus_connection_register_object_path (connection,
                                              echo_path,
                                              &echo_vtable,
-                                             NULL))
+                                             (void*) 0xdeadbeef))
     die ("No memory");
 
+  {
+    void *d;
+    if (!dbus_connection_get_object_path_data (connection, echo_path, &d))
+      die ("No memory");
+    if (d != (void*) 0xdeadbeef)
+      die ("dbus_connection_get_object_path_data() doesn't seem to work right\n");
+  }
+  
   result = dbus_bus_request_name (connection, "org.freedesktop.DBus.TestSuiteEchoService",
                                   0, &error);
   if (dbus_error_is_set (&error))