• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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