Main Page | Class Hierarchy | Class List | File List | Class Members | File Members | Related Pages | Examples

DeviceServer.cpp

The server main function from Device Server Example.
See also:
DeviceServer.h
#include "DeviceServer.h"

extern "C"
void handler(int sig)
{
   //
   // The shutDown function is safe for calling from within a signal handler.
   //
   rdaDeviceServerBase::shutDown(sig);
}

int main(int argc, char** argv)
{
   //
   // Set the server name and trace level from command line arguments
   //
   const char* serverName = 0;
   rdaLogger::LogLevel traceLevel = rdaLogger::LOG_OFF;
   if (argc > 1)
   {
      serverName = argv[1];
      if (argc > 2)
      {
         if (rdaLogger::stringToLevel(traceLevel, argv[2]) == false)
         {
            printf("Invalid trace level '%s'\n", argv[2]);
            return 1;
         }
      }
   }
   else
   {
      printf("Usage: deviceServer <server name> [trace level]\n");
      return 1;
   }
   
   //
   // Install signal handler for SIGINT
   //
   struct sigaction sa;
   sa.sa_handler = handler;
   sigfillset(&sa.sa_mask);
#ifdef __Lynx__
   sa.sa_flags = 0 | SA_NOABORT;
#else
   sa.sa_flags = 0 | SA_RESTART;
#endif
   if (sigaction(SIGINT,  &sa, (struct sigaction*) 0) == -1)
   {
      printf("Can't set signal handler for SIGINT\n");
      return 1;
   }
   
   //
   // Set trace level in our example logger and in the RDA common loggers
   //
   rdaLogger::init();
   logger = rdaLogger::getLogger("dev.example");
   logger->setLevel(traceLevel);
   rdaDeviceServerBase::getGlobalLogger()->setLevel(traceLevel);
   rdaDeviceServerBase::getClientsLogger()->setLevel(traceLevel);
   rdaDeviceServerBase::getCallsLogger()->setLevel(traceLevel);
   rdaDeviceServerBase::getSubscriptionsLogger()->setLevel(traceLevel);

   try
   {
      //
      // Initialize RDA
      //
      rdaDeviceServerBase::init(argc, argv);
      //
      // Create an object of the DeviceServer class
      //
      DeviceServer theServer(serverName);
      //
      // Accept client requests.
      // The main function blocks here until rdaDeviceServerBase::shutDown()
      // is called from another thread or a signal handler.
      //
      theServer.runServer();
   }
   catch(const rdaInternalException& ex)
   {
      printf("RDA internal exception: %s\n", ex.getMessage());
      return 1;
   }
   catch(const rdaInternalError& ex)
   {
      printf("RDA internal error [%s:%d]: %s\n",
              ex.getFile(), ex.getLine(), ex.getMessage());
      return 1;
   }
   catch(...)
   {
      printf("Unknown exception in main\n");
      return 1;
   }

   rdaLogger::destroy();
   return 0;
}

RDA-2.3 documentation - 27 Jun 2007 - N.Trofimov