diff options
Diffstat (limited to 'TAO/tests/ORB_Local_Config/Two_DLL_ORB/ORB_DLL.cpp')
-rw-r--r-- | TAO/tests/ORB_Local_Config/Two_DLL_ORB/ORB_DLL.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/TAO/tests/ORB_Local_Config/Two_DLL_ORB/ORB_DLL.cpp b/TAO/tests/ORB_Local_Config/Two_DLL_ORB/ORB_DLL.cpp new file mode 100644 index 00000000000..5e1e673e8c3 --- /dev/null +++ b/TAO/tests/ORB_Local_Config/Two_DLL_ORB/ORB_DLL.cpp @@ -0,0 +1,149 @@ +// -*- C++ -*- + +#include "ORB_DLL.h" +#include "ace/Service_Config.h" +#include "ace/OS_NS_stdio.h" +#include "ace/OS_NS_strings.h" + +#include "ace/Arg_Shifter.h" +#include "ace/Log_Msg.h" + +ACE_RCSID (tests, + ORB_DLL, + "$Id$") + + +// +Abstract_Worker::Abstract_Worker (const char* s) + : ior_file_ (s) +{ +} + +// +Abstract_Worker::~Abstract_Worker (void) +{ +} + + +// +Service_Config_ORB_DLL::Service_Config_ORB_DLL (void) + : is_server_ (-1) + , worker_ (0) + , argv_ (0) +{ +} + +// +Service_Config_ORB_DLL::~Service_Config_ORB_DLL (void) +{ +} + +// +int +Service_Config_ORB_DLL::init (int argc, ACE_TCHAR *argv[]) +{ + ACE_Arg_Shifter arg_shifter (argc, argv); + + while (arg_shifter.is_anything_left ()) + { + if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT ("-c")) == 0) + { + this->is_server_ = 0; + arg_shifter.consume_arg(); + } + else if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT ("-s")) == 0) + { + this->is_server_ = 1; + arg_shifter.consume_arg(); + } + else + arg_shifter.ignore_arg(); + } + + if (this->is_server_ < 0) + ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) You must specify -c(lient) or -s(erver) argument. Aborting."), -1); + + ACE_TCHAR **temp_argv = new ACE_TCHAR*[argc+1]; + for (int i = 0; i < argc; i++) + { + temp_argv[i] = new ACE_TCHAR[ACE_OS::strlen(argv[i])+1]; + ACE_OS::strcpy (temp_argv[i],argv[i]); + } + temp_argv[argc] = 0; + + ACE_ARGV* tmp = 0; + ACE_NEW_RETURN (tmp, ACE_ARGV (temp_argv), -1); + this->argv_.reset (tmp); + for (int i = 0; i < argc; i++) + delete [] temp_argv[i]; + delete [] temp_argv; + + Abstract_Worker* worker = 0; + if (this->is_server_) + { + ACE_NEW_RETURN (worker, Server_Worker, -1); + } + else + { + ACE_NEW_RETURN (worker, Client_Worker, -1); + } + this->worker_.reset (worker); + +#if defined (ACE_HAS_THREADS) + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) About to activate %s, argv[%d]=\'%s\' ...\n"), + this->worker_->kind (), + this->argv_->argc (), + this->argv_->buf ())); + + // Become an Active Object if more than one argument passed. + // Two arguments indicate two "test objects" to be dynamically + // loaded. + return this->activate (); +#else + ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%P|%t) Threading support is required for this test. Aborting.")), -1); +#endif /* ACE_HAS_THREADS */ +} + +int +Service_Config_ORB_DLL::svc (void) +{ + ACE_ASSERT (this->worker_.get () != 0); + ACE_ASSERT (this->argv_.get () != 0); + + ACE_DECLARE_NEW_ENV; + ACE_TRY + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) %@ %s is active, argv[%d]=\'%s\'\n"), + this, + this->worker_->kind (), + this->argv_->argc (), + this->argv_->buf ())); + + int ret = this->worker_->test_main (this->argv_->argc (), + this->argv_->argv () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%P|%t) %@ %s bows out - so long, cruel world! (%d)\n"), + this, + this->worker_->kind (), + ret)); + return ret; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION(ACE_ANY_EXCEPTION, ACE_TEXT("Failure:")); + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("(%P|%t) Aborting.\n")), + -1); + } + ACE_ENDTRY; + +} + + +// Define our service for using with the Service Configurator +ACE_FACTORY_DEFINE (Service_Config_ORB_DLL, Service_Config_ORB_DLL) |