1
2 #include "test-utils.h"
3
4 static DBusLoop *loop;
5 static dbus_bool_t already_quit = FALSE;
6 static dbus_bool_t hello_from_self_reply_received = FALSE;
7
8 static void
quit(void)9 quit (void)
10 {
11 if (!already_quit)
12 {
13 _dbus_loop_quit (loop);
14 already_quit = TRUE;
15 }
16 }
17
18 static void
die(const char * message)19 die (const char *message)
20 {
21 fprintf (stderr, "*** test-service: %s", message);
22 exit (1);
23 }
24
25 static void
check_hello_from_self_reply(DBusPendingCall * pcall,void * user_data)26 check_hello_from_self_reply (DBusPendingCall *pcall,
27 void *user_data)
28 {
29 DBusMessage *reply;
30 DBusMessage *echo_message, *echo_reply = NULL;
31 DBusError error;
32 DBusConnection *connection;
33
34 int type;
35
36 dbus_error_init (&error);
37
38 connection = dbus_bus_get (DBUS_BUS_STARTER, &error);
39 if (connection == NULL)
40 {
41 fprintf (stderr, "*** Failed to open connection to activating message bus: %s\n",
42 error.message);
43 dbus_error_free (&error);
44 die("no memory");
45 }
46
47
48 echo_message = (DBusMessage *)user_data;
49
50 reply = dbus_pending_call_steal_reply (pcall);
51
52 type = dbus_message_get_type (reply);
53
54 if (type == DBUS_MESSAGE_TYPE_METHOD_RETURN)
55 {
56 const char *s;
57 printf ("Reply from HelloFromSelf received\n");
58
59 if (!dbus_message_get_args (echo_message,
60 &error,
61 DBUS_TYPE_STRING, &s,
62 DBUS_TYPE_INVALID))
63 {
64 echo_reply = dbus_message_new_error (echo_message,
65 error.name,
66 error.message);
67
68 if (echo_reply == NULL)
69 die ("No memory\n");
70
71 }
72 else
73 {
74 echo_reply = dbus_message_new_method_return (echo_message);
75 if (echo_reply == NULL)
76 die ("No memory\n");
77
78 if (!dbus_message_append_args (echo_reply,
79 DBUS_TYPE_STRING, &s,
80 DBUS_TYPE_INVALID))
81 die ("No memory");
82 }
83
84 if (!dbus_connection_send (connection, echo_reply, NULL))
85 die ("No memory\n");
86
87 dbus_message_unref (echo_reply);
88 }
89 else if (type == DBUS_MESSAGE_TYPE_ERROR)
90 {
91 dbus_set_error_from_message (&error, reply);
92 printf ("Error type in reply: %s\n", error.message);
93
94 if (strcmp (error.name, DBUS_ERROR_NO_MEMORY) != 0)
95 {
96 echo_reply = dbus_message_new_error (echo_reply,
97 error.name,
98 error.message);
99
100 if (echo_reply == NULL)
101 die ("No memory\n");
102
103 if (!dbus_connection_send (connection, echo_reply, NULL))
104 die ("No memory\n");
105
106 dbus_message_unref (echo_reply);
107 }
108 dbus_error_free (&error);
109 }
110 else
111 _dbus_assert_not_reached ("Unexpected message received\n");
112
113 hello_from_self_reply_received = TRUE;
114
115 dbus_message_unref (reply);
116 dbus_message_unref (echo_message);
117 dbus_pending_call_unref (pcall);
118 dbus_connection_unref (connection);
119 }
120
121 static DBusHandlerResult
handle_run_hello_from_self(DBusConnection * connection,DBusMessage * message)122 handle_run_hello_from_self (DBusConnection *connection,
123 DBusMessage *message)
124 {
125 DBusError error;
126 DBusMessage *reply, *self_message;
127 DBusPendingCall *pcall;
128 char *s;
129
130 _dbus_verbose ("sending reply to Echo method\n");
131
132 dbus_error_init (&error);
133
134 if (!dbus_message_get_args (message,
135 &error,
136 DBUS_TYPE_STRING, &s,
137 DBUS_TYPE_INVALID))
138 {
139 reply = dbus_message_new_error (message,
140 error.name,
141 error.message);
142
143 if (reply == NULL)
144 die ("No memory\n");
145
146 if (!dbus_connection_send (connection, reply, NULL))
147 die ("No memory\n");
148
149 dbus_message_unref (reply);
150
151 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
152 }
153 printf ("Sending HelloFromSelf\n");
154
155 _dbus_verbose ("*** Sending message to self\n");
156 self_message = dbus_message_new_method_call ("org.freedesktop.DBus.TestSuiteEchoService",
157 "/org/freedesktop/TestSuite",
158 "org.freedesktop.TestSuite",
159 "HelloFromSelf");
160
161 if (self_message == NULL)
162 die ("No memory");
163
164 if (!dbus_connection_send_with_reply (connection, self_message, &pcall, -1))
165 die("No memory");
166
167 dbus_message_ref (message);
168 if (!dbus_pending_call_set_notify (pcall, check_hello_from_self_reply, (void *)message, NULL))
169 die("No memory");
170
171 printf ("Sent HelloFromSelf\n");
172 return DBUS_HANDLER_RESULT_HANDLED;
173 }
174
175 static DBusHandlerResult
handle_echo(DBusConnection * connection,DBusMessage * message)176 handle_echo (DBusConnection *connection,
177 DBusMessage *message)
178 {
179 DBusError error;
180 DBusMessage *reply;
181 char *s;
182
183 _dbus_verbose ("sending reply to Echo method\n");
184
185 dbus_error_init (&error);
186
187 if (!dbus_message_get_args (message,
188 &error,
189 DBUS_TYPE_STRING, &s,
190 DBUS_TYPE_INVALID))
191 {
192 reply = dbus_message_new_error (message,
193 error.name,
194 error.message);
195
196 if (reply == NULL)
197 die ("No memory\n");
198
199 if (!dbus_connection_send (connection, reply, NULL))
200 die ("No memory\n");
201
202 dbus_message_unref (reply);
203
204 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
205 }
206
207 reply = dbus_message_new_method_return (message);
208 if (reply == NULL)
209 die ("No memory\n");
210
211 if (!dbus_message_append_args (reply,
212 DBUS_TYPE_STRING, &s,
213 DBUS_TYPE_INVALID))
214 die ("No memory");
215
216 if (!dbus_connection_send (connection, reply, NULL))
217 die ("No memory\n");
218
219 fprintf (stderr, "Echo service echoed string: \"%s\"\n", s);
220
221 dbus_message_unref (reply);
222
223 return DBUS_HANDLER_RESULT_HANDLED;
224 }
225
226 static void
path_unregistered_func(DBusConnection * connection,void * user_data)227 path_unregistered_func (DBusConnection *connection,
228 void *user_data)
229 {
230 /* connection was finalized */
231 }
232
233 static DBusHandlerResult
path_message_func(DBusConnection * connection,DBusMessage * message,void * user_data)234 path_message_func (DBusConnection *connection,
235 DBusMessage *message,
236 void *user_data)
237 {
238 if (dbus_message_is_method_call (message,
239 "org.freedesktop.TestSuite",
240 "Echo"))
241 return handle_echo (connection, message);
242 else if (dbus_message_is_method_call (message,
243 "org.freedesktop.TestSuite",
244 "Exit"))
245 {
246 quit ();
247 return DBUS_HANDLER_RESULT_HANDLED;
248 }
249 else if (dbus_message_is_method_call (message,
250 "org.freedesktop.TestSuite",
251 "EmitFoo"))
252 {
253 /* Emit the Foo signal */
254 DBusMessage *signal;
255 double v_DOUBLE;
256
257 _dbus_verbose ("emitting signal Foo\n");
258
259 signal = dbus_message_new_signal ("/org/freedesktop/TestSuite",
260 "org.freedesktop.TestSuite",
261 "Foo");
262 if (signal == NULL)
263 die ("No memory\n");
264
265 v_DOUBLE = 42.6;
266 if (!dbus_message_append_args (signal,
267 DBUS_TYPE_DOUBLE, &v_DOUBLE,
268 DBUS_TYPE_INVALID))
269 die ("No memory");
270
271 if (!dbus_connection_send (connection, signal, NULL))
272 die ("No memory\n");
273
274 return DBUS_HANDLER_RESULT_HANDLED;
275 }
276
277 else if (dbus_message_is_method_call (message,
278 "org.freedesktop.TestSuite",
279 "RunHelloFromSelf"))
280 {
281 return handle_run_hello_from_self (connection, message);
282 }
283 else if (dbus_message_is_method_call (message,
284 "org.freedesktop.TestSuite",
285 "HelloFromSelf"))
286 {
287 DBusMessage *reply;
288 printf ("Received the HelloFromSelf message\n");
289
290 reply = dbus_message_new_method_return (message);
291 if (reply == NULL)
292 die ("No memory");
293
294 if (!dbus_connection_send (connection, reply, NULL))
295 die ("No memory");
296
297 return DBUS_HANDLER_RESULT_HANDLED;
298 }
299 else
300 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
301 }
302
303 static DBusObjectPathVTable
304 echo_vtable = {
305 path_unregistered_func,
306 path_message_func,
307 NULL,
308 };
309
310
311 static const char* echo_path = "/org/freedesktop/TestSuite" ;
312
313 static DBusHandlerResult
filter_func(DBusConnection * connection,DBusMessage * message,void * user_data)314 filter_func (DBusConnection *connection,
315 DBusMessage *message,
316 void *user_data)
317 {
318 if (dbus_message_is_signal (message,
319 DBUS_INTERFACE_LOCAL,
320 "Disconnected"))
321 {
322 quit ();
323 return DBUS_HANDLER_RESULT_HANDLED;
324 }
325 else
326 {
327 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
328 }
329 }
330
331 int
main(int argc,char ** argv)332 main (int argc,
333 char **argv)
334 {
335 DBusError error;
336 int result;
337 DBusConnection *connection;
338
339 dbus_error_init (&error);
340 connection = dbus_bus_get (DBUS_BUS_STARTER, &error);
341 if (connection == NULL)
342 {
343 fprintf (stderr, "*** Failed to open connection to activating message bus: %s\n",
344 error.message);
345 dbus_error_free (&error);
346 return 1;
347 }
348
349 loop = _dbus_loop_new ();
350 if (loop == NULL)
351 die ("No memory\n");
352
353 if (!test_connection_setup (loop, connection))
354 die ("No memory\n");
355
356 if (!dbus_connection_add_filter (connection,
357 filter_func, NULL, NULL))
358 die ("No memory");
359
360 if (!dbus_connection_register_object_path (connection,
361 echo_path,
362 &echo_vtable,
363 (void*) 0xdeadbeef))
364 die ("No memory");
365
366 {
367 void *d;
368 if (!dbus_connection_get_object_path_data (connection, echo_path, &d))
369 die ("No memory");
370 if (d != (void*) 0xdeadbeef)
371 die ("dbus_connection_get_object_path_data() doesn't seem to work right\n");
372 }
373
374 result = dbus_bus_request_name (connection, "org.freedesktop.DBus.TestSuiteEchoService",
375 0, &error);
376 if (dbus_error_is_set (&error))
377 {
378 fprintf (stderr, "Error %s\n", error.message);
379 _dbus_verbose ("*** Failed to acquire service: %s\n",
380 error.message);
381 dbus_error_free (&error);
382 exit (1);
383 }
384
385 _dbus_verbose ("*** Test service entering main loop\n");
386 _dbus_loop_run (loop);
387
388 test_connection_shutdown (loop, connection);
389
390 dbus_connection_remove_filter (connection, filter_func, NULL);
391
392 dbus_connection_unref (connection);
393
394 _dbus_loop_unref (loop);
395 loop = NULL;
396
397 dbus_shutdown ();
398
399 _dbus_verbose ("*** Test service exiting\n");
400
401 return 0;
402 }
403