summaryrefslogtreecommitdiff
path: root/cpp
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
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')
-rw-r--r--cpp/include/Ice/Initialize.h17
-rw-r--r--cpp/src/Ice/Initialize.cpp67
2 files changed, 84 insertions, 0 deletions
diff --git a/cpp/include/Ice/Initialize.h b/cpp/include/Ice/Initialize.h
index 22bb9f5c039..1702cbd2d91 100644
--- a/cpp/include/Ice/Initialize.h
+++ b/cpp/include/Ice/Initialize.h
@@ -42,10 +42,22 @@ ICE_API StringSeq argsToStringSeq(int, wchar_t*[]);
//
ICE_API void stringSeqToArgs(const StringSeq&, int&, char*[]);
+#ifdef _WIN32
+
+ICE_API void stringSeqToArgs(const StringSeq&, int&, wchar_t*[]);
+
+#endif
+
ICE_API PropertiesPtr createProperties();
ICE_API PropertiesPtr createProperties(StringSeq&, const PropertiesPtr& = 0);
ICE_API PropertiesPtr createProperties(int&, char*[], const PropertiesPtr& = 0);
+#ifdef _WIN32
+
+ICE_API PropertiesPtr createProperties(int&, wchar_t*[], const PropertiesPtr& = 0);
+
+#endif
+
//
// This class is used to notify user of when Ice threads are started
// and stopped.
@@ -104,6 +116,11 @@ struct InitializationData
ICE_API CommunicatorPtr initialize(int&, char*[], const InitializationData& = InitializationData(),
Int = ICE_INT_VERSION);
+#ifdef _WIN32
+ICE_API CommunicatorPtr initialize(int&, wchar_t*[], const InitializationData& = InitializationData(),
+ Int = ICE_INT_VERSION);
+#endif
+
ICE_API CommunicatorPtr initialize(Ice::StringSeq&, const InitializationData& = InitializationData(),
Int = ICE_INT_VERSION);
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)
{