//==== Copyright (c) 1996-2005, Valve Corporation, All rights reserved. =====// // // Purpose: // // $NoKeywords: $ // //===========================================================================// #include "core/stdafx.h" #include "core/logdef.h" #include "tier0/platform.h" #include "tier0/threadtools.h" #include "tier0/dbg.h" #ifndef DEDICATED #include "vgui/vgui_debugpanel.h" #include "gameui/IConsole.h" #else #include "engine/server/sv_rcon.h" #endif #if defined( _X360 ) #include "xbox/xbox_console.h" #endif std::mutex s_LogMutex; //----------------------------------------------------------------------------- // Templates to assist in validating pointers: //----------------------------------------------------------------------------- PLATFORM_INTERFACE void _AssertValidReadPtr(void* ptr, int count/* = 1*/) { #if defined( _WIN32 ) && !defined( _X360 ) Assert(!IsBadReadPtr(ptr, count)); #else Assert(!count || ptr); #endif } PLATFORM_INTERFACE void _AssertValidWritePtr(void* ptr, int count/* = 1*/) { #if defined( _WIN32 ) && !defined( _X360 ) Assert(!IsBadWritePtr(ptr, count)); #else Assert(!count || ptr); #endif } PLATFORM_INTERFACE void _AssertValidReadWritePtr(void* ptr, int count/* = 1*/) { #if defined( _WIN32 ) && !defined( _X360 ) Assert(!(IsBadWritePtr(ptr, count) || IsBadReadPtr(ptr, count))); #else Assert(!count || ptr); #endif } PLATFORM_INTERFACE void _AssertValidStringPtr(const TCHAR* ptr, int maxchar/* = 0xFFFFFF */) { #if defined( _WIN32 ) && !defined( _X360 ) #ifdef TCHAR_IS_CHAR Assert(!IsBadStringPtr(ptr, maxchar)); #else Assert(!IsBadStringPtrW(ptr, maxchar)); #endif #else Assert(ptr); #endif } PLATFORM_INTERFACE void AssertValidWStringPtr(const wchar_t* ptr, int maxchar/* = 0xFFFFFF */) { #if defined( _WIN32 ) && !defined( _X360 ) Assert(!IsBadStringPtrW(ptr, maxchar)); #else Assert(ptr); #endif } //----------------------------------------------------------------------------- // Purpose: Show logs to all console interfaces // Input : idx - // *fmt - ... - //----------------------------------------------------------------------------- void DevMsg(eDLL_T context, const char* fmt, ...) { static char szBuf[2048] = {}; static std::string svOut; static std::string svAnsiOut; static std::regex rxAnsiExp("\\\033\\[.*?m"); static std::shared_ptr iconsole = spdlog::get("game_console"); static std::shared_ptr wconsole = spdlog::get("win_console"); static std::shared_ptr sqlogger = spdlog::get("sdk_info"); s_LogMutex.lock(); {///////////////////////////// va_list args{}; va_start(args, fmt); vsnprintf(szBuf, sizeof(szBuf), fmt, args); szBuf[sizeof(szBuf) - 1] = 0; va_end(args); }///////////////////////////// svOut = sDLL_T[static_cast(context)].c_str(); svOut.append(szBuf); svOut = std::regex_replace(svOut, rxAnsiExp, ""); char szNewLine = svOut.back(); if (szNewLine != '\n') { svOut.append("\n"); } if (!g_bSpdLog_UseAnsiClr) { wconsole->debug(svOut); #ifdef DEDICATED g_pRConServer->Send(svOut.c_str()); #endif // DEDICATED } else { svAnsiOut = sANSI_DLL_T[static_cast(context)].c_str(); svAnsiOut.append(szBuf); char szNewLine = svAnsiOut.back(); if (szNewLine != '\n') { svAnsiOut.append("\n"); } wconsole->debug(svAnsiOut); #ifdef DEDICATED g_pRConServer->Send(svAnsiOut.c_str()); #endif // DEDICATED } sqlogger->debug(svOut); #ifndef DEDICATED iconsole->info(svOut); int nLog = static_cast(context) + 3; // RUI log enum is shifted by 3 for scripts. LogType_t tLog = static_cast(nLog); ImVec4 color; switch (context) { case eDLL_T::SERVER: color = ImVec4(0.23f, 0.47f, 0.85f, 1.00f); break; case eDLL_T::CLIENT: color = ImVec4(0.46f, 0.46f, 0.46f, 1.00f); break; case eDLL_T::UI: color = ImVec4(0.59f, 0.35f, 0.46f, 1.00f); break; case eDLL_T::ENGINE: color = ImVec4(0.70f, 0.70f, 0.70f, 1.00f); break; case eDLL_T::FS: color = ImVec4(0.32f, 0.64f, 0.72f, 1.00f); break; case eDLL_T::RTECH: color = ImVec4(0.36f, 0.70f, 0.35f, 1.00f); break; case eDLL_T::MS: color = ImVec4(0.75f, 0.41f, 0.67f, 1.00f); break; default: color = ImVec4(0.81f, 0.81f, 0.81f, 1.00f); break; } g_pConsole->m_ivConLog.push_back(CConLog(PrintPercentageEscape(g_spd_sys_w_oss.str()), color)); g_pLogSystem.AddLog(tLog, g_spd_sys_w_oss.str()); g_spd_sys_w_oss.str(""); g_spd_sys_w_oss.clear(); #endif // !DEDICATED s_LogMutex.unlock(); } //----------------------------------------------------------------------------- // Purpose: Print engine and SDK errors // Input : idx - // *fmt - ... - //----------------------------------------------------------------------------- void Warning(eDLL_T context, const char* fmt, ...) { static char szBuf[2048] = {}; static std::string svOut; static std::string svAnsiOut; static std::regex rxAnsiExp("\\\033\\[.*?m"); static std::shared_ptr iconsole = spdlog::get("game_console"); static std::shared_ptr wconsole = spdlog::get("win_console"); static std::shared_ptr sqlogger = spdlog::get("sdk_warn"); s_LogMutex.lock(); {///////////////////////////// va_list args{}; va_start(args, fmt); vsnprintf(szBuf, sizeof(szBuf), fmt, args); szBuf[sizeof(szBuf) - 1] = 0; va_end(args); }///////////////////////////// svOut = sDLL_T[static_cast(context)].c_str(); svOut.append(szBuf); svOut = std::regex_replace(svOut, rxAnsiExp, ""); char szNewLine = svOut.back(); if (szNewLine != '\n') { svOut.append("\n"); } if (!g_bSpdLog_UseAnsiClr) { wconsole->debug(svOut); #ifdef DEDICATED g_pRConServer->Send(svOut.c_str()); #endif // DEDICATED } else { svAnsiOut = sANSI_DLL_T[static_cast(context)].c_str(); svAnsiOut.append(g_svYellowF.c_str()); svAnsiOut.append(szBuf); char szNewLine = svAnsiOut.back(); if (szNewLine != '\n') { svAnsiOut.append("\n"); } wconsole->debug(svAnsiOut); #ifdef DEDICATED g_pRConServer->Send(svAnsiOut.c_str()); #endif // DEDICATED } sqlogger->debug(svOut); #ifndef DEDICATED iconsole->info(svOut); g_pConsole->m_ivConLog.push_back(CConLog(PrintPercentageEscape(g_spd_sys_w_oss.str()), ImVec4(1.00f, 1.00f, 0.00f, 0.80f))); g_pLogSystem.AddLog(LogType_t::WARNING_C, g_spd_sys_w_oss.str()); g_spd_sys_w_oss.str(""); g_spd_sys_w_oss.clear(); #endif // !DEDICATED s_LogMutex.unlock(); } //----------------------------------------------------------------------------- // Purpose: Print engine and SDK errors // Input : idx - // *fmt - ... - //----------------------------------------------------------------------------- void Error(eDLL_T context, const char* fmt, ...) { static char szBuf[2048] = {}; static std::string svOut; static std::string svAnsiOut; static std::regex rxAnsiExp("\\\033\\[.*?m"); static std::shared_ptr iconsole = spdlog::get("game_console"); static std::shared_ptr wconsole = spdlog::get("win_console"); static std::shared_ptr sqlogger = spdlog::get("sdk_error"); s_LogMutex.lock(); {///////////////////////////// va_list args{}; va_start(args, fmt); vsnprintf(szBuf, sizeof(szBuf), fmt, args); szBuf[sizeof(szBuf) - 1] = 0; va_end(args); }///////////////////////////// svOut = sDLL_T[static_cast(context)].c_str(); svOut.append(szBuf); svOut = std::regex_replace(svOut, rxAnsiExp, ""); char szNewLine = svOut.back(); if (szNewLine != '\n') { svOut.append("\n"); } if (!g_bSpdLog_UseAnsiClr) { wconsole->debug(svOut); #ifdef DEDICATED g_pRConServer->Send(svOut.c_str()); #endif // DEDICATED } else { svAnsiOut = sANSI_DLL_T[static_cast(context)].c_str(); svAnsiOut.append(g_svRedF.c_str()); svAnsiOut.append(szBuf); char szNewLine = svAnsiOut.back(); if (szNewLine != '\n') { svAnsiOut.append("\n"); } wconsole->debug(svAnsiOut); #ifdef DEDICATED g_pRConServer->Send(svAnsiOut.c_str()); #endif // DEDICATED } sqlogger->debug(svOut); #ifndef DEDICATED iconsole->info(svOut); g_pConsole->m_ivConLog.push_back(CConLog(PrintPercentageEscape(g_spd_sys_w_oss.str()), ImVec4(1.00f, 0.00f, 0.00f, 1.00f))); g_pLogSystem.AddLog(LogType_t::ERROR_C, g_spd_sys_w_oss.str()); g_spd_sys_w_oss.str(""); g_spd_sys_w_oss.clear(); #endif // !DEDICATED s_LogMutex.unlock(); }