📄 activator_options.cpp
字号:
return -1;
}
/// Initialize for the XML repository case.
int
Options::initialize_xml_persistence (void)
{
ACE_ASSERT(this->repo_config_.get() == 0);
auto_ptr<Repository_Configuration> rc(new Repository_Configuration ("x"));
if (rc->open (this->file_name_.c_str()) == 0)
{
this->repo_config_ = rc;
return 0;
}
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("Error: Opening Configuration XML file %s\n"),
this->file_name_.c_str()
));
return -1;
}
/**
* Executes the various commands that are useful for a NT service. Right
* now these include 'install' and 'remove'. Others, such as 'start' and
* 'stop' can be added, but the 'net' program in Windows already handles
* these commands.
*
* @todo Finish implementing Options::run_service_command
* @todo Update to unicode
*/
int
Options::run_service_command (const ACE_CString& cmdline)
{
if (this->service_command_ == SC_NONE)
return 0;
#if defined (ACE_WIN32)
SERVICE::instance ()->name (IMR_ACTIVATOR_SERVICE_NAME, IMR_ACTIVATOR_DISPLAY_NAME);
if (this->service_command_ == SC_INSTALL)
{
char pathname[_MAX_PATH * 2 + 3]; // +3 for the ' -s' at the end
if (ACE_TEXT_GetModuleFileName(NULL, pathname, _MAX_PATH * 2) == 0)
{
ACE_ERROR ((LM_ERROR, "Error: Could not get module file name.\n"));
return -1;
}
// Append the command used for running the implrepo as
ACE_OS::strcat (pathname, ACE_TEXT (" -s"));
const char* DEPENDS_ON = "TAOIMRLocator"; // Must match Locator_NT_Service.h
int ret = SERVICE::instance ()->insert (SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
pathname,
0, // group
0, // tag
DEPENDS_ON
);
if (ret != -1) {
if (debug() >= 1) {
ACE_DEBUG ((LM_DEBUG, "ImR Activator: Service installed.\n"));
}
this->save_registry_options(cmdline);
} else {
ACE_ERROR((LM_ERROR, "Error: Failed to install service.\n"));
}
if (ret == 0)
return 1;
}
else if (this->service_command_ == SC_REMOVE)
{
int ret = SERVICE::instance ()->remove ();
if (debug() >= 1) {
ACE_DEBUG ((LM_DEBUG, "ImR Activator: Service removed.\n"));
}
if (ret == 0)
return 1; // If successfull, then we don't want to continue.
}
return -1;
#else /* ACE_WIN32 */
ACE_UNUSED_ARG (cmdline);
ACE_ERROR ((LM_ERROR, "Service not supported on this platform"));
return -1;
#endif /* ACE_WIN32 */
}
int
Options::save_registry_options(const ACE_CString& cmdline)
{
#if defined (ACE_WIN32)
HKEY key = 0;
// Create or open the parameters key
LONG err = ACE_TEXT_RegCreateKeyEx (SERVICE_REG_ROOT,
SERVICE_REG_PATH,
0,
"", // class
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&key,
NULL
);
if (err != ERROR_SUCCESS) {
return -1;
}
err = ACE_TEXT_RegSetValueEx(key, "ORBInitOptions", 0, REG_SZ,
(LPBYTE) cmdline.c_str(), cmdline.length() + 1);
ACE_ASSERT(err == ERROR_SUCCESS);
err = ACE_TEXT_RegSetValueEx(key, "PersistFile", 0, REG_SZ,
(LPBYTE) file_name_.c_str(), file_name_.length() + 1);
ACE_ASSERT(err == ERROR_SUCCESS);
err = ACE_TEXT_RegSetValueEx(key, "IORFile", 0, REG_SZ,
(LPBYTE) ior_output_file_.c_str(), ior_output_file_.length() + 1);
ACE_ASSERT(err == ERROR_SUCCESS);
err = ACE_TEXT_RegSetValueEx(key, "DebugLevel", 0, REG_DWORD,
(LPBYTE) &debug_ , sizeof(debug_));
ACE_ASSERT(err == ERROR_SUCCESS);
DWORD tmp = ping_interval_.msec();
err = ACE_TEXT_RegSetValueEx(key, "PingInterval", 0, REG_DWORD,
(LPBYTE) &tmp, sizeof(DWORD));
ACE_ASSERT(err == ERROR_SUCCESS);
tmp = readonly_ ? 1 : 0;
err = ACE_TEXT_RegSetValueEx(key, "Lock", 0, REG_DWORD,
(LPBYTE) &tmp, sizeof(DWORD));
ACE_ASSERT(err == ERROR_SUCCESS);
tmp = repo_mode_;
err = ACE_TEXT_RegSetValueEx(key, "PersistType", 0, REG_DWORD,
(LPBYTE) &tmp, sizeof(DWORD));
ACE_ASSERT(err == ERROR_SUCCESS);
tmp = startup_timeout_.sec();
err = ACE_TEXT_RegSetValueEx(key, "Timeout", 0, REG_DWORD,
(LPBYTE) &tmp, sizeof(DWORD));
ACE_ASSERT(err == ERROR_SUCCESS);
err = ::RegCloseKey(key);
ACE_ASSERT(err == ERROR_SUCCESS);
#else
ACE_UNUSED_ARG (cmdline);
#endif
return 0;
}
namespace {
// This both parses the cmdline by replacing spaces with \0's, and
// adds each command to the ACE_ARGV.
void parse_command_line(char* cmdline, ACE_ARGV& argv) {
// This tokenizer will replace all spaces with end-of-string
// characters and will preserve text between "" and '' pairs.
ACE_Tokenizer parser (cmdline);
parser.delimiter_replace (' ', '\0');
parser.preserve_designators ('\"', '\"');
parser.preserve_designators ('\'', '\'');
for (char *p = parser.next (); p; p = parser.next ()) {
argv.add(p);
}
}
}
/**
* We will only load from the registry if we are a service.
* We load each parameter from individual string keys, and then
* we have to parse the cmdline property into the orb_options
* so that they can be passed to ORB_init()
*/
int
Options::load_registry_options (char*& cmdline, ACE_ARGV& argv)
{
#if defined (ACE_WIN32)
if (! this->service())
{
if (this->debug () >= 2)
ACE_DEBUG ((LM_DEBUG,
"ActivatorOptions::load_registry_options: Not running as "
"a service, will not load data from registry\n"));
return 0;
}
HKEY key = 0;
// Create or open the parameters key
LONG err = ACE_TEXT_RegOpenKeyEx (SERVICE_REG_ROOT,
SERVICE_REG_PATH,
0,
KEY_READ,
&key
);
if (err != ERROR_SUCCESS) {
// If there aren't any saved parameters, then that's ok.
return 0;
}
ACE_TCHAR tmpstr[4096];
DWORD sz = sizeof(tmpstr);
DWORD type = 0;
err = ACE_TEXT_RegQueryValueEx(key, "ORBInitOptions", 0, &type,
(LPBYTE) tmpstr, &sz);
if (err == ERROR_SUCCESS) {
ACE_ASSERT(type == REG_SZ);
tmpstr[sz] = ACE_LIB_TEXT('\0');
cmdline = new char[sz+1];
ACE_OS::strcpy(cmdline, tmpstr);
parse_command_line(cmdline, argv);
}
sz = sizeof(tmpstr);
err = ACE_TEXT_RegQueryValueEx(key, "PersistFile", 0, &type,
(LPBYTE) tmpstr, &sz);
if (err == ERROR_SUCCESS) {
ACE_ASSERT(type == REG_SZ);
tmpstr[sz] = ACE_LIB_TEXT('\0');
this->file_name_ = ACE_CString(tmpstr);
}
sz = sizeof(tmpstr);
err = ACE_TEXT_RegQueryValueEx(key, "IORFile", 0, &type,
(LPBYTE) tmpstr, &sz);
if (err == ERROR_SUCCESS) {
ACE_ASSERT(type == REG_SZ);
tmpstr[sz] = ACE_LIB_TEXT('\0');
this->ior_output_file_ = ACE_CString(tmpstr);
}
sz = sizeof(debug_);
err = ACE_TEXT_RegQueryValueEx(key, "DebugLevel", 0, &type,
(LPBYTE) &debug_ , &sz);
if (err == ERROR_SUCCESS) {
ACE_ASSERT(type == REG_DWORD);
}
DWORD tmp = 0;
err = ACE_TEXT_RegQueryValueEx(key, "PingInterval", 0, &type,
(LPBYTE) &tmp, &sz);
if (err == ERROR_SUCCESS) {
ACE_ASSERT(type == REG_DWORD);
ping_interval_.msec(tmp);
}
tmp = 0;
err = ACE_TEXT_RegQueryValueEx(key, "Lock", 0, &type,
(LPBYTE) &tmp, &sz);
if (err == ERROR_SUCCESS) {
ACE_ASSERT(type == REG_DWORD);
readonly_ = tmp != 0;
}
err = ACE_TEXT_RegQueryValueEx(key, "PersistType", 0, &type,
(LPBYTE) &repo_mode_, &sz);
if (err == ERROR_SUCCESS) {
ACE_ASSERT(type == REG_DWORD);
}
tmp = 0;
err = ACE_TEXT_RegQueryValueEx(key, "Timeout", 0, &type,
(LPBYTE) &tmp, &sz);
if (err == ERROR_SUCCESS) {
ACE_ASSERT(type == REG_DWORD);
startup_timeout_.sec(tmp);
}
err = ::RegCloseKey(key);
ACE_ASSERT(err == ERROR_SUCCESS);
return 0;
#else /* ACE_WIN32 */
ACE_UNUSED_ARG (cmdline);
ACE_UNUSED_ARG (argv);
return 0;
#endif /* ACE_WIN32 */
}
/**
* Standalone Mode
*
* @retval 0 Run as standalone service
* @retval 1 Run as a service (only on NT right now)
*/
bool
Options::service (void) const
{
return this->service_;
}
/**
* Debug level for the IR.
*
* @retval 0 Quiet
* @retval 1 Trace messages
* @retval 2 Detailed messages
*/
unsigned int
Options::debug (void) const
{
return this->debug_;
}
/**
* @return The file where the IOR will be stored.
*/
ACE_CString
Options::output_filename (void) const
{
return this->ior_output_file_;
}
/**
* @return The amount of time to wait for a server to start.
*/
ACE_Time_Value
Options::startup_timeout (void) const
{
return this->startup_timeout_;
}
/**
* @return The amount of time to wait between pings
*/
ACE_Time_Value
Options::ping_interval (void) const
{
return this->ping_interval_;
}
/**
* @return The ACE_Configuration object that is used to store data.
*/
Repository_Configuration *
Options::config (void) const
{
return this->repo_config_.get();
}
int
Options::repository_mode (void)
{
return this->repo_mode_;
}
ACE_CString
Options::file_name (void) const
{
return this->file_name_;
}
const char *
Options::convert_str (ImplementationRepository::ActivationMode mode)
{
switch (mode)
{
case ImplementationRepository::NORMAL:
return "NORMAL";
case ImplementationRepository::MANUAL:
return "MANUAL";
case ImplementationRepository::PER_CLIENT:
return "PER_CLIENT";
case ImplementationRepository::AUTO_START:
return "AUTO_START";
default:
return "UNKNOWN";
};
}
ImplementationRepository::ActivationMode
Options::convert_mode (const char * mode)
{
if (ACE_OS::strcmp (mode, "NORMAL") == 0)
return ImplementationRepository::NORMAL;
else if (ACE_OS::strcmp (mode, "MANUAL") == 0)
return ImplementationRepository::MANUAL;
else if (ACE_OS::strcmp (mode, "PER_CLIENT") == 0)
return ImplementationRepository::PER_CLIENT;
else //if (ACE_OS::strcmp (mode, "AUTO_START") == 0)
return ImplementationRepository::AUTO_START;
}
/**
* @return A pointer to the ORB.
*/
CORBA::ORB_ptr
Options::orb (void) const
{
return CORBA::ORB::_duplicate (this->orb_.in ());
}
/**
* @retval 0 Normal operation.
* @retval 1 Do not let server info be modified.
*/
bool
Options::readonly (void) const
{
return this->readonly_;
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Singleton <Options, ACE_Null_Mutex>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Singleton <Options, ACE_Null_Mutex>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -