1#include <config.h> 2#include "test-utils.h" 3 4typedef struct 5{ 6 DBusLoop *loop; 7 DBusConnection *connection; 8 9} CData; 10 11static dbus_bool_t 12add_watch (DBusWatch *watch, 13 void *data) 14{ 15 CData *cd = data; 16 17 return _dbus_loop_add_watch (cd->loop, watch); 18} 19 20static void 21remove_watch (DBusWatch *watch, 22 void *data) 23{ 24 CData *cd = data; 25 26 _dbus_loop_remove_watch (cd->loop, watch); 27} 28 29static void 30toggle_watch (DBusWatch *watch, 31 void *data) 32{ 33 CData *cd = data; 34 35 _dbus_loop_toggle_watch (cd->loop, watch); 36} 37 38static dbus_bool_t 39add_timeout (DBusTimeout *timeout, 40 void *data) 41{ 42 CData *cd = data; 43 44 return _dbus_loop_add_timeout (cd->loop, timeout); 45} 46 47static void 48remove_timeout (DBusTimeout *timeout, 49 void *data) 50{ 51 CData *cd = data; 52 53 _dbus_loop_remove_timeout (cd->loop, timeout); 54} 55 56static void 57dispatch_status_function (DBusConnection *connection, 58 DBusDispatchStatus new_status, 59 void *data) 60{ 61 DBusLoop *loop = data; 62 63 if (new_status != DBUS_DISPATCH_COMPLETE) 64 { 65 while (!_dbus_loop_queue_dispatch (loop, connection)) 66 _dbus_wait_for_memory (); 67 } 68} 69 70static void 71cdata_free (void *data) 72{ 73 CData *cd = data; 74 75 dbus_connection_unref (cd->connection); 76 _dbus_loop_unref (cd->loop); 77 78 dbus_free (cd); 79} 80 81static CData* 82cdata_new (DBusLoop *loop, 83 DBusConnection *connection) 84{ 85 CData *cd; 86 87 cd = dbus_new0 (CData, 1); 88 if (cd == NULL) 89 return NULL; 90 91 cd->loop = loop; 92 cd->connection = connection; 93 94 dbus_connection_ref (cd->connection); 95 _dbus_loop_ref (cd->loop); 96 97 return cd; 98} 99 100dbus_bool_t 101test_connection_setup (DBusLoop *loop, 102 DBusConnection *connection) 103{ 104 CData *cd; 105 106 cd = NULL; 107 108 dbus_connection_set_dispatch_status_function (connection, dispatch_status_function, 109 loop, NULL); 110 111 cd = cdata_new (loop, connection); 112 if (cd == NULL) 113 goto nomem; 114 115 if (!dbus_connection_set_watch_functions (connection, 116 add_watch, 117 remove_watch, 118 toggle_watch, 119 cd, cdata_free)) 120 goto nomem; 121 122 123 cd = cdata_new (loop, connection); 124 if (cd == NULL) 125 goto nomem; 126 127 if (!dbus_connection_set_timeout_functions (connection, 128 add_timeout, 129 remove_timeout, 130 NULL, 131 cd, cdata_free)) 132 goto nomem; 133 134 if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE) 135 { 136 if (!_dbus_loop_queue_dispatch (loop, connection)) 137 goto nomem; 138 } 139 140 return TRUE; 141 142 nomem: 143 if (cd) 144 cdata_free (cd); 145 146 dbus_connection_set_dispatch_status_function (connection, NULL, NULL, NULL); 147 dbus_connection_set_watch_functions (connection, NULL, NULL, NULL, NULL, NULL); 148 dbus_connection_set_timeout_functions (connection, NULL, NULL, NULL, NULL, NULL); 149 150 return FALSE; 151} 152 153void 154test_connection_shutdown (DBusLoop *loop, 155 DBusConnection *connection) 156{ 157 if (!dbus_connection_set_watch_functions (connection, 158 NULL, 159 NULL, 160 NULL, 161 NULL, NULL)) 162 _dbus_assert_not_reached ("setting watch functions to NULL failed"); 163 164 if (!dbus_connection_set_timeout_functions (connection, 165 NULL, 166 NULL, 167 NULL, 168 NULL, NULL)) 169 _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 170 171 dbus_connection_set_dispatch_status_function (connection, NULL, NULL, NULL); 172} 173 174typedef struct 175{ 176 DBusLoop *loop; 177 DBusServer *server; 178} ServerData; 179 180static void 181serverdata_free (void *data) 182{ 183 ServerData *sd = data; 184 185 dbus_server_unref (sd->server); 186 _dbus_loop_unref (sd->loop); 187 188 dbus_free (sd); 189} 190 191static ServerData* 192serverdata_new (DBusLoop *loop, 193 DBusServer *server) 194{ 195 ServerData *sd; 196 197 sd = dbus_new0 (ServerData, 1); 198 if (sd == NULL) 199 return NULL; 200 201 sd->loop = loop; 202 sd->server = server; 203 204 dbus_server_ref (sd->server); 205 _dbus_loop_ref (sd->loop); 206 207 return sd; 208} 209 210static dbus_bool_t 211add_server_watch (DBusWatch *watch, 212 void *data) 213{ 214 ServerData *context = data; 215 216 return _dbus_loop_add_watch (context->loop, watch); 217} 218 219static void 220toggle_server_watch (DBusWatch *watch, 221 void *data) 222{ 223 ServerData *context = data; 224 225 _dbus_loop_toggle_watch (context->loop, watch); 226} 227 228static void 229remove_server_watch (DBusWatch *watch, 230 void *data) 231{ 232 ServerData *context = data; 233 234 _dbus_loop_remove_watch (context->loop, watch); 235} 236 237static dbus_bool_t 238add_server_timeout (DBusTimeout *timeout, 239 void *data) 240{ 241 ServerData *context = data; 242 243 return _dbus_loop_add_timeout (context->loop, timeout); 244} 245 246static void 247remove_server_timeout (DBusTimeout *timeout, 248 void *data) 249{ 250 ServerData *context = data; 251 252 _dbus_loop_remove_timeout (context->loop, timeout); 253} 254 255dbus_bool_t 256test_server_setup (DBusLoop *loop, 257 DBusServer *server) 258{ 259 ServerData *sd; 260 261 sd = serverdata_new (loop, server); 262 if (sd == NULL) 263 goto nomem; 264 265 if (!dbus_server_set_watch_functions (server, 266 add_server_watch, 267 remove_server_watch, 268 toggle_server_watch, 269 sd, 270 serverdata_free)) 271 { 272 goto nomem; 273 } 274 275 sd = serverdata_new (loop, server); 276 if (sd == NULL) 277 goto nomem; 278 279 if (!dbus_server_set_timeout_functions (server, 280 add_server_timeout, 281 remove_server_timeout, 282 NULL, 283 sd, serverdata_free)) 284 { 285 goto nomem; 286 } 287 return TRUE; 288 289 nomem: 290 if (sd) 291 serverdata_free (sd); 292 293 test_server_shutdown (loop, server); 294 295 return FALSE; 296} 297 298void 299test_server_shutdown (DBusLoop *loop, 300 DBusServer *server) 301{ 302 dbus_server_disconnect (server); 303 304 if (!dbus_server_set_watch_functions (server, 305 NULL, NULL, NULL, 306 NULL, 307 NULL)) 308 _dbus_assert_not_reached ("setting watch functions to NULL failed"); 309 310 if (!dbus_server_set_timeout_functions (server, 311 NULL, NULL, NULL, 312 NULL, 313 NULL)) 314 _dbus_assert_not_reached ("setting timeout functions to NULL failed"); 315} 316