SpIni.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. #ifndef SPINI_H
  2. #define SPINI_H
  3. #pragma once
  4. #include "SpBase.h"
  5. #include "ListEntry.h"
  6. struct IIniMappingEntry
  7. {
  8. LIST_ENTRY entry;
  9. IIniMappingEntry(const char *section, const char *key) : m_section(section), m_key(key) {}
  10. const char *m_section;
  11. const char *m_key;
  12. virtual ErrorCodeEnum Load(const CSmartPointer<IConfigInfo> &pConfig) = 0;
  13. virtual ErrorCodeEnum Save(const CSmartPointer<IConfigInfo> &pConfig) = 0;
  14. };
  15. struct SpIniMappingEntryInt : public IIniMappingEntry
  16. {
  17. int &m_dest;
  18. int m_default;
  19. SpIniMappingEntryInt(const char *section, const char *key, int &dest, int defaultVal)
  20. : IIniMappingEntry(section, key), m_dest(dest), m_default(defaultVal)
  21. {
  22. }
  23. virtual ErrorCodeEnum Load(const CSmartPointer<IConfigInfo> &pConfig)
  24. {
  25. CSimpleStringA strValue;
  26. ErrorCodeEnum Error = pConfig->ReadConfigValue(m_section, m_key, strValue);
  27. if (Error == Error_Succeed) {
  28. m_dest = atoi(strValue);
  29. } else {
  30. m_dest = m_default;
  31. }
  32. return Error;
  33. }
  34. virtual ErrorCodeEnum Save(const CSmartPointer<IConfigInfo> &pConfig)
  35. {
  36. CSimpleStringA strValue = CSimpleStringA::Format("%d", m_dest);
  37. return pConfig->WriteConfigValue(m_section, m_key, strValue);
  38. }
  39. };
  40. struct SpIniMappingEntryUInt : public IIniMappingEntry
  41. {
  42. UINT &m_dest;
  43. UINT m_default;
  44. SpIniMappingEntryUInt(const char *section, const char *key, UINT &dest, UINT defaultVal)
  45. : IIniMappingEntry(section, key), m_dest(dest), m_default(defaultVal)
  46. {
  47. }
  48. virtual ErrorCodeEnum Load(const CSmartPointer<IConfigInfo> &pConfig)
  49. {
  50. CSimpleStringA strValue;
  51. ErrorCodeEnum Error = pConfig->ReadConfigValue(m_section, m_key, strValue);
  52. if (Error == Error_Succeed) {
  53. m_dest = strtoul(strValue, NULL, 10);
  54. } else {
  55. m_dest = m_default;
  56. }
  57. return Error;
  58. }
  59. virtual ErrorCodeEnum Save(const CSmartPointer<IConfigInfo> &pConfig)
  60. {
  61. CSimpleStringA strValue = CSimpleStringA::Format("%u", m_dest);
  62. return pConfig->WriteConfigValue(m_section, m_key, strValue);
  63. }
  64. };
  65. struct SpIniMappingEntryDouble : public IIniMappingEntry
  66. {
  67. double &m_dest;
  68. double m_default;
  69. SpIniMappingEntryDouble(const char *section, const char *key, double &dest, double defaultVal)
  70. : IIniMappingEntry(section, key), m_dest(dest), m_default(defaultVal)
  71. {
  72. }
  73. virtual ErrorCodeEnum Load(const CSmartPointer<IConfigInfo> &pConfig)
  74. {
  75. CSimpleStringA strValue;
  76. ErrorCodeEnum Error = pConfig->ReadConfigValue(m_section, m_key, strValue);
  77. if (Error == Error_Succeed) {
  78. m_dest = atof(strValue);
  79. } else {
  80. m_dest = m_default;
  81. }
  82. return Error;
  83. }
  84. virtual ErrorCodeEnum Save(const CSmartPointer<IConfigInfo> &pConfig)
  85. {
  86. CSimpleStringA strValue = CSimpleStringA::Format("%f", m_dest);
  87. return pConfig->WriteConfigValue(m_section, m_key, strValue);
  88. }
  89. };
  90. struct SpIniMappingEntryFloat : public IIniMappingEntry
  91. {
  92. float &m_dest;
  93. float m_default;
  94. SpIniMappingEntryFloat(const char *section, const char *key, float &dest, float defaultVal)
  95. : IIniMappingEntry(section, key), m_dest(dest), m_default(defaultVal)
  96. {
  97. }
  98. virtual ErrorCodeEnum Load(const CSmartPointer<IConfigInfo> &pConfig)
  99. {
  100. CSimpleStringA strValue;
  101. ErrorCodeEnum Error = pConfig->ReadConfigValue(m_section, m_key, strValue);
  102. if (Error == Error_Succeed) {
  103. m_dest = (float)atof(strValue);
  104. } else {
  105. m_dest = m_default;
  106. }
  107. return Error;
  108. }
  109. virtual ErrorCodeEnum Save(const CSmartPointer<IConfigInfo> &pConfig)
  110. {
  111. CSimpleStringA strValue = CSimpleStringA::Format("%f", m_dest);
  112. return pConfig->WriteConfigValue(m_section, m_key, strValue);
  113. }
  114. };
  115. struct SpIniMappingEntryString : public IIniMappingEntry
  116. {
  117. SpIniMappingEntryString(const char *section, const char *key, CSimpleStringA &dest, CSimpleStringA defaultVal)
  118. : IIniMappingEntry(section, key), m_dest(dest), m_default(defaultVal)
  119. {
  120. }
  121. CSimpleStringA &m_dest;
  122. CSimpleStringA m_default;
  123. virtual ErrorCodeEnum Load(const CSmartPointer<IConfigInfo> &pConfig)
  124. {
  125. ErrorCodeEnum Error = pConfig->ReadConfigValue(m_section, m_key, m_dest);
  126. if (Error != Error_Succeed) {
  127. m_dest = m_default;
  128. }
  129. return Error;
  130. }
  131. virtual ErrorCodeEnum Save(const CSmartPointer<IConfigInfo> &pConfig)
  132. {
  133. return pConfig->WriteConfigValue(m_section, m_key, m_dest);
  134. }
  135. };
  136. struct SpIniMappingEntryBoolean : public IIniMappingEntry
  137. {
  138. SpIniMappingEntryBoolean(const char *section, const char *key, bool &dest, bool defaultVal)
  139. : IIniMappingEntry(section, key), m_dest(dest), m_default(defaultVal)
  140. {
  141. }
  142. bool &m_dest;
  143. bool m_default;
  144. virtual ErrorCodeEnum Load(const CSmartPointer<IConfigInfo> &pConfig)
  145. {
  146. CSimpleStringA strValue;
  147. ErrorCodeEnum Error = pConfig->ReadConfigValue(m_section, m_key, strValue);
  148. if (Error == Error_Succeed) {
  149. if (_stricmp(strValue, "false") == 0 || _stricmp(strValue, "0") == 0) {
  150. m_dest = false;
  151. } else if (_stricmp(strValue, "true") == 0 || _stricmp(strValue, "1") == 0) {
  152. m_dest = true;
  153. }
  154. } else {
  155. m_dest = m_default;
  156. }
  157. return Error;
  158. }
  159. virtual ErrorCodeEnum Save(const CSmartPointer<IConfigInfo> &pConfig)
  160. {
  161. return pConfig->WriteConfigValue(m_section, m_key, m_dest ? "true" : "false");
  162. }
  163. };
  164. struct SpIniMappingTable
  165. {
  166. SpIniMappingTable()
  167. {
  168. ListEntry_InitHead(&m_entrylist);
  169. }
  170. ~SpIniMappingTable()
  171. {
  172. Clear();
  173. }
  174. void Clear()
  175. {
  176. IIniMappingEntry *pos, *n;
  177. ListEntry_ForEachSafe(pos, n, &m_entrylist, IIniMappingEntry, entry) {
  178. ListEntry_DeleteNode(&pos->entry);
  179. delete pos;
  180. }
  181. }
  182. ErrorCodeEnum AddEntryInt(const char *section, const char *key, int &dest, int defaultVal)
  183. {
  184. SpIniMappingEntryInt *pEntry = new SpIniMappingEntryInt(section, key, dest, defaultVal);
  185. ListEntry_AddTail(&m_entrylist, &pEntry->entry);
  186. return Error_Succeed;
  187. }
  188. ErrorCodeEnum AddEntryUInt(const char *section, const char *key, UINT &dest, UINT defaultVal)
  189. {
  190. SpIniMappingEntryUInt *pEntry = new SpIniMappingEntryUInt(section, key, dest, defaultVal);
  191. ListEntry_AddTail(&m_entrylist, &pEntry->entry);
  192. return Error_Succeed;
  193. }
  194. ErrorCodeEnum AddEntryDouble(const char *section, const char *key, double &dest, double defaultVal)
  195. {
  196. SpIniMappingEntryDouble *pEntry = new SpIniMappingEntryDouble(section, key, dest, defaultVal);
  197. ListEntry_AddTail(&m_entrylist, &pEntry->entry);
  198. return Error_Succeed;
  199. }
  200. ErrorCodeEnum AddEntryFloat(const char *section, const char *key, float &dest, float defaultVal)
  201. {
  202. SpIniMappingEntryFloat *pEntry = new SpIniMappingEntryFloat(section, key, dest, defaultVal);
  203. ListEntry_AddTail(&m_entrylist, &pEntry->entry);
  204. return Error_Succeed;
  205. }
  206. ErrorCodeEnum AddEntryString(const char *section, const char *key, CSimpleStringA &dest, const char *defaultVal)
  207. {
  208. SpIniMappingEntryString *pEntry = new SpIniMappingEntryString(section, key, dest, defaultVal);
  209. ListEntry_AddTail(&m_entrylist, &pEntry->entry);
  210. return Error_Succeed;
  211. }
  212. ErrorCodeEnum AddEntryBoolean(const char *section, const char *key, bool &dest, bool defaultVal)
  213. {
  214. SpIniMappingEntryBoolean *pEntry = new SpIniMappingEntryBoolean(section, key, dest, defaultVal);
  215. ListEntry_AddTail(&m_entrylist, &pEntry->entry);
  216. return Error_Succeed;
  217. }
  218. ErrorCodeEnum Load(const CSmartPointer<IConfigInfo> &pConfig)
  219. {
  220. ErrorCodeEnum Error = Error_Succeed;
  221. IIniMappingEntry *pos;
  222. ListEntry_ForEach(pos, &m_entrylist, IIniMappingEntry, entry) {
  223. Error = pos->Load(pConfig);
  224. if (Error != Error_Succeed)
  225. break;
  226. }
  227. return Error;
  228. }
  229. ErrorCodeEnum Save(const CSmartPointer<IConfigInfo> &pConfig)
  230. {
  231. ErrorCodeEnum Error = Error_Succeed;
  232. IIniMappingEntry *pos;
  233. ListEntry_ForEach(pos, &m_entrylist, IIniMappingEntry, entry) {
  234. Error = pos->Save(pConfig);
  235. if (Error != Error_Succeed)
  236. break;
  237. }
  238. return Error;
  239. }
  240. private:
  241. LIST_ENTRY m_entrylist;
  242. };
  243. #endif // SPINI_H