restvar.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  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 = nullptr, const char *pszPath = nullptr)
  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 std::string&, const std::string&);
  148. public:
  149. CRestVarTable(void) : m_map(fncomp) {
  150. };
  151. virtual ~CRestVarTable(void) {
  152. };
  153. void AddVar(CRest *pVar) {
  154. if(pVar)
  155. m_map[std::string(pVar->GetPath())] = pVar;
  156. }
  157. CRest* Find(const char *key) const {
  158. std::map<std::string, CRest*>::const_iterator it = m_map.find(std::string(key));
  159. if(it == m_map.end())
  160. return nullptr;
  161. return it->second;
  162. }
  163. size_t size(void)
  164. {
  165. return m_map.size();
  166. }
  167. private:
  168. static bool fncomp(const std::string &p1, const std::string &p2) {
  169. return p1.compare(p2) < 0;
  170. }
  171. private:
  172. std::map<std::string, CRest*, _PFNCMP> m_map;
  173. };
  174. /////////////////////////////////////////////////////////////////////////////
  175. class CRestVariable : public CRest
  176. {
  177. public:
  178. enum VT
  179. {
  180. VT_Invalid,
  181. VT_bool,
  182. VT_I1,
  183. VT_UI1,
  184. VT_I2,
  185. VT_UI2,
  186. VT_I4,
  187. VT_UI4,
  188. VT_I8,
  189. VT_UI8,
  190. VT_float,
  191. VT_double,
  192. VT_string
  193. };
  194. typedef union
  195. {
  196. void *pVoid;
  197. bool *pBool;
  198. signed char *pI1;
  199. unsigned char *pUI1;
  200. signed short *pI2;
  201. unsigned short *pUI2;
  202. signed int *pI4;
  203. unsigned int *pUI4;
  204. signed long long *pI8;
  205. unsigned long long *pUI8;
  206. float *pFloat;
  207. double *pDouble;
  208. }V_Ptr;
  209. typedef union
  210. {
  211. bool boolVal;
  212. signed char I1Val;
  213. unsigned char UI1Val;
  214. signed short I2Val;
  215. unsigned short UI2Val;
  216. signed int I4Val;
  217. unsigned int UI4Val;
  218. signed long long I8Val;
  219. unsigned long long UI8Val;
  220. float FloatVal;
  221. double DoubleVal;
  222. }V_Val;
  223. public:
  224. CRestVariable(void *pData, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, CRest *pParent);
  225. virtual ~CRestVariable(void);
  226. virtual void CreateMembersTable(CRestVarTable &vt);
  227. virtual void InitPath(CRest*pParent, const char *pszMemberName, int nIndex = -1);
  228. virtual const char* GetPath(void) const {
  229. return m_pszPath;
  230. }
  231. virtual void GetValue(int nReqIndex, json_t* pjtMap);
  232. virtual json_t* GetValue(int nReqIndex);
  233. virtual json_t* SetValue(int nReqIndex, json_t* pjtVal);
  234. private:
  235. void Lock(void);
  236. void Unlock(void);
  237. private:
  238. std::string m_name;
  239. std::string m_path;
  240. const char *m_pszPath;
  241. int m_nIndex;
  242. enum VT m_vt;
  243. volatile V_Ptr m_data;
  244. HSHM m_hShm;
  245. CRest *m_pParent;
  246. size_t m_nCbVarpath;
  247. };
  248. /////////////////////////////////////////////////////////////////////////////
  249. class CRestStringVariable : public CRest
  250. {
  251. public:
  252. typedef enum
  253. {
  254. VT_Invalid, // 0
  255. VT_Latin1, // 1
  256. VT_UTF_8, // 2
  257. VT_UTF_16, // 3
  258. VT_UTF_32, // 4
  259. VT_Unicode, // 5
  260. VT_Last
  261. }VT;
  262. typedef union
  263. {
  264. void *pVoid;
  265. char *pszMbs;
  266. char16_t *pszWc16;
  267. char32_t *pszWc32;
  268. wchar_t *pszWcs;
  269. }V_Ptr;
  270. public:
  271. CRestStringVariable(void *pData, size_t nCChData, VT vt, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, CRest *pParent);
  272. virtual ~CRestStringVariable(void);
  273. virtual void CreateMembersTable(CRestVarTable &vt);
  274. virtual void InitPath(CRest*pParent, const char *pszMemberName, int nIndex = -1);
  275. virtual const char* GetPath(void) const {
  276. return m_pszPath;
  277. }
  278. virtual void GetValue(int nReqIndex, json_t* pjtMap);
  279. virtual json_t* GetValue(int nReqIndex);
  280. virtual json_t* SetValue(int nReqIndex, json_t* pjtVal);
  281. private:
  282. void Lock(void);
  283. void Unlock(void);
  284. void zeroTerm(volatile V_Ptr &rp, size_t at);
  285. private:
  286. std::string m_name;
  287. std::string m_path;
  288. const char *m_pszPath;
  289. int m_nIndex;
  290. VT m_vt;
  291. volatile V_Ptr m_data;
  292. size_t m_nCbBuffer;
  293. char *m_pszUTF8;
  294. size_t m_nCbUTF8;
  295. HSHM m_hShm;
  296. CRest *m_pParent;
  297. size_t m_nCbVarpath;
  298. };
  299. /////////////////////////////////////////////////////////////////////////////
  300. class CRestBitVariable : public CRest
  301. {
  302. public:
  303. enum VT
  304. {
  305. VT_Invalid,
  306. VT_bool,
  307. VT_I1,
  308. VT_UI1,
  309. VT_I2,
  310. VT_UI2,
  311. VT_I4,
  312. VT_UI4,
  313. VT_I8,
  314. VT_UI8,
  315. VT_float,
  316. VT_double,
  317. VT_string
  318. };
  319. typedef union
  320. {
  321. void *pVoid;
  322. bool *pBool;
  323. signed char *pI1;
  324. unsigned char *pUI1;
  325. signed short *pI2;
  326. unsigned short *pUI2;
  327. signed int *pI4;
  328. unsigned int *pUI4;
  329. signed long long *pI8;
  330. unsigned long long *pUI8;
  331. float *pFloat;
  332. double *pDouble;
  333. }V_Ptr;
  334. typedef union
  335. {
  336. bool boolVal;
  337. signed char I1Val;
  338. unsigned char UI1Val;
  339. signed short I2Val;
  340. unsigned short UI2Val;
  341. signed int I4Val;
  342. unsigned int UI4Val;
  343. signed long long I8Val;
  344. unsigned long long UI8Val;
  345. float FloatVal;
  346. double DoubleVal;
  347. }V_Val;
  348. public:
  349. CRestBitVariable(void *pData, size_t nOffset, int nBitNr, HSHM hShm, const char *pszName, CRest *pParent);
  350. virtual ~CRestBitVariable(void);
  351. virtual void CreateMembersTable(CRestVarTable &vt);
  352. virtual void InitPath(CRest*pParent, const char *pszMemberName, int nIndex = -1);
  353. virtual const char* GetPath(void) const {
  354. return m_pszPath;
  355. }
  356. virtual void GetValue(int nReqIndex, json_t* pjtMap);
  357. virtual json_t* GetValue(int nReqIndex);
  358. virtual json_t* SetValue(int nReqIndex, json_t* pjtVal);
  359. private:
  360. void Lock(void);
  361. void Unlock(void);
  362. private:
  363. std::string m_name;
  364. std::string m_path;
  365. uint8_t *m_pShmByte;
  366. uint8_t m_mask;
  367. const char *m_pszPath;
  368. HSHM m_hShm;
  369. CRest *m_pParent;
  370. size_t m_nCbVarpath;
  371. };
  372. /////////////////////////////////////////////////////////////////////////////
  373. template <typename T, typename V>
  374. class CRestArray : public CRest,
  375. public std::vector<T*>
  376. {
  377. public:
  378. CRestArray(void *pData, const std::type_info &rti, HSHM hShm, const char *pszName, size_t nElemCount, CRest *pParent) : m_name(pszName) {
  379. UNUSED(pParent);
  380. for(size_t i = 0; i < nElemCount; i++)
  381. {
  382. this->push_back(new T(&((V*)pData)[i], rti, hShm, pszName, i, static_cast<CRest*>(this)));
  383. }
  384. }
  385. 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) {
  386. UNUSED(pParent);
  387. for(size_t i = 0; i < nElemCount; i++)
  388. {
  389. this->push_back(new T(((V*)pData) + nCChData * i, nCChData, vt, rti, hShm, pszName, i, static_cast<CRest*>(this)));
  390. }
  391. }
  392. CRestArray(void *pData, HSHM hShm, const char *pszName, size_t nElemCount, CRest *pParent) : m_name(pszName) {
  393. UNUSED(pParent);
  394. for(size_t i = 0; i < nElemCount; i++)
  395. {
  396. this->push_back(new T(&((V*)pData)[i], hShm, i, static_cast<CRest*>(this)));
  397. }
  398. }
  399. virtual ~CRestArray(void) {
  400. for(CRest *p : *this)
  401. {
  402. if(p)
  403. delete p;
  404. }
  405. }
  406. public:
  407. virtual void CreateMembersTable(CRestVarTable &vt) {
  408. vt.AddVar(static_cast<CRest*>(this));
  409. for(CRest *p : *this) {
  410. if(p)
  411. p->CreateMembersTable(vt);
  412. }
  413. }
  414. virtual void InitPath(CRest *pParent, const char *pszMemberName, int nIndex = -1) {
  415. int i = 0;
  416. CRest::CreatePath(pParent, pszMemberName, nIndex, m_path);
  417. m_pszPath = m_path.c_str();
  418. m_nCbVarpath = m_path.length();
  419. for(CRest *p : *this) {
  420. if(p)
  421. p->InitPath(pParent, pszMemberName, i++);
  422. }
  423. }
  424. virtual const char* GetPath(void) const {
  425. return m_pszPath;
  426. }
  427. virtual void GetValue(int nReqIndex, json_t* pjtMap) {
  428. for(CRest *p : *this) {
  429. if(p)
  430. p->GetValue(nReqIndex, pjtMap);
  431. }
  432. }
  433. virtual json_t* GetValue(int nReqIndex) {
  434. CJson_t jtArr(json_array());
  435. for(CRest *p : *this) {
  436. if(p)
  437. json_array_append_new(jtArr, p->GetValue(nReqIndex));
  438. }
  439. CJson_t jtObj(json_object(), false);
  440. CJson_t jtPath(json_string(m_pszPath));
  441. CJson_t jtIndex(json_integer(-1));
  442. CJson_t jtType(json_integer(jtArr.Type()));
  443. CJson_t jtName(json_string(m_name.c_str()));
  444. json_object_set(jtObj, "path", jtPath);
  445. json_object_set(jtObj, "index", jtIndex);
  446. json_object_set(jtObj, "valType", jtType);
  447. json_object_set(jtObj, "valName", jtName);
  448. json_object_set(jtObj, "value", jtArr);
  449. return jtObj;
  450. }
  451. virtual json_t* SetValue(int nReqIndex, json_t* pjtVal) {
  452. UNUSED(pjtVal);
  453. return CreateStatusObject(nReqIndex, -1, "Cannot assign a value to an array!", GetPath());
  454. }
  455. private:
  456. std::string m_name;
  457. std::string m_path;
  458. const char *m_pszPath;
  459. size_t m_nCbVarpath;
  460. };
  461. /////////////////////////////////////////////////////////////////////////////
  462. #endif // !defined(AGD_RESTVAR_H__77EB9782_2B70_4713_A649_F4695F617197__INCLUDED_)