diff options
Diffstat (limited to 'src/core/support')
-rw-r--r-- | src/core/support/log_win32.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/core/support/log_win32.c b/src/core/support/log_win32.c index dc8c1d0785..e1cf6fb10a 100644 --- a/src/core/support/log_win32.c +++ b/src/core/support/log_win32.c @@ -35,6 +35,7 @@ #ifdef GPR_WIN32 +#include <grpc/support/log_win32.h> #include <grpc/support/log.h> #include <grpc/support/alloc.h> #include <stdio.h> @@ -74,8 +75,42 @@ void gpr_log(const char *file, int line, gpr_log_severity severity, /* Simple starter implementation */ void gpr_default_log(gpr_log_func_args *args) { - fprintf(stderr, "%s %s:%d: %s\n", gpr_log_severity_string(args->severity), + fprintf(stderr, "%s.%u %s:%d: %s\n", + gpr_log_severity_string(args->severity), GetCurrentThreadId(), args->file, args->line, args->message); } +/* Arguable, this could become a public function. But hardly + * anything beside the Windows implementation should use + * it, so, never mind...*/ +#if defined UNICODE || defined _UNICODE +static char *tchar_to_char(LPWSTR input) { + char *ret; + int needed = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL); + if (needed == 0) return NULL; + ret = gpr_malloc(needed + 1); + WideCharToMultiByte(CP_UTF8, 0, input, -1, ret, needed, NULL, NULL); + ret[needed] = 0; + return ret; +} +#else +static char *tchar_to_char(LPSTR input) { + return gpr_strdup(input); +} #endif + +char *gpr_format_message(DWORD messageid) { + LPTSTR tmessage; + char *message; + DWORD status = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, messageid, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)(&tmessage), 0, NULL); + message = tchar_to_char(tmessage); + LocalFree(tmessage); + return message; +} + +#endif /* GPR_WIN32 */ |