Subversion Repositories spk

Rev

Rev 227 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "log.h"

CLog *CLog::m_pInstance = 0;

CLog::CLog() : _iLevel(0), _iFilter(0), _bSaveLog(0)
{
}

CLog::~CLog()
{
}

CLog *CLog::create()
{
        if ( !m_pInstance ) {
                m_pInstance = new CLog();
        }
        return m_pInstance;
}

void CLog::release()
{
        if ( m_pInstance ) {
                delete m_pInstance;
        }
        m_pInstance = 0;
}

void CLog::log(LogType iType, int iLevel, const Utils::WString& sLogText)
{
        CLog* pLogger = CLog::create();
        pLogger->_log(iType, iLevel, sLogText);
}

void CLog::addFilter(int iType)
{
        _iFilter |= iType;
}

void CLog::setFilter(int iFilter)
{
        _iFilter = iFilter;
}

void CLog::removeFilter(int iType)
{
        _iFilter &= ~(iType);
}

void CLog::clearFilter()
{
        _iFilter = 0;
}

void CLog::displayLog(LogType iType, int iLevel, const Utils::WString &sLogText) const
{
}

void CLog::_log(LogType iType, int iLevel, const Utils::WString& sLogText)
{
        if (iLevel > _iLevel) return;
        if (!(_iFilter & iType)) return;

        if (_bSaveLog) {
                SLog* newLog = new SLog;
                newLog->sText = sLogText;
                newLog->iLevel = iLevel;
                newLog->iType = iType;
                m_lLogs.push_back(newLog);
        }

        this->displayLog(iType, iLevel, sLogText);
}


void CLog::logf(LogType iType, int iLevel, const char* sLogText, ...)
{
        char buffer[10000];
        va_list args;
        va_start(args, sLogText);
        vsprintf(buffer, sLogText, args);
        va_end(args);

        CLog::log(iType, iLevel, Utils::WString::FromString(buffer));
}

void CLog::logf(LogType iType, int iLevel, const wchar_t* sLogText, ...)
{
        wchar_t buffer[10000];
        va_list args;
        va_start(args, sLogText);
        vswprintf_s(buffer, 10000, sLogText, args);
        va_end(args);

        CLog::log(iType, iLevel, Utils::WString(buffer));
}
void CLog::_logf(LogType iType, int iLevel, const char* sLogText, ...)
{
        char buffer[10000];
        va_list args;
        va_start(args, sLogText);
        vsprintf(buffer, sLogText, args);
        va_end(args);

        this->_log(iType, iLevel, Utils::WString::FromString(buffer));
}
void CLog::_logf(LogType iType, int iLevel, const wchar_t* sLogText, ...)
{
        wchar_t buffer[10000];
        va_list args;
        va_start(args, sLogText);
        vswprintf_s(buffer, 10000, sLogText, args);
        va_end(args);

        this->_log(iType, iLevel, Utils::WString(buffer));
}

void CLog::setLevel(int iLevel)
{
        _iLevel = iLevel;
}

void CLog::clear()
{
        m_lLogs.clear(true);
}
        
const SLog *CLog::firstLog() const
{
        if ( !m_lLogs.Front() ) return NULL;
        return m_lLogs.Front()->Data();
}

int CLog::count() const
{
        return m_lLogs.size();
}

/////////////////////////////////////////////////////////////////////////////
//      File Log
///////////////////

void CFileLog::_writeLog(int iType, const Utils::WString &sLogText) const
{
        std::wofstream outFile;
        outFile.open(_sFilename.toStdWString(), std::ios::out | std::ios::app);
        if ( outFile.is_open() ) {
                outFile << _timeStamp().toStdWString() << " (" << _typeName(iType).toStdWString() << ") " << sLogText.toStdWString() << std::endl;
                outFile.close();
        }
}

Utils::WString CFileLog::_timeStamp() const
{
        std::wstringstream strm;
        time_t T = time(NULL);
        struct tm *TM = localtime(&T);
        strm << L"[" << Utils::WString::PadNumber(TM->tm_mday, 2).toStdWString() << L"/" << Utils::WString::PadNumber(TM->tm_mon+1, 2).toStdWString() << L"/" << TM->tm_year+1900 << " - " << Utils::WString::PadNumber(TM->tm_hour, 2).toStdWString() << L":" << Utils::WString::PadNumber(TM->tm_min, 2).toStdWString() << L":" << Utils::WString::PadNumber(TM->tm_sec, 2).toStdWString() << L"]";
        return strm.str();
}

Utils::WString CFileLog::_typeName(int iType) const
{
        switch(iType) {
                case Log_Install:       return L"INSTALL";
                case Log_Uninstall: return L"UNINSTALL";
                case Log_IO:            return L"IO";
                case Log_File:          return L"FILE";
                case Log_Directory:     return L"DIRECTORY";
        }
        return L"";
}