FuncLayer.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #pragma once
  2. // 下列 ifdef 块是创建使从 DLL 导出更简单的
  3. // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 FUNCLAYER_EXPORTS
  4. // 符号编译的。在使用此 DLL 的
  5. // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
  6. // FUNCLAYER_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
  7. // 符号视为是被导出的。
  8. #ifndef FUNCLAYER_EXPORTS
  9. #ifdef _WIN64
  10. #ifdef _DEBUG
  11. #pragma comment(lib, "FuncLayerX64D.lib")
  12. #else
  13. #pragma comment(lib, "FuncLayerX64.lib")
  14. #endif
  15. #else
  16. #ifdef _DEBUG
  17. #pragma comment(lib, "FuncLayerD.lib")
  18. #else
  19. #pragma comment(lib, "FuncLayer.lib")
  20. #endif
  21. #endif
  22. #endif
  23. #ifdef FUNCLAYER_EXPORTS
  24. #define FUNCLAYER_API __declspec(dllexport)
  25. #define FUNCLAYER_C_API extern "C" __declspec(dllexport)
  26. #else
  27. #define FUNCLAYER_API __declspec(dllimport)
  28. #define FUNCLAYER_C_API extern "C" __declspec(dllimport)
  29. #endif
  30. #include "ResDataNode.h"
  31. //action----------------------------------------
  32. template <class T1, class T2>
  33. bool OemRegistClassFunc(T1 *p, T2 Addr, const char *pClass, const char *pFunc)
  34. {
  35. bool ret = false;
  36. typedef RET_STATUS(DEVICE_ACTION T1::*classMember) (ResDataObject &req, ResDataObject &res);
  37. classMember func = (classMember)Addr;
  38. typedef union _funcContext {
  39. classMember func;
  40. UINT32 Addr32;
  41. UINT64 Addr64;
  42. }FUNCCONTEXT;
  43. FUNCCONTEXT fc;
  44. memset(&fc, 0, sizeof(fc));
  45. fc.func = func;
  46. #ifdef _WIN64
  47. ret = p->RegistFunc((PVOID)p, pFunc, (PVOID)(fc.Addr64));
  48. #else
  49. ret = p->RegistFunc((PVOID)p, pFunc, (PVOID)(fc.Addr32));
  50. #endif
  51. if (ret == false)
  52. {
  53. GPRINTA_ERROR("RegistClassFunc Failed.ClassName:%s,FuncName:%s",pClass, pFunc);
  54. }
  55. return ret;
  56. }
  57. #define RegistDeviceAction(ClassType,Addr) OemRegistClassFunc<ClassType>(this,&ClassType::Addr,#ClassType,#Addr)
  58. //attribute:normal routine----------------------------------------
  59. template <class T1, class T2>
  60. bool OemRegistClassAttribute(T1 *p, T2 &Target, const char *pClass)
  61. {
  62. bool ret = false;
  63. #ifdef _WIN64
  64. ret = p->RegistAttributeSet((PVOID)p, &Target,0);
  65. #else
  66. ret = p->RegistAttributeSet((PVOID)p, &Target,0);
  67. #endif
  68. if (ret == false)
  69. {
  70. GPRINTA_ERROR("RegistAttributeSet Failed.ClassName:%s,Attrkey:%s", pClass, Target.GetKey());
  71. }
  72. return ret;
  73. }
  74. #define RegistDeviceAttribute(ClassType,Target) OemRegistClassAttribute<ClassType>(this,Target,#ClassType)
  75. typedef enum _AttributeRegistType {
  76. REGIST_ATTRIBUTE_GET,
  77. REGIST_ATTRIBUTE_SET,
  78. REGIST_ATTRIBUTE_ADD,
  79. REGIST_ATTRIBUTE_DEL,
  80. REGIST_ATTRIBUTE_UPDATE,
  81. REGIST_ATTRIBUTE_MAX
  82. }ATTRIBUTEREGISTTYPE;
  83. //attribute:Action routine----------------------------------------
  84. template <class T1, class T2, class T3>
  85. bool OemRegistClassAttributeEx(T1 *p, T2 &Target, T3 Addr, const char *pClass, const char *pFunc, ATTRIBUTEREGISTTYPE RegistType)
  86. {
  87. bool ret = false;
  88. typedef RET_STATUS(DEVICE_ACTION T1::*classMember) (ResDataObject &req);
  89. classMember func = (classMember)Addr;
  90. typedef union _funcContext {
  91. classMember func;
  92. UINT32 Addr32;
  93. UINT64 Addr64;
  94. }FUNCCONTEXT;
  95. FUNCCONTEXT fc;
  96. memset(&fc, 0, sizeof(fc));
  97. fc.func = func;
  98. #ifdef _WIN64
  99. switch (RegistType)
  100. {
  101. case REGIST_ATTRIBUTE_GET:
  102. ret = p->RegistAttributeGet((PVOID)p, &Target, (PVOID)(fc.Addr64));
  103. break;
  104. case REGIST_ATTRIBUTE_SET:
  105. ret = p->RegistAttributeSet((PVOID)p, &Target, (PVOID)(fc.Addr64));
  106. break;
  107. case REGIST_ATTRIBUTE_ADD:
  108. ret = p->RegistAttributeAdd((PVOID)p, &Target, (PVOID)(fc.Addr64));
  109. break;
  110. case REGIST_ATTRIBUTE_DEL:
  111. ret = p->RegistAttributeDel((PVOID)p, &Target, (PVOID)(fc.Addr64));
  112. break;
  113. case REGIST_ATTRIBUTE_UPDATE:
  114. ret = p->RegistAttributeUpdate((PVOID)p, &Target, (PVOID)(fc.Addr64));
  115. break;
  116. default:
  117. break;
  118. }
  119. #else
  120. switch (RegistType)
  121. {
  122. case REGIST_ATTRIBUTE_GET:
  123. ret = p->RegistAttributeGet((PVOID)p, &Target, (PVOID)(fc.Addr32));
  124. break;
  125. case REGIST_ATTRIBUTE_SET:
  126. ret = p->RegistAttributeSet((PVOID)p, &Target, (PVOID)(fc.Addr32));
  127. break;
  128. case REGIST_ATTRIBUTE_ADD:
  129. ret = p->RegistAttributeAdd((PVOID)p, &Target, (PVOID)(fc.Addr32));
  130. break;
  131. case REGIST_ATTRIBUTE_DEL:
  132. ret = p->RegistAttributeDel((PVOID)p, &Target, (PVOID)(fc.Addr32));
  133. break;
  134. case REGIST_ATTRIBUTE_UPDATE:
  135. ret = p->RegistAttributeUpdate((PVOID)p, &Target, (PVOID)(fc.Addr32));
  136. break;
  137. default:
  138. break;
  139. }
  140. #endif
  141. if (ret == false)
  142. {
  143. GPRINTA_ERROR("RegistAttributeEx Failed.ClassName:%s,Attrkey:%s,SetFuncName:%s", pClass, Target.GetKey(), pFunc);
  144. }
  145. return ret;
  146. }
  147. #define RegistDeviceAttributeGet(ClassType,Target,Addr) OemRegistClassAttributeEx<ClassType>(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_GET)
  148. #define RegistDeviceAttributeSet(ClassType,Target,Addr) OemRegistClassAttributeEx<ClassType>(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_SET)
  149. #define RegistDeviceAttributeAdd(ClassType,Target,Addr) OemRegistClassAttributeEx<ClassType>(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_ADD)
  150. #define RegistDeviceAttributeDel(ClassType,Target,Addr) OemRegistClassAttributeEx<ClassType>(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_DEL)
  151. #define RegistDeviceAttributeUpdate(ClassType,Target,Addr) OemRegistClassAttributeEx<ClassType>(this,Target,&ClassType::Addr,#ClassType,#Addr,REGIST_ATTRIBUTE_UPDATE)
  152. //req{P0:val1,P1:val2,...}
  153. //res{P0:val1,P1:val2,...}
  154. typedef RET_STATUS(DEVICE_ACTION *REGISTFUNCTYPE0)(PVOID pthis, ResDataObject &req, ResDataObject &res);
  155. typedef RET_STATUS(DEVICE_ACTION *REGISTATTRCHANGEADDR)(PVOID pthis, ResDataObject &req);
  156. class FUNCLAYER_API AttrActions{
  157. public:
  158. REGISTATTRCHANGEADDR m_pGetAddr;
  159. REGISTATTRCHANGEADDR m_pSetAddr;
  160. REGISTATTRCHANGEADDR m_pAddAddr;
  161. REGISTATTRCHANGEADDR m_pDelAddr;
  162. REGISTATTRCHANGEADDR m_pUpdateAddr;
  163. ResDataNode* m_pTarget;
  164. AttrActions();
  165. AttrActions(ResDataNode *pTarget);
  166. virtual ~AttrActions();
  167. void GetAction(PVOID Addr);
  168. void SetAction(PVOID Addr);
  169. void AddAction(PVOID Addr);
  170. void DelAction(PVOID Addr);
  171. void UpdateAction(PVOID Addr);
  172. };
  173. class FUNCLAYER_API FuncLayer : public LogicDevice
  174. {
  175. HANDLE m_RegistDone;
  176. protected://for internal use
  177. //this,attributekey,attr,SetAddr
  178. map<PVOID, map<string, AttrActions>> *m_pRegistedAttributes;
  179. //this,funcionkey,entry
  180. map<PVOID,map<string, PVOID>> *m_pRegistedActions;
  181. bool SYSTEM_CALL GetDeviceResourceAttrs(ResDataObject &Res);
  182. bool SYSTEM_CALL GetDeviceResourceActions(ResDataObject &Res);
  183. virtual RET_STATUS SYSTEM_CALL Dispatch_AttributeChange(INT cmd,const char *pszKey, ResDataObject &Context);
  184. public:
  185. FuncLayer(void);
  186. virtual ~FuncLayer(void);
  187. //get device type
  188. virtual bool SYSTEM_CALL GetDeviceType(GUID &DevType);
  189. //notify to lower layer
  190. virtual RET_STATUS SYSTEM_CALL CmdToLogicDev(ResDataObject PARAM_IN *pCmd);
  191. //get device resource
  192. virtual RET_STATUS SYSTEM_CALL GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResource);
  193. //ResourceCommand Request In and Response Out
  194. virtual RET_STATUS SYSTEM_CALL Request(ResDataObject PARAM_IN *pRequest, ResDataObject PARAM_OUT *pResponse);
  195. virtual bool SYSTEM_CALL RegistFunc(PVOID pTarget,const char *pFuncName, PVOID FunctionAddr);
  196. virtual bool SYSTEM_CALL RegistAttributeGet(PVOID pTarget, ResDataNode *pDataNode, PVOID FunctionAddr);
  197. virtual bool SYSTEM_CALL RegistAttributeSet(PVOID pTarget, ResDataNode *pDataNode,PVOID FunctionAddr);
  198. virtual bool SYSTEM_CALL RegistAttributeAdd(PVOID pTarget, ResDataNode *pDataNode, PVOID FunctionAddr);
  199. virtual bool SYSTEM_CALL RegistAttributeDel(PVOID pTarget, ResDataNode *pDataNode, PVOID FunctionAddr);
  200. virtual bool SYSTEM_CALL RegistAttributeUpdate(PVOID pTarget, ResDataNode *pDataNode, PVOID FunctionAddr);
  201. virtual void SYSTEM_CALL SetRegistStatus(bool Done);
  202. //normal attr routine
  203. virtual RET_STATUS DEVICE_ACTION ADD(const char *pszKey, ResDataObject &Context);
  204. virtual RET_STATUS DEVICE_ACTION DEL(const char *pszKey, ResDataObject &Context);
  205. virtual RET_STATUS DEVICE_ACTION SET(const char *pszKey, ResDataObject &Context);
  206. virtual RET_STATUS DEVICE_ACTION GET(const char *pszKey, ResDataObject &Context);
  207. virtual RET_STATUS DEVICE_ACTION UPDATE(const char *pszKey, ResDataObject &Context);
  208. //actions
  209. virtual RET_STATUS DEVICE_ACTION Action(const char *pszKey, ResDataObject &req, ResDataObject &res);
  210. virtual RET_STATUS DEVICE_ACTION PostNotify(ResDataObject &Notify);
  211. };