| |
| |
| #include "toonz/tlog.h" |
| |
| #include "tfilepath_io.h" |
| |
| #include <QDateTime> |
| |
| #ifdef WIN32 |
| #pragma warning(disable : 4996) |
| #include <windows.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <tchar.h> |
| |
| #else |
| #include <syslog.h> |
| #include <unistd.h> |
| #include <sys/timeb.h> |
| #endif |
| |
| #include "tthreadmessage.h" |
| #include "tsystem.h" |
| #include <fstream> |
| #include "tmsgcore.h" |
| |
| using namespace TSysLog; |
| namespace |
| { |
| |
| enum LEVEL { |
| LEVEL_SUCCESS, |
| LEVEL_ERROR, |
| LEVEL_WARNING, |
| LEVEL_INFO |
| }; |
| |
| #ifdef WIN32 |
| WORD Level2WinEventType(LEVEL level) |
| { |
| switch (level) { |
| case LEVEL_SUCCESS: |
| return EVENTLOG_SUCCESS; |
| case LEVEL_ERROR: |
| return EVENTLOG_ERROR_TYPE; |
| case LEVEL_WARNING: |
| return EVENTLOG_WARNING_TYPE; |
| case LEVEL_INFO: |
| return EVENTLOG_INFORMATION_TYPE; |
| |
| |
| default: |
| return LEVEL_WARNING; |
| } |
| } |
| #else |
| int Level2XPriority(LEVEL level) |
| { |
| switch (level) { |
| case LEVEL_SUCCESS: |
| return LOG_INFO; |
| case LEVEL_ERROR: |
| return LOG_ERR; |
| case LEVEL_WARNING: |
| return LOG_WARNING; |
| case LEVEL_INFO: |
| return LOG_INFO; |
| default: |
| return LEVEL_WARNING; |
| } |
| } |
| #endif |
| |
| void notify(LEVEL level, const string &msg) |
| { |
| #ifdef WIN32 |
| TCHAR buf[_MAX_PATH + 1]; |
| |
| GetModuleFileName(0, buf, _MAX_PATH); |
| |
| HANDLE handle = RegisterEventSource(NULL, |
| TFilePath(buf).getName().c_str()); |
| |
| LPCTSTR lpszStrings[2]; |
| TCHAR szMsg[256]; |
| DWORD dwErr = 1; |
| _stprintf(szMsg, TEXT("%s error: %d"), "appname", dwErr); |
| |
| lpszStrings[0] = |
| lpszStrings[1] = msg.c_str(); |
| ReportEvent(handle, |
| Level2WinEventType(level), |
| 0, |
| dwErr, |
| NULL, |
| 1, |
| 0, |
| lpszStrings, |
| NULL); |
| |
| DeregisterEventSource(handle); |
| |
| #else |
| syslog(Level2XPriority(level), msg.c_str()); |
| #endif |
| } |
| |
| static TThread::Mutex MyMutex; |
| } |
| |
| |
| |
| void TSysLog::success(const string &msg) |
| { |
| QMutexLocker sl(&MyMutex); |
| notify(LEVEL_SUCCESS, msg); |
| } |
| |
| |
| |
| void TSysLog::warning(const string &msg) |
| { |
| QMutexLocker sl(&MyMutex); |
| notify(LEVEL_WARNING, msg); |
| } |
| |
| |
| |
| void TSysLog::error(const string &msg) |
| { |
| QMutexLocker sl(&MyMutex); |
| notify(LEVEL_ERROR, msg); |
| } |
| |
| |
| |
| void TSysLog::info(const string &msg) |
| { |
| QMutexLocker sl(&MyMutex); |
| notify(LEVEL_INFO, msg); |
| } |
| |
| |
| |
| class TUserLogAppend::Imp |
| { |
| public: |
| Imp() : m_os(&std::cout), m_streamOwner(false) {} |
| |
| Imp(const TFilePath &fp) |
| : m_streamOwner(true) |
| { |
| TFileStatus fs(fp); |
| if (fs.doesExist()) |
| m_os = new Tofstream(fp, true); |
| else |
| m_os = new Tofstream(fp); |
| } |
| |
| ~Imp() |
| { |
| if (m_streamOwner) |
| delete m_os; |
| } |
| |
| void write(const string &msg); |
| |
| TThread::Mutex m_mutex; |
| std::ostream *m_os; |
| bool m_streamOwner; |
| }; |
| |
| |
| |
| void TUserLogAppend::Imp::write(const string &msg) |
| { |
| QMutexLocker sl(&m_mutex); |
| *m_os << msg.c_str(); |
| m_os->flush(); |
| } |
| |
| |
| |
| namespace |
| { |
| |
| |
| |
| string myGetCurrentTime() |
| { |
| QString tmp = QTime::currentTime().toString("hh:mm:ss"); |
| return tmp.toStdString(); |
| } |
| |
| } |
| |
| |
| |
| TUserLogAppend::TUserLogAppend() : m_imp(new Imp()) |
| { |
| } |
| |
| |
| |
| TUserLogAppend::TUserLogAppend(const TFilePath &fp) : m_imp(new Imp(fp)) |
| { |
| } |
| |
| |
| |
| TUserLogAppend::~TUserLogAppend() |
| { |
| |
| } |
| |
| |
| |
| void TUserLogAppend::warning(const string &msg) |
| { |
| DVGui::MsgBox(DVGui::WARNING, QString::fromStdString(msg)); |
| |
| string fullMsg(myGetCurrentTime()); |
| fullMsg += " WRN:"; |
| fullMsg += "\n"; |
| fullMsg += msg; |
| fullMsg += "\n"; |
| m_imp->write(fullMsg); |
| } |
| |
| |
| |
| void TUserLogAppend::error(const string &msg) |
| { |
| DVGui::MsgBox(DVGui::CRITICAL, QString::fromStdString(msg)); |
| string fullMsg(myGetCurrentTime()); |
| fullMsg += " ERR:"; |
| fullMsg += "\n"; |
| fullMsg += msg; |
| fullMsg += "\n"; |
| m_imp->write(fullMsg); |
| } |
| |
| |
| |
| void TUserLogAppend::info(const string &msg) |
| { |
| string fullMsg(""); |
| |
| |
| fullMsg += msg; |
| fullMsg += "\n"; |
| m_imp->write(fullMsg); |
| } |
| |