用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

420 lines
22 KiB

/**
* Copyright (C) 2014-2050
* All rights reserved.
*
* @file SAttrCracker.h
* @brief
* @version v1.0
* @author SOUI group
* @date 2014/08/15
*
* Describe 定义SOUI的XML属性解析宏
*/
#ifndef _SATTRCRACK_H
#define _SATTRCRACK_H
#pragma once
// Attribute Declaration
#define SOUI_ATTRS_BEGIN() \
public: \
virtual HRESULT SetAttribute( \
const SOUI::SStringW & strAttribName, \
const SOUI::SStringW & strValue, \
BOOL bLoading=FALSE) \
{ \
HRESULT hRet = E_FAIL; \
//从SObject派生的类是属性结尾
#define SOUI_ATTRS_END() \
if(FAILED(hRet)) return __super::SetAttribute( \
strAttribName, \
strValue, \
bLoading \
); \
return AfterAttribute(strAttribName,strValue,bLoading,hRet);\
} \
//不交给SObject处理的属性表结尾
#define SOUI_ATTRS_BREAK() \
return E_NOTIMPL; \
return hRet; \
} \
#define ATTR_CHAIN(varname,flag) \
if (FAILED(hRet) && SUCCEEDED(hRet = varname.SetAttribute(strAttribName, strValue, bLoading))) \
{ \
hRet |= flag; \
} \
else \
#define ATTR_CHAIN_PTR(varname,flag) \
if (FAILED(hRet) && varname!= NULL && SUCCEEDED(hRet = varname->SetAttribute(strAttribName, strValue, bLoading))) \
{ \
hRet |= flag; \
} \
else \
#define ATTR_CUSTOM(attribname, func) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
hRet = func(strValue, bLoading); \
} \
else \
#define STRINGASBOOL(strValue) (strValue).CompareNoCase(L"0") != 0 && (strValue).CompareNoCase(L"false") != 0
#define ATTR_BOOL(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
varname=STRINGASBOOL(strValue); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// Int = %d StringA
#define ATTR_INT(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
int nRet=0; \
::StrToIntExW(strValue,STIF_SUPPORT_HEX,&nRet); \
varname=nRet; \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
#define ATTR_LAYOUTSIZE(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
varname = GETLAYOUTSIZE(strValue); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
#define ATTR_LAYOUTSIZE2(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
SStringWList values; \
if(SplitString(strValue,L',',values)!=2) return E_INVALIDARG;\
varname[0]=GETLAYOUTSIZE(values[0]); \
varname[1]=GETLAYOUTSIZE(values[1]); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
#define ATTR_LAYOUTSIZE4(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
SStringWList values; \
if(SplitString(strValue,L',',values)!=4) return E_INVALIDARG;\
varname[0]=GETLAYOUTSIZE(values[0]); \
varname[1]=GETLAYOUTSIZE(values[1]); \
varname[2]=GETLAYOUTSIZE(values[2]); \
varname[3]=GETLAYOUTSIZE(values[3]); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
#define ATTR_MARGIN(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
SStringWList values; \
if(SplitString(strValue,L',',values)!=4) return E_INVALIDARG;\
varname.left=GETLAYOUTSIZE(values[0]).toPixelSize(100); \
varname.top=GETLAYOUTSIZE(values[1]).toPixelSize(100); \
varname.right=GETLAYOUTSIZE(values[2]).toPixelSize(100);\
varname.bottom=GETLAYOUTSIZE(values[3]).toPixelSize(100);\
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// Rect = %d,%d,%d,%d StringA
#define ATTR_RECT(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
swscanf_s(strValue,L"%d,%d,%d,%d",&varname.left,&varname.top,&varname.right,&varname.bottom);\
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// Size = %d,%d StringA
#define ATTR_SIZE(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
swscanf_s(strValue,L"%d,%d",&varname.cx,&varname.cy);\
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// Point = %d,%d StringA
#define ATTR_POINT(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
swscanf_s(strValue,L"%d,%d",&varname.x,&varname.y);\
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// Float = %f StringA
#define ATTR_FLOAT(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
swscanf_s(strValue,L"%f",&varname); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// UInt = %u StringA
#define ATTR_UINT(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
int nRet=0; \
::StrToIntExW(strValue,STIF_SUPPORT_HEX,&nRet); \
varname = (UINT)nRet; \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// DWORD = %u StringA
#define ATTR_DWORD(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
int nRet=0; \
::StrToIntExW(strValue,STIF_SUPPORT_HEX,&nRet); \
varname = (DWORD)nRet; \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// WORD = %u StringA
#define ATTR_WORD(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
int nRet=0; \
::StrToIntExW(strValue,STIF_SUPPORT_HEX,&nRet); \
varname = (WORD)nRet; \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// bool = 0 or 1 StringA
#define ATTR_BIT(attribname, varname, maskbit, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
bool bSet=STRINGASBOOL(strValue); \
if(bSet) varname|=maskbit; \
else varname &=~(maskbit); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// StringA = StringA
#define ATTR_STRINGA(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
SOUI::SStringW strTmp=GETSTRING(strValue); \
varname = S_CW2A(strTmp); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// StringW = StringA
#define ATTR_STRINGW(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
varname=GETSTRING(strValue); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// StringT = StringA
#define ATTR_STRINGT(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
varname=S_CW2T(GETSTRING(strValue)); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// StringA = StringA
#define ATTR_I18NSTRA(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
SOUI::SStringW strTmp=tr(GETSTRING(strValue)); \
varname = S_CW2A(strTmp); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// STrText = StringA
#define ATTR_I18NSTRT(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
SOUI::SStringW strTmp=GETSTRING(strValue); \
varname.SetText(S_CW2T(strTmp)); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// DWORD = 0x08x StringA
#define ATTR_HEX(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
int nRet=0; \
::StrToIntExW(strValue,STIF_SUPPORT_HEX,&nRet); \
varname = nRet; \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// COLORREF = #06X or #08x or rgba(r,g,b,a) or rgb(r,g,b)
#define ATTR_COLOR(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
if(!strValue.IsEmpty()) \
{ \
varname = GETCOLOR(strValue); \
hRet = allredraw ? S_OK : S_FALSE; \
}else \
{ \
hRet=E_FAIL; \
} \
} \
else \
//DpiAwareFont="face:宋体;bold:1;italic:1;underline:1;adding:10"
#define ATTR_FONT(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
varname.SetFontDesc(strValue,GetScale()); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// Value In {String1 : Value1, String2 : Value2 ...}
#define ATTR_ENUM_BEGIN(attribname, vartype, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
vartype varTemp; \
\
hRet = allredraw ? S_OK : S_FALSE; \
#define ATTR_ENUM_VALUE(enumstring, enumvalue) \
if (strValue == enumstring) \
varTemp = enumvalue; \
else \
#define ATTR_ENUM_END(varname) \
return E_FAIL; \
\
varname = varTemp; \
} \
else \
// SwndStyle From StringA Key
#define ATTR_STYLE(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
GETSTYLE(strValue,varname); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// SSkinPool From StringA Key
#define ATTR_SKIN(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
varname = GETSKIN(strValue,GetScale()); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
// SSkinPool From StringA Key
#define ATTR_INTERPOLATOR(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
varname.Attach(CREATEINTERPOLATOR(strValue)); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
//ATTR_IMAGE:直接使用IResProvider::LoadImage创建SOUI::IBitmap对象,创建成功后引用计数为1
//不需要调用AddRef,但是用完后需要调用Release
#define ATTR_IMAGE(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
SOUI::IBitmap *pImg=LOADIMAGE2(strValue); \
if(!pImg) hRet =E_FAIL; \
else{ \
if(varname) varname->Release(); \
varname = pImg; \
hRet = allredraw ? S_OK : S_FALSE; \
} \
} \
else \
//ATTR_IMAGEAUTOREF:varname应该是一个SAutoRefPtr<SOUI::IBitmap>对象
#define ATTR_IMAGEAUTOREF(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
SOUI::IBitmap *pImg=LOADIMAGE2(strValue); \
if(!pImg) hRet =E_FAIL; \
else{ \
varname = pImg; \
pImg->Release(); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
} \
else \
#define ATTR_ICON(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
if(varname) DestroyIcon(varname); \
varname = LOADICON2(strValue); \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
#define ATTR_CHAR(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
varname = *(LPCWSTR)strValue; \
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
#define ATTR_ANIMATION(attribname, varname, allredraw) \
if (0 == strAttribName.CompareNoCase(attribname)) \
{ \
varname.Attach(SApplication::getSingleton().LoadAnimation(S_CW2T(strValue)));\
hRet = allredraw ? S_OK : S_FALSE; \
} \
else \
#endif//_SATTRCRACK_H