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:
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:
128:
129:
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: }