test-shell-service.c revision 7020b573764bb86551d329e867c2e87172424c9b
1 2#include "test-utils.h" 3 4static DBusLoop *loop; 5static dbus_bool_t already_quit = FALSE; 6static const char* echo_path = "/org/freedesktop/TestSuite"; 7 8typedef struct 9{ 10 int argc; 11 char **argv; 12} EchoData; 13 14static void 15quit (void) 16{ 17 if (!already_quit) 18 { 19 _dbus_loop_quit (loop); 20 already_quit = TRUE; 21 } 22} 23 24static void 25die (const char *message) 26{ 27 fprintf (stderr, "*** test-service: %s", message); 28 exit (1); 29} 30 31static DBusHandlerResult 32handle_echo (DBusConnection *connection, 33 DBusMessage *message) 34{ 35 DBusError error; 36 DBusMessage *reply; 37 DBusMessageIter iter; 38 int i; 39 EchoData *d; 40 41 _dbus_verbose ("sending reply to Echo method\n"); 42 43 if (!dbus_connection_get_object_path_data (connection, echo_path, (void **)&d)) 44 die ("No memory"); 45 46 47 dbus_error_init (&error); 48 49 reply = dbus_message_new_method_return (message); 50 if (reply == NULL) 51 die ("No memory\n"); 52 53 dbus_message_iter_init_append (reply, &iter); 54 for (i = 0; i < d->argc; ++i) 55 if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &(d->argv[i]))) 56 die ("No memory\n"); 57 58 if (!dbus_connection_send (connection, reply, NULL)) 59 die ("No memory\n"); 60 61 fprintf (stderr, "Shell echo service echoed the command line\n"); 62 63 dbus_message_unref (reply); 64 65 return DBUS_HANDLER_RESULT_HANDLED; 66} 67 68static void 69path_unregistered_func (DBusConnection *connection, 70 void *user_data) 71{ 72 /* connection was finalized */ 73} 74 75static DBusHandlerResult 76path_message_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 { 88 quit (); 89 return DBUS_HANDLER_RESULT_HANDLED; 90 } 91 else 92 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; 93} 94 95static DBusObjectPathVTable 96echo_vtable = { 97 path_unregistered_func, 98 path_message_func, 99 NULL, 100}; 101 102static DBusHandlerResult 103filter_func (DBusConnection *connection, 104 DBusMessage *message, 105 void *user_data) 106{ 107 if (dbus_message_is_signal (message, 108 DBUS_INTERFACE_LOCAL, 109 "Disconnected")) 110 { 111 quit (); 112 return DBUS_HANDLER_RESULT_HANDLED; 113 } 114 else 115 { 116 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; 117 } 118} 119 120int 121main (int argc, 122 char **argv) 123{ 124 DBusConnection *connection; 125 DBusError error; 126 EchoData echo_data; 127 int result; 128 129 echo_data.argc = argc; 130 echo_data.argv = argv; 131 132 dbus_error_init (&error); 133 connection = dbus_bus_get (DBUS_BUS_STARTER, &error); 134 if (connection == NULL) 135 { 136 fprintf (stderr, "*** Failed to open connection to activating message bus: %s\n", 137 error.message); 138 dbus_error_free (&error); 139 return 1; 140 } 141 142 loop = _dbus_loop_new (); 143 if (loop == NULL) 144 die ("No memory\n"); 145 146 if (!test_connection_setup (loop, connection)) 147 die ("No memory\n"); 148 149 if (!dbus_connection_add_filter (connection, 150 filter_func, NULL, NULL)) 151 die ("No memory"); 152 153 if (!dbus_connection_register_object_path (connection, 154 echo_path, 155 &echo_vtable, 156 (void*) &echo_data)) 157 die ("No memory"); 158 159 { 160 void *d; 161 if (!dbus_connection_get_object_path_data (connection, echo_path, &d)) 162 die ("No memory"); 163 if (d != (void*) &echo_data) 164 die ("dbus_connection_get_object_path_data() doesn't seem to work right\n"); 165 } 166 167 result = dbus_bus_request_name (connection, "org.freedesktop.DBus.TestSuiteShellEchoServiceSuccess", 168 0, &error); 169 if (dbus_error_is_set (&error)) 170 { 171 fprintf (stderr, "Error %s\n", error.message); 172 _dbus_verbose ("*** Failed to acquire service: %s\n", 173 error.message); 174 dbus_error_free (&error); 175 exit (1); 176 } 177 178 _dbus_verbose ("*** Test service entering main loop\n"); 179 _dbus_loop_run (loop); 180 181 test_connection_shutdown (loop, connection); 182 183 dbus_connection_remove_filter (connection, filter_func, NULL); 184 185 dbus_connection_unref (connection); 186 187 _dbus_loop_unref (loop); 188 loop = NULL; 189 190 dbus_shutdown (); 191 192 _dbus_verbose ("*** Test service exiting\n"); 193 194 return 0; 195} 196