diff -r 000000000000 -r bde4ae8d615e os/ossrv/ofdbus/dbus/tsrc/testapps/dbus_test_cases/test-utils.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/ofdbus/dbus/tsrc/testapps/dbus_test_cases/test-utils.c Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,190 @@ +/* Portion Copyright © 2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/ +#include "test-utils.h" + +typedef struct +{ + DBusLoop *loop; + DBusConnection *connection; + +} CData; + +static dbus_bool_t +connection_watch_callback (DBusWatch *watch, + unsigned int condition, + void *data) +{ + return dbus_watch_handle (watch, condition); +} + +static dbus_bool_t +add_watch (DBusWatch *watch, + void *data) +{ + CData *cd = data; + + return _dbus_loop_add_watch (cd->loop, + watch, + connection_watch_callback, + cd, NULL); +} + +static void +remove_watch (DBusWatch *watch, + void *data) +{ + CData *cd = data; + + _dbus_loop_remove_watch (cd->loop, + watch, connection_watch_callback, cd); +} + +static void +connection_timeout_callback (DBusTimeout *timeout, + void *data) +{ + /* Can return FALSE on OOM but we just let it fire again later */ + dbus_timeout_handle (timeout); +} + +static dbus_bool_t +add_timeout (DBusTimeout *timeout, + void *data) +{ + CData *cd = data; + + return _dbus_loop_add_timeout (cd->loop, + timeout, connection_timeout_callback, cd, NULL); +} + +static void +remove_timeout (DBusTimeout *timeout, + void *data) +{ + CData *cd = data; + + _dbus_loop_remove_timeout (cd->loop, + timeout, connection_timeout_callback, cd); +} + +static void +dispatch_status_function (DBusConnection *connection, + DBusDispatchStatus new_status, + void *data) +{ + DBusLoop *loop = data; + + if (new_status != DBUS_DISPATCH_COMPLETE) + { + while (!_dbus_loop_queue_dispatch (loop, connection)) + _dbus_wait_for_memory (); + } +} + +static void +cdata_free (void *data) +{ + CData *cd = data; + + dbus_connection_unref (cd->connection); + _dbus_loop_unref (cd->loop); + + dbus_free (cd); +} + +static CData* +cdata_new (DBusLoop *loop, + DBusConnection *connection) +{ + CData *cd; + + cd = dbus_new0 (CData, 1); + if (cd == NULL) + return NULL; + + cd->loop = loop; + cd->connection = connection; + + dbus_connection_ref (cd->connection); + _dbus_loop_ref (cd->loop); + + return cd; +} + +dbus_bool_t +test_connection_setup (DBusLoop *loop, + DBusConnection *connection) +{ + CData *cd; + + cd = NULL; + + dbus_connection_set_dispatch_status_function (connection, dispatch_status_function, + loop, NULL); + + cd = cdata_new (loop, connection); + if (cd == NULL) + goto nomem; + + /* Because dbus-mainloop.c checks dbus_timeout_get_enabled(), + * dbus_watch_get_enabled() directly, we don't have to provide + * "toggled" callbacks. + */ + + if (!dbus_connection_set_watch_functions (connection, + add_watch, + remove_watch, + NULL, + cd, cdata_free)) + goto nomem; + + + cd = cdata_new (loop, connection); + if (cd == NULL) + goto nomem; + + if (!dbus_connection_set_timeout_functions (connection, + add_timeout, + remove_timeout, + NULL, + cd, cdata_free)) + goto nomem; + + if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE) + { + if (!_dbus_loop_queue_dispatch (loop, connection)) + goto nomem; + } + + return TRUE; + + nomem: + if (cd) + cdata_free (cd); + + dbus_connection_set_dispatch_status_function (connection, NULL, NULL, NULL); + dbus_connection_set_watch_functions (connection, NULL, NULL, NULL, NULL, NULL); + dbus_connection_set_timeout_functions (connection, NULL, NULL, NULL, NULL, NULL); + + return FALSE; +} + +void +test_connection_shutdown (DBusLoop *loop, + DBusConnection *connection) +{ + if (!dbus_connection_set_watch_functions (connection, + NULL, + NULL, + NULL, + NULL, NULL)) + _dbus_assert_not_reached ("setting watch functions to NULL failed"); + + if (!dbus_connection_set_timeout_functions (connection, + NULL, + NULL, + NULL, + NULL, NULL)) + _dbus_assert_not_reached ("setting timeout functions to NULL failed"); + + dbus_connection_set_dispatch_status_function (connection, NULL, NULL, NULL); +}