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