|
|
#include <stdarg.h>
#include "AppManDebug.h"
#if _TRACEON == TRUE
#pragma message("Trace is on")
CAppManDebugHandler g_oDebugHandler; CHAR g_szDebugString[256];
#define APPMAN_REG_DBG
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
DWORD GetExternalMask(const DWORD dwMsgType) { return (DBG_EXTERNAL & dwMsgType); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
DWORD GetLevel(const DWORD dwMsgType) { DWORD dwLevel = 0;
if ((DBG_ERROR | DBG_THROW | DBG_CATCH) & dwMsgType) { dwLevel = 0; } else if (DBG_WARNING & dwMsgType) { dwLevel = 1; } else if ((DBG_FUNCENTRY | DBG_FUNCEXIT | DBG_CONSTRUCTOR | DBG_DESTRUCTOR) & dwMsgType) { dwLevel = 2; } else { dwLevel = 5; }
return dwLevel; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
DWORD GetSourceMask(const DWORD dwMsgType) { return (DBG_ALL_MODULES & dwMsgType); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
extern CHAR * MakeDebugString(const CHAR * szFormat, ...) { va_list ArgumentList;
if (NULL != szFormat) { va_start(ArgumentList, szFormat); _vsnprintf(g_szDebugString, 256, szFormat, ArgumentList); va_end(ArgumentList); }
return g_szDebugString; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
CAppManDebugHandler::CAppManDebugHandler(void) { m_fDebugInitialized = FALSE; m_dwDebugLevel = 0; m_dwDebugInternal = 0; m_dwSourceFlags = 0xffffffff; m_dwOperationalFlags = OP_NOTHING; m_dwReportMode = _CRTDBG_MODE_DEBUG; m_dwFunctionDepth = 0; strcpy(m_szOutputFilename,"c:\\AppManDebug.txt"); m_MutexHandle = CreateMutex(NULL, FALSE, "AppManDebug"); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
CAppManDebugHandler::~CAppManDebugHandler(void) { CloseHandle(m_MutexHandle); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
void CAppManDebugHandler::InitDebug(void) { DWORD dwType; DWORD dwSize; HKEY hRegistryKey = NULL; BYTE cBuffer[512];
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGPATH_APPMAN, 0, KEY_READ, &hRegistryKey)) { //
// What is the debug level
//
dwSize = sizeof(cBuffer); if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "Debug", NULL, &dwType, (LPBYTE) cBuffer, &dwSize)) { if ((REG_DWORD == dwType)&&(sizeof(DWORD) == dwSize)) { m_dwDebugLevel = *((LPDWORD) cBuffer); } }
//
// What is the debug level
//
dwSize = sizeof(cBuffer); if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "DebugInternal", NULL, &dwType, (LPBYTE) cBuffer, &dwSize)) { if ((REG_DWORD == dwType)&&(sizeof(DWORD) == dwSize)) { m_dwDebugInternal = *((LPDWORD) cBuffer); } }
//
// What is the DebugSourceFlag
//
dwSize = sizeof(cBuffer); if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "DebugSourceFlags", NULL, &dwType, (LPBYTE) cBuffer, &dwSize)) { if ((REG_DWORD == dwType)&&(sizeof(DWORD) == dwSize)) { m_dwSourceFlags = *((LPDWORD) cBuffer); } }
//
// What is the DebugOperationFlags
//
dwSize = sizeof(cBuffer); if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "DebugOperationFlags", NULL, &dwType, (LPBYTE) cBuffer, &dwSize)) { if ((REG_DWORD == dwType)&&(sizeof(DWORD) == dwSize)) { m_dwOperationalFlags = *((LPDWORD) cBuffer); } }
//
// What is the DebugReportMode
//
// _CRTDBG_MODE_FILE 0x00000001
// _CRTDBG_MODE_DEBUG 0x00000002
// _CRTDBG_MODE_WNDW 0x00000004
//
dwSize = sizeof(cBuffer); if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "DebugReportMode", NULL, &dwType, (LPBYTE) cBuffer, &dwSize)) { if ((REG_DWORD == dwType)&&(sizeof(DWORD) == dwSize)) { m_dwReportMode = *((LPDWORD) cBuffer); } }
//
// What is the DebugOutputFilename
//
dwSize = sizeof(cBuffer); if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "DebugOutputFilename", NULL, &dwType, (LPBYTE) cBuffer, &dwSize)) { if ((REG_SZ == dwType)&&(sizeof(DWORD) == dwSize)) { strcpy(m_szOutputFilename, (LPCSTR) cBuffer); } }
//
// Check that the filename is valid and can be opened
//
if (_CRTDBG_MODE_FILE & m_dwReportMode) { HANDLE hFile;
hFile = CreateFile(m_szOutputFilename, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (NULL == hFile) { m_dwReportMode &= ~_CRTDBG_MODE_FILE; } else { CloseHandle(hFile); } }
//
// Close the registry key
//
RegCloseKey(hRegistryKey);
//
// We are ready
//
m_fDebugInitialized = TRUE; } }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
void CAppManDebugHandler::DebugPrintf(const DWORD dwMsgType, const DWORD dwLineNumber, LPCSTR szFilename, const TCHAR * szFormat, ...) { va_list sVariableList; DWORD dwProcessId, dwThreadId; SYSTEMTIME sSystemTime; CHAR szHeader[512]; CHAR szBaseMessage[512]; CHAR szIntermediateString[1024]; CHAR szOutputString[1024];
//
// Initialize the debug spew
//
if (!m_fDebugInitialized) { InitDebug(); m_fDebugInitialized = TRUE; }
if (WAIT_TIMEOUT != WaitForSingleObject(m_MutexHandle, 1000)) {
//
// Is this an internal message. If so, should we print it out
//
if (((0 == m_dwDebugInternal)&&(GetExternalMask(dwMsgType)))||(0 != m_dwDebugInternal)) { if (m_dwDebugLevel >= GetLevel(dwMsgType)) { if (m_dwSourceFlags & GetSourceMask(dwMsgType)) { //
// Build the main output message
//
va_start(sVariableList, szFormat); _vsnprintf(szBaseMessage, 512, szFormat, sVariableList); va_end(sVariableList);
//
// Build szTmpString
//
ZeroMemory(szHeader, sizeof(szHeader)); memset(szHeader, 32, m_dwFunctionDepth * 2); szHeader[m_dwFunctionDepth * 2] = 0; switch(dwMsgType & DBG_LEVEL) { case DBG_ERROR : wsprintfA(szIntermediateString, "%s[ ERROR ] %s", szHeader, szBaseMessage); break;
case DBG_THROW : wsprintfA(szIntermediateString, "%s[ THROW ] %s", szHeader, szBaseMessage); break;
case DBG_CATCH : wsprintfA(szIntermediateString, "%s[ CATCH ] %s", szHeader, szBaseMessage); break;
case DBG_WARNING : wsprintfA(szIntermediateString, "%s[ WARNING ] %s", szHeader, szBaseMessage); break;
case DBG_FUNCENTRY : wsprintfA(szIntermediateString, "%s[vvvv] %s", szHeader, szBaseMessage); m_dwFunctionDepth++; break;
case DBG_FUNCEXIT : m_dwFunctionDepth--; ZeroMemory(szHeader, sizeof(szHeader)); memset(szHeader, 32, m_dwFunctionDepth * 2); szHeader[m_dwFunctionDepth * 2] = 0; wsprintfA(szIntermediateString, "%s[^^^^] %s", szHeader, szBaseMessage); break;
case DBG_CONSTRUCTOR : wsprintfA(szIntermediateString, "%s[ CONSTRUCTOR ] %s", szHeader, szBaseMessage); m_dwFunctionDepth++; break;
case DBG_DESTRUCTOR : m_dwFunctionDepth--; ZeroMemory(szHeader, sizeof(szHeader)); memset(szHeader, 32, m_dwFunctionDepth * 2); szHeader[m_dwFunctionDepth * 2] = 0; wsprintfA(szIntermediateString, "%s[ DESTRUCTOR ] %s", szHeader, szBaseMessage); break;
default : wsprintfA(szIntermediateString, "%s> %s", szHeader, szBaseMessage); break; }
if (OP_OUTPUTTIMESTAMP & m_dwOperationalFlags) { if (OP_OUTPUTFILENAME & m_dwOperationalFlags) { if (OP_OUTPUTLINENUMBER & m_dwOperationalFlags) { if (OP_OUTPUTPTID & m_dwOperationalFlags) { //
// OUTPUTPTID, OUTPUTLINENUMBER, OUTPUTFILENAME, OUTPUTTIMESTAMP
//
dwProcessId = GetCurrentProcessId(); dwThreadId = GetCurrentThreadId(); GetLocalTime(&sSystemTime); wsprintfA(szOutputString, "[p%05d][t%05d] [Time %02d:%02d:%02d:%02d %02d-%02d-%04d] File %032s Line %05d %s\r\n", dwProcessId, dwThreadId, sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szFilename, dwLineNumber, szIntermediateString); } else { //
// OUTPUTLINENUMBER, OUTPUTFILENAME, OUTPUTTIMESTAMP
//
GetLocalTime(&sSystemTime); wsprintfA(szOutputString, "[Time %02d:%02d:%02d:%02d %02d-%02d-%04d] File %032s Line %05d %s\r\n", sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szFilename, dwLineNumber, szIntermediateString); } } else { if (OP_OUTPUTPTID & m_dwOperationalFlags) { //
// OUTPUTPTID, OUTPUTFILENAME, OUTPUTTIMESTAMP
//
dwProcessId = GetCurrentProcessId(); dwThreadId = GetCurrentThreadId(); GetLocalTime(&sSystemTime); wsprintfA(szOutputString, "[p%05d][t%05d] [Time %02d:%02d:%02d:%02d %02d-%02d-%04d] File %032s %s\r\n", dwProcessId, dwThreadId, sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szFilename, szIntermediateString); } else { //
// OUTPUTFILENAME, OUTPUTTIMESTAMP
//
GetLocalTime(&sSystemTime); wsprintfA(szOutputString, "[Time %02d:%02d:%02d:%02d %02d-%02d-%04d] File %032s %s\r\n", sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szFilename, szIntermediateString); } } } else { if (OP_OUTPUTLINENUMBER & m_dwOperationalFlags) { if (OP_OUTPUTPTID & m_dwOperationalFlags) { //
// OUTPUTPTID, OUTPUTLINENUMBER, OUTPUTTIMESTAMP
//
dwProcessId = GetCurrentProcessId(); dwThreadId = GetCurrentThreadId(); GetLocalTime(&sSystemTime); wsprintfA(szOutputString, "[p%05d][t%05d] [Time %02d:%02d:%02d:%02d %02d-%02d-%04d] Line %05d %s\r\n", dwProcessId, dwThreadId, sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, dwLineNumber, szIntermediateString); } else { //
// OUTPUTLINENUMBER, OUTPUTTIMESTAMP
//
GetLocalTime(&sSystemTime); wsprintfA(szOutputString, "[Time %02d:%02d:%02d:%02d %02d-%02d-%04d] Line %05d %s\r\n", sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, dwLineNumber, szIntermediateString); } } else { if (OP_OUTPUTPTID & m_dwOperationalFlags) { //
// OUTPUTPTID, OUTPUTTIMESTAMP
//
dwProcessId = GetCurrentProcessId(); dwThreadId = GetCurrentThreadId(); GetLocalTime(&sSystemTime); wsprintfA(szOutputString, "[p%05d][t%05d] [Time %02d:%02d:%02d:%02d %02d-%02d-%04d] %05d %s\r\n", dwProcessId, dwThreadId, sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szIntermediateString); } else { //
// OUTPUTTIMESTAMP
//
GetLocalTime(&sSystemTime); wsprintfA(szOutputString, "[Time %02d:%02d:%02d:%02d %02d-%02d-%04d] %s\r\n", sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szIntermediateString); } } } } else { if (OP_OUTPUTFILENAME & m_dwOperationalFlags) { if (OP_OUTPUTLINENUMBER & m_dwOperationalFlags) { if (OP_OUTPUTPTID & m_dwOperationalFlags) { //
// OUTPUTPTID, OUTPUTLINENUMBER, OUTPUTFILENAME
//
dwProcessId = GetCurrentProcessId(); dwThreadId = GetCurrentThreadId(); wsprintfA(szOutputString, "[p%05d][t%05d] File %032s Line %05d %s\r\n", dwProcessId, dwThreadId, szFilename, dwLineNumber, szIntermediateString); } else { //
// OUTPUTLINENUMBER, OUTPUTFILENAME
//
wsprintfA(szOutputString, "File %032s Line %05d %s\r\n", szFilename, dwLineNumber, szIntermediateString); } } else { if (OP_OUTPUTPTID & m_dwOperationalFlags) { //
// OUTPUTPTID, OUTPUTFILENAME
//
dwProcessId = GetCurrentProcessId(); dwThreadId = GetCurrentThreadId(); wsprintfA(szOutputString, "[p%05d][t%05d] File %032s %s\r\n", dwProcessId, dwThreadId, szFilename, szIntermediateString); } else { //
// OUTPUTFILENAME
//
wsprintfA(szOutputString, "File %032s %s\r\n", szFilename, szIntermediateString); } } } else { if (OP_OUTPUTLINENUMBER & m_dwOperationalFlags) { if (OP_OUTPUTPTID & m_dwOperationalFlags) { //
// OUTPUTPTID, OUTPUTLINENUMBER
//
dwProcessId = GetCurrentProcessId(); dwThreadId = GetCurrentThreadId(); wsprintfA(szOutputString, "[p%05d][t%05d] Line %05d %s\r\n", dwProcessId, dwThreadId, dwLineNumber, szIntermediateString); } else { //
// OUTPUTLINENUMBER
//
wsprintfA(szOutputString, "Line %05d %s\r\n", dwLineNumber, szIntermediateString); } } else { if (OP_OUTPUTPTID & m_dwOperationalFlags) { //
// OUTPUTPTID
//
dwProcessId = GetCurrentProcessId(); dwThreadId = GetCurrentThreadId(); wsprintfA(szOutputString, "[p%05d][t%05d] %s\r\n", dwProcessId, dwThreadId, szIntermediateString); } else { //
// NONE
//
wsprintfA(szOutputString, "%s\r\n", szIntermediateString); } } } }
//
// Should we output to file
//
if (_CRTDBG_MODE_FILE & m_dwReportMode) { HANDLE hFileHandle; DWORD dwBytesWritten;
hFileHandle = CreateFile(m_szOutputFilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE != hFileHandle) { SetFilePointer(hFileHandle, 0, NULL, FILE_END); WriteFile(hFileHandle, szOutputString, strlen(szOutputString), &dwBytesWritten, NULL); CloseHandle(hFileHandle); } }
//
// Should we output to the debug window
//
if ((_CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW) & m_dwReportMode) { OutputDebugString(szOutputString); } } } }
//
// Release the mutex
//
ReleaseMutex(m_MutexHandle); } }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
void CAppManDebugHandler::DebugPrintfW(const DWORD dwMsgType, const DWORD dwLineNumber, LPCSTR szFilename, const wchar_t * wszFormat, ...) { CWin32API oWin32API; va_list sVariableList; WCHAR wszMessage[512]; CHAR szMessage[512];
va_start(sVariableList, wszFormat); _vsnwprintf(wszMessage, 512, wszFormat, sVariableList); oWin32API.WideCharToMultiByte(wszMessage, 512, szMessage, 512); va_end(sVariableList);
DebugPrintf(dwMsgType, dwLineNumber, szFilename, szMessage); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
void CAppManDebugHandler::SetSourceFlags(const DWORD dwFilter) { m_dwSourceFlags = dwFilter; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
void CAppManDebugHandler::SetOperationalFlags(const DWORD dwOperationalFlags) { m_dwOperationalFlags = dwOperationalFlags; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
void CAppManDebugHandler::SetOutputFilename(LPCSTR szFilename) { wsprintfA(m_szOutputFilename, szFilename); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
DWORD CAppManDebugHandler::GetSourceFlags(void) { return m_dwSourceFlags; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
DWORD CAppManDebugHandler::GetOperationalFlags(void) { return m_dwOperationalFlags; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
void CAppManDebugHandler::GetOutputFilename(LPSTR szFilename) { wsprintfA(szFilename, m_szOutputFilename); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
CAutoTrace::CAutoTrace(DWORD dwModule, LPSTR lpFunctionName, INT iLine, LPSTR lpFileName) { //
// Save the function name
//
m_dwModule = dwModule; strncpy(m_szFunctionName, lpFunctionName, MAX_PATH_CHARCOUNT); strncpy(m_szFilename, lpFileName, MAX_PATH_CHARCOUNT); g_oDebugHandler.DebugPrintf(m_dwModule | DBG_FUNCENTRY, iLine, m_szFilename, m_szFunctionName); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
CAutoTrace::~CAutoTrace(void) { g_oDebugHandler.DebugPrintf(m_dwModule | DBG_FUNCEXIT, NULL, m_szFilename, m_szFunctionName); }
#endif // _TRACEON
|