//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1992.
//
// File: dbgpoint.hxx
//
// Contents: Support for visual debug values
//
// Classes: CDebugBaseClass
// CDebugBreakPoint
// CDebugValue
//
// Functions:
//
// History: 12-Mar-93 KevinRo Created
//
// This module handles debug values, such as breakpoints and settable
// values. By using this module, the values can be examined and changed
// in a debugging window. The debugging window uses its own thread, so
// changes can be effected asynchronously.
//
//--------------------------------------------------------------------------
#ifndef __DBGPOINT_HXX__
#define __DBGPOINT_HXX__
#if defined(__cplusplus)
enum DebugValueType
{
dvtBreakPoint,
dvtInfoLevel,
dvtValue
};
class CDebugBaseClass;
//
// The following routines are exported from commnot.dll
//
extern "C"
EXPORTDEF
void APINOT dbgRegisterGroup(WCHAR const *pwzName,HANDLE *hGroup);
extern "C"
EXPORTDEF
void APINOT dbgRemoveGroup(HANDLE hGroup);
extern "C"
EXPORTDEF
void APINOT dbgRegisterValue(WCHAR const *pwzName,HANDLE hGroup,CDebugBaseClass *pdv);
extern "C"
EXPORTDEF
void APINOT dbgRemoveValue(HANDLE hGroup,CDebugBaseClass *pdv);
extern "C"
EXPORTDEF
void APINOT dbgNotifyChange(HANDLE hGroup,CDebugBaseClass *pdv);
extern "C"
EXPORTDEF
ULONG APINOT dbgGetIniInfoLevel(WCHAR const *pwzName,ULONG ulDefault);
extern "C"
EXPORTDEF
ULONG APINOT dbgBreakDialog(char const *pszFileName,ULONG ulLineNumber,WCHAR const *pwzName,long ulCode);
// The following values may be returned by dbgBreakDialog
#define CDBG_BREAKPOINT_CONTINUE 0x01
#define CDBG_BREAKPOINT_BREAK 0x02
#define CDBG_BREAKPOINT_DISABLE 0x04
//
// The following group is for the Infolevel Group. The group is automatically
// registered when a value is added to it.
//
#define HANDLE_INFOLEVELGROUP ((HANDLE)-1)
//+-------------------------------------------------------------------------
//
// Class: CDebugBaseClass
//
// Purpose: Defines a base class used by visual debug value system
//
// Interface:
//
// History: 12-Mar-93 KevinRo Created
//
// Notes:
//
//--------------------------------------------------------------------------
class CDebugBaseClass
{
public:
CDebugBaseClass(WCHAR const *pwzValueName,
HANDLE hGroupHandle,
DebugValueType dvtType):
_dvtType(dvtType),
_hGroupHandle(hGroupHandle)
{
}
void Register(WCHAR const *pwzValueName)
{
dbgRegisterValue(pwzValueName,_hGroupHandle,this);
}
virtual ~CDebugBaseClass()
{
dbgRemoveValue(_hGroupHandle,this);
}
virtual void NotifyChange()
{
dbgNotifyChange(_hGroupHandle,this);
}
DebugValueType GetValueType() {return _dvtType;}
HANDLE GetGroupHandle() { return _hGroupHandle;}
private:
HANDLE _hGroupHandle;
DebugValueType _dvtType;
};
//+-------------------------------------------------------------------------
//
// Class: CDebugBreakPoint
//
// Purpose: Defines an externally switchable break point. By using the
// visual debug window, you can set or clear this breakpoint
// while a program runs.
//
// Interface:
//
// History: 12-Mar-93 KevinRo Created
//
// Notes:
//
//--------------------------------------------------------------------------
class CDebugBreakPoint : public CDebugBaseClass
{
public:
CDebugBreakPoint(WCHAR const *pwzName,HANDLE hGroup,ULONG fBreakSet):
_fBreakSet(fBreakSet),
_pwzName(pwzName),
CDebugBaseClass(pwzName,hGroup,dvtBreakPoint)
{
Register(pwzName);
}
~CDebugBreakPoint()
{
}
void ToggleBreakPoint()
{
_fBreakSet = !_fBreakSet;
NotifyChange();
}
ULONG GetBreakPoint()
{
return(_fBreakSet);
}
ULONG SetBreakPoint()
{
register ret = _fBreakSet;
_fBreakSet = TRUE;
NotifyChange();
return(ret);
}
ULONG ClearBreakPoint()
{
register ret = _fBreakSet;
_fBreakSet = FALSE;
NotifyChange();
return(ret);
}
inline BOOL BreakPointTest()
{
return _fBreakSet;
}
inline BOOL BreakPointMessage(char *pszFileName,ULONG ulLineNo,long lCode=0)
{
ULONG rc = dbgBreakDialog(pszFileName,ulLineNo,_pwzName,lCode);
if(rc & CDBG_BREAKPOINT_DISABLE) ClearBreakPoint();
return(rc & CDBG_BREAKPOINT_BREAK);
}
public:
WCHAR const * _pwzName;
BOOL _fBreakSet;
};
//+-------------------------------------------------------------------------
//
// Class: CDebugValue
//
// Purpose: A DebugValue makes a ULONG value visible and settable
// from the debugging window. By accepting a ULONG reference,
// it is possible to expose a ULONG value to the debugging
// window.
//
// Interface:
//
// History: 12-Mar-93 KevinRo Created
//
// Notes:
//
//--------------------------------------------------------------------------
class CDebugValue : public CDebugBaseClass
{
public:
CDebugValue(WCHAR const *pwzName,HANDLE hGroup,ULONG & ulValue):
_ulValue(ulValue),
CDebugBaseClass(pwzName,hGroup,dvtValue)
{
Register(pwzName);
}
~CDebugValue()
{
}
ULONG GetValue()
{
return(_ulValue);
}
ULONG SetValue(ULONG ulValue)
{
register ret = _ulValue;
_ulValue = ulValue;
NotifyChange();
return(ret);
}
private:
ULONG & _ulValue;
};
//+-------------------------------------------------------------------------
//
// Class: CInfoLevel
//
// Purpose: A CInfoLevel makes an InfoLevel value accessable by the
// debugging window.
//
// Interface:
//
// History: 12-Mar-93 KevinRo Created
//
// Notes:
//
//--------------------------------------------------------------------------
class CInfoLevel : public CDebugBaseClass
{
public:
CInfoLevel(WCHAR const *pwzName,ULONG & ulValue,ULONG deflvl = DEF_INFOLEVEL):
_ulInfoLevel(ulValue),
CDebugBaseClass(pwzName,HANDLE_INFOLEVELGROUP,dvtInfoLevel)
{
_ulInfoLevel = dbgGetIniInfoLevel(pwzName,deflvl);
Register(pwzName);
}
~CInfoLevel()
{
}
ULONG GetInfoLevel()
{
return(_ulInfoLevel);
}
ULONG SetInfoLevel(ULONG ulValue)
{
register ret = _ulInfoLevel;
_ulInfoLevel = ulValue;
NotifyChange();
return(ret);
}
private:
ULONG & _ulInfoLevel;
};
//+-------------------------------------------------------------------------
//
// Class: CDebugGroupClass
//
// Purpose: Encapsulates a Debug Group
//
// Notes:
//
//--------------------------------------------------------------------------
class CDebugGroupClass
{
public:
CDebugGroupClass(WCHAR *pwzName)
{
dbgRegisterGroup(pwzName,&_hGroup);
}
~CDebugGroupClass()
{
dbgRemoveGroup(_hGroup);
}
operator HANDLE() { return(_hGroup); }
private:
HANDLE _hGroup;
};
#endif // defined(__cplusplus)
#endif // __DBGPOINT_HXX__