228 lines
6.5 KiB
C++
228 lines
6.5 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
||
|
//
|
||
|
// File: propdbg.hxx
|
||
|
//
|
||
|
// Contents: Declarations for tracing property code
|
||
|
//
|
||
|
// History:
|
||
|
// 28-Aug-96 MikeHill Added a Mac version of propinlineDebugOut
|
||
|
// 03-Mar-98 MikeHill Added CDebugFunctionAndParameterTrace
|
||
|
// for debug tracing.
|
||
|
// 6/11/98 MikeHill
|
||
|
// - Allow errors to be suppressed from dbg output.
|
||
|
// - Ensure against stack corruption.
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
#ifndef _MAC
|
||
|
DECLARE_DEBUG(prop)
|
||
|
#endif
|
||
|
|
||
|
#include <stdio.h> // vsprintf
|
||
|
|
||
|
// Custom debug flags for the 'prop' info level
|
||
|
|
||
|
#define DEB_PROP_INFO DEB_USER1
|
||
|
#define DEB_PROP_TRACE_CREATE DEB_USER2
|
||
|
|
||
|
|
||
|
// 'prop' macros for tracing external and internal routines, and tracing parameters.
|
||
|
|
||
|
#if DBG == 1
|
||
|
#define propXTrace(x) CDebugFunctionAndParameterTrace propTrace( this, &hr, "prop", DEB_TRACE, x);
|
||
|
#define propITrace(x) CDebugFunctionAndParameterTrace propTrace( this, &hr, "prop", DEB_ITRACE, x);
|
||
|
#define propXTraceStatic(x) CDebugFunctionAndParameterTrace propTrace( NULL, &hr, "prop", DEB_TRACE, x);
|
||
|
#define propITraceStatic(x) CDebugFunctionAndParameterTrace propTrace( NULL, &hr, "prop", DEB_ITRACE, x);
|
||
|
#define propTraceParameters(x) propTrace.Parameters x
|
||
|
#define propSuppressExitErrors() propTrace.SuppressExitErrors()
|
||
|
#else
|
||
|
#define propXTrace(x) {}
|
||
|
#define propITrace(x) {}
|
||
|
#define propXTraceStatic(x) {}
|
||
|
#define propITraceStatic(x) {}
|
||
|
#define propTraceParameters(x) {}
|
||
|
#define propSuppressExitErrors() {}
|
||
|
#endif
|
||
|
|
||
|
#if DBG
|
||
|
|
||
|
class CDebugFunctionAndParameterTrace
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
CDebugFunctionAndParameterTrace( const void *pThis, const HRESULT *phr,
|
||
|
const char *pszInfoLevelString, ULONG ulTraceMask,
|
||
|
const char *pszFunction );
|
||
|
void Parameters( const char *pszParameterFormatString = NULL, ... );
|
||
|
~CDebugFunctionAndParameterTrace();
|
||
|
void DbgPrintf( ULONG ulTraceMask, const char *pszFormat, ... ) const;
|
||
|
void SuppressExitErrors();
|
||
|
|
||
|
private:
|
||
|
|
||
|
const char * _pszFunction;
|
||
|
const char * _pszInfoLevelString;
|
||
|
char _szStringizedParameterList[ 2 * MAX_PATH ];
|
||
|
ULONG _ulTraceMask;
|
||
|
const void * _pThis;
|
||
|
const HRESULT *_phr;
|
||
|
|
||
|
BOOL _fSuppressExitErrors:1;
|
||
|
|
||
|
}; // class CDebugFunctionAndParameterTrace
|
||
|
|
||
|
inline
|
||
|
CDebugFunctionAndParameterTrace::CDebugFunctionAndParameterTrace( const void *pThis,
|
||
|
const HRESULT *phr,
|
||
|
const char *pszInfoLevelString,
|
||
|
ULONG ulTraceMask,
|
||
|
const char *pszFunction )
|
||
|
{
|
||
|
_pszInfoLevelString = pszInfoLevelString;
|
||
|
_pThis = pThis;
|
||
|
_phr = phr;
|
||
|
_pszFunction = pszFunction;
|
||
|
_szStringizedParameterList[0] = '\0';
|
||
|
_ulTraceMask = ulTraceMask;
|
||
|
_fSuppressExitErrors = FALSE;
|
||
|
|
||
|
DbgPrintf( _ulTraceMask, "Entering (%08x)%s\n", _pThis, _pszFunction );
|
||
|
}
|
||
|
|
||
|
inline void
|
||
|
CDebugFunctionAndParameterTrace::Parameters( const char *pszParameterFormatString, ... )
|
||
|
{
|
||
|
va_list Arguments;
|
||
|
va_start( Arguments, pszParameterFormatString );
|
||
|
|
||
|
if( NULL != pszParameterFormatString )
|
||
|
{
|
||
|
int cb = sizeof(_szStringizedParameterList);
|
||
|
cb = _vsnprintf( _szStringizedParameterList, cb,
|
||
|
pszParameterFormatString, Arguments );
|
||
|
if( -1 == cb )
|
||
|
_szStringizedParameterList[ sizeof(_szStringizedParameterList)-1 ] = '\0';
|
||
|
}
|
||
|
|
||
|
DbgPrintf( _ulTraceMask, " Parameters(%08X)%s(%s)\n", _pThis, _pszFunction,
|
||
|
_szStringizedParameterList );
|
||
|
|
||
|
}
|
||
|
|
||
|
inline void
|
||
|
CDebugFunctionAndParameterTrace::DbgPrintf( ULONG ulTraceMask, const char *pszFormat, ... )
|
||
|
const
|
||
|
{
|
||
|
if( propInfoLevel & ulTraceMask )
|
||
|
{
|
||
|
va_list Arguments;
|
||
|
va_start( Arguments, pszFormat );
|
||
|
vdprintf( ulTraceMask, _pszInfoLevelString, pszFormat, Arguments );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
inline void
|
||
|
CDebugFunctionAndParameterTrace::SuppressExitErrors()
|
||
|
{
|
||
|
_fSuppressExitErrors = TRUE;
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
CDebugFunctionAndParameterTrace::~CDebugFunctionAndParameterTrace()
|
||
|
{
|
||
|
if( SUCCEEDED(*_phr) )
|
||
|
{
|
||
|
DbgPrintf( _ulTraceMask, "Exiting (%08x)%s, returning %08x\n",
|
||
|
_pThis, _pszFunction, *_phr );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if( STG_E_INVALIDPARAMETER == *_phr || STG_E_INVALIDPOINTER == *_phr )
|
||
|
{
|
||
|
DbgPrintf( _fSuppressExitErrors ? DEB_TRACE : DEB_ERROR,
|
||
|
"Exiting (%08x)%s, returning %08x\n",
|
||
|
_pThis, _pszFunction, *_phr );
|
||
|
}
|
||
|
else if( _fSuppressExitErrors || STG_E_REVERTED == *_phr )
|
||
|
{
|
||
|
DbgPrintf( DEB_IWARN, "Exiting (%08x)%s, returning %08x (%s)\n",
|
||
|
_pThis, _pszFunction, *_phr, _szStringizedParameterList );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DbgPrintf( DEB_ERROR, "Exiting (%08x)%s, returning %08x (%s)\n",
|
||
|
_pThis, _pszFunction, *_phr, _szStringizedParameterList );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif // #if DBG
|
||
|
|
||
|
|
||
|
|
||
|
inline DWORD DbgFlag( HRESULT hr, DWORD dbgflag )
|
||
|
{
|
||
|
#if DBG==1
|
||
|
return( FAILED(hr) ? DEB_ERROR : dbgflag );
|
||
|
#else
|
||
|
return 0;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifdef _MAC
|
||
|
|
||
|
inline void propInlineDebugOut(DWORD dwDebugLevel, CHAR *szFormat, ...)
|
||
|
{
|
||
|
#if 0
|
||
|
if( DEB_PROP_MAP >= dwDebugLevel )
|
||
|
{
|
||
|
CHAR szBuffer[ 256 ];
|
||
|
va_list Arguments;
|
||
|
va_start( Arguments, szFormat );
|
||
|
|
||
|
*szBuffer = '\p'; // This is a zero-terminated string.
|
||
|
|
||
|
if( -1 == _vsnprintf( szBuffer+1, sizeof(szBuffer)-1, szFormat, Arguments ))
|
||
|
{
|
||
|
// Terminate the buffer, since the string was too long.
|
||
|
szBuffer[ sizeof(szBuffer)-1 ] = '\0';
|
||
|
}
|
||
|
|
||
|
DebugStr( (unsigned char*) szBuffer );
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
#endif // #ifdef _MAC
|
||
|
|
||
|
#if DBG
|
||
|
|
||
|
# define propDbg(x) propInlineDebugOut x
|
||
|
# define DBGBUF(buf) CHAR buf[400]
|
||
|
|
||
|
CHAR *DbgFmtId(REFFMTID rfmtid, CHAR *pszBuf);
|
||
|
CHAR *DbgMode(DWORD grfMode, CHAR *pszBuf);
|
||
|
CHAR *DbgFlags(DWORD grfMode, CHAR *pszBuf);
|
||
|
|
||
|
#else
|
||
|
|
||
|
# define propDbg(x) {}
|
||
|
# define DBGBUF(buf)
|
||
|
# define DbgFmtId(rfmtid, pszBuf)
|
||
|
# define DbgMode(grfMode, pszBuf)
|
||
|
# define DbgFlags(grfMode, pszBuf)
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|