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