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