mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Remove old logging system
This commit is contained in:
		
							parent
							
								
									0e0a007a25
								
							
						
					
					
						commit
						4d2a6f8b9b
					
				
					 7 changed files with 2 additions and 851 deletions
				
			
		|  | @ -7,7 +7,6 @@ | ||||||
| #include "main.hxx" | #include "main.hxx" | ||||||
| 
 | 
 | ||||||
| #include "common/common.h" | #include "common/common.h" | ||||||
| #include "common/log_manager.h" |  | ||||||
| #include "common/logging/text_formatter.h" | #include "common/logging/text_formatter.h" | ||||||
| #include "common/logging/log.h" | #include "common/logging/log.h" | ||||||
| #include "common/logging/backend.h" | #include "common/logging/backend.h" | ||||||
|  |  | ||||||
|  | @ -3,14 +3,12 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scm_rev.cpp.in" "${CMAKE_CURRENT_SOU | ||||||
| 
 | 
 | ||||||
| set(SRCS | set(SRCS | ||||||
|             break_points.cpp |             break_points.cpp | ||||||
|             console_listener.cpp |  | ||||||
|             emu_window.cpp |             emu_window.cpp | ||||||
|             extended_trace.cpp |             extended_trace.cpp | ||||||
|             file_search.cpp |             file_search.cpp | ||||||
|             file_util.cpp |             file_util.cpp | ||||||
|             hash.cpp |             hash.cpp | ||||||
|             key_map.cpp |             key_map.cpp | ||||||
|             log_manager.cpp |  | ||||||
|             logging/filter.cpp |             logging/filter.cpp | ||||||
|             logging/text_formatter.cpp |             logging/text_formatter.cpp | ||||||
|             logging/backend.cpp |             logging/backend.cpp | ||||||
|  | @ -36,7 +34,6 @@ set(HEADERS | ||||||
|             common_paths.h |             common_paths.h | ||||||
|             common_types.h |             common_types.h | ||||||
|             concurrent_ring_buffer.h |             concurrent_ring_buffer.h | ||||||
|             console_listener.h |  | ||||||
|             cpu_detect.h |             cpu_detect.h | ||||||
|             debug_interface.h |             debug_interface.h | ||||||
|             emu_window.h |             emu_window.h | ||||||
|  | @ -48,7 +45,6 @@ set(HEADERS | ||||||
|             key_map.h |             key_map.h | ||||||
|             linear_disk_cache.h |             linear_disk_cache.h | ||||||
|             log.h |             log.h | ||||||
|             log_manager.h |  | ||||||
|             logging/text_formatter.h |             logging/text_formatter.h | ||||||
|             logging/filter.h |             logging/filter.h | ||||||
|             logging/log.h |             logging/log.h | ||||||
|  |  | ||||||
|  | @ -1,319 +0,0 @@ | ||||||
| // Copyright 2013 Dolphin Emulator Project
 |  | ||||||
| // Licensed under GPLv2
 |  | ||||||
| // Refer to the license.txt file included.
 |  | ||||||
| 
 |  | ||||||
| #include <algorithm> |  | ||||||
| 
 |  | ||||||
| #ifdef _WIN32 |  | ||||||
| #include <windows.h> |  | ||||||
| #include <array> |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #include "common/common.h" |  | ||||||
| #include "common/log_manager.h" // Common
 |  | ||||||
| #include "common/console_listener.h" // Common
 |  | ||||||
| 
 |  | ||||||
| ConsoleListener::ConsoleListener() |  | ||||||
| { |  | ||||||
| #ifdef _WIN32 |  | ||||||
|     hConsole = nullptr; |  | ||||||
|     bUseColor = true; |  | ||||||
| #else |  | ||||||
|     bUseColor = isatty(fileno(stdout)); |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ConsoleListener::~ConsoleListener() |  | ||||||
| { |  | ||||||
|     Close(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // 100, 100, "Dolphin Log Console"
 |  | ||||||
| // Open console window - width and height is the size of console window
 |  | ||||||
| // Name is the window title
 |  | ||||||
| void ConsoleListener::Open(bool Hidden, int Width, int Height, const char *Title) |  | ||||||
| { |  | ||||||
| #ifdef _WIN32 |  | ||||||
|     if (!GetConsoleWindow()) |  | ||||||
|     { |  | ||||||
|         // Open the console window and create the window handle for GetStdHandle()
 |  | ||||||
|         AllocConsole(); |  | ||||||
|         // Hide
 |  | ||||||
|         if (Hidden) ShowWindow(GetConsoleWindow(), SW_HIDE); |  | ||||||
|         // Save the window handle that AllocConsole() created
 |  | ||||||
|         hConsole = GetStdHandle(STD_OUTPUT_HANDLE); |  | ||||||
|         // Set the console window title
 |  | ||||||
|         SetConsoleTitle(Common::UTF8ToTStr(Title).c_str()); |  | ||||||
|         // Set letter space
 |  | ||||||
|         LetterSpace(80, 4000); |  | ||||||
|         //MoveWindow(GetConsoleWindow(), 200,200, 800,800, true);
 |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         hConsole = GetStdHandle(STD_OUTPUT_HANDLE); |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void ConsoleListener::UpdateHandle() |  | ||||||
| { |  | ||||||
| #ifdef _WIN32 |  | ||||||
|     hConsole = GetStdHandle(STD_OUTPUT_HANDLE); |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Close the console window and close the eventual file handle
 |  | ||||||
| void ConsoleListener::Close() |  | ||||||
| { |  | ||||||
| #ifdef _WIN32 |  | ||||||
|     if (hConsole == nullptr) |  | ||||||
|         return; |  | ||||||
|     FreeConsole(); |  | ||||||
|     hConsole = nullptr; |  | ||||||
| #else |  | ||||||
|     fflush(nullptr); |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| bool ConsoleListener::IsOpen() |  | ||||||
| { |  | ||||||
| #ifdef _WIN32 |  | ||||||
|     return (hConsole != nullptr); |  | ||||||
| #else |  | ||||||
|     return true; |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|   LetterSpace: SetConsoleScreenBufferSize and SetConsoleWindowInfo are |  | ||||||
|     dependent on each other, that's the reason for the additional checks. |  | ||||||
| */ |  | ||||||
| void ConsoleListener::BufferWidthHeight(int BufferWidth, int BufferHeight, int ScreenWidth, int ScreenHeight, bool BufferFirst) |  | ||||||
| { |  | ||||||
| #ifdef _WIN32 |  | ||||||
|     BOOL SB, SW; |  | ||||||
|     if (BufferFirst) |  | ||||||
|     { |  | ||||||
|         // Change screen buffer size
 |  | ||||||
|         COORD Co = {BufferWidth, BufferHeight}; |  | ||||||
|         SB = SetConsoleScreenBufferSize(hConsole, Co); |  | ||||||
|         // Change the screen buffer window size
 |  | ||||||
|         SMALL_RECT coo = {0,0,ScreenWidth, ScreenHeight}; // top, left, right, bottom
 |  | ||||||
|         SW = SetConsoleWindowInfo(hConsole, TRUE, &coo); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         // Change the screen buffer window size
 |  | ||||||
|         SMALL_RECT coo = {0,0, ScreenWidth, ScreenHeight}; // top, left, right, bottom
 |  | ||||||
|         SW = SetConsoleWindowInfo(hConsole, TRUE, &coo); |  | ||||||
|         // Change screen buffer size
 |  | ||||||
|         COORD Co = {BufferWidth, BufferHeight}; |  | ||||||
|         SB = SetConsoleScreenBufferSize(hConsole, Co); |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| void ConsoleListener::LetterSpace(int Width, int Height) |  | ||||||
| { |  | ||||||
| #ifdef _WIN32 |  | ||||||
|     // Get console info
 |  | ||||||
|     CONSOLE_SCREEN_BUFFER_INFO ConInfo; |  | ||||||
|     GetConsoleScreenBufferInfo(hConsole, &ConInfo); |  | ||||||
| 
 |  | ||||||
|     //
 |  | ||||||
|     int OldBufferWidth = ConInfo.dwSize.X; |  | ||||||
|     int OldBufferHeight = ConInfo.dwSize.Y; |  | ||||||
|     int OldScreenWidth = (ConInfo.srWindow.Right - ConInfo.srWindow.Left); |  | ||||||
|     int OldScreenHeight = (ConInfo.srWindow.Bottom - ConInfo.srWindow.Top); |  | ||||||
|     //
 |  | ||||||
|     int NewBufferWidth = Width; |  | ||||||
|     int NewBufferHeight = Height; |  | ||||||
|     int NewScreenWidth = NewBufferWidth - 1; |  | ||||||
|     int NewScreenHeight = OldScreenHeight; |  | ||||||
| 
 |  | ||||||
|     // Width
 |  | ||||||
|     BufferWidthHeight(NewBufferWidth, OldBufferHeight, NewScreenWidth, OldScreenHeight, (NewBufferWidth > OldScreenWidth-1)); |  | ||||||
|     // Height
 |  | ||||||
|     BufferWidthHeight(NewBufferWidth, NewBufferHeight, NewScreenWidth, NewScreenHeight, (NewBufferHeight > OldScreenHeight-1)); |  | ||||||
| 
 |  | ||||||
|     // Resize the window too
 |  | ||||||
|     //MoveWindow(GetConsoleWindow(), 200,200, (Width*8 + 50),(NewScreenHeight*12 + 200), true);
 |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| #ifdef _WIN32 |  | ||||||
| COORD ConsoleListener::GetCoordinates(int BytesRead, int BufferWidth) |  | ||||||
| { |  | ||||||
|     COORD Ret = {0, 0}; |  | ||||||
|     // Full rows
 |  | ||||||
|     int Step = (int)floor((float)BytesRead / (float)BufferWidth); |  | ||||||
|     Ret.Y += Step; |  | ||||||
|     // Partial row
 |  | ||||||
|     Ret.X = BytesRead - (BufferWidth * Step); |  | ||||||
|     return Ret; |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| void ConsoleListener::PixelSpace(int Left, int Top, int Width, int Height, bool Resize) |  | ||||||
| { |  | ||||||
| #ifdef _WIN32 |  | ||||||
|     // Check size
 |  | ||||||
|     if (Width < 8 || Height < 12) return; |  | ||||||
| 
 |  | ||||||
|     bool DBef = true; |  | ||||||
|     bool DAft = true; |  | ||||||
|     std::string SLog = ""; |  | ||||||
| 
 |  | ||||||
|     const HWND hWnd = GetConsoleWindow(); |  | ||||||
|     const HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); |  | ||||||
| 
 |  | ||||||
|     // Get console info
 |  | ||||||
|     CONSOLE_SCREEN_BUFFER_INFO ConInfo; |  | ||||||
|     GetConsoleScreenBufferInfo(hConsole, &ConInfo); |  | ||||||
|     DWORD BufferSize = ConInfo.dwSize.X * ConInfo.dwSize.Y; |  | ||||||
| 
 |  | ||||||
|     // ---------------------------------------------------------------------
 |  | ||||||
|     //  Save the current text
 |  | ||||||
|     // ------------------------
 |  | ||||||
|     DWORD cCharsRead = 0; |  | ||||||
|     COORD coordScreen = { 0, 0 }; |  | ||||||
| 
 |  | ||||||
|     static const int MAX_BYTES = 1024 * 16; |  | ||||||
| 
 |  | ||||||
|     std::vector<std::array<TCHAR, MAX_BYTES>> Str; |  | ||||||
|     std::vector<std::array<WORD, MAX_BYTES>> Attr; |  | ||||||
| 
 |  | ||||||
|     // ReadConsoleOutputAttribute seems to have a limit at this level
 |  | ||||||
|     static const int ReadBufferSize = MAX_BYTES - 32; |  | ||||||
| 
 |  | ||||||
|     DWORD cAttrRead = ReadBufferSize; |  | ||||||
|     DWORD BytesRead = 0; |  | ||||||
|     while (BytesRead < BufferSize) |  | ||||||
|     { |  | ||||||
|         Str.resize(Str.size() + 1); |  | ||||||
|         if (!ReadConsoleOutputCharacter(hConsole, Str.back().data(), ReadBufferSize, coordScreen, &cCharsRead)) |  | ||||||
|             SLog += Common::StringFromFormat("WriteConsoleOutputCharacter error"); |  | ||||||
| 
 |  | ||||||
|         Attr.resize(Attr.size() + 1); |  | ||||||
|         if (!ReadConsoleOutputAttribute(hConsole, Attr.back().data(), ReadBufferSize, coordScreen, &cAttrRead)) |  | ||||||
|             SLog += Common::StringFromFormat("WriteConsoleOutputAttribute error"); |  | ||||||
| 
 |  | ||||||
|         // Break on error
 |  | ||||||
|         if (cAttrRead == 0) break; |  | ||||||
|         BytesRead += cAttrRead; |  | ||||||
|         coordScreen = GetCoordinates(BytesRead, ConInfo.dwSize.X); |  | ||||||
|     } |  | ||||||
|     // Letter space
 |  | ||||||
|     int LWidth = (int)(floor((float)Width / 8.0f) - 1.0f); |  | ||||||
|     int LHeight = (int)(floor((float)Height / 12.0f) - 1.0f); |  | ||||||
|     int LBufWidth = LWidth + 1; |  | ||||||
|     int LBufHeight = (int)floor((float)BufferSize / (float)LBufWidth); |  | ||||||
|     // Change screen buffer size
 |  | ||||||
|     LetterSpace(LBufWidth, LBufHeight); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     ClearScreen(true); |  | ||||||
|     coordScreen.Y = 0; |  | ||||||
|     coordScreen.X = 0; |  | ||||||
|     DWORD cCharsWritten = 0; |  | ||||||
| 
 |  | ||||||
|     int BytesWritten = 0; |  | ||||||
|     DWORD cAttrWritten = 0; |  | ||||||
|     for (size_t i = 0; i < Attr.size(); i++) |  | ||||||
|     { |  | ||||||
|         if (!WriteConsoleOutputCharacter(hConsole, Str[i].data(), ReadBufferSize, coordScreen, &cCharsWritten)) |  | ||||||
|             SLog += Common::StringFromFormat("WriteConsoleOutputCharacter error"); |  | ||||||
|         if (!WriteConsoleOutputAttribute(hConsole, Attr[i].data(), ReadBufferSize, coordScreen, &cAttrWritten)) |  | ||||||
|             SLog += Common::StringFromFormat("WriteConsoleOutputAttribute error"); |  | ||||||
| 
 |  | ||||||
|         BytesWritten += cAttrWritten; |  | ||||||
|         coordScreen = GetCoordinates(BytesWritten, LBufWidth); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const int OldCursor = ConInfo.dwCursorPosition.Y * ConInfo.dwSize.X + ConInfo.dwCursorPosition.X; |  | ||||||
|     COORD Coo = GetCoordinates(OldCursor, LBufWidth); |  | ||||||
|     SetConsoleCursorPosition(hConsole, Coo); |  | ||||||
| 
 |  | ||||||
|     if (SLog.length() > 0) Log(LogTypes::LNOTICE, SLog.c_str()); |  | ||||||
| 
 |  | ||||||
|     // Resize the window too
 |  | ||||||
|     if (Resize) MoveWindow(GetConsoleWindow(), Left,Top, (Width + 100),Height, true); |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void ConsoleListener::Log(LogTypes::LOG_LEVELS Level, const char *Text) |  | ||||||
| { |  | ||||||
| #if defined(_WIN32) |  | ||||||
|     WORD Color; |  | ||||||
| 
 |  | ||||||
|     switch (Level) |  | ||||||
|     { |  | ||||||
|     case OS_LEVEL: // light yellow
 |  | ||||||
|         Color = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY; |  | ||||||
|         break; |  | ||||||
|     case NOTICE_LEVEL: // light green
 |  | ||||||
|         Color = FOREGROUND_GREEN | FOREGROUND_INTENSITY; |  | ||||||
|         break; |  | ||||||
|     case ERROR_LEVEL: // light red
 |  | ||||||
|         Color = FOREGROUND_RED | FOREGROUND_INTENSITY; |  | ||||||
|         break; |  | ||||||
|     case WARNING_LEVEL: // light purple
 |  | ||||||
|         Color = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY; |  | ||||||
|         break; |  | ||||||
|     case INFO_LEVEL: // cyan
 |  | ||||||
|         Color = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY; |  | ||||||
|         break; |  | ||||||
|     case DEBUG_LEVEL: // gray
 |  | ||||||
|         Color = FOREGROUND_INTENSITY; |  | ||||||
|         break; |  | ||||||
|     default: // off-white
 |  | ||||||
|         Color = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; |  | ||||||
|         break; |  | ||||||
|     } |  | ||||||
|     SetConsoleTextAttribute(hConsole, Color); |  | ||||||
|     printf(Text); |  | ||||||
| #else |  | ||||||
|     char ColorAttr[16] = ""; |  | ||||||
|     char ResetAttr[16] = ""; |  | ||||||
| 
 |  | ||||||
|     if (bUseColor) |  | ||||||
|     { |  | ||||||
|         strcpy(ResetAttr, "\033[0m"); |  | ||||||
|         switch (Level) |  | ||||||
|         { |  | ||||||
|         case NOTICE_LEVEL: // light green
 |  | ||||||
|             strcpy(ColorAttr, "\033[92m"); |  | ||||||
|             break; |  | ||||||
|         case ERROR_LEVEL: // light red
 |  | ||||||
|             strcpy(ColorAttr, "\033[91m"); |  | ||||||
|             break; |  | ||||||
|         case WARNING_LEVEL: // light yellow
 |  | ||||||
|             strcpy(ColorAttr, "\033[93m"); |  | ||||||
|             break; |  | ||||||
|         default: |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     fprintf(stderr, "%s%s%s", ColorAttr, Text, ResetAttr); |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| // Clear console screen
 |  | ||||||
| void ConsoleListener::ClearScreen(bool Cursor) |  | ||||||
| { |  | ||||||
| #if defined(_WIN32) |  | ||||||
|     COORD coordScreen = { 0, 0 }; |  | ||||||
|     DWORD cCharsWritten; |  | ||||||
|     CONSOLE_SCREEN_BUFFER_INFO csbi; |  | ||||||
|     DWORD dwConSize; |  | ||||||
| 
 |  | ||||||
|     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); |  | ||||||
| 
 |  | ||||||
|     GetConsoleScreenBufferInfo(hConsole, &csbi); |  | ||||||
|     dwConSize = csbi.dwSize.X * csbi.dwSize.Y; |  | ||||||
|     // Write space to the entire console
 |  | ||||||
|     FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten); |  | ||||||
|     GetConsoleScreenBufferInfo(hConsole, &csbi); |  | ||||||
|     FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten); |  | ||||||
|     // Reset cursor
 |  | ||||||
|     if (Cursor) SetConsoleCursorPosition(hConsole, coordScreen); |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|  | @ -1,38 +0,0 @@ | ||||||
| // Copyright 2013 Dolphin Emulator Project
 |  | ||||||
| // Licensed under GPLv2
 |  | ||||||
| // Refer to the license.txt file included.
 |  | ||||||
| 
 |  | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include "common/log_manager.h" |  | ||||||
| 
 |  | ||||||
| #ifdef _WIN32 |  | ||||||
| #include <windows.h> |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| class ConsoleListener : public LogListener |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     ConsoleListener(); |  | ||||||
|     ~ConsoleListener(); |  | ||||||
| 
 |  | ||||||
|     void Open(bool Hidden = false, int Width = 100, int Height = 100, const char * Name = "Console"); |  | ||||||
|     void UpdateHandle(); |  | ||||||
|     void Close(); |  | ||||||
|     bool IsOpen(); |  | ||||||
|     void LetterSpace(int Width, int Height); |  | ||||||
|     void BufferWidthHeight(int BufferWidth, int BufferHeight, int ScreenWidth, int ScreenHeight, bool BufferFirst); |  | ||||||
|     void PixelSpace(int Left, int Top, int Width, int Height, bool); |  | ||||||
| #ifdef _WIN32 |  | ||||||
|     COORD GetCoordinates(int BytesRead, int BufferWidth); |  | ||||||
| #endif |  | ||||||
|     void Log(LogTypes::LOG_LEVELS, const char *Text) override; |  | ||||||
|     void ClearScreen(bool Cursor = true); |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
| #ifdef _WIN32 |  | ||||||
|     HWND GetHwnd(void); |  | ||||||
|     HANDLE hConsole; |  | ||||||
| #endif |  | ||||||
|     bool bUseColor; |  | ||||||
| }; |  | ||||||
							
								
								
									
										127
									
								
								src/common/log.h
									
										
									
									
									
								
							
							
						
						
									
										127
									
								
								src/common/log.h
									
										
									
									
									
								
							|  | @ -8,132 +8,13 @@ | ||||||
| #include "common/msg_handler.h" | #include "common/msg_handler.h" | ||||||
| #include "common/logging/log.h" | #include "common/logging/log.h" | ||||||
| 
 | 
 | ||||||
| #ifndef LOGGING |  | ||||||
| #define LOGGING |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| enum { |  | ||||||
|     OS_LEVEL,       // Printed by the emulated operating system
 |  | ||||||
|     NOTICE_LEVEL,   // VERY important information that is NOT errors. Like startup and OSReports.
 |  | ||||||
|     ERROR_LEVEL,    // Critical errors
 |  | ||||||
|     WARNING_LEVEL,  // Something is suspicious.
 |  | ||||||
|     INFO_LEVEL,     // General information.
 |  | ||||||
|     DEBUG_LEVEL,    // Detailed debugging - might make things slow.
 |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| namespace LogTypes |  | ||||||
| { |  | ||||||
| 
 |  | ||||||
| enum LOG_TYPE { |  | ||||||
|     //ACTIONREPLAY,
 |  | ||||||
|     //AUDIO,
 |  | ||||||
|     //AUDIO_INTERFACE,
 |  | ||||||
|     BOOT, |  | ||||||
|     //COMMANDPROCESSOR,
 |  | ||||||
|     COMMON, |  | ||||||
|     //CONSOLE,
 |  | ||||||
|     CONFIG, |  | ||||||
|     //DISCIO,
 |  | ||||||
|     //FILEMON,
 |  | ||||||
|     //DSPHLE,
 |  | ||||||
|     //DSPLLE,
 |  | ||||||
|     //DSP_MAIL,
 |  | ||||||
|     //DSPINTERFACE,
 |  | ||||||
|     //DVDINTERFACE,
 |  | ||||||
|     //DYNA_REC,
 |  | ||||||
|     //EXPANSIONINTERFACE,
 |  | ||||||
|     //GDB_STUB,
 |  | ||||||
|     ARM11, |  | ||||||
|     GSP, |  | ||||||
|     OSHLE, |  | ||||||
|     MASTER_LOG, |  | ||||||
|     MEMMAP, |  | ||||||
|     //MEMCARD_MANAGER,
 |  | ||||||
|     //OSREPORT,
 |  | ||||||
|     //PAD,
 |  | ||||||
|     //PROCESSORINTERFACE,
 |  | ||||||
|     //PIXELENGINE,
 |  | ||||||
|     //SERIALINTERFACE,
 |  | ||||||
|     //SP1,
 |  | ||||||
|     //STREAMINGINTERFACE,
 |  | ||||||
|     VIDEO, |  | ||||||
|     //VIDEOINTERFACE,
 |  | ||||||
|     LOADER, |  | ||||||
|     FILESYS, |  | ||||||
|     //WII_IPC_DVD,
 |  | ||||||
|     //WII_IPC_ES,
 |  | ||||||
|     //WII_IPC_FILEIO,
 |  | ||||||
|     //WII_IPC_HID,
 |  | ||||||
|     KERNEL, |  | ||||||
|     SVC, |  | ||||||
|     HLE, |  | ||||||
|     RENDER, |  | ||||||
|     GPU, |  | ||||||
|     HW, |  | ||||||
|     TIME, |  | ||||||
|     //NETPLAY,
 |  | ||||||
|     GUI, |  | ||||||
| 
 |  | ||||||
|     NUMBER_OF_LOGS // Must be last
 |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // FIXME: should this be removed?
 |  | ||||||
| enum LOG_LEVELS { |  | ||||||
|     LOS = OS_LEVEL, |  | ||||||
|     LNOTICE = NOTICE_LEVEL, |  | ||||||
|     LERROR = ERROR_LEVEL, |  | ||||||
|     LWARNING = WARNING_LEVEL, |  | ||||||
|     LINFO = INFO_LEVEL, |  | ||||||
|     LDEBUG = DEBUG_LEVEL, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #define LOGTYPES_LEVELS LogTypes::LOG_LEVELS |  | ||||||
| #define LOGTYPES_TYPE LogTypes::LOG_TYPE |  | ||||||
| 
 |  | ||||||
| }  // namespace
 |  | ||||||
| 
 |  | ||||||
| void GenericLog(LOGTYPES_LEVELS level, LOGTYPES_TYPE type, const char*file, int line, |  | ||||||
|     const char* function, const char* fmt, ...) |  | ||||||
| #ifdef __GNUC__ |  | ||||||
|         __attribute__((format(printf, 6, 7))) |  | ||||||
| #endif |  | ||||||
|         ; |  | ||||||
| 
 |  | ||||||
| #if defined LOGGING || defined _DEBUG || defined DEBUGFAST |  | ||||||
| #define MAX_LOGLEVEL LDEBUG |  | ||||||
| #else |  | ||||||
| #ifndef MAX_LOGLEVEL |  | ||||||
| #define MAX_LOGLEVEL LWARNING |  | ||||||
| #endif // loglevel
 |  | ||||||
| #endif // logging
 |  | ||||||
| 
 |  | ||||||
| #ifdef _WIN32 | #ifdef _WIN32 | ||||||
| #ifndef __func__ | #ifndef __func__ | ||||||
| #define __func__ __FUNCTION__ | #define __func__ __FUNCTION__ | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| // Let the compiler optimize this out
 | #if _DEBUG | ||||||
| #define GENERIC_LOG(t, v, ...) { \ |  | ||||||
|     if (v <= LogTypes::MAX_LOGLEVEL) \ |  | ||||||
|         GenericLog(v, t, __FILE__, __LINE__, __func__, __VA_ARGS__); \ |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| //#define OS_LOG(t,...) do { GENERIC_LOG(LogTypes::t, LogTypes::LOS, __VA_ARGS__) } while (0)
 |  | ||||||
| //#define ERROR_LOG(t,...) do { GENERIC_LOG(LogTypes::t, LogTypes::LERROR, __VA_ARGS__) } while (0)
 |  | ||||||
| //#define WARN_LOG(t,...) do { GENERIC_LOG(LogTypes::t, LogTypes::LWARNING, __VA_ARGS__) } while (0)
 |  | ||||||
| //#define NOTICE_LOG(t,...) do { GENERIC_LOG(LogTypes::t, LogTypes::LNOTICE, __VA_ARGS__) } while (0)
 |  | ||||||
| //#define INFO_LOG(t,...) do { GENERIC_LOG(LogTypes::t, LogTypes::LINFO, __VA_ARGS__) } while (0)
 |  | ||||||
| //#define DEBUG_LOG(t,...) do { GENERIC_LOG(LogTypes::t, LogTypes::LDEBUG, __VA_ARGS__) } while (0)
 |  | ||||||
| 
 |  | ||||||
| //#define OS_LOG(t,...) LOG_INFO(Common, __VA_ARGS__)
 |  | ||||||
| //#define ERROR_LOG(t,...) LOG_ERROR(Common_Filesystem, __VA_ARGS__)
 |  | ||||||
| //#define WARN_LOG(t,...) LOG_WARNING(Kernel_SVC, __VA_ARGS__)
 |  | ||||||
| //#define NOTICE_LOG(t,...) LOG_INFO(Service, __VA_ARGS__)
 |  | ||||||
| //#define INFO_LOG(t,...) LOG_INFO(Service_FS, __VA_ARGS__)
 |  | ||||||
| //#define DEBUG_LOG(t,...) LOG_DEBUG(Common, __VA_ARGS__)
 |  | ||||||
| 
 |  | ||||||
| #if MAX_LOGLEVEL >= DEBUG_LEVEL |  | ||||||
| #define _dbg_assert_(_t_, _a_) \ | #define _dbg_assert_(_t_, _a_) \ | ||||||
|     if (!(_a_)) {\ |     if (!(_a_)) {\ | ||||||
|         LOG_CRITICAL(_t_, "Error...\n\n  Line: %d\n  File: %s\n  Time: %s\n\nIgnore and continue?", \ |         LOG_CRITICAL(_t_, "Error...\n\n  Line: %d\n  File: %s\n  Time: %s\n\nIgnore and continue?", \ | ||||||
|  | @ -154,11 +35,10 @@ void GenericLog(LOGTYPES_LEVELS level, LOGTYPES_TYPE type, const char*file, int | ||||||
| #define _dbg_assert_(_t_, _a_) {} | #define _dbg_assert_(_t_, _a_) {} | ||||||
| #define _dbg_assert_msg_(_t_, _a_, _desc_, ...) {} | #define _dbg_assert_msg_(_t_, _a_, _desc_, ...) {} | ||||||
| #endif // dbg_assert
 | #endif // dbg_assert
 | ||||||
| #endif // MAX_LOGLEVEL DEBUG
 | #endif | ||||||
| 
 | 
 | ||||||
| #define _assert_(_a_) _dbg_assert_(MASTER_LOG, _a_) | #define _assert_(_a_) _dbg_assert_(MASTER_LOG, _a_) | ||||||
| 
 | 
 | ||||||
| #ifndef GEKKO |  | ||||||
| #ifdef _WIN32 | #ifdef _WIN32 | ||||||
| #define _assert_msg_(_t_, _a_, _fmt_, ...)        \ | #define _assert_msg_(_t_, _a_, _fmt_, ...)        \ | ||||||
|     if (!(_a_)) {\ |     if (!(_a_)) {\ | ||||||
|  | @ -170,6 +50,3 @@ void GenericLog(LOGTYPES_LEVELS level, LOGTYPES_TYPE type, const char*file, int | ||||||
|         if (!PanicYesNo(_fmt_, ##__VA_ARGS__)) {Crash();} \ |         if (!PanicYesNo(_fmt_, ##__VA_ARGS__)) {Crash();} \ | ||||||
|     } |     } | ||||||
| #endif // WIN32
 | #endif // WIN32
 | ||||||
| #else // GEKKO
 |  | ||||||
| #define _assert_msg_(_t_, _a_, _fmt_, ...) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  | @ -1,198 +0,0 @@ | ||||||
| // Copyright 2013 Dolphin Emulator Project
 |  | ||||||
| // Licensed under GPLv2
 |  | ||||||
| // Refer to the license.txt file included.
 |  | ||||||
| 
 |  | ||||||
| #include <algorithm> |  | ||||||
| 
 |  | ||||||
| #include "common/log_manager.h" |  | ||||||
| #include "common/console_listener.h" |  | ||||||
| #include "common/timer.h" |  | ||||||
| 
 |  | ||||||
| void GenericLog(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char* file, int line, |  | ||||||
|     const char* function, const char* fmt, ...) |  | ||||||
| { |  | ||||||
|     va_list args; |  | ||||||
|     va_start(args, fmt); |  | ||||||
| 
 |  | ||||||
|     if (LogManager::GetInstance()) { |  | ||||||
|         LogManager::GetInstance()->Log(level, type, |  | ||||||
|             file, line, function, fmt, args); |  | ||||||
|     } |  | ||||||
|     va_end(args); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| LogManager *LogManager::m_logManager = nullptr; |  | ||||||
| 
 |  | ||||||
| LogManager::LogManager() |  | ||||||
| { |  | ||||||
|     // create log files
 |  | ||||||
|     m_Log[LogTypes::MASTER_LOG]         = new LogContainer("*",                 "Master Log"); |  | ||||||
|     m_Log[LogTypes::BOOT]               = new LogContainer("BOOT",              "Boot"); |  | ||||||
|     m_Log[LogTypes::COMMON]             = new LogContainer("COMMON",            "Common"); |  | ||||||
|     m_Log[LogTypes::CONFIG]             = new LogContainer("CONFIG",            "Configuration"); |  | ||||||
|     //m_Log[LogTypes::DISCIO]             = new LogContainer("DIO",               "Disc IO");
 |  | ||||||
|     //m_Log[LogTypes::FILEMON]            = new LogContainer("FileMon",           "File Monitor");
 |  | ||||||
|     //m_Log[LogTypes::PAD]                = new LogContainer("PAD",               "Pad");
 |  | ||||||
|     //m_Log[LogTypes::PIXELENGINE]        = new LogContainer("PE",                "PixelEngine");
 |  | ||||||
|     //m_Log[LogTypes::COMMANDPROCESSOR]   = new LogContainer("CP",                "CommandProc");
 |  | ||||||
|     //m_Log[LogTypes::VIDEOINTERFACE]     = new LogContainer("VI",                "VideoInt");
 |  | ||||||
|     //m_Log[LogTypes::SERIALINTERFACE]    = new LogContainer("SI",                "SerialInt");
 |  | ||||||
|     //m_Log[LogTypes::PROCESSORINTERFACE] = new LogContainer("PI",                "ProcessorInt");
 |  | ||||||
|     m_Log[LogTypes::MEMMAP]             = new LogContainer("MI",                "MI & memmap"); |  | ||||||
|     //m_Log[LogTypes::SP1]                = new LogContainer("SP1",               "Serial Port 1");
 |  | ||||||
|     //m_Log[LogTypes::STREAMINGINTERFACE] = new LogContainer("Stream",            "StreamingInt");
 |  | ||||||
|     //m_Log[LogTypes::DSPINTERFACE]       = new LogContainer("DSP",               "DSPInterface");
 |  | ||||||
|     //m_Log[LogTypes::DVDINTERFACE]       = new LogContainer("DVD",               "DVDInterface");
 |  | ||||||
|     m_Log[LogTypes::GSP]                = new LogContainer("GSP",               "GSP"); |  | ||||||
|     //m_Log[LogTypes::EXPANSIONINTERFACE] = new LogContainer("EXI",               "ExpansionInt");
 |  | ||||||
|     //m_Log[LogTypes::GDB_STUB]           = new LogContainer("GDB_STUB",          "GDB Stub");
 |  | ||||||
|     //m_Log[LogTypes::AUDIO_INTERFACE]    = new LogContainer("AI",                "AudioInt");
 |  | ||||||
|     m_Log[LogTypes::ARM11]              = new LogContainer("ARM11",             "ARM11"); |  | ||||||
|     m_Log[LogTypes::OSHLE]              = new LogContainer("HLE",               "HLE"); |  | ||||||
|     //m_Log[LogTypes::DSPHLE]             = new LogContainer("DSPHLE",            "DSP HLE");
 |  | ||||||
|     //m_Log[LogTypes::DSPLLE]             = new LogContainer("DSPLLE",            "DSP LLE");
 |  | ||||||
|     //m_Log[LogTypes::DSP_MAIL]           = new LogContainer("DSPMails",          "DSP Mails");
 |  | ||||||
|     m_Log[LogTypes::VIDEO]              = new LogContainer("Video",             "Video Backend"); |  | ||||||
|     //m_Log[LogTypes::AUDIO]              = new LogContainer("Audio",             "Audio Emulator");
 |  | ||||||
|     //m_Log[LogTypes::DYNA_REC]           = new LogContainer("JIT",               "JIT");
 |  | ||||||
|     //m_Log[LogTypes::CONSOLE]            = new LogContainer("CONSOLE",           "Dolphin Console");
 |  | ||||||
|     //m_Log[LogTypes::OSREPORT]           = new LogContainer("OSREPORT",          "OSReport");
 |  | ||||||
|     m_Log[LogTypes::TIME]               = new LogContainer("Time",              "Core Timing"); |  | ||||||
|     m_Log[LogTypes::LOADER]             = new LogContainer("Loader",            "Loader"); |  | ||||||
|     m_Log[LogTypes::FILESYS]            = new LogContainer("FileSys",           "File System"); |  | ||||||
|     //m_Log[LogTypes::WII_IPC_HID]        = new LogContainer("WII_IPC_HID",       "WII IPC HID");
 |  | ||||||
|     m_Log[LogTypes::KERNEL]             = new LogContainer("KERNEL",            "KERNEL HLE"); |  | ||||||
|     //m_Log[LogTypes::WII_IPC_DVD]        = new LogContainer("WII_IPC_DVD",       "WII IPC DVD");
 |  | ||||||
|     //m_Log[LogTypes::WII_IPC_ES]         = new LogContainer("WII_IPC_ES",        "WII IPC ES");
 |  | ||||||
|     //m_Log[LogTypes::WII_IPC_FILEIO]     = new LogContainer("WII_IPC_FILEIO",    "WII IPC FILEIO");
 |  | ||||||
|     m_Log[LogTypes::RENDER]             = new LogContainer("RENDER",            "RENDER"); |  | ||||||
|     m_Log[LogTypes::GPU]                = new LogContainer("GPU",               "GPU"); |  | ||||||
|     m_Log[LogTypes::SVC]                = new LogContainer("SVC",               "Supervisor Call HLE"); |  | ||||||
|     m_Log[LogTypes::HLE]                = new LogContainer("HLE",               "High Level Emulation"); |  | ||||||
|     m_Log[LogTypes::HW]                 = new LogContainer("HW",                "Hardware"); |  | ||||||
|     //m_Log[LogTypes::ACTIONREPLAY]       = new LogContainer("ActionReplay",      "ActionReplay");
 |  | ||||||
|     //m_Log[LogTypes::MEMCARD_MANAGER]    = new LogContainer("MemCard Manager",   "MemCard Manager");
 |  | ||||||
|     //m_Log[LogTypes::NETPLAY]            = new LogContainer("NETPLAY",           "Netplay");
 |  | ||||||
|     m_Log[LogTypes::GUI]                = new LogContainer("GUI",               "GUI"); |  | ||||||
| 
 |  | ||||||
|     m_fileLog = new FileLogListener(FileUtil::GetUserPath(F_MAINLOG_IDX).c_str()); |  | ||||||
|     m_consoleLog = new ConsoleListener(); |  | ||||||
|     m_debuggerLog = new DebuggerLogListener(); |  | ||||||
| 
 |  | ||||||
|     for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) |  | ||||||
|     { |  | ||||||
|         m_Log[i]->SetEnable(true); |  | ||||||
|         m_Log[i]->AddListener(m_fileLog); |  | ||||||
|         m_Log[i]->AddListener(m_consoleLog); |  | ||||||
| #ifdef _MSC_VER |  | ||||||
|         if (IsDebuggerPresent()) |  | ||||||
|             m_Log[i]->AddListener(m_debuggerLog); |  | ||||||
| #endif |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     m_consoleLog->Open(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| LogManager::~LogManager() |  | ||||||
| { |  | ||||||
|     for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) |  | ||||||
|     { |  | ||||||
|         m_logManager->RemoveListener((LogTypes::LOG_TYPE)i, m_fileLog); |  | ||||||
|         m_logManager->RemoveListener((LogTypes::LOG_TYPE)i, m_consoleLog); |  | ||||||
|         m_logManager->RemoveListener((LogTypes::LOG_TYPE)i, m_debuggerLog); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; ++i) |  | ||||||
|         delete m_Log[i]; |  | ||||||
| 
 |  | ||||||
|     delete m_fileLog; |  | ||||||
|     delete m_consoleLog; |  | ||||||
|     delete m_debuggerLog; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void LogManager::Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char* file, |  | ||||||
|     int line, const char* function, const char *fmt, va_list args) |  | ||||||
| { |  | ||||||
|     char temp[MAX_MSGLEN]; |  | ||||||
|     char msg[MAX_MSGLEN * 2]; |  | ||||||
|     LogContainer *log = m_Log[type]; |  | ||||||
| 
 |  | ||||||
|     if (!log->IsEnabled() || level > log->GetLevel() || ! log->HasListeners()) |  | ||||||
|         return; |  | ||||||
| 
 |  | ||||||
|     Common::CharArrayFromFormatV(temp, MAX_MSGLEN, fmt, args); |  | ||||||
| 
 |  | ||||||
|     static const char level_to_char[7] = "ONEWID"; |  | ||||||
|     sprintf(msg, "%s %s:%u %c[%s] %s: %s\n", Common::Timer::GetTimeFormatted().c_str(), file, line, |  | ||||||
|         level_to_char[(int)level], log->GetShortName(), function, temp); |  | ||||||
| 
 |  | ||||||
| #ifdef ANDROID |  | ||||||
|     Host_SysMessage(msg); |  | ||||||
| #endif |  | ||||||
|     log->Trigger(level, msg); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void LogManager::Init() |  | ||||||
| { |  | ||||||
|     m_logManager = new LogManager(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void LogManager::Shutdown() |  | ||||||
| { |  | ||||||
|     delete m_logManager; |  | ||||||
|     m_logManager = nullptr; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| LogContainer::LogContainer(const char* shortName, const char* fullName, bool enable) |  | ||||||
|     : m_enable(enable) |  | ||||||
| { |  | ||||||
|     strncpy(m_fullName, fullName, 128); |  | ||||||
|     strncpy(m_shortName, shortName, 32); |  | ||||||
|     m_level = LogTypes::MAX_LOGLEVEL; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // LogContainer
 |  | ||||||
| void LogContainer::AddListener(LogListener *listener) |  | ||||||
| { |  | ||||||
|     std::lock_guard<std::mutex> lk(m_listeners_lock); |  | ||||||
|     m_listeners.insert(listener); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void LogContainer::RemoveListener(LogListener *listener) |  | ||||||
| { |  | ||||||
|     std::lock_guard<std::mutex> lk(m_listeners_lock); |  | ||||||
|     m_listeners.erase(listener); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void LogContainer::Trigger(LogTypes::LOG_LEVELS level, const char *msg) |  | ||||||
| { |  | ||||||
|     std::lock_guard<std::mutex> lk(m_listeners_lock); |  | ||||||
| 
 |  | ||||||
|     std::set<LogListener*>::const_iterator i; |  | ||||||
|     for (i = m_listeners.begin(); i != m_listeners.end(); ++i) |  | ||||||
|     { |  | ||||||
|         (*i)->Log(level, msg); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| FileLogListener::FileLogListener(const char *filename) |  | ||||||
| { |  | ||||||
|     OpenFStream(m_logfile, filename, std::ios::app); |  | ||||||
|     SetEnable(true); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void FileLogListener::Log(LogTypes::LOG_LEVELS, const char *msg) |  | ||||||
| { |  | ||||||
|     if (!IsEnabled() || !IsValid()) |  | ||||||
|         return; |  | ||||||
| 
 |  | ||||||
|     std::lock_guard<std::mutex> lk(m_log_lock); |  | ||||||
|     m_logfile << msg << std::flush; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void DebuggerLogListener::Log(LogTypes::LOG_LEVELS, const char *msg) |  | ||||||
| { |  | ||||||
| #if _MSC_VER |  | ||||||
|     ::OutputDebugStringA(msg); |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
|  | @ -1,166 +0,0 @@ | ||||||
| // Copyright 2013 Dolphin Emulator Project
 |  | ||||||
| // Licensed under GPLv2
 |  | ||||||
| // Refer to the license.txt file included.
 |  | ||||||
| 
 |  | ||||||
| #pragma once |  | ||||||
| 
 |  | ||||||
| #include "common/log.h" |  | ||||||
| #include "common/string_util.h" |  | ||||||
| #include "common/file_util.h" |  | ||||||
| 
 |  | ||||||
| #include <cstring> |  | ||||||
| #include <set> |  | ||||||
| #include <mutex> |  | ||||||
| 
 |  | ||||||
| #define MAX_MESSAGES 8000 |  | ||||||
| #define MAX_MSGLEN  1024 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // pure virtual interface
 |  | ||||||
| class LogListener |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     virtual ~LogListener() {} |  | ||||||
| 
 |  | ||||||
|     virtual void Log(LogTypes::LOG_LEVELS, const char *msg) = 0; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class FileLogListener : public LogListener |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     FileLogListener(const char *filename); |  | ||||||
| 
 |  | ||||||
|     void Log(LogTypes::LOG_LEVELS, const char *msg) override; |  | ||||||
| 
 |  | ||||||
|     bool IsValid() { return !m_logfile.fail(); } |  | ||||||
|     bool IsEnabled() const { return m_enable; } |  | ||||||
|     void SetEnable(bool enable) { m_enable = enable; } |  | ||||||
| 
 |  | ||||||
|     const char* GetName() const { return "file"; } |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     std::mutex m_log_lock; |  | ||||||
|     std::ofstream m_logfile; |  | ||||||
|     bool m_enable; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class DebuggerLogListener : public LogListener |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     void Log(LogTypes::LOG_LEVELS, const char *msg) override; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class LogContainer |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     LogContainer(const char* shortName, const char* fullName, bool enable = false); |  | ||||||
| 
 |  | ||||||
|     const char* GetShortName() const { return m_shortName; } |  | ||||||
|     const char* GetFullName() const { return m_fullName; } |  | ||||||
| 
 |  | ||||||
|     void AddListener(LogListener* listener); |  | ||||||
|     void RemoveListener(LogListener* listener); |  | ||||||
| 
 |  | ||||||
|     void Trigger(LogTypes::LOG_LEVELS, const char *msg); |  | ||||||
| 
 |  | ||||||
|     bool IsEnabled() const { return m_enable; } |  | ||||||
|     void SetEnable(bool enable) { m_enable = enable; } |  | ||||||
| 
 |  | ||||||
|     LogTypes::LOG_LEVELS GetLevel() const { return m_level;    } |  | ||||||
| 
 |  | ||||||
|     void SetLevel(LogTypes::LOG_LEVELS level) {    m_level = level; } |  | ||||||
| 
 |  | ||||||
|     bool HasListeners() const { return !m_listeners.empty(); } |  | ||||||
| 
 |  | ||||||
| private: |  | ||||||
|     char m_fullName[128]; |  | ||||||
|     char m_shortName[32]; |  | ||||||
|     bool m_enable; |  | ||||||
|     LogTypes::LOG_LEVELS m_level; |  | ||||||
|     std::mutex m_listeners_lock; |  | ||||||
|     std::set<LogListener*> m_listeners; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| class ConsoleListener; |  | ||||||
| 
 |  | ||||||
| class LogManager : NonCopyable |  | ||||||
| { |  | ||||||
| private: |  | ||||||
|     LogContainer* m_Log[LogTypes::NUMBER_OF_LOGS]; |  | ||||||
|     FileLogListener *m_fileLog; |  | ||||||
|     ConsoleListener *m_consoleLog; |  | ||||||
|     DebuggerLogListener *m_debuggerLog; |  | ||||||
|     static LogManager *m_logManager;  // Singleton. Ugh.
 |  | ||||||
| 
 |  | ||||||
|     LogManager(); |  | ||||||
|     ~LogManager(); |  | ||||||
| public: |  | ||||||
| 
 |  | ||||||
|     static u32 GetMaxLevel() { return LogTypes::MAX_LOGLEVEL;    } |  | ||||||
| 
 |  | ||||||
|     void Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char* file, int line, |  | ||||||
|         const char* function, const char *fmt, va_list args); |  | ||||||
| 
 |  | ||||||
|     void SetLogLevel(LogTypes::LOG_TYPE type, LogTypes::LOG_LEVELS level) |  | ||||||
|     { |  | ||||||
|         m_Log[type]->SetLevel(level); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void SetEnable(LogTypes::LOG_TYPE type, bool enable) |  | ||||||
|     { |  | ||||||
|         m_Log[type]->SetEnable(enable); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     bool IsEnabled(LogTypes::LOG_TYPE type) const |  | ||||||
|     { |  | ||||||
|         return m_Log[type]->IsEnabled(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const char* GetShortName(LogTypes::LOG_TYPE type) const |  | ||||||
|     { |  | ||||||
|         return m_Log[type]->GetShortName(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     const char* GetFullName(LogTypes::LOG_TYPE type) const |  | ||||||
|     { |  | ||||||
|         return m_Log[type]->GetFullName(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void AddListener(LogTypes::LOG_TYPE type, LogListener *listener) |  | ||||||
|     { |  | ||||||
|         m_Log[type]->AddListener(listener); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     void RemoveListener(LogTypes::LOG_TYPE type, LogListener *listener) |  | ||||||
|     { |  | ||||||
|         m_Log[type]->RemoveListener(listener); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     FileLogListener *GetFileListener() const |  | ||||||
|     { |  | ||||||
|         return m_fileLog; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     ConsoleListener *GetConsoleListener() const |  | ||||||
|     { |  | ||||||
|         return m_consoleLog; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     DebuggerLogListener *GetDebuggerListener() const |  | ||||||
|     { |  | ||||||
|         return m_debuggerLog; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     static LogManager* GetInstance() |  | ||||||
|     { |  | ||||||
|         return m_logManager; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     static void SetInstance(LogManager *logManager) |  | ||||||
|     { |  | ||||||
|         m_logManager = logManager; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     static void Init(); |  | ||||||
|     static void Shutdown(); |  | ||||||
| }; |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue