📄 activator_options.cpp
字号:
//=============================================================================
/**
* @file Activator_Options.cpp
*
* Activator_Options.cpp,v 1.2 2003/11/12 22:58:08 michel_j Exp
*
* @author Darrell Brunsch <brunsch@cs.wustl.edu>
*/
//=============================================================================
#include "Activator_Options.h"
#include "Activator_NT_Service.h"
#include "tao/Strategies/advanced_resource.h"
#include "ace/Arg_Shifter.h"
#include "ace/ARGV.h"
#include "ace/OS_NS_strings.h"
#include "ace/Mutex.h"
ACE_RCSID (ImplRepo_Service,
Options,
"Activator_Options.cpp,v 1.2 2003/11/12 22:58:08 michel_j Exp")
#if defined (ACE_WIN32)
static const HKEY SERVICE_REG_ROOT = HKEY_LOCAL_MACHINE;
// This string must agree with the one used in Activator_NT_Service.h
static const ACE_TCHAR *SERVICE_REG_PATH =
ACE_TEXT ("SYSTEM\\CurrentControlSet\\Services\\TAOIMRActivator\\Parameters");
#endif /* ACE_WIN32 */
/**
* Default Constructor. Assigns default values to all the member variables.
*/
Options::Options ()
: repo_mode_ (REPO_NONE)
, debug_ (1)
, ping_interval_ (0, 200 * 1000) // 200 milliseconds
, service_ (false)
, startup_timeout_ (5)
, readonly_ (false)
, service_command_(SC_NONE)
{
}
/**
* parse_args uses an ACE_Arg_Shifter to grab all the options that are
* specific to the ImR.
* If running as an nt service, most of these options will come from the
* registry instead.
*
* @retval 0 Success
* @retval -1 Error parsing args
* @retval 1 Success but we should exit.
*/
int
Options::parse_args (int &argc, char *argv[])
{
ACE_Arg_Shifter shifter (argc, argv);
while (shifter.is_anything_left ())
{
if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-c")) == 0)
{
shifter.consume_arg ();
if (!shifter.is_anything_left () || shifter.get_current ()[0] == '-')
{
ACE_ERROR ((LM_ERROR, "Error: -c option needs a command\n"));
this->print_usage ();
return -1;
}
if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("install")) == 0)
{
this->service_command_ = SC_INSTALL;
}
else if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("remove")) == 0)
{
this->service_command_ = SC_REMOVE;
}
else
{
ACE_ERROR((LM_ERROR, "Error: Unknown service command : %s\n", shifter.get_current()));
this->print_usage ();
return -1;
}
}
else if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-d")) == 0)
{
shifter.consume_arg ();
if (!shifter.is_anything_left () || shifter.get_current ()[0] == '-')
{
ACE_ERROR ((LM_ERROR, "Error: -d option needs a debuglevel\n"));
this->print_usage ();
return -1;
}
this->debug_ = ACE_OS::atoi (shifter.get_current ());
}
else if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-l")) == 0)
{
this->readonly_ = true;
}
else if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-o")) == 0)
{
shifter.consume_arg ();
if (!shifter.is_anything_left () || shifter.get_current ()[0] == '-')
{
ACE_ERROR ((LM_ERROR, "Error: -o option needs a filename\n"));
this->print_usage ();
return -1;
}
this->ior_output_file_ = shifter.get_current();
}
else if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-p")) == 0)
{
shifter.consume_arg ();
if (!shifter.is_anything_left () || shifter.get_current ()[0] == '-')
{
ACE_ERROR ((LM_ERROR, "Error: -p option needs a filename\n"));
this->print_usage ();
return -1;
}
if (repo_mode_ != REPO_NONE)
{
ACE_ERROR ((LM_ERROR, "Error: Persistence already specified.\n"));
this->print_usage ();
return -1;
}
this->file_name_ = shifter.get_current ();
this->repo_mode_ = REPO_HEAP_FILE;
}
else if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-r")) == 0)
{
if (repo_mode_ != REPO_NONE)
{
ACE_ERROR ((LM_ERROR, "Error: Persistence already specified.\n"));
this->print_usage ();
return -1;
}
this->repo_mode_ = REPO_REGISTRY;
}
else if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-x")) == 0)
{
shifter.consume_arg ();
if (!shifter.is_anything_left () || shifter.get_current ()[0] == '-')
{
ACE_ERROR ((LM_ERROR, "Error: -x option needs a filename\n"));
this->print_usage ();
return -1;
}
if (repo_mode_ != REPO_NONE)
{
ACE_ERROR ((LM_ERROR, "Error: Persistence already specified.\n"));
this->print_usage ();
return -1;
}
this->file_name_ = shifter.get_current ();
this->repo_mode_ = REPO_XML_FILE;
}
else if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-s")) == 0)
{
this->service_ = true;
}
else if (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-t")) == 0)
{
shifter.consume_arg ();
if (!shifter.is_anything_left () || shifter.get_current ()[0] == '-')
{
ACE_ERROR ((LM_ERROR, "Error: -t option needs a value\n"));
this->print_usage ();
return -1;
}
this->startup_timeout_ =
ACE_Time_Value (ACE_OS::atoi (shifter.get_current ()));
}
else if ((ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-?")) == 0)
|| (ACE_OS::strcasecmp (shifter.get_current (),
ACE_TEXT ("-h")) == 0))
{
this->print_usage ();
return 1;
}
else
{
shifter.ignore_arg ();
continue;
}
shifter.consume_arg ();
}
return 0;
}
/**
* @retval 0 Success
* @retval -1 Error parsing args
* @retval 1 Success but we should exit.
*/
int
Options::init (int argc, char *argv[])
{
// Make an initial pass through and grab the arguments that we recognize.
// This may also run the commands to install or remove the nt service.
int result = this->parse_args (argc, argv);
if (result != 0) {
return result;
}
ACE_ARGV orb_args; // Save the leftovers to a ACE_ARGV class
ACE_CString cmdline; // We'll save this in the registry when installing.
for (int i = 1; i < argc; ++i)
{
cmdline += ACE_CString(argv[i]) + ACE_CString(" ");
if (orb_args.add (argv[i]) == -1)
{
ACE_ERROR ((LM_ERROR, "Error: Could not save argument"));
return -1;
}
}
result = run_service_command(cmdline);
if (result != 0)
return result;
char* argv_tmp = 0;
// Load from the registry. This may replace the args.
if (this->load_registry_options(argv_tmp, orb_args) != 0)
return -1;
ACE_Auto_Array_Ptr<char> argv_deleter(argv_tmp);
if (orb_args.add ("-ORBSvcConfDirective\"static Advanced_Resource_Factory '-ORBReactorType select_st'\"") == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%P|%t) TAO_ImR_Activator- Could not add"
" SvcConfDirective \n"),
-1);
}
int orb_argc = orb_args.argc ();
// Now initialize the orb and pass it the leftover arguments
ACE_TRY_NEW_ENV
{
this->orb_ = CORBA::ORB_init (orb_argc,
orb_args.argv (),
0
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
"Caught exception \n");
ACE_ERROR ((LM_ERROR, "Error: Cannot initialize ORB\n"));
return -1;
}
ACE_ENDTRY;
// If there are any arguments left (besides the executable filename)
// then they were not picked up by us or the orb and must be
// unrecognized.
if (orb_argc > 1)
{
// Just print out the first option as an error
ACE_ERROR ((LM_ERROR,
"Unrecognized option: %s\n",
orb_args.argv ()[1]));
return -1;
}
if (this->initialize_persistence () != 0)
return -1;
// Indicates successful parsing of command line.
return 0;
}
/**
* Just print out the usage message to STDERR
*/
void
Options::print_usage (void) const
{
ACE_ERROR ((LM_ERROR,
"Usage:\n"
"\n"
"ImR_Activator [-c cmd] [-d 0|1|2] [-l] [-m] [-o file]"
" [-r|-p file|-x file] [-s] [-t secs]\n"
"\n"
" -c command Runs service commands ('install' or 'remove')\n"
" -d level Sets the debug level\n"
" -l Lock the database\n"
" -o file Outputs the ImR's IOR to a file\n"
" -p file Use file for storing/loading settings\n"
" -x file Use XML file for storing/loading setting\n"
" -r Use the registry for storing/loading settings\n"
" -s Runs as a service (NT Only)\n"
" -t secs Timeout used for killing unresponsive servers\n")
);
}
int
Options::initialize_persistence(void)
{
switch (this->repo_mode_)
{
case REPO_NONE:
return this->initialize_non_persistence();
case REPO_XML_FILE:
return this->initialize_xml_persistence();
case REPO_HEAP_FILE:
return this->initialize_heap_persistence();
case REPO_REGISTRY:
return this->initialize_registry_persistence();
}
ACE_ERROR((LM_ERROR, "Error: Unknown persistence type.\n"));
return -1;
}
/**
* The most portable form of persistence is file persistence. Here
* we assign an ACE_Configuration_Heap object using @param filename
* as the file.
*
* @retval 0 Success
* @retval -1 Failure
*/
int
Options::initialize_heap_persistence (void)
{
ACE_ASSERT(this->repo_config_.get() == 0);
auto_ptr<Repository_Configuration> rc(new Repository_Configuration ("h"));
if (rc->open (this->file_name_.c_str()) == 0)
{
this->repo_config_ = rc;
return 0;
}
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("Error: Opening persistent heap file '%s'\n"),
this->file_name_.c_str()));
return -1;
}
/**
* On Windows, we have the option of using the Registry to store the
* server data. Assigns a ACE_Configuration_Win32Registry to
* this->repo_config_. On non-Win32 systems, just returns an error.
*
* @todo Where in the registry should this be stored?
*
* @retval 0 Success
* @retval -1 Failure
*/
int
Options::initialize_registry_persistence (void)
{
ACE_ASSERT(this->repo_config_.get() == 0);
#if defined (ACE_WIN32)
auto_ptr<Repository_Configuration> rc(new Repository_Configuration ("w"));
this->repo_config_ = rc;
return 0;
#else /* ACE_WIN32 */
ACE_ERROR_RETURN ((LM_ERROR, "Registry not supported on this platform"), -1);
#endif /* ACE_WIN32 */
}
/**
* In cases where persistence isn't needed, create an object of
* the ACE_Configuration_Heap class to be used. Initializes
* this->repo_config_ to an opened ACE_Configuration_Heap.
*
* @retval 0 Success
* @retval -1 Failure
*/
int
Options::initialize_non_persistence (void)
{
ACE_ASSERT(this->repo_config_.get() == 0);
auto_ptr<Repository_Configuration> rc(new Repository_Configuration ("h"));
if (rc->open () == 0)
{
this->repo_config_ = rc;
return 0;
}
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("Error: Opening Configuration heap\n")));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -