summaryrefslogtreecommitdiff
path: root/src/common/log_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/log_manager.h')
-rw-r--r--src/common/log_manager.h169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/common/log_manager.h b/src/common/log_manager.h
new file mode 100644
index 000000000..579198ff6
--- /dev/null
+++ b/src/common/log_manager.h
@@ -0,0 +1,169 @@
1// Copyright 2013 Dolphin Emulator Project
2// Licensed under GPLv2
3// Refer to the license.txt file included.
4
5#ifndef _LOGMANAGER_H_
6#define _LOGMANAGER_H_
7
8#include "log.h"
9#include "string_util.h"
10#include "thread.h"
11#include "file_util.h"
12
13#include <set>
14#include <string.h>
15
16#define MAX_MESSAGES 8000
17#define MAX_MSGLEN 1024
18
19
20// pure virtual interface
21class LogListener
22{
23public:
24 virtual ~LogListener() {}
25
26 virtual void Log(LogTypes::LOG_LEVELS, const char *msg) = 0;
27};
28
29class FileLogListener : public LogListener
30{
31public:
32 FileLogListener(const char *filename);
33
34 void Log(LogTypes::LOG_LEVELS, const char *msg);
35
36 bool IsValid() { return !m_logfile.fail(); }
37 bool IsEnabled() const { return m_enable; }
38 void SetEnable(bool enable) { m_enable = enable; }
39
40 const char* GetName() const { return "file"; }
41
42private:
43 std::mutex m_log_lock;
44 std::ofstream m_logfile;
45 bool m_enable;
46};
47
48class DebuggerLogListener : public LogListener
49{
50public:
51 void Log(LogTypes::LOG_LEVELS, const char *msg);
52};
53
54class LogContainer
55{
56public:
57 LogContainer(const char* shortName, const char* fullName, bool enable = false);
58
59 const char* GetShortName() const { return m_shortName; }
60 const char* GetFullName() const { return m_fullName; }
61
62 void AddListener(LogListener* listener);
63 void RemoveListener(LogListener* listener);
64
65 void Trigger(LogTypes::LOG_LEVELS, const char *msg);
66
67 bool IsEnabled() const { return m_enable; }
68 void SetEnable(bool enable) { m_enable = enable; }
69
70 LogTypes::LOG_LEVELS GetLevel() const { return m_level; }
71
72 void SetLevel(LogTypes::LOG_LEVELS level) { m_level = level; }
73
74 bool HasListeners() const { return !m_listeners.empty(); }
75
76private:
77 char m_fullName[128];
78 char m_shortName[32];
79 bool m_enable;
80 LogTypes::LOG_LEVELS m_level;
81 std::mutex m_listeners_lock;
82 std::set<LogListener*> m_listeners;
83};
84
85class ConsoleListener;
86
87class LogManager : NonCopyable
88{
89private:
90 LogContainer* m_Log[LogTypes::NUMBER_OF_LOGS];
91 FileLogListener *m_fileLog;
92 ConsoleListener *m_consoleLog;
93 DebuggerLogListener *m_debuggerLog;
94 static LogManager *m_logManager; // Singleton. Ugh.
95
96 LogManager();
97 ~LogManager();
98public:
99
100 static u32 GetMaxLevel() { return MAX_LOGLEVEL; }
101
102 void Log(LogTypes::LOG_LEVELS level, LogTypes::LOG_TYPE type,
103 const char *file, int line, const char *fmt, va_list args);
104
105 void SetLogLevel(LogTypes::LOG_TYPE type, LogTypes::LOG_LEVELS level)
106 {
107 m_Log[type]->SetLevel(level);
108 }
109
110 void SetEnable(LogTypes::LOG_TYPE type, bool enable)
111 {
112 m_Log[type]->SetEnable(enable);
113 }
114
115 bool IsEnabled(LogTypes::LOG_TYPE type) const
116 {
117 return m_Log[type]->IsEnabled();
118 }
119
120 const char* GetShortName(LogTypes::LOG_TYPE type) const
121 {
122 return m_Log[type]->GetShortName();
123 }
124
125 const char* GetFullName(LogTypes::LOG_TYPE type) const
126 {
127 return m_Log[type]->GetFullName();
128 }
129
130 void AddListener(LogTypes::LOG_TYPE type, LogListener *listener)
131 {
132 m_Log[type]->AddListener(listener);
133 }
134
135 void RemoveListener(LogTypes::LOG_TYPE type, LogListener *listener)
136 {
137 m_Log[type]->RemoveListener(listener);
138 }
139
140 FileLogListener *GetFileListener() const
141 {
142 return m_fileLog;
143 }
144
145 ConsoleListener *GetConsoleListener() const
146 {
147 return m_consoleLog;
148 }
149
150 DebuggerLogListener *GetDebuggerListener() const
151 {
152 return m_debuggerLog;
153 }
154
155 static LogManager* GetInstance()
156 {
157 return m_logManager;
158 }
159
160 static void SetInstance(LogManager *logManager)
161 {
162 m_logManager = logManager;
163 }
164
165 static void Init();
166 static void Shutdown();
167};
168
169#endif // _LOGMANAGER_H_