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