69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
// Copyright(c) 2016 Alexander Dalshov & spdlog contributors.
 | 
						|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#if defined(_WIN32)
 | 
						|
 | 
						|
    #include <spdlog/details/null_mutex.h>
 | 
						|
    #if defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT)
 | 
						|
        #include <spdlog/details/os.h>
 | 
						|
    #endif
 | 
						|
    #include <spdlog/sinks/base_sink.h>
 | 
						|
 | 
						|
    #include <mutex>
 | 
						|
    #include <string>
 | 
						|
 | 
						|
    // Avoid including windows.h (https://stackoverflow.com/a/30741042)
 | 
						|
    #if defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT)
 | 
						|
extern "C" __declspec(dllimport) void __stdcall OutputDebugStringW(const wchar_t *lpOutputString);
 | 
						|
    #else
 | 
						|
extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA(const char *lpOutputString);
 | 
						|
    #endif
 | 
						|
extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent();
 | 
						|
 | 
						|
namespace spdlog {
 | 
						|
namespace sinks {
 | 
						|
/*
 | 
						|
 * MSVC sink (logging using OutputDebugStringA)
 | 
						|
 */
 | 
						|
template <typename Mutex>
 | 
						|
class msvc_sink : public base_sink<Mutex> {
 | 
						|
public:
 | 
						|
    msvc_sink() = default;
 | 
						|
    msvc_sink(bool check_debugger_present)
 | 
						|
        : check_debugger_present_{check_debugger_present} {};
 | 
						|
 | 
						|
protected:
 | 
						|
    void sink_it_(const details::log_msg &msg) override {
 | 
						|
        if (check_debugger_present_ && !IsDebuggerPresent()) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        memory_buf_t formatted;
 | 
						|
        base_sink<Mutex>::formatter_->format(msg, formatted);
 | 
						|
        formatted.push_back('\0');  // add a null terminator for OutputDebugString
 | 
						|
    #if defined(SPDLOG_WCHAR_TO_UTF8_SUPPORT)
 | 
						|
        wmemory_buf_t wformatted;
 | 
						|
        details::os::utf8_to_wstrbuf(string_view_t(formatted.data(), formatted.size()), wformatted);
 | 
						|
        OutputDebugStringW(wformatted.data());
 | 
						|
    #else
 | 
						|
        OutputDebugStringA(formatted.data());
 | 
						|
    #endif
 | 
						|
    }
 | 
						|
 | 
						|
    void flush_() override {}
 | 
						|
 | 
						|
    bool check_debugger_present_ = true;
 | 
						|
};
 | 
						|
 | 
						|
using msvc_sink_mt = msvc_sink<std::mutex>;
 | 
						|
using msvc_sink_st = msvc_sink<details::null_mutex>;
 | 
						|
 | 
						|
using windebug_sink_mt = msvc_sink_mt;
 | 
						|
using windebug_sink_st = msvc_sink_st;
 | 
						|
 | 
						|
}  // namespace sinks
 | 
						|
}  // namespace spdlog
 | 
						|
 | 
						|
#endif
 |