windows-nt/Source/XPSP1/NT/com/ole32/stg/props/propdbg.hxx
2020-09-26 16:20:57 +08:00

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