diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/Logging/AppenderConsole.cpp | 13 | ||||
-rw-r--r-- | src/common/Logging/AppenderConsole.h | 1 | ||||
-rw-r--r-- | src/common/Utilities/Util.cpp | 34 | ||||
-rw-r--r-- | src/common/Utilities/Util.h | 5 | ||||
-rw-r--r-- | src/server/worldserver/CommandLine/CliRunnable.cpp | 16 |
5 files changed, 55 insertions, 14 deletions
diff --git a/src/common/Logging/AppenderConsole.cpp b/src/common/Logging/AppenderConsole.cpp index 61efed60e90..fa146dc6960 100644 --- a/src/common/Logging/AppenderConsole.cpp +++ b/src/common/Logging/AppenderConsole.cpp @@ -162,6 +162,15 @@ void AppenderConsole::ResetColor(bool stdout_stream) #endif } +void AppenderConsole::Print(std::string const& str, bool error) +{ +#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS + WriteWinConsole(str + "\n", error); +#else + utf8printf(error ? stderr : stdout, "%s\n", str.c_str()); +#endif +} + void AppenderConsole::_write(LogMessage const* message) { bool stdout_stream = !(message->level == LOG_LEVEL_ERROR || message->level == LOG_LEVEL_FATAL); @@ -194,9 +203,9 @@ void AppenderConsole::_write(LogMessage const* message) } SetColor(stdout_stream, _colors[index]); - utf8printf(stdout_stream ? stdout : stderr, "%s%s\n", message->prefix.c_str(), message->text.c_str()); + Print(message->prefix + message->text, !stdout_stream); ResetColor(stdout_stream); } else - utf8printf(stdout_stream ? stdout : stderr, "%s%s\n", message->prefix.c_str(), message->text.c_str()); + Print(message->prefix + message->text, !stdout_stream); } diff --git a/src/common/Logging/AppenderConsole.h b/src/common/Logging/AppenderConsole.h index 6c6be4b6c59..19c5c211028 100644 --- a/src/common/Logging/AppenderConsole.h +++ b/src/common/Logging/AppenderConsole.h @@ -53,6 +53,7 @@ class TC_COMMON_API AppenderConsole : public Appender private: void SetColor(bool stdout_stream, ColorTypes color); void ResetColor(bool stdout_stream); + void Print(std::string const& str, bool error); void _write(LogMessage const* message) override; bool _colored; ColorTypes _colors[NUM_ENABLED_LOG_LEVELS]; diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp index 4406dc673e0..a595f654ec7 100644 --- a/src/common/Utilities/Util.cpp +++ b/src/common/Utilities/Util.cpp @@ -785,6 +785,40 @@ bool Utf8ToUpperOnlyLatin(std::string& utf8String) return WStrToUtf8(wstr, utf8String); } +#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS +bool ReadWinConsole(std::string& str, size_t size /*= 256*/) +{ + wchar_t* commandbuf = new wchar_t[size + 1]; + HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE); + DWORD read; + + if (!ReadConsoleW(hConsole, commandbuf, size, &read, NULL)) + { + delete[] commandbuf; + return false; + } + + commandbuf[read] = 0; + + bool ok = WStrToUtf8(commandbuf, wcslen(commandbuf), str); + delete[] commandbuf; + return ok; +} + +bool WriteWinConsole(std::string_view str, bool error /*= false*/) +{ + std::wstring wstr; + if (!Utf8toWStr(str, wstr)) + return false; + + HANDLE hConsole = GetStdHandle(error ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE); + DWORD toWrite = wstr.size(); + DWORD write; + + return WriteConsoleW(hConsole, wstr.c_str(), wstr.size(), &write, NULL); +} +#endif + std::string Trinity::Impl::ByteArrayToHexStr(uint8 const* bytes, size_t arrayLen, bool reverse /* = false */) { int32 init = 0; diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index 6aeca639173..dd37fd604ff 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -328,6 +328,11 @@ TC_COMMON_API void utf8printf(FILE* out, const char *str, ...); TC_COMMON_API void vutf8printf(FILE* out, const char *str, va_list* ap); TC_COMMON_API bool Utf8ToUpperOnlyLatin(std::string& utf8String); +#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS +TC_COMMON_API bool ReadWinConsole(std::string& str, size_t size = 256); +TC_COMMON_API bool WriteWinConsole(std::string_view str, bool error = false); +#endif + TC_COMMON_API bool IsIPAddress(char const* ipaddress); TC_COMMON_API uint32 CreatePIDFile(std::string const& filename); diff --git a/src/server/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp index a46d39478fe..2aeaeab8cb6 100644 --- a/src/server/worldserver/CommandLine/CliRunnable.cpp +++ b/src/server/worldserver/CommandLine/CliRunnable.cpp @@ -72,11 +72,7 @@ namespace Trinity::Impl::Readline void utf8print(void* /*arg*/, std::string_view str) { #if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS - std::wstring wbuf; - if (!Utf8toWStr(str, wbuf)) - return; - - wprintf(L"%s", wbuf.c_str()); + WriteWinConsole(str); #else { printf(STRING_VIEW_FMT, STRING_VIEW_FMT_ARG(str)); @@ -133,14 +129,10 @@ void CliThread() std::string command; #if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS - wchar_t commandbuf[256]; - if (fgetws(commandbuf, sizeof(commandbuf), stdin)) + if (!ReadWinConsole(command)) { - if (!WStrToUtf8(commandbuf, wcslen(commandbuf), command)) - { - PrintCliPrefix(); - continue; - } + PrintCliPrefix(); + continue; } #else char* command_str = readline(CLI_PREFIX); |