diff options
author | Bernard Normier <bernard@zeroc.com> | 2008-04-22 13:40:39 -0400 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2008-04-22 13:40:39 -0400 |
commit | e9ff5f662db93aa2d7a53dd470318e087bae1cf2 (patch) | |
tree | 228c6af2fb81c0ef59bcd0a56ddade1d7fdd3128 /cpp/src/IceStringConverter/Plugin.cpp | |
parent | Added comments to Java & C# timer class (diff) | |
download | ice-e9ff5f662db93aa2d7a53dd470318e087bae1cf2.tar.bz2 ice-e9ff5f662db93aa2d7a53dd470318e087bae1cf2.tar.xz ice-e9ff5f662db93aa2d7a53dd470318e087bae1cf2.zip |
Linux/Unix-side of string-converter plugin
Diffstat (limited to 'cpp/src/IceStringConverter/Plugin.cpp')
-rw-r--r-- | cpp/src/IceStringConverter/Plugin.cpp | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/cpp/src/IceStringConverter/Plugin.cpp b/cpp/src/IceStringConverter/Plugin.cpp new file mode 100644 index 00000000000..6ae52006621 --- /dev/null +++ b/cpp/src/IceStringConverter/Plugin.cpp @@ -0,0 +1,131 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <Ice/Ice.h> +#include <IceUtil/StringUtil.h> +#include <cstdlib> + +using namespace Ice; +using namespace std; + +extern "C" +{ +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="))); + } + 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; + } +} +} |