From a10cda2f17916895d8c6bc3cd69a360947017771 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 9 Aug 2011 23:33:55 +0900 Subject: Use global::cout to output string to stdout. In MinGW32 build, global::cout is WinConsoleFile. When outputing to console, it uses WriteConsoleW, so Unicode characters are written. Fixed memory leak in WChar<->MultiByte conversion functions. The portion of code which uses std::cout is rewritten to use global::cout. --- src/WinConsoleFile.cc | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 src/WinConsoleFile.cc (limited to 'src/WinConsoleFile.cc') diff --git a/src/WinConsoleFile.cc b/src/WinConsoleFile.cc new file mode 100644 index 00000000..81755fe1 --- /dev/null +++ b/src/WinConsoleFile.cc @@ -0,0 +1,105 @@ +/* */ +#include "WinConsoleFile.h" + +#include +#include +#include +#include + +#ifdef __MINGW32__ +# define WIN32_LEAN_AND_MEAN +# include +#endif // __MINGW32__ + +#include "a2io.h" +#include "util.h" + +namespace aria2 { + +WinConsoleFile::WinConsoleFile() {} + +WinConsoleFile::~WinConsoleFile() {} + +namespace { +bool console() +{ + DWORD mode; + return GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &mode); +} +} // namespace + +size_t WinConsoleFile::write(const char* str) +{ + DWORD written; + if(console()) { + std::wstring msg = utf8ToWChar(str); + WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), + msg.c_str(), msg.size(), &written, 0); + } else { + WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), + str, strlen(str), &written, 0); + } + return written; +} + +int WinConsoleFile::printf(const char* format, ...) +{ + char buf[1024]; + va_list ap; + va_start(ap, format); + int r = vsnprintf(buf, sizeof(buf), format, ap); + va_end(ap); + if(r <= 0) { + return 0; + } + DWORD written; + if(console()) { + std::wstring msg = utf8ToWChar(buf); + WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), + msg.c_str(), msg.size(), &written, 0); + } else { + WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), + buf, r, &written, 0); + } + return written; +} + +int WinConsoleFile::flush() +{ + return 0; +} + +} // namespace aria2 -- cgit