|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996.
//
// File: trace.cxx
//
// Contents: TraceInfo functions
//
// History: 14-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
#include <stdarg.h>
#include <ole2int.h>
#if DBG==1
#ifdef FLAT
#include <sem.hxx>
#include <dllsem.hxx>
#endif // FLAT
#include "oleprint.hxx"
#include "sym.hxx"
// *** Global data ***
DWORD g_dwInfoLevel = INF_OFF; extern CSym *g_pSym; extern char gPidString[];
//+---------------------------------------------------------------------------
//
// Function: TraceInfoEnabled
//
// Synopsis: Checks our trace info level to see if output of
// trace information is enabled
//
// Arguments: (none)
//
// Returns: > 0 if enabled, 0 if not
//
// History: 15-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
inline int TraceInfoEnabled() { return g_dwInfoLevel & INF_BASE; }
//+---------------------------------------------------------------------------
//
// Function: TraceCmnEnabled
//
// Synopsis: Checks our trace info level to see if output of
// cmn api information is enabled
//
// Arguments: (none)
//
// Returns: > 0 if enabled, 0 if not
//
// History: 15-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
inline int TraceCmnEnabled() { return g_dwInfoLevel & INF_CMN; }
//+---------------------------------------------------------------------------
//
// Function: SymInfoEnabled
//
// Synopsis: Checks our trace info level to see if output of
// symbol information is enabled
//
// Arguments: (none)
//
// Returns: > 0 if enabled, 0 if not
//
// History: 15-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
inline int SymInfoEnabled() { return g_dwInfoLevel & INF_SYM; }
//+---------------------------------------------------------------------------
//
// Function: StructInfoEnabled
//
// Synopsis: Checks our trace info level to see if output of
// expanded structures is enabled
//
// Arguments: (none)
//
// Returns: > 0 if enabled, 0 if not
//
// History: 15-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
inline int StructInfoEnabled() { return g_dwInfoLevel & INF_STRUCT; }
//+---------------------------------------------------------------------------
//
// Function: TLSIncTraceNestingLevel
//
// Synopsis: Returns the current nesting level, then increments it
//
// Returns: nesting level for OLETRACE
//
// History: 13-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
inline LONG TLSIncTraceNestingLevel() { HRESULT hr; COleTls tls(hr); if (SUCCEEDED(hr)) { return (tls->cTraceNestingLevel)++; }
return 0; }
//+---------------------------------------------------------------------------
//
// Function: TLSDecTraceNestingLevel
//
// Synopsis: Decrement and return nesting level
//
// Returns: nesting level for OLETRACE
//
// History: 13-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
inline LONG TLSDecTraceNestingLevel() { HRESULT hr; COleTls tls(hr); if (SUCCEEDED(hr)) { return --(tls->cTraceNestingLevel); }
return 0; }
// *** Inline Functions
//+---------------------------------------------------------------------------
//
// Function: IsAPIID
//
// Synopsis: Returns whether or not an 32-bit ID is a API ID
//
// Arguments: [dwID] - 32-bit ID
//
// Returns: TRUE if it is an API ID, FALSE otherwise
//
// History: 04-Aug-95 t-stevan Created
//
//----------------------------------------------------------------------------
BOOL IsAPIID(DWORD dwID) { return !(dwID>>16); }
//+---------------------------------------------------------------------------
//
// Function: GetNameFromAPIID
//
// Synopsis: Returns a pointer to a string containing the API name
//
// Arguments: [dwID] - API ID
//
// Returns: Pointer to a string
//
// History: 04-Aug-95 t-stevan Created
//
//----------------------------------------------------------------------------
const char *GetNameFromAPIID(DWORD dwID) { return (g_ppNameTables[dwID>>16])[dwID&0xffff]; }
//+---------------------------------------------------------------------------
//
// Function: GetNameFromOBJID
//
// Synopsis: Returns a pointer to a string containing the object/method name
//
// Arguments: [dwID] - 32-bit ID
//
// Returns: Pointer to a string
//
// History: 04-Aug-95 t-stevan Created
//
//----------------------------------------------------------------------------
const char *GetNameFromOBJID(DWORD dwID, IUnknown *pUnk, char *pBuf) { wsprintfA(pBuf, "%s(%x)->%s", g_pscInterfaceNames[dwID>>16], pUnk, (g_ppNameTables[dwID>>16])[dwID&0xffff]);
return pBuf; }
//+---------------------------------------------------------------------------
//
// Function: _oletracein
//
// Synopsis: Prints trace information for API/Method-entry
//
// Arguments: [dwID] - API/Method ID
//
// Returns: nothing
//
// History: 14-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
void _oletracein(DWORD dwID, ...) { const char *pscFormat; va_list args; int iNestingLevel;
va_start(args, dwID);
iNestingLevel = TLSIncTraceNestingLevel();
if(TraceInfoEnabled()) { if(IsAPIID(dwID)) { // This is an API
pscFormat = va_arg(args, const char*);
oleprintf(iNestingLevel, GetNameFromAPIID(dwID), pscFormat, args); } else { IUnknown *pUnk; char szTemp[128];
// This is an object/method call
pUnk = va_arg(args, IUnknown *);
pscFormat = va_arg(args, const char *);
oleprintf(iNestingLevel, GetNameFromOBJID(dwID, pUnk, szTemp), pscFormat, args); } }
va_end(args); }
//+---------------------------------------------------------------------------
//
// Function: _oletracecmnin
//
// Synopsis: Prints trace information for API/Method-entry
//
// Arguments: [dwID] - API/Method ID
//
// Returns: nothing
//
// History: 14-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
void _oletracecmnin(DWORD dwID, ...) { const char *pscFormat; va_list args; int iNestingLevel;
if (!TraceCmnEnabled()) { return; }
va_start(args, dwID);
iNestingLevel = TLSIncTraceNestingLevel();
if(TraceInfoEnabled()) { if(IsAPIID(dwID)) { // This is an API
pscFormat = va_arg(args, const char*);
oleprintf(iNestingLevel, GetNameFromAPIID(dwID), pscFormat, args); } else { IUnknown *pUnk; char szTemp[128];
// This is an object/method call
pUnk = va_arg(args, IUnknown *);
pscFormat = va_arg(args, const char *);
oleprintf(iNestingLevel, GetNameFromOBJID(dwID, pUnk, szTemp), pscFormat, args); } }
va_end(args); }
//+---------------------------------------------------------------------------
//
// Function: _oletraceout
//
// Synopsis: Prints trace information for API/Method-exit. assuming
// return value is an HRESULT
//
// Arguments: [dwID] - API/Method ID
// [hr] - return value
//
// Returns: nothing
//
// History: 14-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
void _oletraceout(DWORD dwID, HRESULT hr) { _oletraceoutex(dwID, RETURNFMT("%x"), hr); }
//+---------------------------------------------------------------------------
//
// Function: _oletracecmnout
//
// Synopsis: Prints trace information for API/Method-exit. assuming
// return value is an HRESULT
//
// Arguments: [dwID] - API/Method ID
// [hr] - return value
//
// Returns: nothing
//
// History: 14-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
void _oletracecmnout(DWORD dwID, HRESULT hr) { _oletracecmnoutex(dwID, RETURNFMT("%x"), hr); }
//+---------------------------------------------------------------------------
//
// Function: _oletraceoutex
//
// Synopsis: Prints trace information for API/Method-exit, using given
// format string for return value
//
// Arguments: [dwID] - API/Method ID
//
// Returns: nothing
//
// History: 14-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
void _oletraceoutex(DWORD dwID, ...) { const char *pscFormat; va_list args; int iNestingLevel;
va_start(args, dwID);
iNestingLevel = TLSDecTraceNestingLevel();
if(TraceInfoEnabled()) { if(IsAPIID(dwID)) { // This is an API
pscFormat = va_arg(args, const char*);
oleprintf(iNestingLevel, GetNameFromAPIID(dwID), pscFormat, args); } else { IUnknown *pUnk; char szTemp[128];
// This is an object/method call
pUnk = va_arg(args, IUnknown *);
pscFormat = va_arg(args, const char *);
oleprintf(iNestingLevel, GetNameFromOBJID(dwID, pUnk, szTemp), pscFormat, args); } }
va_end(args); }
//+---------------------------------------------------------------------------
//
// Function: _oletracecmnoutex
//
// Synopsis: Prints trace information for API/Method-exit, using given
// format string for return value
//
// Arguments: [dwID] - API/Method ID
//
// Returns: nothing
//
// History: 14-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
void _oletracecmnoutex(DWORD dwID, ...) { const char *pscFormat; va_list args; int iNestingLevel;
if (!TraceCmnEnabled()) { return; }
va_start(args, dwID);
iNestingLevel = TLSDecTraceNestingLevel();
if(TraceInfoEnabled()) { if(IsAPIID(dwID)) { // This is an API
pscFormat = va_arg(args, const char*);
oleprintf(iNestingLevel, GetNameFromAPIID(dwID), pscFormat, args); } else { IUnknown *pUnk; char szTemp[128];
// This is an object/method call
pUnk = va_arg(args, IUnknown *);
pscFormat = va_arg(args, const char *);
oleprintf(iNestingLevel, GetNameFromOBJID(dwID, pUnk, szTemp), pscFormat, args); } }
va_end(args); }
//+---------------------------------------------------------------------------
//
// Function: InitializeTraceInfo
//
// Synopsis: Initializes the trace information's global variables,
//
// Arguments: (none)
//
// Returns: nothing
//
// History: 11-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
void InitializeTraceInfo() { // get Pid string once
_itoa(GetCurrentProcessId(), gPidString, 10);
if(TraceInfoEnabled() && SymInfoEnabled()) { // Initialize the symbol information
// CAUTION: This is very expensive to turn on!
g_pSym = new CSym(); }
}
void SetTraceInfoLevel(DWORD dwLevel) { g_dwInfoLevel = dwLevel;
if(TraceInfoEnabled() && (g_pSym == NULL) && SymInfoEnabled()) { // Initialize the symbol information
g_pSym = new CSym(); } }
//+---------------------------------------------------------------------------
//
// Function: CleanupTraceInfo
//
// Synopsis: Cleans up trace information's global variables
//
// Arguments: (none)
//
// Returns: nothing
//
// History: 11-Jul-95 t-stevan Created
//
//----------------------------------------------------------------------------
void CleanupTraceInfo() { if(g_pSym != NULL) { delete g_pSym; } WriteToLogFile(NULL); // Stop writing to log file
}
#endif // DBG==1
|