test-service.c revision 8873c90f99303f9cc308f15f8d03e637911f5b9e
1 2#include "test-utils.h" 3 4static DBusLoop *loop; 5static dbus_bool_t already_quit = FALSE; 6 7static void 8quit (void) 9{ 10 if (!already_quit) 11 { 12 _dbus_loop_quit (loop); 13 already_quit = TRUE; 14 } 15} 16 17static void 18die (const char *message) 19{ 20 fprintf (stderr, "*** test-service: %s", message); 21 exit (1); 22} 23 24static DBusHandlerResult 25handle_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_message_unref (reply); 71 72 return DBUS_HANDLER_RESULT_HANDLED; 73} 74 75static void 76path_unregistered_func (DBusConnection *connection, 77 void *user_data) 78{ 79 /* connection was finalized */ 80} 81 82static DBusHandlerResult 83path_message_func (DBusConnection *connection, 84 DBusMessage *message, 85 void *user_data) 86{ 87 if (dbus_message_is_method_call (message, 88 "org.freedesktop.TestSuite", 89 "Echo")) 90 return handle_echo (connection, message); 91 else if (dbus_message_is_method_call (message, 92 "org.freedesktop.TestSuite", 93 "Exit")) 94 { 95 dbus_connection_disconnect (connection); 96 quit (); 97 return DBUS_HANDLER_RESULT_HANDLED; 98 } 99 else if (dbus_message_is_method_call (message, 100 "org.freedesktop.TestSuite", 101 "EmitFoo")) 102 { 103 /* Emit the Foo signal */ 104 DBusMessage *signal; 105 double v_DOUBLE; 106 107 _dbus_verbose ("emitting signal Foo\n"); 108 109 signal = dbus_message_new_signal ("/org/freedesktop/TestSuite", 110 "org.freedesktop.TestSuite", 111 "Foo"); 112 if (signal == NULL) 113 die ("No memory\n"); 114 115 v_DOUBLE = 42.6; 116 if (!dbus_message_append_args (signal, 117 DBUS_TYPE_DOUBLE, &v_DOUBLE, 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 130static DBusObjectPathVTable 131echo_vtable = { 132 path_unregistered_func, 133 path_message_func, 134 NULL, 135}; 136 137 138static const char* echo_path = "/org/freedesktop/TestSuite" ; 139 140static DBusHandlerResult 141filter_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 159int 160main (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_STARTER, &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_request_name (connection, "org.freedesktop.DBus.TestSuiteEchoService", 195 0, &error); 196 if (dbus_error_is_set (&error)) 197 { 198 fprintf (stderr, "Error %s\n", 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} 223