test-service.c revision f7beca572b341c4cabf2f97a9f0d6d763e6acb40
198572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington
298572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington#include "test-utils.h"
398572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington
498572905e60cac7ea971aa0830e2a629bfff208dHavoc Penningtonstatic DBusLoop *loop;
551781f541094a4936d47119cd62682e0431c41e9Havoc Penningtonstatic dbus_bool_t already_quit = FALSE;
6fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
7fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtonstatic void
8fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Penningtonquit (void)
9fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington{
10fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  if (!already_quit)
11fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    {
12fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      _dbus_loop_quit (loop);
13fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      already_quit = TRUE;
14fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington    }
15fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington}
16eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington
17f216e81432ddf04889202c33a6e68113f94d7611Havoc Penningtonstatic void
18f216e81432ddf04889202c33a6e68113f94d7611Havoc Penningtondie (const char *message)
19f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington{
20f7beca572b341c4cabf2f97a9f0d6d763e6acb40Havoc Pennington  fprintf (stderr, "*** test-service: %s", message);
21f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  exit (1);
22f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington}
23f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
24f216e81432ddf04889202c33a6e68113f94d7611Havoc Penningtonstatic DBusHandlerResult
25a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Penningtonhandle_echo (DBusConnection     *connection,
26a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington             DBusMessage        *message)
27f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington{
28f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  DBusError error;
29f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  DBusMessage *reply;
30f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  char *s;
3175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
3275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  _dbus_verbose ("sending reply to Echo method\n");
33f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
34f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  dbus_error_init (&error);
35f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
36f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  if (!dbus_message_get_args (message,
37f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington                              &error,
38f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington                              DBUS_TYPE_STRING, &s,
39f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington                              DBUS_TYPE_INVALID))
40f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington    {
41b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington      reply = dbus_message_new_error (message,
42b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington                                      error.name,
43b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington                                      error.message);
44f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
45f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington      if (reply == NULL)
46f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington        die ("No memory\n");
47f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
48f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington      if (!dbus_connection_send (connection, reply, NULL))
49f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington        die ("No memory\n");
50f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
51f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington      dbus_message_unref (reply);
52f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
535c1a8e44903bd1dedc8cbefad78b0c8b61daada5Havoc Pennington      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
54f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington    }
55f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
56b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington  reply = dbus_message_new_method_return (message);
57f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  if (reply == NULL)
58f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington    die ("No memory\n");
59c5020ac870c5990a36c3576453cc23431213e8bfAlexander Larsson
60d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington  if (!dbus_message_append_args (reply,
61d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington                                 DBUS_TYPE_STRING, s,
62d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington                                 DBUS_TYPE_INVALID))
63f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington    die ("No memory");
64d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington
65f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  if (!dbus_connection_send (connection, reply, NULL))
66f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington    die ("No memory\n");
67d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington
68d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington  fprintf (stderr, "Echo service echoed string: \"%s\"\n", s);
69f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
70f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  dbus_free (s);
71f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
72f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  dbus_message_unref (reply);
73f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
74d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington  return DBUS_HANDLER_RESULT_HANDLED;
75f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington}
76f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
7775742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonstatic void
7875742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonpath_unregistered_func (DBusConnection  *connection,
7975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                        void            *user_data)
8075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington{
8175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  /* connection was finalized */
8275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington}
8375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
84a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Penningtonstatic DBusHandlerResult
8575742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonpath_message_func (DBusConnection  *connection,
8675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                   DBusMessage     *message,
8775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                   void            *user_data)
8875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington{
8968a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  if (dbus_message_is_method_call (message,
9068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                   "org.freedesktop.TestSuite",
9168a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                   "Echo"))
92a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington    return handle_echo (connection, message);
9368a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington  else if (dbus_message_is_method_call (message,
9468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                        "org.freedesktop.TestSuite",
9575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                                        "Exit"))
9675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington    {
9775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      dbus_connection_disconnect (connection);
9875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      quit ();
9975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      return DBUS_HANDLER_RESULT_HANDLED;
10075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington    }
10175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  else if (dbus_message_is_method_call (message,
10275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                                        "org.freedesktop.TestSuite",
10375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                                        "EmitFoo"))
10475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington    {
10575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      /* Emit the Foo signal */
10675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      DBusMessage *signal;
10775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
10875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      _dbus_verbose ("emitting signal Foo\n");
10975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
11075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      signal = dbus_message_new_signal ("/org/freedesktop/TestSuite",
11175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                                        "org.freedesktop.TestSuite",
11275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                                        "Foo");
11375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      if (signal == NULL)
11475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington        die ("No memory\n");
11575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
11675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      if (!dbus_message_append_args (signal,
11775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                                     DBUS_TYPE_DOUBLE, 42.6,
11875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                                     DBUS_TYPE_INVALID))
11975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington        die ("No memory");
12075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
12175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      if (!dbus_connection_send (connection, signal, NULL))
12275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington        die ("No memory\n");
12375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
12475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      return DBUS_HANDLER_RESULT_HANDLED;
12575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington    }
12675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  else
12775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
12875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington}
12975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
13075742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonstatic DBusObjectPathVTable
13175742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonecho_vtable = {
13275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  path_unregistered_func,
13375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  path_message_func,
13475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  NULL,
13575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington};
13675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
13796f6740f2fbc16c7ee220d3d5abdc94e22da78f3Olivier Andrieu
13896f6740f2fbc16c7ee220d3d5abdc94e22da78f3Olivier Andrieustatic const char* echo_path = "/org/freedesktop/TestSuite" ;
13975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
14075742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonstatic DBusHandlerResult
14175742242000e782719bc1656f0a7da72b059e88eHavoc Penningtonfilter_func (DBusConnection     *connection,
14275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington             DBusMessage        *message,
14375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington             void               *user_data)
14475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington{
14575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  if (dbus_message_is_signal (message,
14675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                              DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
14775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                              "Disconnected"))
148a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington    {
149fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      dbus_connection_disconnect (connection);
150fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      quit ();
1515c1a8e44903bd1dedc8cbefad78b0c8b61daada5Havoc Pennington      return DBUS_HANDLER_RESULT_HANDLED;
152a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington    }
153a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington  else
154a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington    {
1555c1a8e44903bd1dedc8cbefad78b0c8b61daada5Havoc Pennington      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
156a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington    }
157a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington}
158a7f69a41d5b82eb00da20b661181b490039bb70fHavoc Pennington
159eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Penningtonint
160eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Penningtonmain (int    argc,
161eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington      char **argv)
162eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington{
163eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  DBusConnection *connection;
164eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  DBusError error;
165f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  int result;
166f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
167eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  dbus_error_init (&error);
16875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  connection = dbus_bus_get (DBUS_BUS_ACTIVATION, &error);
169eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  if (connection == NULL)
170eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington    {
17175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      fprintf (stderr, "*** Failed to open connection to activating message bus: %s\n",
17275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington               error.message);
173eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington      dbus_error_free (&error);
174eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington      return 1;
175eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington    }
176eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington
17798572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington  loop = _dbus_loop_new ();
17898572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington  if (loop == NULL)
17998572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington    die ("No memory\n");
18098572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington
18198572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington  if (!test_connection_setup (loop, connection))
18298572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington    die ("No memory\n");
183f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
1841dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington  if (!dbus_connection_add_filter (connection,
1851dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington                                   filter_func, NULL, NULL))
186f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington    die ("No memory");
187f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
18875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  if (!dbus_connection_register_object_path (connection,
18975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                                             echo_path,
19075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                                             &echo_vtable,
19175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington                                             NULL))
19275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington    die ("No memory");
193f4cffc0e49d48a8dbf158230d7e816d8713566daSeth Nickell
194f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService",
195f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington                                     0, &error);
196f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  if (dbus_error_is_set (&error))
197f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington    {
19896f6740f2fbc16c7ee220d3d5abdc94e22da78f3Olivier Andrieu      fprintf (stderr, "Error %s\n", error.message);
19977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington      _dbus_verbose ("*** Failed to acquire service: %s\n",
20077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington                     error.message);
201f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington      dbus_error_free (&error);
202fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington      exit (1);
203f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington    }
20451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
20551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("*** Test service entering main loop\n");
20698572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington  _dbus_loop_run (loop);
207eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington
208fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington  test_connection_shutdown (loop, connection);
2091dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington
2101dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9Havoc Pennington  dbus_connection_remove_filter (connection, filter_func, NULL);
211fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
212eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  dbus_connection_unref (connection);
21398572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington
21498572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington  _dbus_loop_unref (loop);
21598572905e60cac7ea971aa0830e2a629bfff208dHavoc Pennington  loop = NULL;
216f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington
217f216e81432ddf04889202c33a6e68113f94d7611Havoc Pennington  dbus_shutdown ();
218fe22b2194d53061fefe64d48ff6a53e6a762279dHavoc Pennington
2191708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington  _dbus_verbose ("*** Test service exiting\n");
220eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington
221eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  return 0;
222eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington}
223