/* * This is a part of the BugTrap package. * Copyright (c) 2005-2009 IntelleSoft. * All rights reserved. * * Description: Base class for custom log file. * Author: Maksim Pyatkovskiy. * * This source code is only intended as a supplement to the * BugTrap package reference and related electronic documentation * provided with the product. See these sources for detailed * information regarding the BugTrap package. */ #pragma once #include "BugTrap.h" #include "BugTrapUtils.h" #include "StrStream.h" #include "Buffer.h" /** * @brief Base class for custom log file. */ class CLogFile { public: /// Entry mode. enum ENTRY_MODE { /// Records are appended to the end of the file. EM_APPEND, /// Records are inserted at the beginning of the file. EM_INSERT }; /// Initialize the object. CLogFile(void); /// Destroy the object. virtual ~CLogFile(void); /// Get custom log file name. PCTSTR GetLogFileName(void); /// Set custom log file name. void SetLogFileName(PCTSTR pszLogFileName); /// Get number of records in custom log file. virtual DWORD GetLogSizeInEntries(void) const; /// Set number of records in custom log file. virtual BOOL SetLogSizeInEntries(DWORD dwLogSizeInEntries); /// Get maximum log file size in bytes. virtual DWORD GetLogSizeInBytes(void) const; /// Set maximum log file size in bytes. virtual BOOL SetLogSizeInBytes(DWORD dwLogSizeInBytes); /// Return true if time stamp is added to every log entry. DWORD GetLogFlags(void) const; /// Set true if time stamp is added to every log entry. BOOL SetLogFlags(DWORD dwLogFlags); /// Return minimal log level accepted by tracing functions. BUGTRAP_LOGLEVEL GetLogLevel(void) const; /// Set minimal log level accepted by tracing functions. BOOL SetLogLevel(BUGTRAP_LOGLEVEL eLogLevel); /// Get echo mode. DWORD GetLogEchoMode(void); /// Set echo mode. BOOL SetLogEchoMode(DWORD dwLogEchoMode); /// Take possession of the log file. void CaptureObject(void); /// Release possession of the log file. void ReleaseObject(void); /// Load Entries into memory. virtual BOOL LoadEntries(void) = 0; /// Save entries into disk. virtual BOOL SaveEntries(BOOL bCrash) = 0; /// Clear log entries. virtual BOOL ClearEntries(void) = 0; /// Close log file. virtual void Close(void) = 0; /// Add new log entry. virtual BOOL WriteLogEntry(BUGTRAP_LOGLEVEL eLogLevel, ENTRY_MODE eEntryMode, CRITICAL_SECTION& rcsConsoleAccess, PCTSTR pszEntry) = 0; /// Add new log entry. BOOL WriteLogEntryF(BUGTRAP_LOGLEVEL eLogLevel, ENTRY_MODE eEntryMode, CRITICAL_SECTION& rcsConsoleAccess, PCTSTR pszFormat, ...); /// Add new log entry. BOOL WriteLogEntryV(BUGTRAP_LOGLEVEL eLogLevel, ENTRY_MODE eEntryMode, CRITICAL_SECTION& rcsConsoleAccess, PCTSTR pszFormat, va_list argList); protected: /// Get default log file extension. virtual PCTSTR GetLogFileExtension(void) const = 0; /// Get last entry text. PCTSTR GetEntryText(void) const; /// Get log level prefix. static PCTSTR GetLogLevelPrefix(BUGTRAP_LOGLEVEL eLogLevel); /// Get time statistics. static void GetTimeStatistics(const SYSTEMTIME* pSystemTime, PTSTR pszTimeStatistics, DWORD dwTimeStatisticsSize); /// Fill entry text. void FillEntryText(BUGTRAP_LOGLEVEL eLogLevel, const SYSTEMTIME* pSystemTime, PCTSTR pszEntry); /// Write text to console. void WriteTextToConsole(HANDLE hConsole); /// Write text to debug console. void WriteTextToDebugConsole(void); /// Get output console handle. HANDLE GetConsoleHandle(void) const; /// Write log entry to the console. BOOL WriteLogEntryToConsole(BUGTRAP_LOGLEVEL eLogLevel, const SYSTEMTIME* pSystemTime, CRITICAL_SECTION& rcsConsoleAccess, PCTSTR pszEntry); private: /// Protects the class from being accidentally copied. CLogFile(const CLogFile& rLogFile); /// Protects the class from being accidentally copied. CLogFile& operator=(const CLogFile& rLogFile); /// Set log file name to default value. BOOL CompleteLogFileName(PCTSTR pszLogFileName); /// Fill buffer with formatted string. BOOL FormatBufferV(PCTSTR pszFormat, va_list argList); /// Fill buffer with formatted string. BOOL FormatBufferF(PCTSTR pszFormat, ...); /// Custom log file name. TCHAR m_szLogFileName[MAX_PATH]; /// True if date and time stamp is added to every log entry. DWORD m_dwLogFlags; /// Echo mode. DWORD m_dwLogEchoMode; /// Minimal log level accepted by tracing functions. BUGTRAP_LOGLEVEL m_eLogLevel; /// Synchronization object. CRITICAL_SECTION m_csLogFile; /// Pre-allocated buffer for log entry text. CStrStream m_StrStream; /// Pre-allocated buffer for format string. CDynamicBuffer m_FormatBuffer; #ifndef _UNICODE /// Pre-allocated buffer for encoded console message. CDynamicBuffer m_ConsoleBufferA; /// Pre-allocated buffer for encoded console message. CDynamicBuffer m_ConsoleBufferW; #endif }; inline CLogFile::~CLogFile(void) { DeleteCriticalSection(&m_csLogFile); } /** * @return maximum number of records in log file. */ inline DWORD CLogFile::GetLogSizeInEntries(void) const { return 0; } /** * @param dwLogSizeInEntries - maximum number of records in log file. * @return true if operation is accepted. */ inline BOOL CLogFile::SetLogSizeInEntries(DWORD /*dwLogSizeInEntries*/) { return FALSE; } /** * @return maximum log file size in bytes. */ inline DWORD CLogFile::GetLogSizeInBytes(void) const { return 0; } /** * @param dwLogSizeInBytes - maximum log file size in bytes. * @return true if operation is accepted. */ inline BOOL CLogFile::SetLogSizeInBytes(DWORD /*dwLogSizeInBytes*/) { return FALSE; } inline void CLogFile::CaptureObject(void) { EnterCriticalSection(&m_csLogFile); } inline void CLogFile::ReleaseObject(void) { LeaveCriticalSection(&m_csLogFile); } /** * @return current set of log flags. */ inline DWORD CLogFile::GetLogFlags(void) const { return m_dwLogFlags; } /** * @param dwLogFlags - set of log flags. * @return true if operation was completed successfully. */ inline BOOL CLogFile::SetLogFlags(DWORD dwLogFlags) { m_dwLogFlags = dwLogFlags; return TRUE; } /** * @return minimal log level accepted by tracing functions. */ inline BUGTRAP_LOGLEVEL CLogFile::GetLogLevel(void) const { return m_eLogLevel; } /** * @param eLogLevel - minimal logl level accepted by tracing functions. * @return true if operation was completed successfully. */ inline BOOL CLogFile::SetLogLevel(BUGTRAP_LOGLEVEL eLogLevel) { m_eLogLevel = eLogLevel; return TRUE; } /** * @return current echo mode. */ inline DWORD CLogFile::GetLogEchoMode(void) { return m_dwLogEchoMode; } /** * @param dwLogEchoMode - new echo mode. * @return true if operation was completed successfully. */ inline BOOL CLogFile::SetLogEchoMode(DWORD dwLogEchoMode) { m_dwLogEchoMode = dwLogEchoMode; return TRUE; } inline void CLogFile::WriteTextToDebugConsole(void) { OutputDebugString(m_StrStream); } /** * @return last entry text. */ inline PCTSTR CLogFile::GetEntryText(void) const { return (PCTSTR)m_StrStream; } /** * @param pszLogFileName - log file name. * @return true if log file name was created and false otherwise. */ inline BOOL CLogFile::CompleteLogFileName(PCTSTR pszLogFileName) { return GetCompleteLogFileName(m_szLogFileName, pszLogFileName, GetLogFileExtension()); } /** * @param pszLogFileName - pointer to custom log file name. */ inline void CLogFile::SetLogFileName(PCTSTR pszLogFileName) { CompleteLogFileName(pszLogFileName); }