diff options
author | Jose <jose@zeroc.com> | 2009-07-08 23:12:24 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2009-07-08 23:12:24 +0200 |
commit | adc4906087225fbe685cdfc42b3e8e65eba853b3 (patch) | |
tree | 2c91dd087395d8d8c36ec9290df62aa5e91488bc /cpp | |
parent | Bug 3632 - removed slice2docbook. (diff) | |
download | ice-adc4906087225fbe685cdfc42b3e8e65eba853b3.tar.bz2 ice-adc4906087225fbe685cdfc42b3e8e65eba853b3.tar.xz ice-adc4906087225fbe685cdfc42b3e8e65eba853b3.zip |
3965 - Add new version if Ice::initialize
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/Ice/Initialize.h | 5 | ||||
-rw-r--r-- | cpp/include/IceUtil/StringUtil.h | 5 | ||||
-rw-r--r-- | cpp/src/Ice/CommunicatorI.cpp | 12 | ||||
-rw-r--r-- | cpp/src/Ice/CommunicatorI.h | 7 | ||||
-rw-r--r-- | cpp/src/Ice/Initialize.cpp | 21 | ||||
-rw-r--r-- | cpp/src/IceUtil/StringUtil.cpp | 27 |
6 files changed, 70 insertions, 7 deletions
diff --git a/cpp/include/Ice/Initialize.h b/cpp/include/Ice/Initialize.h index 2d7d83e290e..2592de239d8 100644 --- a/cpp/include/Ice/Initialize.h +++ b/cpp/include/Ice/Initialize.h @@ -64,7 +64,10 @@ struct InitializationData ThreadNotificationPtr threadHook; }; -ICE_API CommunicatorPtr initialize(int&, char*[], const InitializationData& = InitializationData(), +ICE_API CommunicatorPtr initialize(int&, char**&, const InitializationData& = InitializationData(), + Int = ICE_INT_VERSION); + +ICE_API CommunicatorPtr initialize(int, const char*[], int&, char**&, const InitializationData& = InitializationData(), Int = ICE_INT_VERSION); ICE_API CommunicatorPtr initialize(Ice::StringSeq&, const InitializationData& = InitializationData(), diff --git a/cpp/include/IceUtil/StringUtil.h b/cpp/include/IceUtil/StringUtil.h index 72f061e311e..4ecdc3cc3c8 100644 --- a/cpp/include/IceUtil/StringUtil.h +++ b/cpp/include/IceUtil/StringUtil.h @@ -77,6 +77,11 @@ ICE_UTIL_API std::string toUpper(const std::string&); // ICE_UTIL_API std::string removeWhitespace(const std::string&); +// +// Duplicate argv argument vector +// +ICE_UTIL_API char** dupArgv(const char*[]); + } #endif diff --git a/cpp/src/Ice/CommunicatorI.cpp b/cpp/src/Ice/CommunicatorI.cpp index 4d2f9562575..2a8af012a4f 100644 --- a/cpp/src/Ice/CommunicatorI.cpp +++ b/cpp/src/Ice/CommunicatorI.cpp @@ -298,7 +298,7 @@ Ice::CommunicatorI::removeAdminFacet(const string& facet) return _instance->removeAdminFacet(facet); } -Ice::CommunicatorI::CommunicatorI(const InitializationData& initData) +Ice::CommunicatorI::CommunicatorI(const InitializationData& initData, char** argv) : _argv(argv) { __setNoDelete(true); try @@ -358,6 +358,16 @@ Ice::CommunicatorI::~CommunicatorI() Warning out(_instance->initializationData().logger); out << "Ice::Communicator::destroy() has not been called"; } + if(_argv) + { + for(int i = 0; _argv[i] != 0; ++i) + { + free(_argv[i]); + } + free(_argv); + _argv = 0; + } + } void diff --git a/cpp/src/Ice/CommunicatorI.h b/cpp/src/Ice/CommunicatorI.h index f80939fc805..d78693ad207 100644 --- a/cpp/src/Ice/CommunicatorI.h +++ b/cpp/src/Ice/CommunicatorI.h @@ -66,7 +66,7 @@ public: private: - CommunicatorI(const InitializationData&); + CommunicatorI(const InitializationData&, char** argv = 0); virtual ~CommunicatorI(); // @@ -75,7 +75,8 @@ private: // void finishSetup(int&, char*[]); - friend ICE_API CommunicatorPtr initialize(int&, char*[], const InitializationData&, Int); + friend ICE_API CommunicatorPtr initialize(int&, char**&, const InitializationData&, Int); + friend ICE_API CommunicatorPtr initialize(int, const char*[], int&, char**&, const InitializationData&, Int); friend ICE_API CommunicatorPtr initialize(StringSeq&, const InitializationData&, Int); friend ICE_API CommunicatorPtr initialize(const InitializationData&, Int); friend ICE_API ::IceInternal::InstancePtr IceInternal::getInstance(const ::Ice::CommunicatorPtr&); @@ -87,6 +88,8 @@ private: // Communicator's destructor is invoked. // const ::IceInternal::DynamicLibraryListPtr _dynamicLibraryList; + + char** _argv; }; } diff --git a/cpp/src/Ice/Initialize.cpp b/cpp/src/Ice/Initialize.cpp index 3c0520480e0..69444ff17cb 100644 --- a/cpp/src/Ice/Initialize.cpp +++ b/cpp/src/Ice/Initialize.cpp @@ -9,6 +9,7 @@ #include <IceUtil/DisableWarnings.h> #include <IceUtil/ArgVector.h> +#include <IceUtil/StringUtil.h> #include <Ice/GC.h> #include <Ice/CommunicatorI.h> #include <Ice/PropertiesI.h> @@ -149,18 +150,32 @@ inline void checkIceVersion(Int version) #endif } +CommunicatorPtr +Ice::initialize(int& argc, char**& argv, const InitializationData& initializationData, Int version) +{ + int argcCopy = argc; + CommunicatorPtr result = initialize(argcCopy, const_cast<const char**>(argv), argc, argv, initializationData, version); + return result; +} CommunicatorPtr -Ice::initialize(int& argc, char* argv[], const InitializationData& initializationData, Int version) +Ice::initialize(int argc, const char* argv[], int& newArgc, char**& newArgv, const InitializationData& initializationData, Int version) { + checkIceVersion(version); InitializationData initData = initializationData; - initData.properties = createProperties(argc, argv, initData.properties, initData.stringConverter); + int argcCopy = argc; + char** argvCopy = IceUtilInternal::dupArgv(argv); + initData.properties = createProperties(argcCopy, argvCopy, initData.properties, initData.stringConverter); CommunicatorI* communicatorI = new CommunicatorI(initData); CommunicatorPtr result = communicatorI; // For exception safety. - communicatorI->finishSetup(argc, argv); + communicatorI->finishSetup(argcCopy, argvCopy); + + newArgc = argcCopy; + newArgv = argvCopy; + return result; } diff --git a/cpp/src/IceUtil/StringUtil.cpp b/cpp/src/IceUtil/StringUtil.cpp index a8499af2355..90f23ce8c1a 100644 --- a/cpp/src/IceUtil/StringUtil.cpp +++ b/cpp/src/IceUtil/StringUtil.cpp @@ -719,3 +719,30 @@ IceUtilInternal::removeWhitespace(const std::string& s) } return result; } + +char** +IceUtilInternal::dupArgv(const char* argv[]) +{ + int argc; + char** copy; + + if(argv == 0) + { + return 0; + } + + for(argc = 0; argv[argc] != 0; argc++); + + copy = (char**) malloc((argc + 1) * sizeof(char*)); + if(copy == 0) + { + return 0; + } + + for(argc = 0; argv[argc] != 0; argc++) + { + copy[argc] = strdup(argv[argc]); + } + copy[argc] = 0; + return copy; +} |