restvar.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. // restvar.h :
  2. //
  3. #if !defined(AGD_RESTVAR_H__77EB9782_2B70_4713_A649_F4695F617197__INCLUDED_)
  4. #define AGD_RESTVAR_H__77EB9782_2B70_4713_A649_F4695F617197__INCLUDED_
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <string>
  9. #include <pthread.h>
  10. #include <typeinfo>
  11. #include <vector>
  12. #include <map>
  13. #include <gfa/gfaipc.h>
  14. #ifndef _LIBBUILD
  15. #include <gfa/svc/rest/defines.h>
  16. #include <gfa/svc/common/debug.h>
  17. #else // _LIBBUILD
  18. #include "defines.h"
  19. #include "common/debug.h"
  20. #endif // _LIBBUILD
  21. extern "C"
  22. {
  23. #include <ulfius.h>
  24. }
  25. /////////////////////////////////////////////////////////////////////////////
  26. /////////////////////////////////////////////////////////////////////////////
  27. // class CJson_t
  28. class CJson_t
  29. {
  30. public:
  31. CJson_t(json_t *pjt, bool bFree = true) : m_pjt(pjt), m_bFree(bFree)
  32. {
  33. }
  34. ~CJson_t(void)
  35. {
  36. if(m_pjt && m_bFree)
  37. json_decref(m_pjt);
  38. }
  39. CJson_t& operator = (json_t *pjt)
  40. {
  41. m_pjt = pjt;
  42. return *this;
  43. }
  44. operator json_t*(void) {
  45. return m_pjt;}
  46. operator const json_t*(void) const {
  47. return m_pjt;}
  48. bool IsValid(void) const {
  49. return !!m_pjt;}
  50. bool IsArray(void) {
  51. return json_is_array(m_pjt);}
  52. bool IsObject(void) {
  53. return json_is_object(m_pjt);}
  54. int Type(void) const {
  55. return IsValid() ? json_typeof(m_pjt) : -1;}
  56. private:
  57. json_t *m_pjt;
  58. bool m_bFree;
  59. };
  60. /////////////////////////////////////////////////////////////////////////////
  61. class CRestVarTable;
  62. class CRest
  63. {
  64. public:
  65. virtual void CreateMembersTable(CRestVarTable &vt) = 0;
  66. virtual void InitPath(CRest *pParent, const char *pszMemberName, int nIndex) = 0;
  67. virtual const char* GetPath(void) const = 0;
  68. virtual void GetValue(int nReqIndex, json_t* pjtMap) = 0;
  69. virtual json_t* GetValue(int nReqIndex) = 0;
  70. virtual json_t* SetValue(int nReqIndex, json_t* pjtVal)
  71. {
  72. UNUSED(pjtVal);
  73. return CreateStatusObject(nReqIndex, -1, "Cannot assign a value to an object!", GetPath());
  74. }
  75. static json_t* CreateStatusObject(int nReqIndex, int nStatusCode, const char *pszStatusMsg = NULL, const char *pszPath = NULL)
  76. {
  77. if(!pszStatusMsg)
  78. pszStatusMsg = "";
  79. CJson_t jtStatus(json_object(), false);
  80. CJson_t jtResponseType(json_integer(1));
  81. CJson_t jtReqIndex(json_integer(nReqIndex));
  82. CJson_t jtCode(json_integer(nStatusCode));
  83. CJson_t jtMsg(json_string(pszStatusMsg));
  84. json_object_set(jtStatus, "responseType", jtResponseType);
  85. json_object_set(jtStatus, "requestIndex", jtReqIndex);
  86. json_object_set(jtStatus, "code", jtCode);
  87. json_object_set(jtStatus, "message", jtMsg);
  88. if(pszPath && *pszPath)
  89. {
  90. CJson_t jtPath(json_string(pszPath));
  91. json_object_set(jtStatus, "path", jtPath);
  92. }
  93. return jtStatus;
  94. }
  95. static json_t* CreateValueObject(int nReqIndex, const char *pszPath, int nIndex, int nValType, const char *pszValName, json_t *pjtVal)
  96. {
  97. CJson_t jtValue(json_object(), false);
  98. CJson_t jtResponseType(json_integer(0));
  99. CJson_t jtReqIndex(json_integer(nReqIndex));
  100. CJson_t jtPath(json_string(pszPath));
  101. CJson_t jtIndex(json_integer(nIndex));
  102. CJson_t jtType(json_integer(nValType));
  103. CJson_t jtName(json_string(pszValName));
  104. json_object_set(jtValue, "responseType", jtResponseType);
  105. json_object_set(jtValue, "requestIndex", jtReqIndex);
  106. json_object_set(jtValue, "path", jtPath);
  107. json_object_set(jtValue, "index", jtIndex);
  108. json_object_set(jtValue, "valType", jtType);
  109. json_object_set(jtValue, "valName", jtName);
  110. json_object_set(jtValue, "value", pjtVal);
  111. return jtValue;
  112. }
  113. static void CreatePath(CRest *pParent, const char *pszMemberName, int nIndex, std::string &rPath)
  114. {
  115. char szIndex[32] = {0};
  116. if(!pszMemberName || !*pszMemberName)
  117. pszMemberName = "/";
  118. if(nIndex >= 0)
  119. {
  120. sprintf(szIndex, "[%d]", nIndex);
  121. }
  122. if(pParent)
  123. {
  124. rPath = pParent->GetPath();
  125. auto len = rPath.size();
  126. if(len > 0)
  127. {
  128. auto rend = rPath.rbegin();
  129. if(*rend != '/')
  130. rPath += "/";
  131. }
  132. rPath += pszMemberName;
  133. rPath += szIndex;
  134. }
  135. else
  136. {
  137. rPath = pszMemberName;
  138. rPath += szIndex;
  139. }
  140. // printf("%s\n", rPath.c_str());
  141. }
  142. };
  143. /////////////////////////////////////////////////////////////////////////////
  144. class CRestVarTable
  145. {
  146. public:
  147. typedef bool (*_PFNCMP)(const char*, const char*);
  148. public:
  149. CRestVarTable(void);
  150. virtual ~CRestVarTable(void);
  151. void AddVar(CRest *pv);
  152. CRest* Find(const char *key) const;
  153. size_t size(void)
  154. {
  155. return m_map.size();
  156. }
  157. private:
  158. std::map<const char*, CRest*, _PFNCMP> m_map;
  159. };
  160. /////////////////////////////////////////////////////////////////////////////
  161. class CRestVariable : public CRest
  162. {
  163. public:
  164. enum VT
  165. {
  166. VT_Invalid,
  167. VT_bool,
  168. VT_I1,
  169. VT_UI1,
  170. VT_I2,
  171. VT_UI2,
  172. VT_I4,
  173. VT_UI4,
  174. VT_I8,
  175. VT_UI8,
  176. VT_float,
  177. VT_double,
  178. VT_string
  179. };
  180. typedef union
  181. {
  182. void *pVoid;
  183. bool *pBool;
  184. signed char *pI1;
  185. unsigned char *pUI1;
  186. signed short *pI2;
  187. unsigned short *pUI2;
  188. signed int *pI4;
  189. unsigned int *pUI4;
  190. signed long long *pI8;
  191. unsigned long long *pUI8;
  192. float *pFloat;
  193. double *pDouble;
  194. }V_Ptr;
  195. typedef union
  196. {
  197. bool boolVal;
  198. signed char I1Val;
  199. unsigned char UI1Val;
  200. signed short I2Val;
  201. unsigned short UI2Val;
  202. signed int I4Val;
  203. unsigned int UI4Val;
  204. signed long long I8Val;
  205. unsigned long long UI8Val;
  206. float FloatVal;
  207. double DoubleVal;
  208. }V_Val;
  209. public:
  210. CRestVariable(void *pData, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, CRest *pParent);
  211. virtual ~CRestVariable(void);
  212. virtual void CreateMembersTable(CRestVarTable &vt);
  213. virtual void InitPath(CRest*pParent, const char *pszMemberName, int nIndex = -1);
  214. virtual const char* GetPath(void) const {
  215. return m_pszPath;}
  216. virtual void GetValue(int nReqIndex, json_t* pjtMap);
  217. virtual json_t* GetValue(int nReqIndex);
  218. virtual json_t* SetValue(int nReqIndex, json_t* pjtVal);
  219. private:
  220. void Lock(void);
  221. void Unlock(void);
  222. private:
  223. std::string m_name;
  224. std::string m_path;
  225. const char *m_pszPath;
  226. int m_nIndex;
  227. enum VT m_vt;
  228. volatile V_Ptr m_data;
  229. HSHM m_hShm;
  230. CRest *m_pParent;
  231. size_t m_nCbVarpath;
  232. };
  233. /////////////////////////////////////////////////////////////////////////////
  234. class CRestStringVariable : public CRest
  235. {
  236. public:
  237. typedef enum
  238. {
  239. VT_Invalid, // 0
  240. VT_Latin1, // 1
  241. VT_UTF_8, // 2
  242. VT_UTF_16, // 3
  243. VT_UTF_32, // 4
  244. VT_Unicode, // 5
  245. VT_Last
  246. }VT;
  247. typedef union
  248. {
  249. void *pVoid;
  250. char *pszMbs;
  251. char16_t *pszWc16;
  252. char32_t *pszWc32;
  253. wchar_t *pszWcs;
  254. }V_Ptr;
  255. public:
  256. CRestStringVariable(void *pData, size_t nCChData, VT vt, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, CRest *pParent);
  257. virtual ~CRestStringVariable(void);
  258. virtual void CreateMembersTable(CRestVarTable &vt);
  259. virtual void InitPath(CRest*pParent, const char *pszMemberName, int nIndex = -1);
  260. virtual const char* GetPath(void) const {
  261. return m_pszPath;}
  262. virtual void GetValue(int nReqIndex, json_t* pjtMap);
  263. virtual json_t* GetValue(int nReqIndex);
  264. virtual json_t* SetValue(int nReqIndex, json_t* pjtVal);
  265. private:
  266. void Lock(void);
  267. void Unlock(void);
  268. void zeroTerm(volatile V_Ptr &rp, size_t at);
  269. private:
  270. std::string m_name;
  271. std::string m_path;
  272. const char *m_pszPath;
  273. int m_nIndex;
  274. VT m_vt;
  275. volatile V_Ptr m_data;
  276. size_t m_nCbBuffer;
  277. char *m_pszUTF8;
  278. size_t m_nCbUTF8;
  279. HSHM m_hShm;
  280. CRest *m_pParent;
  281. size_t m_nCbVarpath;
  282. };
  283. /////////////////////////////////////////////////////////////////////////////
  284. class CRestBitVariable : public CRest
  285. {
  286. public:
  287. enum VT
  288. {
  289. VT_Invalid,
  290. VT_bool,
  291. VT_I1,
  292. VT_UI1,
  293. VT_I2,
  294. VT_UI2,
  295. VT_I4,
  296. VT_UI4,
  297. VT_I8,
  298. VT_UI8,
  299. VT_float,
  300. VT_double,
  301. VT_string
  302. };
  303. typedef union
  304. {
  305. void *pVoid;
  306. bool *pBool;
  307. signed char *pI1;
  308. unsigned char *pUI1;
  309. signed short *pI2;
  310. unsigned short *pUI2;
  311. signed int *pI4;
  312. unsigned int *pUI4;
  313. signed long long *pI8;
  314. unsigned long long *pUI8;
  315. float *pFloat;
  316. double *pDouble;
  317. }V_Ptr;
  318. typedef union
  319. {
  320. bool boolVal;
  321. signed char I1Val;
  322. unsigned char UI1Val;
  323. signed short I2Val;
  324. unsigned short UI2Val;
  325. signed int I4Val;
  326. unsigned int UI4Val;
  327. signed long long I8Val;
  328. unsigned long long UI8Val;
  329. float FloatVal;
  330. double DoubleVal;
  331. }V_Val;
  332. public:
  333. CRestBitVariable(void *pData, size_t nOffset, int nBitNr, HSHM hShm, const char *pszName, CRest *pParent);
  334. virtual ~CRestBitVariable(void);
  335. virtual void CreateMembersTable(CRestVarTable &vt);
  336. virtual void InitPath(CRest*pParent, const char *pszMemberName, int nIndex = -1);
  337. virtual const char* GetPath(void) const {
  338. return m_pszPath;}
  339. virtual void GetValue(int nReqIndex, json_t* pjtMap);
  340. virtual json_t* GetValue(int nReqIndex);
  341. virtual json_t* SetValue(int nReqIndex, json_t* pjtVal);
  342. private:
  343. void Lock(void);
  344. void Unlock(void);
  345. private:
  346. std::string m_name;
  347. std::string m_path;
  348. uint8_t *m_pShmByte;
  349. uint8_t m_mask;
  350. const char *m_pszPath;
  351. HSHM m_hShm;
  352. CRest *m_pParent;
  353. size_t m_nCbVarpath;
  354. };
  355. /////////////////////////////////////////////////////////////////////////////
  356. template <typename T, typename V>
  357. class CRestArray : public CRest,
  358. public std::vector<T*>
  359. {
  360. public:
  361. CRestArray(void *pData, const std::type_info &rti, HSHM hShm, const char *pszName, size_t nElemCount, CRest *pParent) : m_name(pszName)
  362. {
  363. UNUSED(pParent);
  364. for(size_t i = 0; i < nElemCount; i++)
  365. {
  366. this->push_back(new T(&((V*)pData)[i], rti, hShm, pszName, i, static_cast<CRest*>(this)));
  367. }
  368. }
  369. CRestArray(void *pData, size_t nCChData, CRestStringVariable::VT vt, const std::type_info &rti, HSHM hShm, const char *pszName, size_t nElemCount, CRest *pParent) : m_name(pszName)
  370. {
  371. UNUSED(pParent);
  372. for(size_t i = 0; i < nElemCount; i++)
  373. {
  374. this->push_back(new T(((V*)pData) + nCChData * i, nCChData, vt, rti, hShm, pszName, i, static_cast<CRest*>(this)));
  375. }
  376. }
  377. CRestArray(void *pData, HSHM hShm, const char *pszName, size_t nElemCount, CRest *pParent) : m_name(pszName)
  378. {
  379. UNUSED(pParent);
  380. for(size_t i = 0; i < nElemCount; i++)
  381. {
  382. this->push_back(new T(&((V*)pData)[i], hShm, i, static_cast<CRest*>(this)));
  383. }
  384. }
  385. virtual ~CRestArray(void)
  386. {
  387. for(int i = 0; i < (int)this->size(); i++)
  388. {
  389. delete this->at(i);
  390. }
  391. }
  392. public:
  393. virtual void CreateMembersTable(CRestVarTable &vt)
  394. {
  395. vt.AddVar(static_cast<CRest*>(this));
  396. for(int i = 0; i < (int)this->size(); i++)
  397. {
  398. this->at(i)->CreateMembersTable(vt);
  399. }
  400. }
  401. virtual void InitPath(CRest *pParent, const char *pszMemberName, int nIndex = -1)
  402. {
  403. CRest::CreatePath(pParent, pszMemberName, nIndex, m_path);
  404. m_pszPath = m_path.c_str();
  405. m_nCbVarpath = m_path.length();
  406. for(int i = 0; i < (int)this->size(); i++)
  407. {
  408. this->at(i)->InitPath(pParent, pszMemberName, i);
  409. }
  410. }
  411. virtual const char* GetPath(void) const {
  412. return m_pszPath;}
  413. virtual void GetValue(int nReqIndex, json_t* pjtMap)
  414. {
  415. for(int i = 0; i < (int)this->size(); i++)
  416. {
  417. this->at(i)->GetValue(nReqIndex, pjtMap);
  418. }
  419. }
  420. virtual json_t* GetValue(int nReqIndex)
  421. {
  422. CJson_t jtArr(json_array());
  423. for(int i = 0; i < (int)this->size(); i++)
  424. {
  425. json_array_append_new(jtArr, this->at(i)->GetValue(nReqIndex));
  426. }
  427. CJson_t jtObj(json_object(), false);
  428. CJson_t jtPath(json_string(m_pszPath));
  429. CJson_t jtIndex(json_integer(-1));
  430. CJson_t jtType(json_integer(jtArr.Type()));
  431. CJson_t jtName(json_string(m_name.c_str()));
  432. json_object_set(jtObj, "path", jtPath);
  433. json_object_set(jtObj, "index", jtIndex);
  434. json_object_set(jtObj, "valType", jtType);
  435. json_object_set(jtObj, "valName", jtName);
  436. json_object_set(jtObj, "value", jtArr);
  437. return jtObj;
  438. }
  439. virtual json_t* SetValue(int nReqIndex, json_t* pjtVal)
  440. {
  441. UNUSED(pjtVal);
  442. return CreateStatusObject(nReqIndex, -1, "Cannot assign a value to an array!", GetPath());
  443. }
  444. private:
  445. std::string m_name;
  446. std::string m_path;
  447. const char *m_pszPath;
  448. size_t m_nCbVarpath;
  449. };
  450. /////////////////////////////////////////////////////////////////////////////
  451. #endif // !defined(AGD_RESTVAR_H__77EB9782_2B70_4713_A649_F4695F617197__INCLUDED_)