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
connection_watch_callback(DBusWatch * watch,unsigned int condition,void * data)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
add_watch(DBusWatch * watch,void * data)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
remove_watch(DBusWatch * watch,void * data)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
connection_timeout_callback(DBusTimeout * timeout,void * data)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
add_timeout(DBusTimeout * timeout,void * data)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
remove_timeout(DBusTimeout * timeout,void * data)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
dispatch_status_function(DBusConnection * connection,DBusDispatchStatus new_status,void * data)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
cdata_free(void * data)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*
cdata_new(DBusLoop * loop,DBusConnection * connection)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
test_connection_setup(DBusLoop * loop,DBusConnection * connection)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
test_connection_shutdown(DBusLoop * loop,DBusConnection * connection)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