2003-09-21 Seth Nickell <seth@gnome.org>
[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   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_NOT_YET_HANDLED;
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_NOT_YET_HANDLED;
72 }
73
74 static DBusHandlerResult
75 filter_func (DBusConnection     *connection,
76              DBusMessage        *message,
77              void               *user_data)
78 {  
79   if (dbus_message_is_method_call (message,
80                                    "org.freedesktop.TestSuite",
81                                    "Echo"))
82     return handle_echo (connection, message);
83   else if (dbus_message_is_method_call (message,
84                                         "org.freedesktop.TestSuite",
85                                         "Exit") ||
86            dbus_message_is_signal (message,
87                                    DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
88                                    "Disconnected"))
89     {
90       dbus_connection_disconnect (connection);
91       quit ();
92       return DBUS_HANDLER_RESULT_HANDLED;
93     }
94   else
95     {
96       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
97     }
98 }
99
100 int
101 main (int    argc,
102       char **argv)
103 {
104   DBusConnection *connection;
105   DBusError error;
106   int result;
107   
108   dbus_error_init (&error);
109   connection = dbus_bus_get (DBUS_BUS_SESSION, &error);
110   if (connection == NULL)
111     {
112       _dbus_verbose ("*** Failed to open connection to activating message bus: %s\n",
113                      error.message);
114       dbus_error_free (&error);
115       return 1;
116     }
117
118   loop = _dbus_loop_new ();
119   if (loop == NULL)
120     die ("No memory\n");
121   
122   if (!test_connection_setup (loop, connection))
123     die ("No memory\n");
124
125   if (!dbus_connection_add_filter (connection,
126                                    filter_func, NULL, NULL))
127     die ("No memory");
128
129   printf ("Acquiring service\n");
130
131   result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService",
132                                      0, &error);
133   if (dbus_error_is_set (&error))
134     {
135       printf ("Error %s", error.message);
136       _dbus_verbose ("*** Failed to acquire service: %s\n",
137                      error.message);
138       dbus_error_free (&error);
139       exit (1);
140     }
141
142   _dbus_verbose ("*** Test service entering main loop\n");
143   _dbus_loop_run (loop);
144
145   test_connection_shutdown (loop, connection);
146
147   dbus_connection_remove_filter (connection, filter_func, NULL);
148   
149   dbus_connection_unref (connection);
150
151   _dbus_loop_unref (loop);
152   loop = NULL;
153   
154   dbus_shutdown ();
155
156   _dbus_verbose ("*** Test service exiting\n");
157   
158   return 0;
159 }