os/ossrv/ofdbus/dbus/tsrc/testapps/dbus_test_cases/test-shell-service.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /* Portion Copyright © 2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
     2 #include "test-utils.h"
     3 
     4 static DBusLoop *loop;
     5 static dbus_bool_t already_quit = FALSE;
     6 static const char* echo_path = "/org/freedesktop/TestSuite";
     7 
     8 typedef struct
     9 {
    10   int argc;
    11   char **argv;
    12 } EchoData;
    13 
    14 static void
    15 quit (void)
    16 {
    17   if (!already_quit)
    18     {
    19       _dbus_loop_quit (loop);
    20       already_quit = TRUE;
    21     }
    22 }
    23 
    24 static void
    25 die (const char *message)
    26 {
    27   fprintf (stderr, "*** test-service: %s", message);
    28   exit (1);
    29 }
    30 
    31 static DBusHandlerResult
    32 handle_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 
    68 static void
    69 path_unregistered_func (DBusConnection  *connection,
    70                         void            *user_data)
    71 {
    72   /* connection was finalized */
    73 }
    74 
    75 static DBusHandlerResult
    76 path_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 
    95 static DBusObjectPathVTable
    96 echo_vtable = {
    97   path_unregistered_func,
    98   path_message_func,
    99   NULL,
   100 };
   101 
   102 static DBusHandlerResult
   103 filter_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 
   120 int
   121 main (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 }