windows-nt/Source/XPSP1/NT/base/wow64/setup/inc/stdassrt.h
2020-09-26 16:20:57 +08:00

196 lines
6.5 KiB
C

/****************************************************************************
**
** File: STDASSRT.H
** Purpose: Standard Assert macros and common error handling defines.
** Notes:
**
****************************************************************************/
#ifndef STDASSRT_H
#define STDASSRT_H
#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif
/* REVIEW: need to make this DEBUG only when RTChkArg is removed */
#define EnableAssertCode static char THIS_FILE[] = __FILE__;
/* Common Error Validation and Handling */
typedef enum {
vrcFail = 0, /* if IDOK or IDIGNORE or IDNO or no message box */
vrcValid = 1, /* if no error condition */
vrcRetry = 2, /* if IDRETRY or IDYES */
vrcQuit = 3, /* if IDABORT or IDCANCEL */
vrcYes = vrcRetry,
vrcNo = vrcFail,
vrcIgnore= vrcFail,
vrcCancel= vrcQuit,
vrcAbort = vrcQuit,
vrcOk = vrcFail
} VRC;
#define ERROR_PARAM_MAX 4 /* parameters %1, %2, %3, %4 */
/* sets an error parameter from a temp string value, good until Validate() */
VOID PUBLIC SetErrorParam ( UINT iParam, SZC szValue );
/* sets an error parameter from a stable string value, can Validate() later */
VOID PUBLIC SetErrorParamConst ( UINT iParam, CSZC szValue );
/* sets an error message parameter from a string value, make a string copy */
VOID PUBLIC SetErrorParamCopy ( UINT iParam, SZC szValue );
/* sets an error message parameter from an integer value */
VOID PUBLIC SetErrorParamInt ( UINT iParam, INT iValue );
/* sets an error message parameter from an character value */
VOID PUBLIC SetErrorParamChar ( UINT iParam, CHAR chValue );
/* tests a condition, handles error and clears error parameters if false */
VRC PUBLIC Validate ( BOOL fCondition, UINT iStringId );
/* loads a string resource or debug string, calls ProcessMessage() */
VRC PUBLIC ProcessMessageId ( UINT iStringId );
/* formats message template, optionally displays message box, write to log */
VRC PUBLIC ProcessMessage ( SZC szMsg );
/* loads a debug or resource message and writes to the logfile if open */
VRC PUBLIC LogMessageId ( UINT iResId ); /* return status of log write */
/* loads a message, sets status for %V & %v, writes to the logfile if open */
VRC PUBLIC LogValidate ( BOOL fCondition, UINT iResId );/* return log status */
/* prototype for callback to obtain object or pass-specific information */
/* returns the number of characters copied to the buffer, or 0 if no info */
typedef INT (WINAPI *PFNErrorParam)( INT chParam, SZ rgchBuf );
/* entry for ACME only, to setup pass calback for error parameters */
VOID PUBLIC SetPassInfo(SZC szPassName, PFNErrorParam pfnCallback);
/* internal entry to process debug messages, called using DebugMessage(sz) */
VRC PUBLIC ProcessDebugMessage ( SZC szMsg );
/* Sets and gets global last-error message */
VOID PUBLIC SetLastSetupErrMsg ( SZ szMsg );
SZ PUBLIC SzGetLastSetupErrMsg ( VOID );
/* entry for ACME only, to setup pass calback for FED Font change - DBCS only*/
typedef BOOL (WINAPI *PFNFEFont)( HWND hdlg );
VOID PUBLIC SetFEFontProc(PFNFEFont pfnCallback);
/* Bit flag, combined with message IDS values to specify messages that
* should be stored into the LastSetupErrMsg buffer in ProcessMessageId.
* Also macros to test, clear and set the bit flag.
*
* NOTE: 1 << 8 through 8 << 16 are reserved for ProcessMessageId
* internal use. (See setupdll\_assert.h)
*/
#define midErrMsg (16 << 16)
#define FIsErrMsg(id) (id & midErrMsg)
#define IdClearErrMsg(id) (id & (~midErrMsg))
#define IdErrMsg(id) (id | midErrMsg)
#ifdef DEBUG
# define DebugErrorParam(p,v) SetErrorParam(p,v)
# define DebugErrorParamCopy(p,v) SetErrorParamCopy(p,v)
# define DebugErrorParamConst(p,v) SetErrorParamConst(p,v)
# define DebugErrorParamInt(p,v) SetErrorParamInt(p,v)
# define DebugErrorParamChar(p,v) SetErrorParamChar(p,v)
# define DebugMessageId(i) ProcessMessageId(i)
# define DebugMessage(s) ProcessDebugMessage(s)
# define DebugLogMessageId(i) LogMessageId(i)
#else
# define DebugErrorParam(p,v)
# define DebugErrorParamCopy(p,v)
# define DebugErrorParamConst(p,v)
# define DebugErrorParamInt(p,v)
# define DebugErrorParamChar(p,v)
# define DebugMessageId(i)
# define DebugMessage(s)
# define DebugLogMessageId(i)
#endif
#ifdef DEBUG
BOOL PUBLIC ResponseFile ( SZ szFile );
#endif
/* Must call as the first call (with hinstAcme) AND as the last
* call (with hinstNull).
*/
BOOL PUBLIC SetAcmeInst(HINSTANCE hInst, LPSTR szCmdLine);
/* RunTime Argument Checking */
/* REVIEW: this should be removed, all uses replaced by calls to Validate */
#define RTChkArg(f, retVal) \
{ if (!(f)) { FailRTChkArg(THIS_FILE, __LINE__); return (retVal); } }
VRC PUBLIC FailRTChkArg ( SZC szFile, UINT uiLine );
/* Assert macros */
VOID PUBLIC FailAssert (SZC szFile, UINT uiLine ); /* also PreCond, BadParam */
#ifdef DEBUG
#define FailAssertObj(f, l, i) FailAssert(f, (UINT)(l + ((i)<<16)))
#define FailChkArg(f, l, i) FailAssert(f, (UINT)(l + (1<<31) + ((i)<<16)))
#define FailPreCond(f, l) FailAssert(f, (UINT)(l + (1<<31)))
#define Assert(f) ((f) ? (VOID)0 : (VOID)FailAssert(THIS_FILE, __LINE__))
#define EvalAssert(f) ((f) ? (VOID)0 : (VOID)FailAssert(THIS_FILE, __LINE__))
#define AssertRet(f, retVal) \
{if (!(f)) {FailAssert( THIS_FILE, __LINE__); return (retVal);} }
#define EvalAssertRet(f, retVal) \
{if (!(f)) {FailAssert( THIS_FILE, __LINE__); return (retVal);} }
#define PreCondition(f, retVal) \
{if (!(f)) {FailPreCond(THIS_FILE, __LINE__); return (retVal);} }
#define ChkArg(f, iArg, retVal) \
{if (!(f)) {FailChkArg(THIS_FILE, __LINE__, iArg); return (retVal);} }
#else
#define Assert(f)
#define EvalAssert(f) ((VOID)(f))
#define AssertRet( f, retVal)
#define EvalAssertRet(f, retVal) ((VOID)(f))
#define PreCondition( f, retVal) RTChkArg(f, retVal)
#define ChkArg( f, iArg, retVal)
#endif
/* REVIEW: These are obsolete, remove when files using them are updated */
#ifdef DEBUG
#define DisplayAssertMsg() Assert(fFalse);
#define DebugLine(expr) expr;
#define DisplayErrorMsg(sz) ((VOID)FDisplaySystemMsg(sz))
#else
#define DisplayAssertMsg() /* in objodbc.cpp, copylist.c */
#define DebugLine(expr) /* once in copylist.c */
#define DisplayErrorMsg(sz)
#endif
extern BOOL WINAPI FDisplaySystemMsg ( SZ szErr );
#ifdef DEVELOPER
#define BadArgErr(nArg, szApi, szArgs) SetupApiErr(nArg+saeMax, szApi, szArgs)
#else
#define BadArgErr(nArg, szApi, szArgs)
#endif
/* REVIEW: end of obsolete */
#ifdef __cplusplus
} /* End of extern "C" { */
#endif
#endif /* STDASSRT_H */