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