log_manager.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright 2013 Dolphin Emulator Project
  2. // Licensed under GPLv2
  3. // Refer to the license.txt file included.
  4. #ifndef _LOGMANAGER_H_
  5. #define _LOGMANAGER_H_
  6. #include "common/log.h"
  7. #include "common/string_util.h"
  8. #include "common/thread.h"
  9. #include "common/file_util.h"
  10. #include <set>
  11. #include <string.h>
  12. #define MAX_MESSAGES 8000
  13. #define MAX_MSGLEN 1024
  14. // pure virtual interface
  15. class LogListener
  16. {
  17. public:
  18. virtual ~LogListener() {}
  19. virtual void Log(LogTypes::LOG_LEVELS, const char *msg) = 0;
  20. };
  21. class FileLogListener : public LogListener
  22. {
  23. public:
  24. FileLogListener(const char *filename);
  25. void Log(LogTypes::LOG_LEVELS, const char *msg);
  26. bool IsValid() { return !m_logfile.fail(); }
  27. bool IsEnabled() const { return m_enable; }
  28. void SetEnable(bool enable) { m_enable = enable; }
  29. const char* GetName() const { return "file"; }
  30. private:
  31. std::mutex m_log_lock;
  32. std::ofstream m_logfile;
  33. bool m_enable;
  34. };
  35. class DebuggerLogListener : public LogListener
  36. {
  37. public:
  38. void Log(LogTypes::LOG_LEVELS, const char *msg);
  39. };
  40. class LogContainer
  41. {
  42. public:
  43. LogContainer(const char* shortName, const char* fullName, bool enable = false);
  44. const char* GetShortName() const { return m_shortName; }
  45. const char* GetFullName() const { return m_fullName; }
  46. void AddListener(LogListener* listener);
  47. void RemoveListener(LogListener* listener);
  48. void Trigger(LogTypes::LOG_LEVELS, const char *msg);
  49. bool IsEnabled() const { return m_enable; }
  50. void SetEnable(bool enable) { m_enable = enable; }
  51. LogTypes::LOG_LEVELS GetLevel() const { return m_level; }
  52. void SetLevel(LogTypes::LOG_LEVELS level) { m_level = level; }
  53. bool HasListeners() const { return !m_listeners.empty(); }
  54. private:
  55. char m_fullName[128];
  56. char m_shortName[32];
  57. bool m_enable;
  58. LogTypes::LOG_LEVELS m_level;
  59. std::mutex m_listeners_lock;
  60. std::set<LogListener*> m_listeners;
  61. };
  62. class ConsoleListener;
  63. class LogManager : NonCopyable
  64. {
  65. private:
  66. LogContainer* m_Log[LogTypes::NUMBER_OF_LOGS];
  67. FileLogListener *m_fileLog;
  68. ConsoleListener *m_consoleLog;
  69. DebuggerLogListener *m_debuggerLog;
  70. static LogManager *m_logManager; // Singleton. Ugh.
  71. LogManager();
  72. ~LogManager();
  73. public:
  74. static u32 GetMaxLevel() { return LogTypes::MAX_LOGLEVEL; }
  75. void Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type, const char* file, int line,
  76. const char* function, const char *fmt, va_list args);
  77. void SetLogLevel(LogTypes::LOG_TYPE type, LogTypes::LOG_LEVELS level)
  78. {
  79. m_Log[type]->SetLevel(level);
  80. }
  81. void SetEnable(LogTypes::LOG_TYPE type, bool enable)
  82. {
  83. m_Log[type]->SetEnable(enable);
  84. }
  85. bool IsEnabled(LogTypes::LOG_TYPE type) const
  86. {
  87. return m_Log[type]->IsEnabled();
  88. }
  89. const char* GetShortName(LogTypes::LOG_TYPE type) const
  90. {
  91. return m_Log[type]->GetShortName();
  92. }
  93. const char* GetFullName(LogTypes::LOG_TYPE type) const
  94. {
  95. return m_Log[type]->GetFullName();
  96. }
  97. void AddListener(LogTypes::LOG_TYPE type, LogListener *listener)
  98. {
  99. m_Log[type]->AddListener(listener);
  100. }
  101. void RemoveListener(LogTypes::LOG_TYPE type, LogListener *listener)
  102. {
  103. m_Log[type]->RemoveListener(listener);
  104. }
  105. FileLogListener *GetFileListener() const
  106. {
  107. return m_fileLog;
  108. }
  109. ConsoleListener *GetConsoleListener() const
  110. {
  111. return m_consoleLog;
  112. }
  113. DebuggerLogListener *GetDebuggerListener() const
  114. {
  115. return m_debuggerLog;
  116. }
  117. static LogManager* GetInstance()
  118. {
  119. return m_logManager;
  120. }
  121. static void SetInstance(LogManager *logManager)
  122. {
  123. m_logManager = logManager;
  124. }
  125. static void Init();
  126. static void Shutdown();
  127. };
  128. #endif // _LOGMANAGER_H_