windows-nt/Source/XPSP1/NT/admin/pchealth/sr/nttest/srdiag2/tstparam.hxx
2020-09-26 16:20:57 +08:00

460 lines
14 KiB
C++

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998.
//
// File: tstparam.hxx
//
// Synopsys: Test paramers container class definitions
//
// Classes: CTestParams, CParamNode
//
// Notes: The test parameter containers provide a layer of abstraction
// above the particular ways to pass test parameters -
// (command line, environment, registry...)
//
// History: 10-Sep-1998 georgis created
//
//---------------------------------------------------------------------------
#ifndef __TSTPARAM_HXX__
#define __TSTPARAM_HXX__
// Maximum registry string value length
#define MAX_REGSTRLEN _MAX_PATH
//+--------------------------------------------------------------------------
//
// Macros: GETPARAM
//
// Synopsys: Get parameter from the default container
//
// Parameters: param: the parameter definition string
// var: the variable which receives the result
//
// Notes: The parameter definition string must be in format "name:format"
// where name is the name which identifies the parameter and
// format shows how to read this parameter.
// E.g. "my_int:%i"
//
// Formats may be of two types:
// 1) Any standard sscanf formats starting with %
// E.g. %i %u %d %lx %s ...
//
// 2) Custom formats
// bool - read BOOL (*pTarget is BOOL)
// cstr - read constant string (*pTarget is const char*)
// astr - heap allocated ascii string (*pTarget is char*)
// tstr - heap allocated TCHAR string (*pTarget is LPTSTR)
// olestr - heap allocated OLESTR string (*pTarget is LPOLESTR)
//
// For the heap allocated formats the string obtained is writable,
// and the caller is responsible for deleting it.
//
// History: 02-Oct-1998 georgis Created
//
//+--------------------------------------------------------------------------
#define GETPARAM(param,var) \
g_TestParams.GetParam(param,&var)
//+--------------------------------------------------------------------------
//
// Macros: GETPARAM_ABORTONERROR
//
// Synopsys: Get parameter from the default container
// and abort on error
//
// Parameters: param: the parameter definition string
// var: the variable which receives the result
//
// History: 20-Oct-1998 georgis Created
//
//+--------------------------------------------------------------------------
#define GETPARAM_ABORTONERROR(param,var) \
hr=g_TestParams.GetParam(param,&var); \
if (S_FALSE!=hr) \
{ \
DH_HRCHECK_ABORT(hr,TEXT(param)); \
} \
hr=S_OK;
//+--------------------------------------------------------------------------
//
// Macros: GETPARAM_DEFINE
//
// Synopsys: Expands to definition of local variable, and
// initialization by the parameter value or the default
//
// Parameters: type: the variable type
// var: the variable which receives the result
// param: the parameter definition string
// defaultval: the defauilt value
//
// History: 02-Oct-1998 georgis Created
//
//+--------------------------------------------------------------------------
#define GETPARAM_DEFINE(type,var,param,defaultval) \
type var=defaultval; \
g_TestParams.GetParam(param,&var)
//+--------------------------------------------------------------------------
//
// Macros: GETPARAM_REQUIRED
//
// Synopsys: As GETPARAM, but aborts the current function on failure to
// obtain the parameter (see DH_*ABORT macros)
//
// Parameters: param: the parameter definition string
// var: the variable which receives the result
//
// History: 02-Oct-1998 georgis Created
//
//+--------------------------------------------------------------------------
#define GETPARAM_REQUIRED(param,var) \
hr=g_TestParams.GetParam(param,&var); \
DH_HRCHECK_ABORT(hr,TEXT(param));
//+--------------------------------------------------------------------------
//
// Macros: GETPARAM_ENUM
//
// Synopsys: Gets the value of a parameter as enum (DWORD)
//
// Example: GETPARAM_ENUM(
// "mode",
// &dwMode,
// "rw", STGM_READWRITE,
// "r", STGM_READ,
// "w", STGM_WRITE,
// NULL);
//
// if e.g. there is command line switch /mode:r
// the dwMode will be set to STGM_READ
//
// History: 02-Oct-1998 georgis Created
//
//+--------------------------------------------------------------------------
#define GETPARAM_ENUM g_TestParams.GetEnum
//+--------------------------------------------------------------------------
//
// Macros: GETPARAM_RANGE
//
// Synopsys: Gets the value of a parameter as range (min, max)
//
// Example: GETPARAM_RANGE("streamsize",ullMin,ullMax);
//
// Notes: The min and max can be ULONG or ULONGLONG
//
// History: 02-Oct-1998 georgis Created
//
//+--------------------------------------------------------------------------
#define GETPARAM_RANGE(param,min,max) \
g_TestParams.GetRange(param,&min,&max);
//+--------------------------------------------------------------------------
//
// Macros: GETPARAM_ISPRESENT
//
// Synopsys: Returns TRUE is the parameter is present in
// the default container
//
// Parameters: param: the parameter definition string
//
// History: 02-Oct-1998 georgis Created
//
//+--------------------------------------------------------------------------
#define GETPARAM_ISPRESENT(param) \
g_TestParams.IsPresent(param)
//+--------------------------------------------------------------------------
//
// Macros: SETPARAM
//
// Synopsys: Set param in the global container (see SetParam method)
//
// History: 02-Oct-1998 georgis Created
//
//+--------------------------------------------------------------------------
#define SETPARAM g_TestParams.SetParam
// Custom parameter types:
#define PARAMFMT_BOOL L"bool"
#define PARAMFMT_CSTR L"cstr"
#define PARAMFMT_ASTR L"astr"
#define PARAMFMT_TSTR L"tstr"
#define PARAMFMT_OLESTR L"olestr"
// Flags: Each parameter in CTestParams have name,value and flags (DWORD)
#define PARAMMASK_PRIORITY 0x000000ff // The priority of the parameter
#define PARAMMASK_SOURCE 0x0000ff00 // From where this param was read
#define PARAMMASK_USAGE 0x00ff0000 // Who used this parameter
#define PARAMMASK_OPTIONS 0xff000000 // Misc flags
#define PARAMMASK_ALL 0xffffffff
// Default priorities
#define PARAMPRIORITY_RUNTIME 0x00000080 // Set using SetParam
#define PARAMPRIORITY_CMDLINE 0x00000040
#define PARAMPRIORITY_ENVIRON 0x00000020
#define PARAMPRIORITY_REGISTRY 0x00000010
// Basic parameter sources
#define PARAMSOURCE_RUNTIME 0x00008000
#define PARAMSOURCE_CMDLINE 0x00004000
#define PARAMSOURCE_ENVIRON 0x00002000
#define PARAMSOURCE_REGISTRY 0x00001000
#define PARAMSOURCE_ANY PARAMMASK_SOURCE
// Parameter usage markers (Who used the parameter)
#define PARAMUSAGE_GENERAL 0x00010000 // During initialization
#define PARAMUSAGE_TESTCASE 0x00020000 // the current testcase
#define PARAMUSAGE_DFLREPRO 0x000f0000 // what to include in repro by default
#define PARAMUSAGE_TESTDRIVER 0x00100000 // exclude from single testcase repro
#define PARAMUSAGE_SELECTOR_G 0x00200000 // reserved for global CSelector object
#define PARAMUSAGE_SELECTOR_L 0x00400000 // reserved for local CSelector objects
// General options
#define PARAMFLAG_MUSTSET 0x01000000 // fail if can't override param
#define PARAMFLAG_OVERRIDEUSED 0x02000000 // override even if used
#define PARAMFLAG_REPROINFO 0x04000000 // e.g. "seed:%x"
// Sources masks summary
#define PARAMFLAGS_CMDLINE PARAMSOURCE_CMDLINE | PARAMPRIORITY_CMDLINE
#define PARAMFLAGS_ENVIRON PARAMSOURCE_ENVIRON | PARAMPRIORITY_ENVIRON
#define PARAMFLAGS_REGISTRY PARAMSOURCE_REGISTRY | PARAMPRIORITY_REGISTRY
#define PARAMFLAGS_RUNTIME PARAMSOURCE_RUNTIME | PARAMPRIORITY_RUNTIME
// Parameters which may be added at runtime (as seed).
// They are added from the begining as "used", in the curent scope
// and are deleted when the usage is cleared
#define PARAMFLAGS_REPROINFO PARAMFLAG_REPROINFO|PARAMFLAG_OVERRIDEUSED| \
PARAMFLAG_MUSTSET|PARAMFLAGS_RUNTIME
// Forward definition of the internal class
class CParamNode;
//+--------------------------------------------------------------------------
//
// Class: CTestParams
//
// Synopsys: Test parameter container class.
//
// Purpose: To provide a level of abstraction above the specific ways
// for passing the test parameters (command line, environment,
// registry keys ...).
//
// History: 09-Sep-1998 georgis Created
//
//---------------------------------------------------------------------------
class CTestParams
{
public:
// Constructor and Destructor
CTestParams();
virtual ~CTestParams();
// Info function TRUE if the container is empty
inline HRESULT IsEmpty()
{return NULL==m_pParamsList;};
// Functions for extracting / adding parameters
HRESULT GetParam(
const char *pszName,
void* pTarget);
HRESULT SetParam(
const char *pszName,
void* pTarget,
DWORD dwFlags=PARAMFLAGS_RUNTIME);
BOOL __cdecl IsPresent(
const char *pszName ,...);
HRESULT DeleteParam(
const char *ptszName);
HRESULT __cdecl GetEnum(
const char *pszParamName,
DWORD *pdwValue,...);
HRESULT GetRange(
const char *pszParamName,
ULONGLONG *pullMin,
ULONGLONG *pullMax);
HRESULT GetRange(
const char *pszParamName,
ULONG *pulMin,
ULONG *pulMax);
// Functions for handling flags
void SetUsage(
DWORD dwFlags)
{m_dwUsageInfo=dwFlags;};
void ClearUsage(
DWORD dwFlags);
HRESULT ChangeFlags(
DWORD dwOldFlags,
DWORD dwNewFlags);
// Functions to read from some parameter sources
HRESULT ReadCommandLine(
LPCTSTR ptszCtommandLine=NULL,
DWORD dwFlags=PARAMFLAGS_CMDLINE);
HRESULT ReadEnvironment(
LPCWSTR pszPrefix=NULL,
DWORD dwFlags=PARAMFLAGS_ENVIRON);
HRESULT ReadRegistry(
HKEY hBaseKey,
LPCTSTR ptszKeyName,
DWORD dwFlags=PARAMFLAGS_REGISTRY);
// Handle the parameter set as whole
HRESULT SaveParams(
char **ppcBuffer,
DWORD *pdwSize,
DWORD dwMask=PARAMSOURCE_ANY);
HRESULT LoadParams(
char *pcBuffer,
DWORD dwSize,
DWORD dwChangeFlags=0);
HRESULT GetReproLine(LPWSTR *ppwszReproLine, DWORD dwFlags);
HRESULT GetReproLine(char **ppszReproLine, DWORD dwFlags);
protected:
virtual HRESULT NotifyOnFirstUse(){return S_OK;}; // use when inherit
private:
// Custom format params
HRESULT SetCustomFmtParam(
LPCWSTR pszFormat,
LPCWSTR pszValue,
void* pTarget,
DWORD dwFlags);
HRESULT GetCustomFmtParam(
LPCWSTR pszName,
LPCWSTR pszFormat,
void* pTarget);
CParamNode* FindParam(
LPCWSTR Name,
CParamNode** ppPrev);
HRESULT AddParam(
LPCWSTR pwszName,
LPCWSTR pwszValue,
DWORD dwFlags,
BOOL bWasQuoted=FALSE);
CParamNode *m_pParamsList;
DWORD m_dwUsageInfo;
BOOL m_bUsed;
CRITICAL_SECTION m_sync;
};
//+--------------------------------------------------------------------------
//
// Class: CParamNode (internaly used in CTestParams)
//
// Synopsys: Single linked list node for one parameter info
//
// History: 29-Sep-1998 georgis Created
//
//---------------------------------------------------------------------------
class CParamNode
{
friend class CTestParams;
DWORD m_dwHashValue;
DWORD m_dwFlags; // source,priority,usage
LPWSTR m_pwszName;
LPWSTR m_pwszValue;
CParamNode *m_pNext;
CParamNode(DWORD dwFlags);
~CParamNode();
HRESULT Init(
LPCWSTR pwszName,
LPCWSTR pwszValue);
HRESULT ChangeValue(
LPCWSTR pwszValue,
DWORD dwFlags);
inline void MarkAsUsed(DWORD dwFlags) // Mark the param as used
{m_dwFlags|=PARAMMASK_USAGE & dwFlags;};
inline void ClearUsage(DWORD dwFlags) // Clear given usage flags
{m_dwFlags &=~(PARAMMASK_USAGE & dwFlags);};
inline void ChangeFlags(DWORD dwFlags) // Change all except usage
{m_dwFlags = (dwFlags & ~PARAMMASK_USAGE)|(PARAMMASK_USAGE & m_dwFlags);};
};
// Utilities functions for converting Unicode strings to/from escaped ascii
#define ESCAPE_CHARACTER '#'
#define ESCAPED_MARKER ':'
#define ESCAPE_NOTNEEDED(x)\
((' '<=x)&&('~'>=x))
#define ESCAPEMODE_PREFIX_ALWAYS 0
#define ESCAPEMODE_PREFIX_NEVER 1
#define ESCAPEMODE_PREFIX_IFCHANGED 2
#define ESCAPE_MODE_DEFAULT ESCAPEMODE_PREFIX_ALWAYS
HRESULT Unicode2Escaped(
LPCWSTR pwszString,
char ** ppszString,
DWORD dwEscapeMode=ESCAPE_MODE_DEFAULT);
HRESULT Unicode2Escaped(
LPCWSTR pwszString,
LPWSTR* ppwszString,
DWORD dwEscapeMode=ESCAPE_MODE_DEFAULT);
HRESULT Escaped2Unicode(
const char * pszEscaped,
LPWSTR *ppwszString,
DWORD dwEscapeMode=ESCAPE_MODE_DEFAULT);
HRESULT Escaped2Unicode(
LPCWSTR pszEscaped,
LPWSTR *ppwszString,
DWORD dwEscapeMode=ESCAPE_MODE_DEFAULT);
// CTOLESTG specific
// parameters to affect the param handling itself
#define PARAMDUMP "paramdump:%lx" // specify to dump on the first Get*
#define STG_CMDLINEONLY "cmdonly:bool" // read only from command line
// The only way to start using CTestParams in all the exisating suites
// without modifications in to read parameters in the object's constructor
class CStgParams : public CTestParams
{
protected:
virtual HRESULT NotifyOnFirstUse();
};
extern CStgParams g_TestParams;
#endif __TSTPARAM_HXX__