Subversion Repositories spk

Rev

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

#pragma once

#include "../Utils/WStringList.h"
#include <vector>
#include <stdarg.h>
#include <fstream>
#include <time.h>
#include <sstream>

typedef struct {
        Utils::WString  sText;
        int                             iLevel;
        int                             iType;
} SLog;

class SPKEXPORT CLog
{
public:
        typedef CLinkList<SLog> LogList;
        typedef CListNode<SLog>* LogNode;

        enum LogType {
                Log_All                 = -1,
                Log_None                = 0,
                Log_Normal              = 1,
                Log_IO                  = 2,
                Log_EditPackage = 4,
                Log_File                = 8,
                Log_Read                = 16,
                Log_Install             = 32,
                Log_Uninstall   = 64,
                Log_Directory   = 128,
        };

protected:
        // private constructor
        CLog(void);
        virtual ~CLog(void);

private:
        LogList m_lLogs;
        int             _iLevel;
        int             _iFilter;
        bool    _bSaveLog;

public:
        static CLog *m_pInstance;
        static CLog *create();
        static void release();

        static void log(LogType iType, int iLevel, const Utils::WString& sLogText);
        static void logf(LogType iType, int iLevel, const char* sLogText, ...);
        static void logf(LogType iType, int iLevel, const wchar_t* sLogText, ...);
        void _log(LogType iType, int iLevel, const Utils::WString& sLogText);
        void _logf(LogType iType, int iLevel, const char* sLogText, ...);
        void _logf(LogType iType, int iLevel, const wchar_t* sLogText, ...);

        virtual void displayLog(LogType iType, int iLevel, const Utils::WString &sLogText) const;
        void setLevel(int iLevel);
        void addFilter(int iType);
        void setFilter(int iFilter);
        void removeFilter(int iType);
        void clearFilter();

        void clear();
        const SLog *firstLog() const;
        int count() const;
};

//TODO: move this
class SPKEXPORT CConsoleLog : public CLog 
{
public:
        static CLog *create()
        {
                if ( !CLog::m_pInstance ) {
                        CLog::m_pInstance = new CConsoleLog();
                }
                return CLog::m_pInstance;
        }

        virtual ~CConsoleLog(void)
        {
        }
        virtual void displayLog(LogType iType, int iLevel, const Utils::WString &sLogText) const
        {
                wprintf(L"%s\n", sLogText.c_str());
        }
};

class SPKEXPORT CFileLog : public CLog 
{
private:
        Utils::WString _sFilename;

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

        void setFile(const Utils::WString &sFileName)
        {
                _sFilename = sFileName;
        }

        virtual ~CFileLog(void)
        {
        }
        virtual void displayLog(LogType iType, int iLevel, const Utils::WString &sLogText) const
        {
                _writeLog(iType, sLogText);
        }

private:
        void _writeLog(int iType, const Utils::WString &sLogText) const;
        Utils::WString _timeStamp() const;
        Utils::WString _formatTime(int iValue) const;
        Utils::WString _typeName(int iType) const;
};