2006-10-01 Havoc Pennington <hp@redhat.com>
[platform/upstream/dbus.git] / test / test-utils.c
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 }