230 lines
5.8 KiB
C++
230 lines
5.8 KiB
C++
#pragma once
|
||
|
||
#include <stdio.h>
|
||
#include <stdarg.h>
|
||
#include <stdio.h>
|
||
#include <Rtutils.h>
|
||
#include <Winsock.h>
|
||
|
||
extern DWORD g_dwTraceId;
|
||
|
||
#if defined(DBG) || defined(_DEBUG)
|
||
#define MYTRACE_ENABLE DWORD g_dwTraceId=0; int CMyDebugTrace::m_nIndent=-1;
|
||
#define MYTRACE_START(UNIQUE_NAME) g_dwTraceId = TraceRegister(UNIQUE_NAME); // TRACE_USE_FILE
|
||
#define MYTRACE_STOP TraceDeregister(g_dwTraceId);
|
||
|
||
#define MYTRACE_ENTER(MSG) CMyDebugTrace _NewMyTrace(MSG, __FILE__, __LINE__, true);
|
||
#define MYTRACE_ENTER_EXTRA_SPACE(MSG) CMyDebugTrace _NewMyTrace(MSG, __FILE__, __LINE__, true,1);
|
||
#define MYTRACE_ENTER_NOSHOWEXIT(MSG) CMyDebugTrace _NewMyTrace(MSG, __FILE__, __LINE__, false);
|
||
#define MYTRACE_ERROR(MSG,ERROR_NUMBER) _NewMyTrace.TraceError(MSG, ERROR_NUMBER, __LINE__);
|
||
#define MYTRACE_IP(ULONG_ADDRESS) _NewMyTrace.IP2A(ULONG_ADDRESS)
|
||
#define MYTRACE _NewMyTrace.MyTrace
|
||
#define MYTRACE_BUFFER2STR(BUFF, NLEN) _NewMyTrace.Buffer2Str(BUFF, NLEN)
|
||
#else
|
||
#define MYTRACE_ENABLE
|
||
#define MYTRACE_START(UNIQUE_NAME)
|
||
#define MYTRACE_STOP
|
||
|
||
#define MYTRACE_ENTER(MSG)
|
||
#define MYTRACE_ENTER_EXTRA_SPACE(MSG)
|
||
#define MYTRACE_ENTER_NOSHOWEXIT(MSG)
|
||
#define MYTRACE_ERROR(MSG,ERROR_NUMBER)
|
||
#define MYTRACE_IP(ULONG_ADDRESS) 0
|
||
#define MYTRACE
|
||
#define MYTRACE_BUFFER2STR(BUFF, NLEN) 0
|
||
#endif
|
||
|
||
|
||
|
||
//#define DOTRACE(ID, str)
|
||
#define DOTRACE(ID, str) TracePrintf(g_dwTraceId, str);
|
||
//#define DOTRACE(ID, str) OutputDebugString(str);OutputDebugString(L"\n");
|
||
//#define DOTRACE(ID, str) MessageBox(NULL,str,m_szMsgEnter,MB_OK|MB_SERVICE_NOTIFICATION);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
class CMyDebugTrace
|
||
{
|
||
public:
|
||
CMyDebugTrace(
|
||
LPCSTR szMsgEnter,
|
||
LPCSTR szFile,
|
||
const int nLine,
|
||
bool bShowExit,
|
||
int nExtraWhiteSpace=0
|
||
)
|
||
{
|
||
USES_CONVERSION;
|
||
m_nExtraSpace = nExtraWhiteSpace;
|
||
m_bShowExit = bShowExit;
|
||
lstrcpy(m_szMsgEnter, A2T(szMsgEnter));
|
||
|
||
// From the entry/creation text we extract the function name
|
||
// example "CFoo::Format" we will have CFoo to prefix in front of all traces done after
|
||
lstrcpy(m_szFunction, A2T(szMsgEnter));
|
||
wchar_t* pEnd = wcschr(m_szFunction, L':');
|
||
if ( pEnd )
|
||
*pEnd = L'\0';
|
||
else
|
||
lstrcpy(m_szFunction, L"");
|
||
|
||
|
||
lstrcpy(m_szFile, A2T(szFile));
|
||
|
||
m_nIndent++;
|
||
|
||
wsprintf(
|
||
m_szTrace,
|
||
L"%s%s %s",
|
||
SzRepeat(m_nIndent),
|
||
m_bShowExit ? L"++" : L"+-",
|
||
m_szMsgEnter
|
||
);
|
||
|
||
int nLen = lstrlen(m_szTrace);
|
||
|
||
wsprintf(
|
||
m_szTrace,
|
||
L"%s%s[L%d]%s",
|
||
m_szTrace,
|
||
SzRepeat(80-nLen),
|
||
nLine,
|
||
m_szFile
|
||
);
|
||
|
||
if ( m_nExtraSpace != 0 )
|
||
DOTRACE(g_dwTraceId, TEXT(""));
|
||
|
||
DOTRACE(g_dwTraceId, m_szTrace);
|
||
}
|
||
|
||
~CMyDebugTrace()
|
||
{
|
||
if ( m_bShowExit )
|
||
{
|
||
|
||
wsprintf(m_szTrace, L"%s-- %s", SzRepeat(m_nIndent), m_szMsgEnter);
|
||
DOTRACE(g_dwTraceId, m_szTrace);
|
||
|
||
if ( m_nExtraSpace != 0 )
|
||
DOTRACE(g_dwTraceId, TEXT(""));
|
||
}
|
||
|
||
m_nIndent--;
|
||
}
|
||
|
||
|
||
//
|
||
// Output to the debug window a user trace
|
||
//
|
||
inline void _cdecl MyTrace(LPCSTR lpszFormat, ...)
|
||
{
|
||
#if defined(DBG) || defined(_DEBUG)
|
||
|
||
USES_CONVERSION;
|
||
va_list args;
|
||
va_start(args, lpszFormat);
|
||
|
||
char szBuffer[2048];
|
||
|
||
_vsnprintf(szBuffer, sizeof(szBuffer), lpszFormat, args);
|
||
|
||
TCHAR szLine[2048];
|
||
wsprintf(szLine, L"%s%s %s", SzRepeat(CMyDebugTrace::m_nIndent+3), m_szFunction, A2T(szBuffer));
|
||
DOTRACE(g_dwTraceId, szLine);
|
||
|
||
va_end(args);
|
||
|
||
#endif
|
||
}
|
||
|
||
|
||
//
|
||
// Output a debug trace for a error including Line number and source file name
|
||
//
|
||
inline void
|
||
TraceError(
|
||
LPCSTR szMsg,
|
||
int nError,
|
||
const int nLine
|
||
)
|
||
{
|
||
USES_CONVERSION;
|
||
TCHAR szBuffer[512];
|
||
|
||
//
|
||
// No Error # was given so lets get the last one raised
|
||
//
|
||
if ( nError == 0 )
|
||
nError = GetLastError();
|
||
|
||
wsprintf(szBuffer, L"%s %s ERROR(0x%X):%s [L%d]%s", SzRepeat(CMyDebugTrace::m_nIndent), m_szMsgEnter, nError, A2T(szMsg), nLine, m_szFile);
|
||
DOTRACE(g_dwTraceId, szBuffer);
|
||
}
|
||
|
||
//
|
||
// Return the ascii equivalent of the IP example "192.168.0.1"
|
||
//
|
||
inline char*
|
||
IP2A(ULONG ulAddress)
|
||
{
|
||
in_addr tmpAddr;
|
||
tmpAddr.s_addr = ulAddress;
|
||
return inet_ntoa(tmpAddr);
|
||
}
|
||
|
||
|
||
inline char*
|
||
Buffer2Str(char* pBuff, int nLen)
|
||
{
|
||
static char szPrintableStr[1024];
|
||
memcpy(szPrintableStr, pBuff, min(nLen,1022));
|
||
szPrintableStr[min(nLen,1023)] = '\0';
|
||
|
||
int nLenMin = strlen(szPrintableStr);
|
||
|
||
for ( int nChar=0; nChar < nLenMin; nChar++ )
|
||
{
|
||
if ( isprint(szPrintableStr[nChar])==0 )
|
||
szPrintableStr[nChar] = '<EFBFBD>';
|
||
}
|
||
|
||
return szPrintableStr;
|
||
}
|
||
|
||
//
|
||
// Return a left paded space indentation
|
||
//
|
||
inline LPCTSTR
|
||
SzRepeat(int nCount)
|
||
{
|
||
static TCHAR szPading[200];
|
||
|
||
lstrcpy(szPading, L"");
|
||
|
||
for ( int nI=0; nI < nCount; nI++ )
|
||
lstrcat(szPading, L" ");
|
||
|
||
return szPading;
|
||
}
|
||
int m_nExtraSpace;
|
||
bool m_bShowExit;
|
||
TCHAR m_szTrace[512];
|
||
TCHAR m_szMsgEnter[1024];
|
||
TCHAR m_szFunction[256];
|
||
TCHAR m_szFile[256];
|
||
static int m_nIndent;
|
||
};
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|