HierarchicalStorage.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. //---------------------------------------------------------------------------
  2. #ifndef HierarchicalStorageH
  3. #define HierarchicalStorageH
  4. #include <registry.hpp>
  5. //---------------------------------------------------------------------------
  6. enum TStorage { stDetect, stRegistry, stIniFile };
  7. enum TStorageAccessMode { smRead, smReadWrite };
  8. //---------------------------------------------------------------------------
  9. class THierarchicalStorage
  10. {
  11. public:
  12. __fastcall THierarchicalStorage(const AnsiString AStorage);
  13. virtual __fastcall ~THierarchicalStorage();
  14. bool __fastcall OpenRootKey(bool CanCreate);
  15. virtual bool __fastcall OpenSubKey(const AnsiString SubKey, bool CanCreate, bool Path = false);
  16. virtual void __fastcall CloseSubKey();
  17. virtual bool __fastcall DeleteSubKey(const AnsiString SubKey) = 0;
  18. virtual void __fastcall GetSubKeyNames(Classes::TStrings* Strings) = 0;
  19. virtual void __fastcall GetValueNames(Classes::TStrings* Strings) = 0;
  20. bool __fastcall HasSubKeys();
  21. bool __fastcall HasSubKey(const AnsiString SubKey);
  22. virtual bool __fastcall KeyExists(const AnsiString SubKey) = 0;
  23. virtual bool __fastcall ValueExists(const AnsiString Value) = 0;
  24. virtual void __fastcall RecursiveDeleteSubKey(const AnsiString Key);
  25. virtual void __fastcall ClearSubKeys();
  26. virtual void __fastcall ReadValues(Classes::TStrings* Strings, bool MaintainKeys = false);
  27. virtual void __fastcall WriteValues(Classes::TStrings* Strings, bool MaintainKeys = false);
  28. virtual void __fastcall ClearValues();
  29. virtual bool __fastcall DeleteValue(const AnsiString Name) = 0;
  30. virtual int __fastcall BinaryDataSize(const AnsiString Name) = 0;
  31. virtual bool __fastcall ReadBool(const AnsiString Name, bool Default) = 0;
  32. virtual int __fastcall ReadInteger(const AnsiString Name, int Default) = 0;
  33. virtual __int64 __fastcall ReadInt64(const AnsiString Name, __int64 Default) = 0;
  34. virtual TDateTime __fastcall ReadDateTime(const AnsiString Name, TDateTime Default) = 0;
  35. virtual double __fastcall ReadFloat(const AnsiString Name, double Default) = 0;
  36. virtual AnsiString __fastcall ReadStringRaw(const AnsiString Name, const AnsiString Default) = 0;
  37. virtual int __fastcall ReadBinaryData(const AnsiString Name, void * Buffer, int Size) = 0;
  38. virtual AnsiString __fastcall ReadString(AnsiString Name, AnsiString Default);
  39. AnsiString __fastcall ReadBinaryData(const AnsiString Name);
  40. virtual void __fastcall WriteBool(const AnsiString Name, bool Value) = 0;
  41. virtual void __fastcall WriteStringRaw(const AnsiString Name, const AnsiString Value) = 0;
  42. virtual void __fastcall WriteInteger(const AnsiString Name, int Value) = 0;
  43. virtual void __fastcall WriteInt64(AnsiString Name, __int64 Value) = 0;
  44. virtual void __fastcall WriteDateTime(const AnsiString Name, TDateTime Value) = 0;
  45. virtual void __fastcall WriteFloat(const AnsiString Name, double Value) = 0;
  46. virtual void __fastcall WriteBinaryData(const AnsiString Name, const void * Buffer, int Size) = 0;
  47. virtual void __fastcall WriteString(const AnsiString Name, const AnsiString Value);
  48. void __fastcall WriteBinaryData(const AnsiString Name, const AnsiString Value);
  49. virtual void __fastcall Flush();
  50. __property AnsiString Storage = { read=FStorage };
  51. __property AnsiString CurrentSubKey = { read=GetCurrentSubKey };
  52. __property TStorageAccessMode AccessMode = { read=FAccessMode, write=SetAccessMode };
  53. __property bool Explicit = { read = FExplicit, write = FExplicit };
  54. __property bool MungeStringValues = { read = FMungeStringValues, write = FMungeStringValues };
  55. __property AnsiString Source = { read = GetSource };
  56. protected:
  57. AnsiString FStorage;
  58. TStrings * FKeyHistory;
  59. TStorageAccessMode FAccessMode;
  60. bool FExplicit;
  61. bool FMungeStringValues;
  62. AnsiString __fastcall GetCurrentSubKey();
  63. AnsiString __fastcall GetCurrentSubKeyMunged();
  64. virtual void __fastcall SetAccessMode(TStorageAccessMode value);
  65. static AnsiString __fastcall IncludeTrailingBackslash(const AnsiString & S);
  66. static AnsiString __fastcall ExcludeTrailingBackslash(const AnsiString & S);
  67. AnsiString __fastcall MungeSubKey(AnsiString Key, bool Path);
  68. virtual AnsiString __fastcall GetSource() = 0;
  69. };
  70. //---------------------------------------------------------------------------
  71. class TRegistryStorage : public THierarchicalStorage
  72. {
  73. public:
  74. __fastcall TRegistryStorage(const AnsiString AStorage, HKEY ARootKey);
  75. __fastcall TRegistryStorage(const AnsiString AStorage);
  76. virtual __fastcall ~TRegistryStorage();
  77. bool __fastcall Copy(TRegistryStorage * Storage);
  78. virtual bool __fastcall OpenSubKey(const AnsiString SubKey, bool CanCreate, bool Path = false);
  79. virtual void __fastcall CloseSubKey();
  80. virtual bool __fastcall DeleteSubKey(const AnsiString SubKey);
  81. virtual bool __fastcall DeleteValue(const AnsiString Name);
  82. virtual void __fastcall GetSubKeyNames(Classes::TStrings* Strings);
  83. virtual bool __fastcall KeyExists(const AnsiString SubKey);
  84. virtual bool __fastcall ValueExists(const AnsiString Value);
  85. virtual int __fastcall BinaryDataSize(const AnsiString Name);
  86. virtual bool __fastcall ReadBool(const AnsiString Name, bool Default);
  87. virtual int __fastcall ReadInteger(const AnsiString Name, int Default);
  88. virtual __int64 __fastcall ReadInt64(const AnsiString Name, __int64 Default);
  89. virtual TDateTime __fastcall ReadDateTime(const AnsiString Name, TDateTime Default);
  90. virtual double __fastcall ReadFloat(const AnsiString Name, double Default);
  91. virtual AnsiString __fastcall ReadStringRaw(const AnsiString Name, const AnsiString Default);
  92. virtual int __fastcall ReadBinaryData(const AnsiString Name, void * Buffer, int Size);
  93. virtual void __fastcall WriteBool(const AnsiString Name, bool Value);
  94. virtual void __fastcall WriteInteger(const AnsiString Name, int Value);
  95. virtual void __fastcall WriteInt64(const AnsiString Name, __int64 Value);
  96. virtual void __fastcall WriteDateTime(const AnsiString Name, TDateTime Value);
  97. virtual void __fastcall WriteFloat(const AnsiString Name, double Value);
  98. virtual void __fastcall WriteStringRaw(const AnsiString Name, const AnsiString Value);
  99. virtual void __fastcall WriteBinaryData(const AnsiString Name, const void * Buffer, int Size);
  100. virtual void __fastcall GetValueNames(Classes::TStrings* Strings);
  101. protected:
  102. int __fastcall GetFailed();
  103. virtual void __fastcall SetAccessMode(TStorageAccessMode value);
  104. virtual AnsiString __fastcall GetSource();
  105. __property int Failed = { read=GetFailed, write=FFailed };
  106. private:
  107. TRegistry * FRegistry;
  108. int FFailed;
  109. void __fastcall Init();
  110. };
  111. //---------------------------------------------------------------------------
  112. class TIniFileStorage : public THierarchicalStorage
  113. {
  114. public:
  115. __fastcall TIniFileStorage(const AnsiString FileName);
  116. virtual __fastcall ~TIniFileStorage();
  117. virtual bool __fastcall OpenSubKey(const AnsiString SubKey, bool CanCreate, bool Path = false);
  118. virtual bool __fastcall DeleteSubKey(const AnsiString SubKey);
  119. virtual bool __fastcall DeleteValue(const AnsiString Name);
  120. virtual void __fastcall GetSubKeyNames(Classes::TStrings* Strings);
  121. virtual bool __fastcall KeyExists(const AnsiString SubKey);
  122. virtual bool __fastcall ValueExists(const AnsiString Value);
  123. virtual int __fastcall BinaryDataSize(const AnsiString Name);
  124. virtual bool __fastcall ReadBool(const AnsiString Name, bool Default);
  125. virtual int __fastcall ReadInteger(const AnsiString Name, int Default);
  126. virtual __int64 __fastcall ReadInt64(const AnsiString Name, __int64 Default);
  127. virtual TDateTime __fastcall ReadDateTime(const AnsiString Name, TDateTime Default);
  128. virtual double __fastcall ReadFloat(const AnsiString Name, double Default);
  129. virtual AnsiString __fastcall ReadStringRaw(const AnsiString Name, const AnsiString Default);
  130. virtual int __fastcall ReadBinaryData(const AnsiString Name, void * Buffer, int Size);
  131. virtual void __fastcall WriteBool(const AnsiString Name, bool Value);
  132. virtual void __fastcall WriteInteger(const AnsiString Name, int Value);
  133. virtual void __fastcall WriteInt64(AnsiString Name, __int64 Value);
  134. virtual void __fastcall WriteDateTime(const AnsiString Name, TDateTime Value);
  135. virtual void __fastcall WriteFloat(const AnsiString Name, double Value);
  136. virtual void __fastcall WriteStringRaw(const AnsiString Name, const AnsiString Value);
  137. virtual void __fastcall WriteBinaryData(const AnsiString Name, const void * Buffer, int Size);
  138. virtual void __fastcall GetValueNames(Classes::TStrings* Strings);
  139. virtual void __fastcall Flush();
  140. private:
  141. TMemIniFile * FIniFile;
  142. TStrings * FOriginal;
  143. AnsiString __fastcall GetCurrentSection();
  144. void __fastcall ApplyOverrides();
  145. protected:
  146. __property AnsiString CurrentSection = { read=GetCurrentSection };
  147. virtual AnsiString __fastcall GetSource();
  148. };
  149. //---------------------------------------------------------------------------
  150. AnsiString __fastcall PuttyMungeStr(const AnsiString Str);
  151. //---------------------------------------------------------------------------
  152. #endif