diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2009-05-13 14:22:48 -0230 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2009-05-13 14:22:48 -0230 |
commit | 46e64f90df4d8da704eea09029458b540e4a3c87 (patch) | |
tree | 2f99a321f86ba39907cc81f6936ed9b4bbc04858 /cpp/src/Ice/Application.cpp | |
parent | Slice compiler crash when slice file had double slashes (diff) | |
download | ice-46e64f90df4d8da704eea09029458b540e4a3c87.tar.bz2 ice-46e64f90df4d8da704eea09029458b540e4a3c87.tar.xz ice-46e64f90df4d8da704eea09029458b540e4a3c87.zip |
Bug 3696 - new Application:main instances
Diffstat (limited to 'cpp/src/Ice/Application.cpp')
-rw-r--r-- | cpp/src/Ice/Application.cpp | 129 |
1 files changed, 79 insertions, 50 deletions
diff --git a/cpp/src/Ice/Application.cpp b/cpp/src/Ice/Application.cpp index 219f571810b..fcdaf147453 100644 --- a/cpp/src/Ice/Application.cpp +++ b/cpp/src/Ice/Application.cpp @@ -298,12 +298,18 @@ Ice::Application::~Application() int Ice::Application::main(int argc, char* argv[]) { - return main(argc, argv, InitializationData()); + return mainInternal(argc, argv, InitializationData(), 0); } int Ice::Application::main(int argc, char* argv[], const char* configFile) { + return main(argc, argv, configFile, 0); +} + +int +Ice::Application::main(int argc, char* argv[], const char* configFile, const Ice::PropertiesPtr& overrideProps) +{ // // We don't call the main below to avoid a deprecated warning // @@ -350,59 +356,13 @@ Ice::Application::main(int argc, char* argv[], const char* configFile) return EXIT_FAILURE; } } - return main(argc, argv, initData); + return mainInternal(argc, argv, initData, overrideProps); } int Ice::Application::main(int argc, char* argv[], const InitializationData& initData) { - if(_communicator != 0) - { - Error out(getProcessLogger()); - if(argv[0]) - { - out << argv[0] << ": "; - } - out << "only one instance of the Application class can be used"; - return EXIT_FAILURE; - } - int status; - - if(_signalPolicy == HandleSignals) - { - try - { - // - // The ctrlCHandler must be created before starting any thread, in particular - // before initializing the communicator. - // - CtrlCHandler ctrCHandler; - _ctrlCHandler = &ctrCHandler; - - status = mainInternal(argc, argv, initData); - - // - // Set _ctrlCHandler to 0 only once communicator->destroy() has completed. - // - _ctrlCHandler = 0; - } - catch(const CtrlCHandlerException&) - { - Error out(getProcessLogger()); - if(argv[0]) - { - out << argv[0] << ": "; - } - out << "only one instance of the Application class can be used"; - status = EXIT_FAILURE; - } - } - else - { - status = mainInternal(argc, argv, initData); - } - - return status; + return mainInternal(argc, argv, initData, 0); } int @@ -420,6 +380,13 @@ Ice::Application::main(const StringSeq& args, const char* configFile) } int +Ice::Application::main(const StringSeq& args, const char* configFile, const Ice::PropertiesPtr& overrideProps) +{ + ArgVector av(args); + return main(av.argc, av.argv, configFile, overrideProps); +} + +int Ice::Application::main(const StringSeq& args, const InitializationData& initData) { ArgVector av(args); @@ -598,7 +565,61 @@ Ice::Application::interrupted() } int -Ice::Application::mainInternal(int argc, char* argv[], const InitializationData& initializationData) +Ice::Application::mainInternal(int argc, char* argv[], const InitializationData& initData, + const Ice::PropertiesPtr& overrideProps) +{ + if(_communicator != 0) + { + Error out(getProcessLogger()); + if(argv[0]) + { + out << argv[0] << ": "; + } + out << "only one instance of the Application class can be used"; + return EXIT_FAILURE; + } + int status; + + if(_signalPolicy == HandleSignals) + { + try + { + // + // The ctrlCHandler must be created before starting any thread, in particular + // before initializing the communicator. + // + CtrlCHandler ctrCHandler; + _ctrlCHandler = &ctrCHandler; + + status = executeRun(argc, argv, initData, overrideProps); + + // + // Set _ctrlCHandler to 0 only once communicator->destroy() has completed. + // + _ctrlCHandler = 0; + } + catch(const CtrlCHandlerException&) + { + Error out(getProcessLogger()); + if(argv[0]) + { + out << argv[0] << ": "; + } + out << "only one instance of the CtrlCHandler class can be used"; + status = EXIT_FAILURE; + } + } + else + { + status = executeRun(argc, argv, initData, overrideProps); + } + + return status; +} + +int +Ice::Application::executeRun(int argc, char* argv[], const InitializationData& initializationData, + const Ice::PropertiesPtr& overrideProps) { int status; @@ -617,6 +638,14 @@ Ice::Application::mainInternal(int argc, char* argv[], const InitializationData& // InitializationData initData = initializationData; initData.properties = createProperties(argc, argv, initData.properties, initData.stringConverter); + if(overrideProps) + { + Ice::PropertyDict props = overrideProps->getPropertiesForPrefix(""); + for(PropertyDict::const_iterator p = props.begin(); p != props.end(); ++p) + { + initData.properties->setProperty(p->first, p->second); + } + } // // If the process logger is the default logger, we replace it with a |