254 lines
5.3 KiB
C++
254 lines
5.3 KiB
C++
|
|
||
|
|
||
|
#include "toonz/tlog.h"
|
||
|
//#include "tfilepath.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; // Success event
|
||
|
case LEVEL_ERROR:
|
||
|
return EVENTLOG_ERROR_TYPE; // Error event
|
||
|
case LEVEL_WARNING:
|
||
|
return EVENTLOG_WARNING_TYPE; //Warning event
|
||
|
case LEVEL_INFO:
|
||
|
return EVENTLOG_INFORMATION_TYPE; // Information event
|
||
|
// case : return EVENTLOG_AUDIT_SUCCESS Success audit event
|
||
|
// case : return EVENTLOG_AUDIT_FAILURE Failure audit event
|
||
|
default:
|
||
|
return LEVEL_WARNING;
|
||
|
}
|
||
|
}
|
||
|
#else
|
||
|
int Level2XPriority(LEVEL level)
|
||
|
{
|
||
|
switch (level) {
|
||
|
case LEVEL_SUCCESS:
|
||
|
return LOG_INFO;
|
||
|
case LEVEL_ERROR:
|
||
|
return LOG_ERR; // Errors.
|
||
|
case LEVEL_WARNING:
|
||
|
return LOG_WARNING; // Warning messages.
|
||
|
case LEVEL_INFO:
|
||
|
return LOG_INFO; // Informational messages.
|
||
|
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, // uses local computer
|
||
|
TFilePath(buf).getName().c_str()); // source name
|
||
|
|
||
|
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, // event log handle
|
||
|
Level2WinEventType(level), // event type
|
||
|
0, // category zero
|
||
|
dwErr, // event identifier
|
||
|
NULL, // no user security identifier
|
||
|
1, // one substitution string
|
||
|
0, // no data
|
||
|
lpszStrings, // pointer to string array
|
||
|
NULL); // pointer to data
|
||
|
|
||
|
DeregisterEventSource(handle);
|
||
|
|
||
|
#else
|
||
|
syslog(Level2XPriority(level), msg.c_str());
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
static TThread::Mutex MyMutex;
|
||
|
} //namespace
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
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();
|
||
|
}
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
TUserLogAppend::TUserLogAppend() : m_imp(new Imp())
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
TUserLogAppend::TUserLogAppend(const TFilePath &fp) : m_imp(new Imp(fp))
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
TUserLogAppend::~TUserLogAppend()
|
||
|
{
|
||
|
//delete m_imp;
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
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 += " INF:";
|
||
|
//fullMsg += "\n";
|
||
|
fullMsg += msg;
|
||
|
fullMsg += "\n";
|
||
|
m_imp->write(fullMsg);
|
||
|
}
|