2003-04-09 Havoc Pennington <hp@redhat.com>
[platform/upstream/dbus.git] / test / test-service.c
1
2 #include "test-utils.h"
3
4 static DBusLoop *loop;
5 static dbus_bool_t already_quit;
6
7 static void
8 quit (void)
9 {
10   if (!already_quit)
11     {
12       _dbus_loop_quit (loop);
13       already_quit = TRUE;
14     }
15 }
16
17 static void
18 die (const char *message)
19 {
20   fprintf (stderr, "%s", message);
21   exit (1);
22 }
23
24 static DBusHandlerResult
25 handle_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_reply (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_reply (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
74 static DBusHandlerResult
75 filter_func (DBusMessageHandler *handler,
76              DBusConnection     *connection,
77              DBusMessage        *message,
78              void               *user_data)
79 {  
80   if (dbus_message_name_is (message, "org.freedesktop.DBus.TestSuiteEcho"))
81     return handle_echo (connection, message);
82   else if (dbus_message_name_is (message, "org.freedesktop.DBus.TestSuiteExit") ||
83            dbus_message_name_is (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
95 int
96 main (int    argc,
97       char **argv)
98 {
99   DBusConnection *connection;
100   DBusError error;
101   DBusMessageHandler *handler;
102   const char *to_handle[] = {
103     "org.freedesktop.DBus.TestSuiteEcho",
104     "org.freedesktop.DBus.TestSuiteExit",
105     DBUS_MESSAGE_LOCAL_DISCONNECT,
106   };
107   int result;
108   
109   dbus_error_init (&error);
110   connection = dbus_bus_get (DBUS_BUS_ACTIVATION, &error);
111   if (connection == NULL)
112     {
113       fprintf (stderr, "Failed to open connection to activating message bus: %s\n",
114                error.message);
115       dbus_error_free (&error);
116       return 1;
117     }
118
119   loop = _dbus_loop_new ();
120   if (loop == NULL)
121     die ("No memory\n");
122   
123   if (!test_connection_setup (loop, connection))
124     die ("No memory\n");
125
126   handler = dbus_message_handler_new (filter_func, NULL, NULL);
127   if (handler == NULL)
128     die ("No memory");
129   
130   if (!dbus_connection_register_handler (connection, handler, to_handle,
131                                          _DBUS_N_ELEMENTS (to_handle)))
132     die ("No memory");
133
134   result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService",
135                                      0, &error);
136   if (dbus_error_is_set (&error))
137     {
138       fprintf (stderr, "Failed to acquire service: %s\n",
139                error.message);
140       dbus_error_free (&error);
141       exit (1);
142     }
143   
144   _dbus_loop_run (loop);
145
146   test_connection_shutdown (loop, connection);
147   
148   dbus_connection_unref (connection);
149   
150   dbus_message_handler_unref (handler);
151
152   _dbus_loop_unref (loop);
153   loop = NULL;
154   
155   dbus_shutdown ();
156
157   _dbus_verbose ("*** Test service exiting\n");
158   
159   return 0;
160 }