Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: log.hxx
//
// Contents: Simple thread safe logging routine.
//
// Classes: CLog
//
// History: 02-10-94 DavidMun Created
//
//----------------------------------------------------------------------------
#ifndef _LOG_HXX
#define _LOG_HXX
//
// Handy array size utility macro
//
#define NUM_ELEMS(x) (sizeof(x) / sizeof((x)[0]))
//
// Misc constants
//
// BANNER_WIDTH - the width of the lines written to the log. Except for
// LOG_TEXT lines, all lines are wrapped at this column
//
// CCH_MAX_LOG_STRING - max size of logged string
//
// BANNER_WIDTH_EQUALS - BANNER_WIDTH '=' characters
//
// BANNER_WIDTH_DASH - BANNER_WIDTH '-' characters
//
// DEFAULT_LOGFILE - default value for ctor log filename
//
const ULONG BANNER_WIDTH = 79; const ULONG CCH_MAX_LOG_STRING = 1024; const CHAR BANNER_WIDTH_EQUALS[] = "==============================================================================="; const CHAR BANNER_WIDTH_DASH[] = "-------------------------------------------------------------------------------"; const CHAR DEFAULT_LOGFILE[] = "default.log";
//
// Logging destination bits used with Write() and SetDefaultDestinations()
//
// LOG_TOCONSOLE - log to the console (i.e., use printf()).
//
// LOG_TOFILE - log to a file
//
// LOG_TODEBUG - log to debugger
//
const ULONG LOG_TOCONSOLE = 0x10000000; const ULONG LOG_TOFILE = 0x20000000; const ULONG LOG_TODEBUG = 0x40000000;
const ULONG LOG_DESTINATIONBITS = 0xF0000000;
//
// Logging info levels. If the bitwise and of the log infolevel and the
// infolevel passed to Write is nonzero, the string passed to Write is
// logged, otherwise it goes to the bit bucket.
//
// No more than one of these infolevel bits should be on.
//
//
const ULONG LOG_PASS = 0x00000001; const ULONG LOG_FAIL = 0x00000002; const ULONG LOG_WARN = 0x00000004; const ULONG LOG_START = 0x00000008; const ULONG LOG_INFO = 0x00000010; const ULONG LOG_TEXT = 0x00000020; const ULONG LOG_END = 0x00000040; const ULONG LOG_SKIP = 0x00000080; const ULONG LOG_ABORT = 0x00000100; const ULONG LOG_ERROR = 0x00000200; const ULONG LOG_TRACE = 0x00000400; const ULONG LOG_PERF = 0x00000800; const ULONG LOG_DEBUG = 0x00001000;
const ULONG LOG_RESERVEDBITS = 0xF0001FFF;
const CHAR START_PREFIX[] = "[START %s]"; const CHAR END_PREFIX[] = "[END %s]"; const CHAR PASS_PREFIX[] = "[PASS ] "; const CHAR FAIL_PREFIX[] = "[FAIL ] "; const CHAR WARN_PREFIX[] = "[WARN ] "; const CHAR INFO_PREFIX[] = "[INFO ] "; const CHAR SKIP_PREFIX[] = "[SKIP ] "; const CHAR ABORT_PREFIX[] = "[ABORT] "; const CHAR ERROR_PREFIX[] = "[ERROR] "; const CHAR TRACE_PREFIX[] = "[TRACE] "; const CHAR PERF_PREFIX[] = "[PERF ] "; const CHAR DEBUG_PREFIX[] = "[DEBUG] ";
const ULONG CCH_MAX_START_MESSAGE = BANNER_WIDTH - NUM_ELEMS(START_PREFIX);
//+---------------------------------------------------------------------------
//
// Class: CLog
//
// Purpose: Provide simple thread safe logging support.
//
// Interface: CLog - ctor
// ~CLog - dtor
// SetDefaultDestinations - set default output locations
// GetDefaultDestinations - get default output locations
// SetFile - set log file name
// SetInfoLevel - set infolevel mask bits
// GetInfoLevel - get infolevel mask bits
// Write - write a line in the log file
//
// History: 02-10-94 DavidMun Created
//
//----------------------------------------------------------------------------
class CLog { public:
CLog( const CHAR *szTestTitle, const CHAR *szLogFile = DEFAULT_LOGFILE, ULONG flDefaultDestinations = LOG_TOCONSOLE, ULONG flLogInfoLevel = (LOG_RESERVEDBITS & ~LOG_DESTINATIONBITS));
~CLog();
inline ULONG SetDefaultDestinations(ULONG flDestinations);
inline ULONG GetDefaultDestinations() const;
VOID SetFile(const CHAR *szNewFilename);
VOID SetFile(const WCHAR *wszNewFilename);
inline const CHAR *GetFile() const;
ULONG SetInfoLevel(ULONG flNewInfoLevel);
inline ULONG GetInfoLevel() const;
VOID Write(ULONG flLevelAndDest, const CHAR *pszFmt, ...);
inline VOID SuppressHeaderFooter(BOOL fSuppress);
private:
VOID _LogPrefix( ULONG flLevel, const CHAR *szLastStart, CHAR *pszPrefix);
VOID _LogHeader(); VOID _LogFooter();
CRITICAL_SECTION _critsec;
BOOL _fLoggedHeader; BOOL _fSuppress; ULONG _cLogPass; ULONG _cLogFail; ULONG _cLogWarn; ULONG _cLogStart; ULONG _cLogInfo; ULONG _cLogSkip; ULONG _cLogAbort; ULONG _cLogError; ULONG _cLogOther;
ULONG _flDefaultDestinations; ULONG _flInfoLevel; CHAR _szLogFile[MAX_PATH]; CHAR _szTestTitle[BANNER_WIDTH / 2]; // enforce short test titles
};
//+---------------------------------------------------------------------------
//
// Member: CLog::GetFile
//
// Synopsis: Return name of log file.
//
// History: 04-01-95 DavidMun Created
//
//----------------------------------------------------------------------------
inline const CHAR *CLog::GetFile() const { return _szLogFile; }
//+---------------------------------------------------------------------------
//
// Member: CLog::SuppressHeaderFooter
//
// Synopsis: Call this with TRUE before logging anything to prevent
// the header/footer from being logged.
//
// Arguments: [fSuppress] - if TRUE, no header or footer will be logged.
//
// History: 04-01-95 DavidMun Created
//
//----------------------------------------------------------------------------
inline VOID CLog::SuppressHeaderFooter(BOOL fSuppress) { _fSuppress = fSuppress; }
//+---------------------------------------------------------------------------
//
// Member: CLog::SetDefaultDestinations
//
// Synopsis: Set the default destinations for logging
//
// Arguments: [flDestinations] - LOG_TO* bits
//
// Returns: Previous default destination bits
//
// History: 02-11-94 DavidMun Created
//
//----------------------------------------------------------------------------
inline ULONG CLog::SetDefaultDestinations(ULONG flDestinations) { ULONG flOldDefault = _flDefaultDestinations; _flDefaultDestinations = flDestinations & LOG_DESTINATIONBITS; return flOldDefault; }
//+---------------------------------------------------------------------------
//
// Member: CLog::GetDefaultDestinations
//
// Synopsis: Return default destination bits
//
// History: 02-11-94 DavidMun Created
//
//----------------------------------------------------------------------------
inline ULONG CLog::GetDefaultDestinations() const { return _flDefaultDestinations; }
//+---------------------------------------------------------------------------
//
// Member: CLog::GetInfoLevel
//
// Synopsis: Return infolevel mask
//
// History: 02-11-94 DavidMun Created
//
//----------------------------------------------------------------------------
inline ULONG CLog::GetInfoLevel() const { return _flInfoLevel; }
//
// Consts and declaration for LogIt() helper func
//
const ULONG MAX_LOGIT_MSG = 1024UL; const HRESULT EXPECT_SUCCEEDED = (HRESULT) -1;
VOID LogIt(HRESULT hrFound, HRESULT hrExpected, CHAR *szFormat, ...);
#endif
|