2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
|
|
|
|
#include "tlogger.h"
|
|
|
|
#include "tsystem.h"
|
|
|
|
#include "tthreadmessage.h"
|
|
|
|
#include "tconvert.h"
|
|
|
|
|
|
|
|
#include <fstream>
|
|
|
|
#include <set>
|
|
|
|
#include <vector>
|
2016-03-27 13:30:32 +13:00
|
|
|
#include <QTimer>
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
using std::endl;
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
class TLogger::Imp {
|
2016-03-19 06:57:51 +13:00
|
|
|
public:
|
2016-06-15 18:43:10 +12:00
|
|
|
std::vector<TLogger::Message> m_messages;
|
|
|
|
std::set<TLogger::Listener *> m_listeners;
|
|
|
|
TThread::Mutex m_mutex;
|
|
|
|
|
2016-06-29 18:17:12 +12:00
|
|
|
class ListenerNotifier final : public TThread::Message {
|
2016-06-15 18:43:10 +12:00
|
|
|
Imp *m_imp;
|
|
|
|
|
|
|
|
public:
|
|
|
|
ListenerNotifier(Imp *imp) : m_imp(imp) {}
|
2016-06-19 20:06:29 +12:00
|
|
|
void onDeliver() override {
|
2016-06-15 18:43:10 +12:00
|
|
|
QMutexLocker sl(&m_imp->m_mutex);
|
|
|
|
std::set<TLogger::Listener *>::iterator it;
|
|
|
|
for (it = m_imp->m_listeners.begin(); it != m_imp->m_listeners.end();
|
|
|
|
++it)
|
|
|
|
(*it)->onLogChanged();
|
|
|
|
}
|
2016-06-20 14:23:05 +12:00
|
|
|
TThread::Message *clone() const override {
|
|
|
|
return new ListenerNotifier(*this);
|
|
|
|
}
|
2016-06-15 18:43:10 +12:00
|
|
|
};
|
|
|
|
|
|
|
|
void notify() {
|
|
|
|
// ListenerNotifier(this).send();//onDeliver()
|
|
|
|
std::set<TLogger::Listener *>::iterator it;
|
|
|
|
for (it = m_listeners.begin(); it != m_listeners.end(); ++it)
|
|
|
|
(*it)->onLogChanged();
|
|
|
|
}
|
2016-03-19 06:57:51 +13:00
|
|
|
};
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TLogger::TLogger() : m_imp(new Imp()) {}
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TLogger::~TLogger() {}
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TLogger *TLogger::instance() {
|
|
|
|
static TLogger _instance;
|
|
|
|
return &_instance;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-04-19 19:32:17 +12:00
|
|
|
TLogger::Message::Message(MessageType type, std::string text)
|
2016-06-15 18:43:10 +12:00
|
|
|
: m_type(type), m_text(text) {
|
|
|
|
QTime t = QTime::currentTime();
|
|
|
|
m_timestamp = t.toString("hh:mm:ss.zzz").toStdString();
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
void TLogger::addMessage(const Message &msg) {
|
|
|
|
QMutexLocker sl(&m_imp->m_mutex);
|
|
|
|
m_imp->m_messages.push_back(msg);
|
|
|
|
m_imp->notify();
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
void TLogger::clearMessages() {
|
|
|
|
QMutexLocker sl(&m_imp->m_mutex);
|
|
|
|
m_imp->m_messages.clear();
|
|
|
|
m_imp->notify();
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
int TLogger::getMessageCount() const {
|
|
|
|
QMutexLocker sl(&m_imp->m_mutex);
|
|
|
|
return m_imp->m_messages.size();
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TLogger::Message TLogger::getMessage(int index) const {
|
|
|
|
QMutexLocker sl(&m_imp->m_mutex);
|
|
|
|
assert(0 <= index && index < getMessageCount());
|
|
|
|
return m_imp->m_messages[index];
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
void TLogger::addListener(TLogger::Listener *listener) {
|
|
|
|
m_imp->m_listeners.insert(listener);
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
void TLogger::removeListener(TLogger::Listener *listener) {
|
|
|
|
m_imp->m_listeners.erase(listener);
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TLogger::Stream::Stream(MessageType type) : m_type(type), m_text() {}
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TLogger::Stream::~Stream() {
|
|
|
|
try {
|
|
|
|
TLogger::Message msg(m_type, m_text);
|
|
|
|
TLogger::instance()->addMessage(msg);
|
|
|
|
} catch (...) {
|
|
|
|
}
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TLogger::Stream &TLogger::Stream::operator<<(std::string v) {
|
|
|
|
m_text += v;
|
|
|
|
return *this;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TLogger::Stream &TLogger::Stream::operator<<(int v) {
|
|
|
|
m_text += std::to_string(v);
|
|
|
|
return *this;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TLogger::Stream &TLogger::Stream::operator<<(double v) {
|
|
|
|
m_text += std::to_string(v);
|
|
|
|
return *this;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TLogger::Stream &TLogger::Stream::operator<<(const TFilePath &v) {
|
|
|
|
m_text += v.getQString().toStdString();
|
|
|
|
return *this;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|