test-service.c revision 1dd3f1788f1b4c9af2f4fa744abdb7892d0a14b9
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, "*** %s", message); 21 exit (1); 22} 23 24static DBusHandlerResult 25handle_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 74static DBusHandlerResult 75filter_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 100int 101main (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_ACTIVATION, &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 result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService", 130 0, &error); 131 if (dbus_error_is_set (&error)) 132 { 133 _dbus_verbose ("*** Failed to acquire service: %s\n", 134 error.message); 135 dbus_error_free (&error); 136 exit (1); 137 } 138 139 _dbus_verbose ("*** Test service entering main loop\n"); 140 _dbus_loop_run (loop); 141 142 test_connection_shutdown (loop, connection); 143 144 dbus_connection_remove_filter (connection, filter_func, NULL); 145 146 dbus_connection_unref (connection); 147 148 _dbus_loop_unref (loop); 149 loop = NULL; 150 151 dbus_shutdown (); 152 153 _dbus_verbose ("*** Test service exiting\n"); 154 155 return 0; 156} 157