250 lines
7.7 KiB
C
250 lines
7.7 KiB
C
// confdbg.h - Conferencing Debug Functions and Macros
|
||
|
||
/*
|
||
The main macros are:
|
||
|
||
ASSERT - display error if parameter evalulates to FALSE.
|
||
e.g. ASSERT(x == y);
|
||
|
||
ERROR_OUT - always print this error. Messagebox is optional.
|
||
e.g. ERROR_OUT(("Unable to FooBar! Err=%d", dwErr));
|
||
|
||
WARNING_OUT - warning message, not an error (App must call InitDebugModule)
|
||
e.g. WARNING_OUT(("FooBar is not available. Using %s", szAlt));
|
||
|
||
TRACE_OUT - debug message (App must call InitDebugModule)
|
||
e.g. TRACE_OUT(("dwFoo=%d, dwBar=%d", dwFoo, dwBar));
|
||
|
||
DBGMSG - debug message for a specific zone
|
||
e.g. DBGMSG(ghZoneFoo, ZONE_BAR, ("Setting dwFoo=%d", dwFoo));
|
||
|
||
|
||
Important Functions:
|
||
VOID DbgInit(HDBGZONE * phDbgZone, PTCHAR * psz, UINT cZone);
|
||
VOID DbgDeInit(HDBGZONE * phDbgZone);
|
||
VOID WINAPI DbgPrintf(PCSTR pszPrefix, PCSTR pszFormat, va_list ap);
|
||
PSTR WINAPI DbgZPrintf(HDBGZONE hZone, UINT iZone, PSTR pszFormat,...);
|
||
|
||
Note: The strings in these functions, in particular the module and
|
||
zone names, are always ANSI strings, even in Unicode components. The
|
||
input strings to DBGINIT should not be wrapped in TEXT macros.
|
||
*/
|
||
|
||
#ifndef _CONFDBG_H_
|
||
#define _CONFDBG_H_
|
||
|
||
#include <stock.h>
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
#include <pshpack8.h> /* Assume 8 byte packing throughout */
|
||
|
||
// deal with including "debug.h" before and after
|
||
#ifdef DEBUGMSG
|
||
#undef DEBUGMSG
|
||
#endif
|
||
#define _DEBUG_H
|
||
|
||
// MFC also defines this - use our version
|
||
#ifdef ASSERT
|
||
#undef ASSERT
|
||
#endif
|
||
|
||
#ifdef DEBUG
|
||
#ifndef NM_DEBUG
|
||
#define NM_DEBUG
|
||
#endif
|
||
#endif /* DEBUG */
|
||
|
||
|
||
|
||
// Special NetMeeting Debug definitions
|
||
#ifdef NM_DEBUG
|
||
|
||
|
||
//////////////////////////////////////
|
||
//Debug Zones
|
||
|
||
#define MAXNUM_OF_MODULES 64
|
||
#define MAXSIZE_OF_MODULENAME 32
|
||
#define MAXNUM_OF_ZONES 16
|
||
#define MAXSIZE_OF_ZONENAME 32
|
||
|
||
#define ZONEINFO_SIGN 0x12490000
|
||
|
||
|
||
// Zone information for a module
|
||
typedef struct _ZoneInfo
|
||
{
|
||
ULONG ulSignature;
|
||
ULONG ulRefCnt;
|
||
ULONG ulZoneMask; //the zone mask
|
||
BOOL bInUse;
|
||
CHAR pszModule[MAXSIZE_OF_MODULENAME]; //name against which the zones are registered
|
||
CHAR szZoneNames[MAXNUM_OF_ZONES][MAXSIZE_OF_ZONENAME]; //names of the zones
|
||
CHAR szFile[MAX_PATH]; // output file, specific to this module
|
||
}ZONEINFO,*PZONEINFO;
|
||
|
||
// DBGZONEPARAM replaced by ZONEINFO
|
||
#define DBGZONEINFO ZONEINFO
|
||
#define PDBGZONEINFO PZONEINFO
|
||
|
||
typedef PVOID HDBGZONE;
|
||
|
||
// size of the memory mapped file
|
||
#define CBMMFDBG (sizeof(ZONEINFO) * MAXNUM_OF_MODULES + sizeof(NMDBG))
|
||
|
||
// General information at end of memory-mapped file (after all zone data)
|
||
typedef struct _NmDbg {
|
||
BOOL fOutputDebugString; // OutputDebugString is enabled
|
||
BOOL fWinOutput; // Window Output is enabled
|
||
HWND hwndCtrl; // Window that handles output
|
||
UINT msgDisplay; // Message to post to hwndCtrl
|
||
BOOL fFileOutput; // File Output is enabled
|
||
CHAR szFile[MAX_PATH]; // File name for output
|
||
UINT uShowTime; // Format date/time (see DBG_FMTTIME_*)
|
||
BOOL fShowThreadId; // Dump ThreadId with each message
|
||
BOOL fShowModule; // Dump Module:Zone with each message
|
||
} NMDBG;
|
||
typedef NMDBG * PNMDBG;
|
||
|
||
#define DBG_FMTTIME_NONE 0 // Do not format the time
|
||
#define DBG_FMTTIME_TICK 1 // Old format (tick count)
|
||
#define DBG_FMTTIME_FULL 2 // Full Year/Month/Day Hour:Min:Sec.ms
|
||
#define DBG_FMTTIME_DAY 3 // Hour:Minute:Second.ms
|
||
|
||
extern BOOL WINAPI NmDbgRegisterCtl(HWND hwnd, UINT uDisplayMsg);
|
||
extern BOOL WINAPI NmDbgDeregisterCtl(HWND hwnd);
|
||
extern BOOL WINAPI NmDbgSetLoggingOptions(HWND hwnd, UINT uOptions);
|
||
extern void WINAPI NmDbgFlushFileLog();
|
||
extern BOOL WINAPI NmDbgGetAllZoneParams(PDBGZONEINFO *plpZoneParam, UINT * puCnt);
|
||
extern BOOL WINAPI NmDbgFreeZoneParams(PDBGZONEINFO pZoneParam);
|
||
|
||
extern HDBGZONE WINAPI NmDbgCreateZone(LPSTR pszName);
|
||
extern VOID WINAPI NmDbgDeleteZone(LPSTR pszName, HDBGZONE hDbgZone);
|
||
extern BOOL WINAPI NmDbgSetZone(HDBGZONE hDbgZone,PDBGZONEINFO pZoneParam);
|
||
extern PNMDBG WINAPI GetPNmDbg(void);
|
||
extern VOID WINAPI NmDbgSetZoneFileName(HDBGZONE hDbgZone, LPCSTR pszFile);
|
||
|
||
extern PZONEINFO FindZoneForModule(LPCSTR pszModule);
|
||
extern PZONEINFO AllocZoneForModule(LPCSTR pszModule);
|
||
extern PZONEINFO MapDebugZoneArea(void);
|
||
extern VOID UnMapDebugZoneArea(void);
|
||
|
||
extern VOID InitDbgZone(void);
|
||
extern VOID DeInitDbgZone(void);
|
||
extern VOID SetDbgFlags(void);
|
||
|
||
|
||
|
||
// Special reserved strings
|
||
#define SZ_DBG_MAPPED_ZONE TEXT("_NmDebugZoneMap")
|
||
#define SZ_DBG_FILE_MUTEX TEXT("_NmDbgFileMutex")
|
||
#define SZ_DBG_ZONE_MUTEX TEXT("_NmDbgZoneMutex")
|
||
|
||
|
||
#define GETZONEMASK(z) ((z) ? (((PZONEINFO)(z))->ulZoneMask) : 0 )
|
||
#define IS_ZONE_ENABLED(z, f) ((((PZONEINFO)(z))->ulZoneMask) & (f))
|
||
|
||
// Macro to check if zone is enabled: h = ghZone, i = zone index
|
||
#define F_ZONE_ENABLED(h, i) ((NULL != h) && IS_ZONE_ENABLED(h, (1 << i)))
|
||
|
||
|
||
// Standard Zones
|
||
#define ZONE_WARNING 0
|
||
#define ZONE_TRACE 1
|
||
#define ZONE_FUNCTION 2
|
||
|
||
#define ZONE_WARNING_FLAG 0x01
|
||
#define ZONE_TRACE_FLAG 0x02
|
||
#define ZONE_FUNCTION_FLAG 0x04
|
||
|
||
|
||
////////////////////////////////////////////
|
||
// Functions
|
||
VOID WINAPI DbgPrintf(PCSTR pszPrefix, PCSTR pszFormat, va_list ap);
|
||
PSTR WINAPI DbgZPrintf(HDBGZONE hZone, UINT iZone, PSTR pszFormat,...);
|
||
PSTR WINAPI DbgZVPrintf(HDBGZONE hZone, UINT iZone, PSTR pszFormat, va_list ap);
|
||
|
||
VOID DbgInitEx(HDBGZONE * phDbgZone, PCHAR * psz, UINT cZone, long ulZoneDefault);
|
||
VOID DbgDeInit(HDBGZONE * phDbgZone);
|
||
|
||
INLINE VOID DbgInit(HDBGZONE * phDbgZone, PCHAR * psz, UINT cZones)
|
||
{
|
||
DbgInitEx(phDbgZone, psz, cZones, 0);
|
||
}
|
||
|
||
PSTR PszPrintf(PCSTR pszFormat,...);
|
||
|
||
#endif /* NM_DEBUG */
|
||
|
||
|
||
////////////////////////////////////////////
|
||
// Main Macros
|
||
#ifdef DEBUG
|
||
#define DBGINIT(phZone, psz) DbgInit(phZone, psz, (sizeof(psz)/sizeof(PCHAR))-1)
|
||
#define DBGDEINIT(phZone) DbgDeInit(phZone)
|
||
|
||
#define ASSERT(exp) (!(exp) ? ERROR_OUT(("ASSERT failed on %s line %u:\n\r"#exp, __FILE__, __LINE__)) : 0)
|
||
|
||
|
||
VOID WINAPI DbgZPrintError(PSTR pszFormat,...);
|
||
VOID WINAPI DbgZPrintWarning(PSTR pszFormat,...);
|
||
VOID WINAPI DbgZPrintTrace(PSTR pszFormat,...);
|
||
VOID WINAPI DbgZPrintFunction(PSTR pszFormat,...);
|
||
|
||
#define ERROR_OUT(s) DbgZPrintError s
|
||
#define WARNING_OUT(s) DbgZPrintWarning s
|
||
#define TRACE_OUT(s) DbgZPrintTrace s
|
||
|
||
#define DBGENTRY(s) DbgZPrintFunction("Enter " #s);
|
||
#define DBGEXIT(s) DbgZPrintFunction("Exit " #s);
|
||
#define DBGEXIT_HR(s,hr) DbgZPrintFunction("Exit " #s " (result=%s)", GetHRESULTString(hr));
|
||
#define DBGEXIT_BOOL(s,f) DbgZPrintFunction("Exit " #s " (result=%s)", GetBOOLString(f));
|
||
#define DBGEXIT_INT(s,i) DbgZPrintFunction("Exit " #s " (result=%s)", GetINTString(i));
|
||
#define DBGEXIT_ULONG(s,u) DbgZPrintFunction("Exit " #s " (result=%s)", GetULONGString((ULONG)u));
|
||
|
||
|
||
#define DBGMSG(z, i, s) \
|
||
{ \
|
||
if ((NULL != z) && (((PZONEINFO)(z))->ulZoneMask & (1<<i)) ) \
|
||
{ \
|
||
LocalFree(DbgZPrintf(z, i, PszPrintf s)); \
|
||
} \
|
||
}
|
||
// e.g. DBGMSG(ghZone, ZONE_FOO, ("bar=%d", dwBar))
|
||
|
||
#else
|
||
#define DBGINIT(phZone, psz)
|
||
#define DBGDEINIT(phZone)
|
||
#define ASSERT(exp)
|
||
|
||
#define ERROR_OUT(s)
|
||
#define WARNING_OUT(s)
|
||
#define TRACE_OUT(s)
|
||
|
||
#define DBGENTRY(s)
|
||
#define DBGEXIT(s)
|
||
#define DBGEXIT_HR(s,hr)
|
||
#define DBGEXIT_BOOL(s,f)
|
||
#define DBGEXIT_INT(s,i)
|
||
#define DBGEXIT_ULONG(s,u)
|
||
|
||
#ifndef DBGMSG
|
||
#define DBGMSG(z, f, s)
|
||
#endif
|
||
|
||
#endif /* DEBUG */
|
||
|
||
|
||
#include <poppack.h> /* End byte packing */
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* _CONFDBG_H_ */
|
||
|
||
|