#pragma once // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 FUNCLAYER_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // FUNCLAYER_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifndef FUNCLAYER_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment(lib, "FuncLayerX64D.lib") #else #pragma comment(lib, "FuncLayerX64.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "FuncLayerD.lib") #else #pragma comment(lib, "FuncLayer.lib") #endif #endif #endif #ifdef FUNCLAYER_EXPORTS #define FUNCLAYER_API __declspec(dllexport) #define FUNCLAYER_C_API extern "C" __declspec(dllexport) #else #define FUNCLAYER_API __declspec(dllimport) #define FUNCLAYER_C_API extern "C" __declspec(dllimport) #endif #include "ResDataNode.h" //action---------------------------------------- template bool OemRegistClassFunc(T1 *p, T2 Addr, const char *pClass, const char *pFunc) { bool ret = false; typedef RET_STATUS(DEVICE_ACTION T1::*classMember) (ResDataObject &req, ResDataObject &res); classMember func = (classMember)Addr; typedef union _funcContext { classMember func; UINT32 Addr32; UINT64 Addr64; }FUNCCONTEXT; FUNCCONTEXT fc; memset(&fc, 0, sizeof(fc)); fc.func = func; #ifdef _WIN64 ret = p->RegistFunc((PVOID)p, pFunc, (PVOID)(fc.Addr64)); #else ret = p->RegistFunc((PVOID)p, pFunc, (PVOID)(fc.Addr32)); #endif if (ret == false) { GPRINTA_ERROR("RegistClassFunc Failed.ClassName:%s,FuncName:%s",pClass, pFunc); } return ret; } #define RegistDeviceAction(ClassType,Addr) OemRegistClassFunc(this,&ClassType::Addr,#ClassType,#Addr) //attribute:normal routine---------------------------------------- template bool OemRegistClassAttribute(T1 *p, T2 &Target, const char *pClass) { bool ret = false; #ifdef _WIN64 ret = p->RegistAttributeSet((PVOID)p, &Target,0); #else ret = p->RegistAttributeSet((PVOID)p, &Target,0); #endif if (ret == false) { GPRINTA_ERROR("RegistAttributeSet Failed.ClassName:%s,Attrkey:%s", pClass, Target.GetKey()); } return ret; } #define RegistDeviceAttribute(ClassType,Target) OemRegistClassAttribute(this,Target,#ClassType) typedef enum _AttributeRegistType { REGIST_ATTRIBUTE_GET, REGIST_ATTRIBUTE_SET, REGIST_ATTRIBUTE_ADD, REGIST_ATTRIBUTE_DEL, REGIST_ATTRIBUTE_UPDATE, REGIST_ATTRIBUTE_MAX }ATTRIBUTEREGISTTYPE; //attribute:Action routine---------------------------------------- template bool OemRegistClassAttributeEx(T1 *p, T2 &Target, T3 Addr, const char *pClass, const char *pFunc, ATTRIBUTEREGISTTYPE RegistType) { bool ret = false; typedef RET_STATUS(DEVICE_ACTION T1::*classMember) (ResDataObject &req); classMember func = (classMember)Addr; typedef union _funcContext { classMember func; UINT32 Addr32; UINT64 Addr64; }FUNCCONTEXT; FUNCCONTEXT fc; memset(&fc, 0, sizeof(fc)); fc.func = func; #ifdef _WIN64 switch (RegistType) { case REGIST_ATTRIBUTE_GET: ret = p->RegistAttributeGet((PVOID)p, &Target, (PVOID)(fc.Addr64)); break; case REGIST_ATTRIBUTE_SET: ret = p->RegistAttributeSet((PVOID)p, &Target, (PVOID)(fc.Addr64)); break; case REGIST_ATTRIBUTE_ADD: ret = p->RegistAttributeAdd((PVOID)p, &Target, (PVOID)(fc.Addr64)); break; case REGIST_ATTRIBUTE_DEL: ret = p->RegistAttributeDel((PVOID)p, &Target, (PVOID)(fc.Addr64)); break; case REGIST_ATTRIBUTE_UPDATE: ret = p->RegistAttributeUpdate((PVOID)p, &Target, (PVOID)(fc.Addr64)); break; default: break; } #else switch (RegistType) { case REGIST_ATTRIBUTE_GET: ret = p->RegistAttributeGet((PVOID)p, &Target, (PVOID)(fc.Addr32)); break; case REGIST_ATTRIBUTE_SET: ret = p->RegistAttributeSet((PVOID)p, &Target, (PVOID)(fc.Addr32)); break; case REGIST_ATTRIBUTE_ADD: ret = p->RegistAttributeAdd((PVOID)p, &Target, (PVOID)(fc.Addr32)); break; case REGIST_ATTRIBUTE_DEL: ret = p->RegistAttributeDel((PVOID)p, &Target, (PVOID)(fc.Addr32)); break; case REGIST_ATTRIBUTE_UPDATE: ret = p->RegistAttributeUpdate((PVOID)p, &Target, (PVOID)(fc.Addr32)); break; default: break; } #endif if (ret == false) { GPRINTA_ERROR("RegistAttributeEx Failed.ClassName:%s,Attrkey:%s,SetFuncName:%s", pClass, Target.GetKey(), pFunc); } return ret; } #define RegistDeviceAttributeGet(ClassType,Target,Addr) OemRegistClassAttributeEx(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_GET) #define RegistDeviceAttributeSet(ClassType,Target,Addr) OemRegistClassAttributeEx(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_SET) #define RegistDeviceAttributeAdd(ClassType,Target,Addr) OemRegistClassAttributeEx(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_ADD) #define RegistDeviceAttributeDel(ClassType,Target,Addr) OemRegistClassAttributeEx(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_DEL) #define RegistDeviceAttributeUpdate(ClassType,Target,Addr) OemRegistClassAttributeEx(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_UPDATE) //req{P0:val1,P1:val2,...} //res{P0:val1,P1:val2,...} typedef RET_STATUS(DEVICE_ACTION *REGISTFUNCTYPE0)(PVOID pthis, ResDataObject &req, ResDataObject &res); typedef RET_STATUS(DEVICE_ACTION *REGISTATTRCHANGEADDR)(PVOID pthis, ResDataObject &req); class FUNCLAYER_API AttrActions{ public: REGISTATTRCHANGEADDR m_pGetAddr; REGISTATTRCHANGEADDR m_pSetAddr; REGISTATTRCHANGEADDR m_pAddAddr; REGISTATTRCHANGEADDR m_pDelAddr; REGISTATTRCHANGEADDR m_pUpdateAddr; ResDataNode* m_pTarget; AttrActions(); AttrActions(ResDataNode *pTarget); virtual ~AttrActions(); void GetAction(PVOID Addr); void SetAction(PVOID Addr); void AddAction(PVOID Addr); void DelAction(PVOID Addr); void UpdateAction(PVOID Addr); }; class FUNCLAYER_API FuncLayer : public LogicDevice { HANDLE m_RegistDone; protected://for internal use //this,attributekey,attr,SetAddr map> *m_pRegistedAttributes; //this,funcionkey,entry map> *m_pRegistedActions; bool SYSTEM_CALL GetDeviceResourceAttrs(ResDataObject &Res); bool SYSTEM_CALL GetDeviceResourceActions(ResDataObject &Res); virtual RET_STATUS SYSTEM_CALL Dispatch_AttributeChange(INT cmd,const char *pszKey, ResDataObject &Context); public: FuncLayer(void); virtual ~FuncLayer(void); //get device type virtual bool SYSTEM_CALL GetDeviceType(GUID &DevType); //notify to lower layer virtual RET_STATUS SYSTEM_CALL CmdToLogicDev(ResDataObject PARAM_IN *pCmd); //get device resource virtual RET_STATUS SYSTEM_CALL GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResource); //ResourceCommand Request In and Response Out virtual RET_STATUS SYSTEM_CALL Request(ResDataObject PARAM_IN *pRequest, ResDataObject PARAM_OUT *pResponse); virtual bool SYSTEM_CALL RegistFunc(PVOID pTarget,const char *pFuncName, PVOID FunctionAddr); virtual bool SYSTEM_CALL RegistAttributeGet(PVOID pTarget, ResDataNode *pDataNode, PVOID FunctionAddr); virtual bool SYSTEM_CALL RegistAttributeSet(PVOID pTarget, ResDataNode *pDataNode,PVOID FunctionAddr); virtual bool SYSTEM_CALL RegistAttributeAdd(PVOID pTarget, ResDataNode *pDataNode, PVOID FunctionAddr); virtual bool SYSTEM_CALL RegistAttributeDel(PVOID pTarget, ResDataNode *pDataNode, PVOID FunctionAddr); virtual bool SYSTEM_CALL RegistAttributeUpdate(PVOID pTarget, ResDataNode *pDataNode, PVOID FunctionAddr); virtual void SYSTEM_CALL SetRegistStatus(bool Done); //normal attr routine virtual RET_STATUS DEVICE_ACTION ADD(const char *pszKey, ResDataObject &Context); virtual RET_STATUS DEVICE_ACTION DEL(const char *pszKey, ResDataObject &Context); virtual RET_STATUS DEVICE_ACTION SET(const char *pszKey, ResDataObject &Context); virtual RET_STATUS DEVICE_ACTION GET(const char *pszKey, ResDataObject &Context); virtual RET_STATUS DEVICE_ACTION UPDATE(const char *pszKey, ResDataObject &Context); //actions virtual RET_STATUS DEVICE_ACTION Action(const char *pszKey, ResDataObject &req, ResDataObject &res); virtual RET_STATUS DEVICE_ACTION PostNotify(ResDataObject &Notify); };