remvartbl.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "remvar.h"
  2. #include <algorithm>
  3. /////////////////////////////////////////////////////////////////////////////
  4. static bool _fncomp(const char *p1, const char *p2)
  5. {
  6. return strcmp(p1, p2) < 0;
  7. }
  8. CRemVarTable::CRemVarTable(void) : m_map(_fncomp)
  9. {
  10. }
  11. CRemVarTable::~CRemVarTable(void)
  12. {
  13. }
  14. void CRemVarTable::AddVar(CRemanent *pVar)
  15. {
  16. m_map[pVar->GetPath()] = pVar;
  17. }
  18. CRemanent* CRemVarTable::Find(const char *key) const
  19. {
  20. std::map<const char*, CRemanent*>::const_iterator it = m_map.find(key);
  21. if(it == m_map.end())
  22. return NULL;
  23. return it->second;
  24. }
  25. bool CRemVarTable::GetMaxUpdateVariables(std::vector<const CRemanent*> &vars, size_t nMaxVars)
  26. {
  27. unsigned long long nUpdateCount;
  28. vars.clear();
  29. std::map<const char*, CRemanent*>::const_iterator iBegin, iEnd;
  30. iEnd = m_map.cend();
  31. for(iBegin = m_map.cbegin(); iBegin != iEnd; iBegin++)
  32. {
  33. const CRemanent *pVar1 = iBegin->second;
  34. if((nUpdateCount = pVar1->GetUpdateCount()))
  35. {
  36. std::vector<const CRemanent*>::iterator vBegin, vEnd;
  37. vEnd = vars.end();
  38. for(vBegin = vars.begin(); vBegin != vEnd; vBegin++)
  39. {
  40. const CRemanent *pVar2 = *vBegin;
  41. if(pVar2->GetUpdateCount() < nUpdateCount)
  42. break;
  43. }
  44. vars.insert(vBegin, pVar1);
  45. if(vars.size() > nMaxVars)
  46. vars.pop_back();
  47. }
  48. }
  49. return true;
  50. }
  51. unsigned long CRemVarTable::LoadJSONValues(const Json::Value &jv)
  52. {
  53. unsigned long parsed = 0;
  54. std::string s;
  55. ParseJsonMember(jv, s, parsed);
  56. return parsed;
  57. }
  58. void CRemVarTable::ParseJsonMember(const Json::Value &jv, std::string &sname, unsigned long &parsed)
  59. {
  60. std::string s(sname);
  61. Json::ValueType vt = jv.type();
  62. switch(vt)
  63. {
  64. case Json::nullValue:
  65. break;
  66. case Json::intValue:
  67. case Json::uintValue:
  68. case Json::realValue:
  69. case Json::stringValue:
  70. case Json::booleanValue:
  71. ParseJsonScalar(jv, s, parsed);
  72. break;
  73. case Json::arrayValue:
  74. ParseJsonArray(jv, s, parsed);
  75. break;
  76. case Json::objectValue:
  77. ParseJsonObject(jv, s, parsed);
  78. break;
  79. }
  80. }
  81. void CRemVarTable::ParseJsonObject(const Json::Value &jv, std::string &sname, unsigned long &parsed)
  82. {
  83. Json::Value::Members members = jv.getMemberNames();
  84. for(Json::Value::Members::const_iterator mem = members.begin(); mem != members.end(); mem++)
  85. {
  86. std::string s(sname);
  87. const std::string &rName = *mem;
  88. const Json::Value &m = jv[rName];
  89. if(s.size() > 0)
  90. s += "/";
  91. s += rName;
  92. ParseJsonMember(m, s, parsed);
  93. }
  94. }
  95. void CRemVarTable::ParseJsonArray(const Json::Value &jv, std::string &sname, unsigned long &parsed)
  96. {
  97. int nIdx = 0;
  98. char szIndex[32];
  99. for(Json::Value::const_iterator val = jv.begin(); val != jv.end(); val++)
  100. {
  101. std::string s(sname);
  102. sprintf(szIndex, "[%d]", nIdx++);
  103. s += szIndex;
  104. ParseJsonMember(*val, s, parsed);
  105. }
  106. }
  107. void CRemVarTable::ParseJsonScalar(const Json::Value &jv, std::string &sname, unsigned long &parsed)
  108. {
  109. CRemanent *pVar = Find(sname.c_str());
  110. if(pVar)
  111. {
  112. if(pVar->SetJSONValue(jv, true))
  113. parsed++;
  114. else
  115. printf("Failed to load value %s!\n", sname.c_str());
  116. }
  117. else
  118. {
  119. printf("Failed to load value %s!\n", sname.c_str());
  120. }
  121. }