#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 std::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 std::string &msg)
{
QMutexLocker sl(&MyMutex);
notify(LEVEL_SUCCESS, msg);
}
//------------------------------------------------------------------------------
void TSysLog::warning(const std::string &msg)
{
QMutexLocker sl(&MyMutex);
notify(LEVEL_WARNING, msg);
}
//------------------------------------------------------------------------------
void TSysLog::error(const std::string &msg)
{
QMutexLocker sl(&MyMutex);
notify(LEVEL_ERROR, msg);
}
//------------------------------------------------------------------------------
void TSysLog::info(const std::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 std::string &msg);
TThread::Mutex m_mutex;
std::ostream *m_os;
bool m_streamOwner;
};
//------------------------------------------------------------------------------
void TUserLogAppend::Imp::write(const std::string &msg)
{
QMutexLocker sl(&m_mutex);
*m_os << msg.c_str();
m_os->flush();
}
//--------------------------------------------------------------------
namespace
{
//--------------------------------------------------------------------
std::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()
{
}
//------------------------------------------------------------------------------
void TUserLogAppend::warning(const std::string &msg)
{
DVGui::warning(QString::fromStdString(msg));
std::string fullMsg(myGetCurrentTime());
fullMsg += " WRN:";
fullMsg += "\n";
fullMsg += msg;
fullMsg += "\n";
m_imp->write(fullMsg);
}
//------------------------------------------------------------------------------
void TUserLogAppend::error(const std::string &msg)
{
DVGui::error(QString::fromStdString(msg));
std::string fullMsg(myGetCurrentTime());
fullMsg += " ERR:";
fullMsg += "\n";
fullMsg += msg;
fullMsg += "\n";
m_imp->write(fullMsg);
}
//------------------------------------------------------------------------------
void TUserLogAppend::info(const std::string &msg)
{
std::string fullMsg("");
//fullMsg += " INF:";
//fullMsg += "\n";
fullMsg += msg;
fullMsg += "\n";
m_imp->write(fullMsg);
}