2003-10-16 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_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 (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_NOT_YET_HANDLED;
52     }
53
54   reply = dbus_message_new_method_return (message);
55   if (reply == NULL)
56     die ("No memory\n");
57   
58   if (!dbus_message_append_args (reply,
59                                  DBUS_TYPE_STRING, s,
60                                  DBUS_TYPE_INVALID))
61     die ("No memory");
62   
63   if (!dbus_connection_send (connection, reply, NULL))
64     die ("No memory\n");
65
66   fprintf (stderr, "Echo service echoed string: \"%s\"\n", s);
67   
68   dbus_free (s);
69   
70   dbus_message_unref (reply);
71     
72   return DBUS_HANDLER_RESULT_HANDLED;
73 }
74
75 static DBusHandlerResult
76 filter_func (DBusConnection     *connection,
77              DBusMessage        *message,
78              void               *user_data)
79 {  
80   if (dbus_message_is_method_call (message,
81                                    "org.freedesktop.TestSuite",
82                                    "Echo"))
83     return handle_echo (connection, message);
84   else if (dbus_message_is_method_call (message,
85                                         "org.freedesktop.TestSuite",
86                                         "Exit") ||
87            dbus_message_is_signal (message,
88                                    DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,
89                                    "Disconnected"))
90     {
91       dbus_connection_disconnect (connection);
92       quit ();
93       return DBUS_HANDLER_RESULT_HANDLED;
94     }
95   else
96     {
97       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
98     }
99 }
100
101 int
102 main (int    argc,
103       char **argv)
104 {
105   DBusConnection *connection;
106   DBusError error;
107   int result;
108   
109   dbus_error_init (&error);
110   connection = dbus_bus_get (DBUS_BUS_SESSION, &error);
111   if (connection == NULL)
112     {
113       _dbus_verbose ("*** 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   if (!dbus_connection_add_filter (connection,
127                                    filter_func, NULL, NULL))
128     die ("No memory");
129
130   printf ("Acquiring service\n");
131
132   result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService",
133                                      0, &error);
134   if (dbus_error_is_set (&error))
135     {
136       printf ("Error %s", error.message);
137       _dbus_verbose ("*** Failed to acquire service: %s\n",
138                      error.message);
139       dbus_error_free (&error);
140       exit (1);
141     }
142
143   _dbus_verbose ("*** Test service entering main loop\n");
144   _dbus_loop_run (loop);
145
146   test_connection_shutdown (loop, connection);
147
148   dbus_connection_remove_filter (connection, filter_func, NULL);
149   
150   dbus_connection_unref (connection);
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 }