summaryrefslogtreecommitdiff
path: root/cpp/src/Ice
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2017-02-07 22:43:01 +0100
committerJose <jose@zeroc.com>2017-02-07 22:43:01 +0100
commitc455240bf4b734b557d972bf081a0e6912296d38 (patch)
tree77a192b92aa85467c5a6bb13cc8caa456f8880f0 /cpp/src/Ice
parentICE-7186 - Allow to build and tests from different directory (diff)
downloadice-c455240bf4b734b557d972bf081a0e6912296d38.tar.bz2
ice-c455240bf4b734b557d972bf081a0e6912296d38.tar.xz
ice-c455240bf4b734b557d972bf081a0e6912296d38.zip
Added wide char overloads of Ice::createProperties & Ice::initialize
Diffstat (limited to 'cpp/src/Ice')
-rw-r--r--cpp/src/Ice/Initialize.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/cpp/src/Ice/Initialize.cpp b/cpp/src/Ice/Initialize.cpp
index 4ce68d5e778..584ba957837 100644
--- a/cpp/src/Ice/Initialize.cpp
+++ b/cpp/src/Ice/Initialize.cpp
@@ -119,6 +119,51 @@ Ice::stringSeqToArgs(const StringSeq& args, int& argc, char* argv[])
}
}
+#ifdef _WIN32
+void
+Ice::stringSeqToArgs(const StringSeq& args, int& argc, wchar_t* argv[])
+{
+ //
+ // Don't need to use a wide string converter argv is expected to
+ // come from Windows API.
+ //
+ const StringConverterPtr converter = getProcessStringConverter();
+
+ //
+ // Shift all elements in argv which are present in args to the
+ // beginning of argv. We record the original value of argc so
+ // that we can know later if we've shifted the array.
+ //
+ const int argcOrig = argc;
+ int i = 0;
+ while(i < argc)
+ {
+ if(find(args.begin(), args.end(), wstringToString(argv[i], converter)) == args.end())
+ {
+ for(int j = i; j < argc - 1; j++)
+ {
+ argv[j] = argv[j + 1];
+ }
+ --argc;
+ }
+ else
+ {
+ ++i;
+ }
+ }
+
+ //
+ // Make sure that argv[argc] == 0, the ISO C++ standard requires this.
+ // We can only do this if we've shifted the array, otherwise argv[argc]
+ // may point to an invalid address.
+ //
+ if(argv && argcOrig != argc)
+ {
+ argv[argc] = 0;
+ }
+}
+#endif
+
PropertiesPtr
Ice::createProperties()
{
@@ -140,6 +185,17 @@ Ice::createProperties(int& argc, char* argv[], const PropertiesPtr& defaults)
return properties;
}
+#ifdef _WIN32
+PropertiesPtr
+Ice::createProperties(int& argc, wchar_t* argv[], const PropertiesPtr& defaults)
+{
+ StringSeq args = argsToStringSeq(argc, argv);
+ PropertiesPtr properties = createProperties(args, defaults);
+ stringSeqToArgs(args, argc, argv);
+ return properties;
+}
+#endif
+
#ifdef ICE_CPP11_MAPPING
Ice::ThreadHookPlugin::ThreadHookPlugin(const CommunicatorPtr& communicator,
function<void()> threadStart,
@@ -236,6 +292,17 @@ Ice::initialize(int& argc, char* argv[], const InitializationData& initializatio
return communicator;
}
+#ifdef _WIN32
+Ice::CommunicatorPtr
+Ice::initialize(int& argc, wchar_t* argv[], const InitializationData& initializationData, Int version)
+{
+ Ice::StringSeq args = argsToStringSeq(argc, argv);
+ CommunicatorPtr communicator = initialize(args, initializationData, version);
+ stringSeqToArgs(args, argc, argv);
+ return communicator;
+}
+#endif
+
Ice::CommunicatorPtr
Ice::initialize(StringSeq& args, const InitializationData& initializationData, Int version)
{