tahoma2d/toonz/sources/common/tsystem/tlogger.cpp

121 lines
2.7 KiB
C++
Raw Normal View History

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;
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
}
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
}