Home | History | Annotate | Download | only in test
      1 #include "test-utils.h"
      2 
      3 typedef struct
      4 {
      5   DBusLoop *loop;
      6   DBusConnection *connection;
      7 
      8 } CData;
      9 
     10 static dbus_bool_t
     11 connection_watch_callback (DBusWatch     *watch,
     12                            unsigned int   condition,
     13                            void          *data)
     14 {
     15   return dbus_watch_handle (watch, condition);
     16 }
     17 
     18 static dbus_bool_t
     19 add_watch (DBusWatch *watch,
     20 	   void      *data)
     21 {
     22   CData *cd = data;
     23 
     24   return _dbus_loop_add_watch (cd->loop,
     25                                watch,
     26                                connection_watch_callback,
     27                                cd, NULL);
     28 }
     29 
     30 static void
     31 remove_watch (DBusWatch *watch,
     32 	      void      *data)
     33 {
     34   CData *cd = data;
     35 
     36   _dbus_loop_remove_watch (cd->loop,
     37                            watch, connection_watch_callback, cd);
     38 }
     39 
     40 static void
     41 connection_timeout_callback (DBusTimeout   *timeout,
     42                              void          *data)
     43 {
     44   /* Can return FALSE on OOM but we just let it fire again later */
     45   dbus_timeout_handle (timeout);
     46 }
     47 
     48 static dbus_bool_t
     49 add_timeout (DBusTimeout *timeout,
     50 	     void        *data)
     51 {
     52   CData *cd = data;
     53 
     54   return _dbus_loop_add_timeout (cd->loop,
     55                                  timeout, connection_timeout_callback, cd, NULL);
     56 }
     57 
     58 static void
     59 remove_timeout (DBusTimeout *timeout,
     60 		void        *data)
     61 {
     62   CData *cd = data;
     63 
     64   _dbus_loop_remove_timeout (cd->loop,
     65                              timeout, connection_timeout_callback, cd);
     66 }
     67 
     68 static void
     69 dispatch_status_function (DBusConnection    *connection,
     70                           DBusDispatchStatus new_status,
     71                           void              *data)
     72 {
     73   DBusLoop *loop = data;
     74 
     75   if (new_status != DBUS_DISPATCH_COMPLETE)
     76     {
     77       while (!_dbus_loop_queue_dispatch (loop, connection))
     78         _dbus_wait_for_memory ();
     79     }
     80 }
     81 
     82 static void
     83 cdata_free (void *data)
     84 {
     85   CData *cd = data;
     86 
     87   dbus_connection_unref (cd->connection);
     88   _dbus_loop_unref (cd->loop);
     89 
     90   dbus_free (cd);
     91 }
     92 
     93 static CData*
     94 cdata_new (DBusLoop       *loop,
     95            DBusConnection *connection)
     96 {
     97   CData *cd;
     98 
     99   cd = dbus_new0 (CData, 1);
    100   if (cd == NULL)
    101     return NULL;
    102 
    103   cd->loop = loop;
    104   cd->connection = connection;
    105 
    106   dbus_connection_ref (cd->connection);
    107   _dbus_loop_ref (cd->loop);
    108 
    109   return cd;
    110 }
    111 
    112 dbus_bool_t
    113 test_connection_setup (DBusLoop       *loop,
    114                        DBusConnection *connection)
    115 {
    116   CData *cd;
    117 
    118   cd = NULL;
    119 
    120   dbus_connection_set_dispatch_status_function (connection, dispatch_status_function,
    121                                                 loop, NULL);
    122 
    123   cd = cdata_new (loop, connection);
    124   if (cd == NULL)
    125     goto nomem;
    126 
    127   /* Because dbus-mainloop.c checks dbus_timeout_get_enabled(),
    128    * dbus_watch_get_enabled() directly, we don't have to provide
    129    * "toggled" callbacks.
    130    */
    131 
    132   if (!dbus_connection_set_watch_functions (connection,
    133                                             add_watch,
    134                                             remove_watch,
    135                                             NULL,
    136                                             cd, cdata_free))
    137     goto nomem;
    138 
    139 
    140   cd = cdata_new (loop, connection);
    141   if (cd == NULL)
    142     goto nomem;
    143 
    144   if (!dbus_connection_set_timeout_functions (connection,
    145                                               add_timeout,
    146                                               remove_timeout,
    147                                               NULL,
    148                                               cd, cdata_free))
    149     goto nomem;
    150 
    151   if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE)
    152     {
    153       if (!_dbus_loop_queue_dispatch (loop, connection))
    154         goto nomem;
    155     }
    156 
    157   return TRUE;
    158 
    159  nomem:
    160   if (cd)
    161     cdata_free (cd);
    162 
    163   dbus_connection_set_dispatch_status_function (connection, NULL, NULL, NULL);
    164   dbus_connection_set_watch_functions (connection, NULL, NULL, NULL, NULL, NULL);
    165   dbus_connection_set_timeout_functions (connection, NULL, NULL, NULL, NULL, NULL);
    166 
    167   return FALSE;
    168 }
    169 
    170 void
    171 test_connection_shutdown (DBusLoop       *loop,
    172                           DBusConnection *connection)
    173 {
    174   if (!dbus_connection_set_watch_functions (connection,
    175                                             NULL,
    176                                             NULL,
    177                                             NULL,
    178                                             NULL, NULL))
    179     _dbus_assert_not_reached ("setting watch functions to NULL failed");
    180 
    181   if (!dbus_connection_set_timeout_functions (connection,
    182                                               NULL,
    183                                               NULL,
    184                                               NULL,
    185                                               NULL, NULL))
    186     _dbus_assert_not_reached ("setting timeout functions to NULL failed");
    187 
    188   dbus_connection_set_dispatch_status_function (connection, NULL, NULL, NULL);
    189 }
    190