mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2025-12-29 12:30:11 +01:00
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()
This commit is contained in:
parent
52fce19fab
commit
64f3d8f67d
7 changed files with 133 additions and 26 deletions
19
ChangeLog
19
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
|
||||
|
|
|
|||
|
|
@ -4300,6 +4300,43 @@ dbus_connection_unregister_object_path (DBusConnection *connection,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
@ -902,6 +905,37 @@ _dbus_object_tree_dispatch_and_unlock (DBusObjectTree *tree,
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue