diff options
author | Jose <jose@zeroc.com> | 2017-02-07 22:43:01 +0100 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2017-02-07 22:43:01 +0100 |
commit | c455240bf4b734b557d972bf081a0e6912296d38 (patch) | |
tree | 77a192b92aa85467c5a6bb13cc8caa456f8880f0 /cpp | |
parent | ICE-7186 - Allow to build and tests from different directory (diff) | |
download | ice-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.h | 17 | ||||
-rw-r--r-- | cpp/src/Ice/Initialize.cpp | 67 |
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) { |