123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- #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 <class T1, class T2>
- 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<ClassType>(this,&ClassType::Addr,#ClassType,#Addr)
- //attribute:normal routine----------------------------------------
- template <class T1, class T2>
- 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<ClassType>(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 <class T1, class T2, class T3>
- 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<ClassType>(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_GET)
- #define RegistDeviceAttributeSet(ClassType,Target,Addr) OemRegistClassAttributeEx<ClassType>(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_SET)
- #define RegistDeviceAttributeAdd(ClassType,Target,Addr) OemRegistClassAttributeEx<ClassType>(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_ADD)
- #define RegistDeviceAttributeDel(ClassType,Target,Addr) OemRegistClassAttributeEx<ClassType>(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_DEL)
- #define RegistDeviceAttributeUpdate(ClassType,Target,Addr) OemRegistClassAttributeEx<ClassType>(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<PVOID, map<string, AttrActions>> *m_pRegistedAttributes;
- //this,funcionkey,entry
- map<PVOID,map<string, PVOID>> *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);
- };
|