2003-04-07 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   char *s;
31   
32   dbus_error_init (&error);
33   
34   if (!dbus_message_get_args (message,
35                               &error,
36                               DBUS_TYPE_STRING, &s,
37                               DBUS_TYPE_INVALID))
38     {
39       reply = dbus_message_new_error_reply (message,
40                                             error.name,
41                                             error.message);
42
43       if (reply == NULL)
44         die ("No memory\n");
45
46       if (!dbus_connection_send (connection, reply, NULL))
47         die ("No memory\n");
48
49       dbus_message_unref (reply);
50
51       return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
52     }
53
54   reply = dbus_message_new_reply (message);
55   if (reply == NULL)
56     die ("No memory\n");
57
58   if (!dbus_message_append_string (reply, s))
59     die ("No memory");
60
61   if (!dbus_connection_send (connection, reply, NULL))
62     die ("No memory\n");
63   
64   dbus_free (s);
65   
66   dbus_message_unref (reply);
67     
68   return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
69 }
70
71 static DBusHandlerResult
72 filter_func (DBusMessageHandler *handler,
73              DBusConnection     *connection,
74              DBusMessage        *message,
75              void               *user_data)
76 {  
77   if (dbus_message_name_is (message, "org.freedesktop.DBus.TestSuiteEcho"))
78     return handle_echo (connection, message);
79   else if (dbus_message_name_is (message, "org.freedesktop.DBus.TestSuiteExit") ||
80            dbus_message_name_is (message, DBUS_MESSAGE_LOCAL_DISCONNECT))
81     {
82       dbus_connection_disconnect (connection);
83       quit ();
84       return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
85     }
86   else
87     {
88       return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
89     }
90 }
91
92 int
93 main (int    argc,
94       char **argv)
95 {
96   DBusConnection *connection;
97   DBusError error;
98   DBusMessageHandler *handler;
99   const char *to_handle[] = {
100     "org.freedesktop.DBus.TestSuiteEcho",
101     "org.freedesktop.DBus.TestSuiteExit",
102     DBUS_MESSAGE_LOCAL_DISCONNECT,
103   };
104   int result;
105   
106   dbus_error_init (&error);
107   connection = dbus_bus_get (DBUS_BUS_ACTIVATION, &error);
108   if (connection == NULL)
109     {
110       fprintf (stderr, "Failed to open connection to activating message bus: %s\n",
111                error.message);
112       dbus_error_free (&error);
113       return 1;
114     }
115
116   loop = _dbus_loop_new ();
117   if (loop == NULL)
118     die ("No memory\n");
119   
120   if (!test_connection_setup (loop, connection))
121     die ("No memory\n");
122
123   handler = dbus_message_handler_new (filter_func, NULL, NULL);
124   if (handler == NULL)
125     die ("No memory");
126   
127   if (!dbus_connection_register_handler (connection, handler, to_handle,
128                                          _DBUS_N_ELEMENTS (to_handle)))
129     die ("No memory");
130
131   result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService",
132                                      0, &error);
133   if (dbus_error_is_set (&error))
134     {
135       fprintf (stderr, "Failed to acquire service: %s\n",
136                error.message);
137       dbus_error_free (&error);
138       exit (1);
139     }
140   
141   _dbus_loop_run (loop);
142
143   test_connection_shutdown (loop, connection);
144   
145   dbus_connection_unref (connection);
146   
147   dbus_message_handler_unref (handler);
148
149   _dbus_loop_unref (loop);
150   loop = NULL;
151   
152   dbus_shutdown ();
153
154   printf ("*** Test service exiting\n");
155   
156   return 0;
157 }