diff options
author | Bernard Normier <bernard@zeroc.com> | 2008-04-25 12:05:30 -0400 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2008-04-25 12:05:30 -0400 |
commit | 0d4c299225d186605db478bcbce2283ed3c40b81 (patch) | |
tree | 30df88da79bf4d534b0bea7a881dfe7aecab5d32 /cpp/src/Ice/StringConverter.cpp | |
parent | Fixed bug 3039 (diff) | |
download | ice-0d4c299225d186605db478bcbce2283ed3c40b81.tar.bz2 ice-0d4c299225d186605db478bcbce2283ed3c40b81.tar.xz ice-0d4c299225d186605db478bcbce2283ed3c40b81.zip |
Moved StringConverter plugin into Ice library
Diffstat (limited to 'cpp/src/Ice/StringConverter.cpp')
-rw-r--r-- | cpp/src/Ice/StringConverter.cpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/cpp/src/Ice/StringConverter.cpp b/cpp/src/Ice/StringConverter.cpp index f73c2680eb6..cd781075d76 100644 --- a/cpp/src/Ice/StringConverter.cpp +++ b/cpp/src/Ice/StringConverter.cpp @@ -14,6 +14,11 @@ #include <Ice/Initialize.h> #include <Ice/Instance.h> #include <Ice/LocalException.h> +#include <Ice/LoggerUtil.h> +#include <Ice/Communicator.h> +#ifndef _WIN32 +#include <Ice/IconvStringConverter.h> +#endif using namespace IceUtil; using namespace IceUtilInternal; @@ -214,3 +219,126 @@ StringConverterPlugin::destroy() } } + +// +// The entry point for the "string converter" plugin built-in the Ice library +// +extern "C" +{ + +using namespace Ice; + +ICE_DECLSPEC_EXPORT Plugin* +createStringConverter(const CommunicatorPtr& communicator, const string& name, const StringSeq& args) +{ + StringConverterPtr stringConverter; + WstringConverterPtr wstringConverter; + + if(args.size() > 2) + { + Error out(communicator->getLogger()); + out << "Plugin " << name << ": too many arguments"; + return 0; + } + + try + { + +#ifdef _WIN32 + + int cp = -1; + + for(size_t i = 0; i < args.size(); ++i) + { + if(args[i].find("windows=") == 0) + { + cp = atoi(args[i].substr(strlen("windows=")).c_str()); + } + else if(args[i].find("iconv=") != 0) + { + Error out(communicator->getLogger()); + out << "Plugin " << name << ": invalid \"" << args[i] << "\" argument"; + return 0; + } + } + + if(cp == -1) + { + Error out(communicator->getLogger()); + out << "Plugin " << name << ": missing windows=<code page> argument"; + return 0; + } + + if(cp == 0 || cp == INT_MAX || cp < 0) + { + Error out(communicator->getLogger()); + out << "Plugin " << name << ": invalid Windows code page"; + return 0; + } + + stringConverter = new WindowsStringConverter(static_cast<unsigned int>(cp)); +#else + StringSeq iconvArgs; + + for(size_t i = 0; i < args.size(); ++i) + { + if(args[i].find("iconv=") == 0) + { + if(!IceUtilInternal::splitString(args[i].substr(strlen("iconv=")), ", \t\r\n", iconvArgs)) + { + Error out(communicator->getLogger()); + out << "Plugin " << name << ": invalid iconv argument"; + return 0; + } + } + else if(args[i].find("windows=") != 0) + { + Error out(communicator->getLogger()); + out << "Plugin " << name << ": invalid \"" << args[i] << "\" argument"; + return 0; + } + } + + switch(iconvArgs.size()) + { + case 0: + { + stringConverter = new IconvStringConverter<char>; + break; + } + case 1: + { + stringConverter = new IconvStringConverter<char>(iconvArgs[0].c_str()); + break; + } + case 2: + { + stringConverter = new IconvStringConverter<char>(iconvArgs[0].c_str()); + wstringConverter = new IconvStringConverter<wchar_t>(iconvArgs[1].c_str()); + break; + } + default: + { + assert(0); + } + } + +#endif + + return new StringConverterPlugin(communicator, stringConverter, wstringConverter); + } + catch(const std::exception& ex) + { + Error out(communicator->getLogger()); + out << "Plugin " << name << ": creation failed with " << ex.what(); + return 0; + } + catch(...) + { + Error out(communicator->getLogger()); + out << "Plugin " << name << ": creation failed with unknown exception"; + return 0; + } +} +} + |