CoreStorage.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. //============================================================================================
  2. // Spirenkov Maxim, 2008
  3. //============================================================================================
  4. // CoreStorage
  5. //============================================================================================
  6. #include "..\..\common_h\core.h"
  7. #include "CoreStorageFolder.h"
  8. #ifndef _CoreStorage_h_
  9. #define _CoreStorage_h_
  10. class CoreStorage
  11. {
  12. struct Name
  13. {
  14. dword hash; //Хэшь-значение имени
  15. dword len; //Длинна строки
  16. long next; //Индекс следующей записи в таблице имён с одинаковой маской
  17. char name[1]; //Имя
  18. };
  19. public:
  20. //Запретим сообщение о том что будет доминировать ветка из Item
  21. #pragma warning(push)
  22. #pragma warning(disable : 4250)
  23. class Item : public virtual ICoreStorageItem
  24. {
  25. protected:
  26. Item();
  27. public:
  28. //Удалить интерфейс на переменную
  29. virtual void Release();
  30. //Проверить, существует ли переменная
  31. virtual bool IsValidate();
  32. public:
  33. //Маркировать что координаты потеряны
  34. void Lost();
  35. //Инициализировать итем
  36. void Init(array<long> & _path, const char * _fileName, long _fileLine);
  37. //Принудительное удаление
  38. void ForceRelease();
  39. protected:
  40. //Получить доступ к переменной
  41. bool IsAccess();
  42. //Проставить результат
  43. static void SetResult(bool * isOk, bool value);
  44. protected:
  45. CoreStorageFolder * folder; //Указатель на папку в которой находиться поле
  46. long index; //Индекc поля
  47. array<long> path; //Путь до итема
  48. Type type; //Тип итема
  49. const char * cppFileName; //Имя файла где была создана переменная
  50. long cppFileLine; //Номер строки в файле где была создана переменная
  51. };
  52. class String : public Item, public ICoreStorageString
  53. {
  54. public:
  55. String();
  56. //Установить
  57. virtual void Set(const char * value);
  58. //Получить
  59. virtual const char * Get(const char * def, bool * isOk);
  60. //Получить указатель на storage
  61. virtual ICoreStorageString * GetStorageItem();
  62. };
  63. class Long : public Item, public ICoreStorageLong
  64. {
  65. public:
  66. Long();
  67. //Установить
  68. virtual void Set(long value);
  69. //Получить
  70. virtual long Get(long def, bool * isOk);
  71. //Получить указатель на storage
  72. virtual ICoreStorageLong * GetStorageItem();
  73. };
  74. class Float : public Item, public ICoreStorageFloat
  75. {
  76. public:
  77. Float();
  78. //Установить
  79. virtual void Set(float value);
  80. //Получить
  81. virtual float Get(float def, bool * isOk);
  82. //Получить указатель на storage
  83. virtual ICoreStorageFloat * GetStorageItem();
  84. };
  85. class Folder : public Item, public ICoreStorageFolder
  86. {
  87. public:
  88. Folder();
  89. //Установить элементу массива строковое поле
  90. virtual bool SetString(const char * name, const char * value);
  91. //Получить строку
  92. virtual const char * GetString(const char * name, const char * def, bool * isOk);
  93. //Получить интерфейс на переменную типа string, возвращает всегра не null
  94. ICoreStorageString * GetItemString(const char * name, const char * fileName, long fileLine);
  95. //Установить целочисленное поле
  96. virtual bool SetLong(const char * name, long value);
  97. //Получить целочисленное поле
  98. virtual long GetLong(const char * name, long def, bool * isOk);
  99. //Получить интерфейс на переменную типа long, возвращает всегра не null
  100. ICoreStorageLong * GetItemLong(const char * name, const char * fileName, long fileLine);
  101. //Установить численное поле
  102. virtual bool SetFloat(const char * name, float value);
  103. //Получить численное поле
  104. virtual float GetFloat(const char * name, float def, bool * isOk);
  105. //Получить интерфейс на переменную типа long, возвращает всегра не null
  106. ICoreStorageFloat * GetItemFloat(const char * name, const char * fileName, long fileLine);
  107. //Получить папку, если такой нет, то создать, если имя не занято, возвращает всегра не null
  108. virtual ICoreStorageFolder * GetItemFolder(const char * name, const char * fileName, long fileLine);
  109. //Получить количество полей данной папки
  110. virtual dword GetItemsCount();
  111. //Получить имя поля по индексу
  112. virtual const char * GetNameByIndex(long index);
  113. //Получить тип поля по индексу
  114. virtual Type GetTypeByIndex(long index);
  115. //Удалить содержимое папки
  116. virtual void Delete(const char * name);
  117. //Вывести содержимое в строку, (перевод строки \n)
  118. virtual void Print(string & buffer, const char * name);
  119. //Сохранить состояние папки, добавив данные в data
  120. virtual bool Save(const char * folderName, array<byte> & data);
  121. //Востоновить состояние папки из data. readPointer - текущая позиция чтения из data
  122. virtual bool Load(const char * folderName, const void * data, dword size, dword & readPointer);
  123. //Получить указатель на storage
  124. virtual ICoreStorageFolder * GetStorageItem();
  125. private:
  126. //Получить координаты итема если он доступен
  127. CoreStorageFolder * FindItem(const char * name, ICoreStorageItem::Type type, bool isCreatePath, long & index);
  128. //Получить текущую папку
  129. CoreStorageFolder * ThisFolder();
  130. private:
  131. static const byte storgeId[4];
  132. };
  133. class RootFolder : public Folder
  134. {
  135. public:
  136. //Удалить интерфейс на переменную
  137. virtual void Release();
  138. //Проверить, существует ли переменная
  139. virtual bool IsValidate();
  140. };
  141. #pragma warning(pop)
  142. public:
  143. CoreStorage();
  144. virtual ~CoreStorage();
  145. public:
  146. //Получить корневую папку
  147. ICoreStorageFolder & Root();
  148. //Удалить все переменные, сообщив об ошибках
  149. void ForceRelease();
  150. public:
  151. //Индексировать путь по имени достраивая от заданного
  152. array<long> & BuildPath(const char * namePath, long * rootPath, dword sizeOfRootPath);
  153. //Найти итем имея полный путь
  154. CoreStorageFolder * FindItem(const array<long> & p, ICoreStorageItem::Type type, bool isCreatePath, long & index);
  155. //Добавить итем в список созданных и инициализировать его
  156. void AddItem(Item * item, const char * namePath, array<long> & itemRoot, const char * fileName, long fileLine);
  157. //Удалить итем из списка
  158. void RemoveItem(Item * item);
  159. //Промаркировать заведённые переменные что было удоление
  160. void InvalidateItems(CoreStorageFolder * folder);
  161. public:
  162. //Преобразовать имя в идентификатор
  163. long SaveName(const char * name);
  164. //Получить имя по идентификатору
  165. const char * GetName(long id);
  166. private:
  167. //Получить описание имени по индексу
  168. Name & GetNameByIndex(long index);
  169. private:
  170. //Корень базы
  171. CoreStorageFolder root;
  172. RootFolder rootFolder;
  173. ICoreStorageFolder * rootFolderPtr;
  174. //База имён
  175. array<char> names;
  176. long entry[1024];
  177. //Заведённые переменные
  178. array<Item *> items;
  179. //Индексированный путь
  180. string buffer;
  181. array<long> path;
  182. };
  183. //Получить корневую папку
  184. inline ICoreStorageFolder & CoreStorage::Root()
  185. {
  186. return *rootFolderPtr;
  187. }
  188. #endif