ResDataNode.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. #pragma once
  2. // 下列 ifdef 块是创建使从 DLL 导出更简单的
  3. // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 RESDATANODE_EXPORTS
  4. // 符号编译的。在使用此 DLL 的
  5. // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
  6. // RESDATANODE_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
  7. // 符号视为是被导出的。
  8. #ifndef RESDATANODE_EXPORTS
  9. #ifdef _WIN64
  10. #ifdef _DEBUG
  11. #pragma comment(lib, "ResDataNodeX64D.lib")
  12. #else
  13. #pragma comment(lib, "ResDataNodeX64.lib")
  14. #endif
  15. #else
  16. #ifdef _DEBUG
  17. #pragma comment(lib, "ResDataNodeD.lib")
  18. #else
  19. #pragma comment(lib, "ResDataNode.lib")
  20. #endif
  21. #endif
  22. #endif
  23. #ifdef RESDATANODE_EXPORTS
  24. #define RESDATANODE_API __declspec(dllexport)
  25. #define RESDATANODE_C_API extern "C" __declspec(dllexport)
  26. #else
  27. #define RESDATANODE_API __declspec(dllimport)
  28. #define RESDATANODE_C_API extern "C" __declspec(dllimport)
  29. #endif
  30. #include "LogicDevice.h"
  31. /*
  32. 因为资源的层太深的话,发通知会非常麻烦.(添加/删除/设置/读取...)
  33. 所以,规定的Rule是对象层最多2层,发通知最多2层结构,再深入的内容都作为Context处理.
  34. 一层结构:值对象, "KV":50.
  35. 更新POINT: key= "KV",Context="50"
  36. 二层结构:结构体对象,
  37. "APR": {"KV":50,"MA":20,...}
  38. 更新POINT: key= "APR",Context="KV:50"
  39. 二层结构:MAP对象
  40. "DevMap":{"Dev1":"Driver","Dev2":"Device",....}
  41. 更新POINT: key= "DevMap",Context={"Dev1":"Driver"}
  42. 嵌套三层结构:MAP<STRUCT>
  43. "AprMAP":{ "APR1":{"KV":50,"MA":20,...},"APR2":{"KV":50,"MA":20,...},...}
  44. 更新POINT: (作为2层结构处理,就算只有一个KV节点变更,也要把整个对象发送过去.)
  45. key= "AprMAP",Context=""APR1":{"KV":50,"MA":20,...}"
  46. */
  47. class RESDATANODE_API ResDataNode;
  48. //for read/update use
  49. class RESDATANODE_API ResDataSubNodeContext
  50. {
  51. ResDataNode *m_pParent;
  52. vector<string> *m_pKeyDepth;
  53. public:
  54. ResDataSubNodeContext(ResDataNode *Parent);
  55. virtual ~ResDataSubNodeContext();
  56. //get context
  57. operator int();
  58. operator unsigned int();
  59. operator INT64();
  60. operator UINT64();
  61. operator float();
  62. operator double();
  63. operator const char*();
  64. operator ResDataObject();
  65. ResDataSubNodeContext operator [](const char *pKey);
  66. //set context
  67. ResDataSubNodeContext& operator = (const int tValue);
  68. ResDataSubNodeContext& operator = (const unsigned int tValue);
  69. ResDataSubNodeContext& operator = (const INT64 tValue);
  70. ResDataSubNodeContext& operator = (const UINT64 tValue);
  71. ResDataSubNodeContext& operator = (const float tValue);
  72. ResDataSubNodeContext& operator = (const double tValue);
  73. ResDataSubNodeContext& operator = (const char* pVal);
  74. ResDataSubNodeContext& operator = (const ResDataSubNodeContext &tValue);
  75. };
  76. class RESDATANODE_API ResDataNode : public CcosLock
  77. {
  78. friend class ResDataSubNodeContext;
  79. protected:
  80. LogicDevice *m_pDevice;
  81. string *m_pMainKey;//主KEY跟CONTEXT要分离开来.
  82. ResDataObject m_Data;//动态CONTEXT
  83. ResDataObject m_StaticDescript;//静态CONTEXT
  84. //静态属性相关------------------------------------
  85. //添加
  86. bool AddStaticDesc(const char *pkey, ResDataObject &Context);
  87. bool AddStaticDesc(const char *pKey, const char *pDesc);
  88. bool AddStaticDesc(const char *pKey, FLOAT CellDesc);
  89. bool AddStaticDesc(const char *pKey, INT CellDesc);
  90. bool AddStaticDesc(const char *pkey, double CellDesc);
  91. bool AddStaticDesc(const char *pkey, INT64 CellDesc);
  92. public:
  93. ResDataNode();
  94. ResDataNode(const char *pkey);//init with key
  95. virtual ~ResDataNode(void);
  96. size_t Size();
  97. void SetLogicDevice(LogicDevice *pDevice);
  98. virtual const char *GetKey();//get key
  99. virtual void SetKey(const char *pKey);//set key
  100. ResDataObject &GetStaticDescript();
  101. //GET----------
  102. operator int();
  103. operator unsigned int();
  104. operator INT64();
  105. operator UINT64();
  106. operator float();
  107. operator double();
  108. operator const char*();
  109. operator ResDataObject();
  110. virtual ResDataSubNodeContext operator [](const char* pkey);
  111. virtual ResDataSubNodeContext operator [](size_t Idx);//for vector
  112. //SET----------
  113. virtual ResDataNode& operator = (int tValue);
  114. virtual ResDataNode& operator = (unsigned int tValue);
  115. virtual ResDataNode& operator = (INT64 tValue);
  116. virtual ResDataNode& operator = (UINT64 tValue);
  117. virtual ResDataNode& operator = (float tValue);
  118. virtual ResDataNode& operator = (double tValue);
  119. virtual ResDataNode& operator = (const char* pVal);
  120. virtual ResDataNode& operator = (ResDataNode &tValue);
  121. virtual ResDataNode& operator = (ResDataObject &tValue);
  122. virtual ResDataNode& operator = (ResDataSubNodeContext &tValue);
  123. //UPDATE:use ResDataSubNodeContext::operator [] function.
  124. //ADD----------
  125. virtual bool Add(ResDataObject &NodeObject);
  126. virtual bool Add(const char *pkey, ResDataObject &Context);
  127. //DEL----------
  128. virtual bool Del(const char *pkey);
  129. virtual bool Del(size_t Idx);//for vector
  130. };
  131. #define RES_CLASS_TYPE ("CLASS")
  132. typedef enum _RES_CLASS {
  133. RES_CLASS_VALUE,
  134. RES_CLASS_STRUCT,
  135. RES_CLASS_VECTOR,
  136. RES_CLASS_MAP,
  137. RES_CLASS_MAX
  138. }RESCLASS;
  139. #define RES_CONTEXT_TYPE ("CONTEXTTYPE")
  140. #define RES_SUBCONTEXT_TYPE ("SUBCONTEXTTYPE")
  141. typedef enum _RES_CONTEXT_TYPE {
  142. RES_CONTEXT_EMPTY,
  143. RES_CONTEXT_INT,
  144. RES_CONTEXT_FLOAT,
  145. RES_CONTEXT_STRING,
  146. RES_CONTEXT_VALUE,
  147. RES_CONTEXT_STRUCT,
  148. RES_CONTEXT_VECTOR,
  149. RES_CONTEXT_MAP,
  150. RES_CONTEXT_MAX
  151. }RESCONTEXT;
  152. //------------------------VALUE 模板定义------------------------------
  153. /*
  154. T类型必须是ResDataObject能解析的类型
  155. */
  156. class RESDATANODE_API ResValue : public ResDataNode
  157. {
  158. public:
  159. ResValue();
  160. virtual ~ResValue(void);
  161. //SET----------
  162. virtual ResValue& operator = (int tValue);
  163. virtual ResValue& operator = (unsigned int tValue);
  164. virtual ResValue& operator = (INT64 tValue);
  165. virtual ResValue& operator = (UINT64 tValue);
  166. virtual ResValue& operator = (float tValue);
  167. virtual ResValue& operator = (double tValue);
  168. virtual ResValue& operator = (const char* pVal);
  169. virtual ResValue& operator = (ResDataNode &tValue);
  170. virtual ResValue& operator = (ResDataObject &tValue);
  171. virtual ResValue& operator = (ResDataSubNodeContext &tValue);
  172. //GET----------:使用下标不要
  173. virtual ResDataSubNodeContext operator [](const char* pkey);
  174. virtual ResDataSubNodeContext operator [](size_t Idx);
  175. //ADD----------:不要
  176. virtual bool Add(ResDataObject &NodeObject);
  177. virtual bool Add(const char *pkey, ResDataObject &Context);
  178. //DEL----------:不要
  179. virtual bool Del(const char *pkey);
  180. virtual bool Del(size_t Idx);
  181. };
  182. //
  183. //class KV : public ResValue<FLOAT>
  184. //{
  185. //public:
  186. // KV()
  187. // {
  188. // SetKey("KV");
  189. // AddStaticDesc(RES_CONTEXT_TYPE, RES_CONTEXT_FLOAT);
  190. // AddStaticDesc(RES_SUBCONTEXT_TYPE, RES_CONTEXT_EMPTY);
  191. // };
  192. // virtual ~KV(void)
  193. // {
  194. //
  195. // };
  196. //
  197. //};
  198. //------------------------STRUCT 定义------------------------------
  199. class RESDATANODE_API ResStruct : public ResDataNode
  200. {
  201. public:
  202. ResStruct();
  203. virtual ~ResStruct(void);
  204. //FULL GET:use ResDataNode::GetContext
  205. //FULL SET
  206. ResStruct& operator = (ResStruct &Val);
  207. //get: use operator []
  208. //ADD&DEL不支持
  209. //ADD----------:不要
  210. virtual bool Add(ResDataObject &NodeObject);
  211. virtual bool Add(const char *pkey, ResDataObject &Context);
  212. //DEL----------:不要
  213. virtual bool Del(const char *pkey);
  214. virtual bool Del(size_t Idx);
  215. };
  216. //
  217. //class APR : public ResStruct
  218. //{
  219. //public:
  220. // APR()
  221. // {
  222. // SetKey("APR");
  223. //
  224. // Add("WS", 1);
  225. // Add("KV", 0.0f);
  226. // Add("MA", 0.0f);
  227. // Add("POSTKV", 0.0f);
  228. // Add("POSTMA", 0.0f);
  229. // Add("PATIENT", "");
  230. //
  231. //
  232. // ResDataObject ContextType;
  233. // ContextType.add("WS", RES_CONTEXT_INT);
  234. // ContextType.add("KV", RES_CONTEXT_FLOAT);
  235. // ContextType.add("MA", RES_CONTEXT_FLOAT);
  236. // ContextType.add("POSTKV", RES_CONTEXT_FLOAT);
  237. // ContextType.add("POSTMA", RES_CONTEXT_FLOAT);
  238. // ContextType.add("PATIENT", RES_CONTEXT_STRING);
  239. // AddStaticDesc(RES_CONTEXT_TYPE, ContextType);
  240. //
  241. // AddStaticDesc(RES_SUBCONTEXT_TYPE, RES_CONTEXT_EMPTY);
  242. // };
  243. // virtual ~APR(void)
  244. // {
  245. //
  246. // };
  247. //
  248. //};
  249. //------------------------MAP 定义------------------------------
  250. /*
  251. 注意:KEY是唯一的
  252. */
  253. class RESDATANODE_API ResMap : public ResDataNode
  254. {
  255. public:
  256. ResMap();
  257. virtual ~ResMap(void);
  258. };
  259. //class AprMap : public ResMap<APR>
  260. //{
  261. //public:
  262. // AprMap(){
  263. // SetKey("APRMAP");
  264. //
  265. // AddStaticDesc(RES_CONTEXT_TYPE, RES_CONTEXT_STRUCT);
  266. //
  267. // APR apr;
  268. // AddStaticDesc(RES_SUBCONTEXT_TYPE, apr.GetStaticDescript()[RES_CONTEXT_TYPE]);
  269. //
  270. // };
  271. // virtual ~AprMap(void)
  272. // {
  273. // };
  274. //
  275. //
  276. //
  277. //
  278. //};
  279. //------------------------VECTOR 定义------------------------------
  280. /*
  281. vector保存内容为[INT,FLOAT,STRING]的一种,
  282. 如果是保存的内容为对象的情况,跟ResMap没有区别了,所以vector除了保存基础信息以外意义不大.
  283. 重要:另一个问题是vector的存储内容不能重复,因为这样通知就非常暧昧,接收方不知道该更新哪个节点,后续有重复情况的时候需要再检讨.
  284. 所以,数组的节点必须是唯一的.
  285. 可以GETCONTEXT/SETCONTEXT,ADD,DEL
  286. 不要Update:Update操作调整为 DEL/ADD
  287. operator[](const char *pkey) 会失败且异常.
  288. */
  289. /*
  290. 以下原因暂时不支持VECTOR,后续的技术调整成功后会做出VECTOR.
  291. 1.第一个最重要的原因是Boost库以XML文件形式读写JSON对象的时候,不支持JSON数组.
  292. 2.现在版本用下标访问的地方太多,要一个一个排查.
  293. 如果对象中有数组的话,在资源内容传递过程中,中间一个环节用字符串下标访问数组会直接崩溃.
  294. 3.ResDataObject现在还没有实现数组的套用,得做技术可行性分析,后续解决了套用数组的话,再考虑.
  295. 4.现阶段只有驱动服务和总线驱动会受到影响,问题不大.
  296. 目前纯粹的基础数据表格,设备层还没有太大的必要.
  297. */
  298. template<class T>
  299. class ResVector : public ResDataNode
  300. {
  301. public:
  302. ResVector()
  303. {
  304. AddStaticDesc(RES_CLASS_TYPE, RES_CLASS_VECTOR);
  305. };
  306. virtual ~ResVector(void)
  307. {
  308. };
  309. //GET:用基类的.
  310. //UPDATE:不要
  311. virtual bool Update(const char *pkey, ResDataObject &Context)
  312. {
  313. return false;
  314. };
  315. virtual bool Update(const char *pkey, const char* pCell)
  316. {
  317. return false;
  318. };
  319. virtual bool Update(const char *pkey, FLOAT CellDesc)
  320. {
  321. return false;
  322. };
  323. virtual bool Update(const char *pkey, INT CellIdx)
  324. {
  325. return false;
  326. };
  327. //ADD----------
  328. virtual bool Add(const char *pkey, ResDataObject &Context)
  329. {
  330. throw ResDataObjectExption("deserted function for ResVector::Add1");
  331. return false;
  332. };
  333. virtual bool Add(const char *pkey, const char* pCell)
  334. {
  335. throw ResDataObjectExption("deserted function for ResVector::Add2");
  336. return false;
  337. };
  338. virtual bool Add(const char *pkey, FLOAT CellDesc)
  339. {
  340. throw ResDataObjectExption("deserted function for ResVector::Add3");
  341. return false;
  342. };
  343. virtual bool Add(const char *pkey, INT CellIdx)
  344. {
  345. throw ResDataObjectExption("deserted function for ResVector::Add4");
  346. return false;
  347. };
  348. virtual bool Add(const char* pCell)
  349. {
  350. assert(0);//not finished yet
  351. return false;
  352. };
  353. virtual bool Add(FLOAT CellDesc)
  354. {
  355. assert(0);//not finished yet
  356. return false;
  357. };
  358. virtual bool Add(INT CellIdx)
  359. {
  360. assert(0);//not finished yet
  361. return false;
  362. };
  363. //下标字符串DEL不要
  364. virtual bool Del(const char *pkey)
  365. {
  366. throw ResDataObjectExption("deserted function for ResVector::Del[str]");
  367. return false;
  368. };
  369. };