diff options
author | Jose <jose@zeroc.com> | 2017-01-09 17:01:31 +0100 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2017-01-09 17:01:31 +0100 |
commit | d4ed7973f1824478477be29989fc125b04207494 (patch) | |
tree | ec488f46a0ee15f987a0a24c87d1fe0a999cc168 /cpp/src/IceUtil/ConsoleUtil.cpp | |
parent | IceSSL C#/Java test fixes to sync with C++ changes (diff) | |
download | ice-d4ed7973f1824478477be29989fc125b04207494.tar.bz2 ice-d4ed7973f1824478477be29989fc125b04207494.tar.xz ice-d4ed7973f1824478477be29989fc125b04207494.zip |
Fixed (ICE-6694) - Unicode output in command line tools
Diffstat (limited to 'cpp/src/IceUtil/ConsoleUtil.cpp')
-rw-r--r-- | cpp/src/IceUtil/ConsoleUtil.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/cpp/src/IceUtil/ConsoleUtil.cpp b/cpp/src/IceUtil/ConsoleUtil.cpp new file mode 100644 index 00000000000..ea743646685 --- /dev/null +++ b/cpp/src/IceUtil/ConsoleUtil.cpp @@ -0,0 +1,152 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2016 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 <IceUtil/ConsoleUtil.h> +#include <IceUtil/MutexPtrLock.h> +#include <IceUtil/Mutex.h> + +using namespace IceUtilInternal; +using namespace std; + +#if defined(_WIN32) && !defined(ICE_OS_UWP) +namespace +{ + +IceUtil::Mutex* consoleMutex = 0; +ConsoleUtilPtr consoleUtil = 0; + +class Init +{ +public: + + Init() + { + consoleMutex = new IceUtil::Mutex; + consoleUtil = ICE_MAKE_SHARED(ConsoleUtil); + } + + ~Init() + { + delete consoleMutex; + consoleMutex = 0; + } +}; + +Init init; + +} + +const ConsoleUtilPtr& +IceUtilInternal::getConsoleUtil() +{ + return consoleUtil; +} + +ConsoleOut IceUtilInternal::consoleOut; +ConsoleErr IceUtilInternal::consoleErr; + +ConsoleUtil::ConsoleUtil() : + _converter(IceUtil::getProcessStringConverter()), + _consoleConverter(IceUtil::createWindowsStringConverter(GetConsoleOutputCP())) +{ +} + +string +ConsoleUtil::toConsoleEncoding(const string& message) const +{ + try + { + // Convert message to UTF-8 + string u8s = nativeToUTF8(message, _converter); + + // Then from UTF-8 to console CP + string consoleString; + _consoleConverter->fromUTF8(reinterpret_cast<const IceUtil::Byte* > (u8s.data()), + reinterpret_cast<const IceUtil::Byte*>(u8s.data() + u8s.size()), + consoleString); + + return consoleString; + } + catch(const IceUtil::IllegalConversionException&) + { + // + // If there is a problem with the encoding conversions we just + // return the original message without encoding conversions. + // + return message; + } +} + +void +ConsoleUtil::output(const string& message) const +{ + // + // Use fprintf_s to avoid encoding conversion when stderr is connected + // to Windows console. + // + fprintf_s(stdout, "%s", toConsoleEncoding(message).c_str()); +} + +void +ConsoleUtil::error(const string& message) const +{ + // + // Use fprintf_s to avoid encoding conversion when stderr is connected + // to Windows console. + // + fprintf_s(stderr, "%s", toConsoleEncoding(message).c_str()); +} + +ConsoleOut& +IceUtilInternal::endl(ConsoleOut& out) +{ + fprintf_s(stdout, "\n"); + fflush(stdout); + return out; +} + +ConsoleOut& +IceUtilInternal::flush(ConsoleOut& out) +{ + fflush(stdout); + return out; +} + +ConsoleOut& +ConsoleOut::operator<<(ConsoleOut& (*pf)(ConsoleOut&)) +{ + pf(*this); + return *this; +} + +ConsoleErr& +IceUtilInternal::endl(ConsoleErr& err) +{ + fprintf_s(stderr, "\n"); + fflush(stderr); + return err; +} + +ConsoleErr& +IceUtilInternal::flush(ConsoleErr& err) +{ + fflush(stderr); + return err; +} + +ConsoleErr& +ConsoleErr::operator<<(ConsoleErr& (*pf)(ConsoleErr&)) +{ + pf(*this); + return *this; +} +#else +std::ostream& IceUtilInternal::consoleOut = cout; +std::ostream& IceUtilInternal::consoleErr = cerr; +#endif |