test-service.c revision b29ea9115ea3277354b7ccbe442026279220f4ac
1
2#include "test-utils.h"
3
4static DBusLoop *loop;
5static dbus_bool_t already_quit = FALSE;
6
7static void
8quit (void)
9{
10  if (!already_quit)
11    {
12      _dbus_loop_quit (loop);
13      already_quit = TRUE;
14    }
15}
16
17static void
18die (const char *message)
19{
20  fprintf (stderr, "*** %s", message);
21  exit (1);
22}
23
24static DBusHandlerResult
25handle_echo (DBusConnection     *connection,
26             DBusMessage        *message)
27{
28  DBusError error;
29  DBusMessage *reply;
30  DBusMessageIter iter;
31  char *s;
32
33  dbus_error_init (&error);
34
35  if (!dbus_message_get_args (message,
36                              &error,
37                              DBUS_TYPE_STRING, &s,
38                              DBUS_TYPE_INVALID))
39    {
40      reply = dbus_message_new_error (message,
41                                      error.name,
42                                      error.message);
43
44      if (reply == NULL)
45        die ("No memory\n");
46
47      if (!dbus_connection_send (connection, reply, NULL))
48        die ("No memory\n");
49
50      dbus_message_unref (reply);
51
52      return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
53    }
54
55  reply = dbus_message_new_method_return (message);
56  if (reply == NULL)
57    die ("No memory\n");
58
59  dbus_message_append_iter_init (message, &iter);
60
61  if (!dbus_message_iter_append_string (&iter, s))
62    die ("No memory");
63
64  if (!dbus_connection_send (connection, reply, NULL))
65    die ("No memory\n");
66
67  dbus_free (s);
68
69  dbus_message_unref (reply);
70
71  return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
72}
73
74static DBusHandlerResult
75filter_func (DBusMessageHandler *handler,
76             DBusConnection     *connection,
77             DBusMessage        *message,
78             void               *user_data)
79{
80  if (dbus_message_has_name (message, "org.freedesktop.DBus.TestSuiteEcho"))
81    return handle_echo (connection, message);
82  else if (dbus_message_has_name (message, "org.freedesktop.DBus.TestSuiteExit") ||
83           dbus_message_has_name (message, DBUS_MESSAGE_LOCAL_DISCONNECT))
84    {
85      dbus_connection_disconnect (connection);
86      quit ();
87      return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
88    }
89  else
90    {
91      return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
92    }
93}
94
95int
96main (int    argc,
97      char **argv)
98{
99  DBusConnection *connection;
100  DBusError error;
101  DBusMessageHandler *handler;
102  int result;
103
104  dbus_error_init (&error);
105  connection = dbus_bus_get (DBUS_BUS_ACTIVATION, &error);
106  if (connection == NULL)
107    {
108      _dbus_verbose ("*** Failed to open connection to activating message bus: %s\n",
109                     error.message);
110      dbus_error_free (&error);
111      return 1;
112    }
113
114  loop = _dbus_loop_new ();
115  if (loop == NULL)
116    die ("No memory\n");
117
118  if (!test_connection_setup (loop, connection))
119    die ("No memory\n");
120
121  handler = dbus_message_handler_new (filter_func, NULL, NULL);
122  if (handler == NULL)
123    die ("No memory");
124
125  if (!dbus_connection_add_filter (connection, handler))
126    die ("No memory");
127
128  result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService",
129                                     0, &error);
130  if (dbus_error_is_set (&error))
131    {
132      _dbus_verbose ("*** Failed to acquire service: %s\n",
133                     error.message);
134      dbus_error_free (&error);
135      exit (1);
136    }
137
138  _dbus_verbose ("*** Test service entering main loop\n");
139  _dbus_loop_run (loop);
140
141  test_connection_shutdown (loop, connection);
142
143  dbus_connection_unref (connection);
144
145  dbus_message_handler_unref (handler);
146
147  _dbus_loop_unref (loop);
148  loop = NULL;
149
150  dbus_shutdown ();
151
152  _dbus_verbose ("*** Test service exiting\n");
153
154  return 0;
155}
156