2004-03-21 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 = FALSE;
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   char *s;
31
32   _dbus_verbose ("sending reply to Echo method\n");
33   
34   dbus_error_init (&error);
35   
36   if (!dbus_message_get_args (message,
37                               &error,
38                               DBUS_TYPE_STRING, &s,
39                               DBUS_TYPE_INVALID))
40     {
41       reply = dbus_message_new_error (message,
42                                       error.name,
43                                       error.message);
44
45       if (reply == NULL)
46         die ("No memory\n");
47
48       if (!dbus_connection_send (connection, reply, NULL))
49         die ("No memory\n");
50
51       dbus_message_unref (reply);
52
53       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
54     }
55
56   reply = dbus_message_new_method_return (message);
57   if (reply == NULL)
58     die ("No memory\n");
59   
60   if (!dbus_message_append_args (reply,
61                                  DBUS_TYPE_STRING, s,
62                                  DBUS_TYPE_INVALID))
63     die ("No memory");
64   
65   if (!dbus_connection_send (connection, reply, NULL))
66     die ("No memory\n");
67
68   fprintf (stderr, "Echo service echoed string: \"%s\"\n", s);
69   
70   dbus_free (s);
71   
72   dbus_message_unref (reply);
73     
74   return DBUS_HANDLER_RESULT_HANDLED;
75 }
76
77 static void
78 path_unregistered_func (DBusConnection  *connection,
79                         void            *user_data)
80 {
81   /* connection was finalized */
82 }
83
84 static DBusHandlerResult
85 path_message_func (DBusConnection  *connection,
86                    DBusMessage     *message,
87                    void            *user_data)
88 {
89   if (dbus_message_is_method_call (message,
90                                    "org.freedesktop.TestSuite",
91                                    "Echo"))
92     return handle_echo (connection, message);
93   else if (dbus_message_is_method_call (message,
94                                         "org.freedesktop.TestSuite",
95                                         "Exit"))
96     {
97       dbus_connection_disconnect (connection);
98       quit ();
99       return DBUS_HANDLER_RESULT_HANDLED;
100     }
101   else if (dbus_message_is_method_call (message,
102                                         "org.freedesktop.TestSuite",
103                                         "EmitFoo"))
104     {
105       /* Emit the Foo signal */
106       DBusMessage *signal;
107
108       _dbus_verbose ("emitting signal Foo\n");
109       
110       signal = dbus_message_new_signal ("/org/freedesktop/TestSuite",
111                                         "org.freedesktop.TestSuite",
112                                         "Foo");
113       if (signal == NULL)
114         die ("No memory\n");
115       
116       if (!dbus_message_append_args (signal,
117                                      DBUS_TYPE_DOUBLE, 42.6,
118                                      DBUS_TYPE_INVALID))
119         die ("No memory");
120   
121       if (!dbus_connection_send (connection, signal, NULL))
122         die ("No memory\n");
123       
124       return DBUS_HANDLER_RESULT_HANDLED;
125     }
126   else
127     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
128 }
129
130 static DBusObjectPathVTable
131 echo_vtable = {
132   path_unregistered_func,
133   path_message_func,
134   NULL,
135 };
136
137 /* Pre-exploded path, "/org/freedesktop/TestSuite" */
138 static const char* echo_path[] = { "org", "freedesktop", "TestSuite", NULL };
139
140 static DBusHandlerResult
141 filter_func (DBusConnection     *connection,
142              DBusMessage        *message,
143              void               *user_data)
144 {
145   if (dbus_message_is_signal (message,
146                               DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
147                               "Disconnected"))
148     {
149       dbus_connection_disconnect (connection);
150       quit ();
151       return DBUS_HANDLER_RESULT_HANDLED;
152     }
153   else
154     {
155       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
156     }
157 }
158
159 int
160 main (int    argc,
161       char **argv)
162 {
163   DBusConnection *connection;
164   DBusError error;
165   int result;
166   
167   dbus_error_init (&error);
168   connection = dbus_bus_get (DBUS_BUS_ACTIVATION, &error);
169   if (connection == NULL)
170     {
171       fprintf (stderr, "*** Failed to open connection to activating message bus: %s\n",
172                error.message);
173       dbus_error_free (&error);
174       return 1;
175     }
176
177   loop = _dbus_loop_new ();
178   if (loop == NULL)
179     die ("No memory\n");
180   
181   if (!test_connection_setup (loop, connection))
182     die ("No memory\n");
183
184   if (!dbus_connection_add_filter (connection,
185                                    filter_func, NULL, NULL))
186     die ("No memory");
187
188   if (!dbus_connection_register_object_path (connection,
189                                              echo_path,
190                                              &echo_vtable,
191                                              NULL))
192     die ("No memory");
193
194   result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService",
195                                      0, &error);
196   if (dbus_error_is_set (&error))
197     {
198       fprintf (stderr, "Error %s", error.message);
199       _dbus_verbose ("*** Failed to acquire service: %s\n",
200                      error.message);
201       dbus_error_free (&error);
202       exit (1);
203     }
204
205   _dbus_verbose ("*** Test service entering main loop\n");
206   _dbus_loop_run (loop);
207
208   test_connection_shutdown (loop, connection);
209
210   dbus_connection_remove_filter (connection, filter_func, NULL);
211   
212   dbus_connection_unref (connection);
213
214   _dbus_loop_unref (loop);
215   loop = NULL;
216   
217   dbus_shutdown ();
218
219   _dbus_verbose ("*** Test service exiting\n");
220   
221   return 0;
222 }