ofdbus/dbus/tsrc/testapps/dbus_test_cases/test-utils.c
changeset 0 e4d67989cc36
child 18 47c74d1534e1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ofdbus/dbus/tsrc/testapps/dbus_test_cases/test-utils.c	Tue Feb 02 02:01:42 2010 +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);
+}