summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2009-07-08 23:12:24 +0200
committerJose <jose@zeroc.com>2009-07-08 23:12:24 +0200
commitadc4906087225fbe685cdfc42b3e8e65eba853b3 (patch)
tree2c91dd087395d8d8c36ec9290df62aa5e91488bc /cpp
parentBug 3632 - removed slice2docbook. (diff)
downloadice-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.h5
-rw-r--r--cpp/include/IceUtil/StringUtil.h5
-rw-r--r--cpp/src/Ice/CommunicatorI.cpp12
-rw-r--r--cpp/src/Ice/CommunicatorI.h7
-rw-r--r--cpp/src/Ice/Initialize.cpp21
-rw-r--r--cpp/src/IceUtil/StringUtil.cpp27
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;
+}