test-service.c revision 5c1a8e44903bd1dedc8cbefad78b0c8b61daada5
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 (DBusMessageHandler *handler, 76 DBusConnection *connection, 77 DBusMessage *message, 78 void *user_data) 79{ 80 if (dbus_message_has_name (message, "org.freedesktop.DBus.TestSuiteEcho")) 81 return handle_echo (connection, message); 82 else if (dbus_message_has_name (message, "org.freedesktop.DBus.TestSuiteExit") || 83 dbus_message_has_name (message, DBUS_MESSAGE_LOCAL_DISCONNECT)) 84 { 85 dbus_connection_disconnect (connection); 86 quit (); 87 return DBUS_HANDLER_RESULT_HANDLED; 88 } 89 else 90 { 91 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; 92 } 93} 94 95int 96main (int argc, 97 char **argv) 98{ 99 DBusConnection *connection; 100 DBusError error; 101 DBusMessageHandler *handler; 102 int result; 103 104 dbus_error_init (&error); 105 connection = dbus_bus_get (DBUS_BUS_ACTIVATION, &error); 106 if (connection == NULL) 107 { 108 _dbus_verbose ("*** Failed to open connection to activating message bus: %s\n", 109 error.message); 110 dbus_error_free (&error); 111 return 1; 112 } 113 114 loop = _dbus_loop_new (); 115 if (loop == NULL) 116 die ("No memory\n"); 117 118 if (!test_connection_setup (loop, connection)) 119 die ("No memory\n"); 120 121 handler = dbus_message_handler_new (filter_func, NULL, NULL); 122 if (handler == NULL) 123 die ("No memory"); 124 125 if (!dbus_connection_add_filter (connection, handler)) 126 die ("No memory"); 127 128 result = dbus_bus_acquire_service (connection, "org.freedesktop.DBus.TestSuiteEchoService", 129 0, &error); 130 if (dbus_error_is_set (&error)) 131 { 132 _dbus_verbose ("*** Failed to acquire service: %s\n", 133 error.message); 134 dbus_error_free (&error); 135 exit (1); 136 } 137 138 _dbus_verbose ("*** Test service entering main loop\n"); 139 _dbus_loop_run (loop); 140 141 test_connection_shutdown (loop, connection); 142 143 dbus_connection_unref (connection); 144 145 dbus_message_handler_unref (handler); 146 147 _dbus_loop_unref (loop); 148 loop = NULL; 149 150 dbus_shutdown (); 151 152 _dbus_verbose ("*** Test service exiting\n"); 153 154 return 0; 155} 156