HierarchicalStorage.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "Common.h"
  5. #include "PuttyIntf.h"
  6. #include "HierarchicalStorage.h"
  7. //---------------------------------------------------------------------------
  8. #pragma package(smart_init)
  9. //---------------------------------------------------------------------------
  10. #define READ_REGISTRY(Method) \
  11. if (FRegistry->ValueExists(Name)) \
  12. try { return FRegistry->Method(Name); } catch(...) { FFailed++; return Default; } \
  13. else return Default;
  14. #define WRITE_REGISTRY(Method) \
  15. try { FRegistry->Method(Name, Value); } catch(...) { FFailed++; }
  16. //---------------------------------------------------------------------------
  17. AnsiString __fastcall MungeStr(const AnsiString Str)
  18. {
  19. AnsiString Result;
  20. Result.SetLength(Str.Length() * 3 + 1);
  21. putty_mungestr(Str.c_str(), Result.c_str());
  22. PackStr(Result);
  23. return Result;
  24. }
  25. //---------------------------------------------------------------------------
  26. AnsiString __fastcall UnMungeStr(const AnsiString Str)
  27. {
  28. AnsiString Result;
  29. Result.SetLength(Str.Length() * 3 + 1);
  30. putty_unmungestr(Str.c_str(), Result.c_str(), Result.Length());
  31. PackStr(Result);
  32. return Result;
  33. }
  34. //===========================================================================
  35. __fastcall THierarchicalStorage::THierarchicalStorage(const AnsiString AStorage)
  36. {
  37. FStorage = AStorage;
  38. FKeyHistory = new TStringList();
  39. AccessMode = smRead;
  40. }
  41. //---------------------------------------------------------------------------
  42. __fastcall THierarchicalStorage::~THierarchicalStorage()
  43. {
  44. delete FKeyHistory;
  45. }
  46. //---------------------------------------------------------------------------
  47. void __fastcall THierarchicalStorage::SetAccessMode(TStorageAccessMode value)
  48. {
  49. FAccessMode = value;
  50. }
  51. //---------------------------------------------------------------------------
  52. AnsiString __fastcall THierarchicalStorage::GetCurrentSubKey()
  53. {
  54. if (FKeyHistory->Count) return FKeyHistory->Strings[FKeyHistory->Count-1];
  55. else return "";
  56. }
  57. //---------------------------------------------------------------------------
  58. bool __fastcall THierarchicalStorage::OpenRootKey(bool CanCreate)
  59. {
  60. return OpenSubKey("", CanCreate);
  61. }
  62. //---------------------------------------------------------------------------
  63. bool __fastcall THierarchicalStorage::OpenSubKey(const AnsiString SubKey, bool )
  64. {
  65. FKeyHistory->Add(IncludeTrailingBackslash(CurrentSubKey+SubKey));
  66. return true;
  67. }
  68. //---------------------------------------------------------------------------
  69. bool __fastcall THierarchicalStorage::CreateSubKey(const AnsiString SubKey)
  70. {
  71. FKeyHistory->Add(IncludeTrailingBackslash(CurrentSubKey+SubKey));
  72. return true;
  73. }
  74. //---------------------------------------------------------------------------
  75. void __fastcall THierarchicalStorage::CloseSubKey()
  76. {
  77. if (FKeyHistory->Count == 0) throw Exception("");
  78. else FKeyHistory->Delete(FKeyHistory->Count-1);
  79. }
  80. //---------------------------------------------------------------------------
  81. void __fastcall THierarchicalStorage::RecursiveDeleteSubKey(const AnsiString Key)
  82. {
  83. if (OpenSubKey(Key, false))
  84. {
  85. TStringList *SubKeys = new TStringList();
  86. try
  87. {
  88. GetSubKeyNames(SubKeys);
  89. for (int Index = 0; Index < SubKeys->Count; Index++)
  90. {
  91. RecursiveDeleteSubKey(SubKeys->Strings[Index]);
  92. }
  93. }
  94. __finally
  95. {
  96. delete SubKeys;
  97. }
  98. CloseSubKey();
  99. }
  100. DeleteSubKey(Key);
  101. }
  102. //---------------------------------------------------------------------------
  103. bool __fastcall THierarchicalStorage::HasSubKeys()
  104. {
  105. bool Result;
  106. TStrings * SubKeys = new TStringList();
  107. try
  108. {
  109. GetSubKeyNames(SubKeys);
  110. Result = (SubKeys->Count > 0);
  111. }
  112. __finally
  113. {
  114. delete SubKeys;
  115. }
  116. return Result;
  117. }
  118. //---------------------------------------------------------------------------
  119. void __fastcall THierarchicalStorage::ReadValues(Classes::TStrings* Strings,
  120. bool MaintainKeys)
  121. {
  122. TStrings * Names = new TStringList();
  123. try
  124. {
  125. GetValueNames(Names);
  126. for (int Index = 0; Index < Names->Count; Index++)
  127. {
  128. if (MaintainKeys)
  129. {
  130. Strings->Add(FORMAT("%s=%s", (Names->Strings[Index],
  131. ReadString(Names->Strings[Index], ""))));
  132. }
  133. else
  134. {
  135. Strings->Add(ReadString(Names->Strings[Index], ""));
  136. }
  137. }
  138. }
  139. __finally
  140. {
  141. delete Names;
  142. }
  143. }
  144. //---------------------------------------------------------------------------
  145. void __fastcall THierarchicalStorage::ClearValues()
  146. {
  147. TStrings * Names = new TStringList();
  148. try
  149. {
  150. GetValueNames(Names);
  151. for (int Index = 0; Index < Names->Count; Index++)
  152. {
  153. DeleteValue(Names->Strings[Index]);
  154. }
  155. }
  156. __finally
  157. {
  158. delete Names;
  159. }
  160. }
  161. //---------------------------------------------------------------------------
  162. void __fastcall THierarchicalStorage::WriteValues(Classes::TStrings * Strings,
  163. bool MaintainKeys)
  164. {
  165. ClearValues();
  166. if (Strings)
  167. {
  168. for (int Index = 0; Index < Strings->Count; Index++)
  169. {
  170. if (MaintainKeys)
  171. {
  172. assert(Strings->Strings[Index].Pos("=") > 1);
  173. WriteString(Strings->Names[Index], Strings->Values[Strings->Names[Index]]);
  174. }
  175. else
  176. {
  177. WriteString(IntToStr(Index), Strings->Strings[Index]);
  178. }
  179. }
  180. }
  181. }
  182. //---------------------------------------------------------------------------
  183. AnsiString __fastcall THierarchicalStorage::ReadString(const AnsiString Name, const AnsiString Default)
  184. {
  185. return UnMungeStr(ReadStringRaw(Name, Default));
  186. }
  187. //---------------------------------------------------------------------------
  188. AnsiString __fastcall THierarchicalStorage::ReadBinaryData(const AnsiString Name)
  189. {
  190. int Size = BinaryDataSize(Name);
  191. AnsiString Value;
  192. Value.SetLength(Size);
  193. ReadBinaryData(Name, Value.c_str(), Size);
  194. return Value;
  195. }
  196. //---------------------------------------------------------------------------
  197. void __fastcall THierarchicalStorage::WriteString(const AnsiString Name, const AnsiString Value)
  198. {
  199. WriteStringRaw(Name, MungeStr(Value));
  200. }
  201. //---------------------------------------------------------------------------
  202. void __fastcall THierarchicalStorage::WriteBinaryData(const AnsiString Name,
  203. const AnsiString Value)
  204. {
  205. WriteBinaryData(Name, Value.c_str(), Value.Length());
  206. }
  207. //---------------------------------------------------------------------------
  208. AnsiString __fastcall THierarchicalStorage::IncludeTrailingBackslash(const AnsiString S) const
  209. {
  210. return S.IsEmpty() ? S : ::IncludeTrailingBackslash(S);
  211. }
  212. //---------------------------------------------------------------------------
  213. AnsiString __fastcall THierarchicalStorage::ExcludeTrailingBackslash(const AnsiString S) const
  214. {
  215. return S.IsEmpty() ? S : ::ExcludeTrailingBackslash(S);
  216. }
  217. //===========================================================================
  218. __fastcall TRegistryStorage::TRegistryStorage(const AnsiString AStorage):
  219. THierarchicalStorage(IncludeTrailingBackslash(AStorage))
  220. {
  221. Init();
  222. };
  223. //---------------------------------------------------------------------------
  224. __fastcall TRegistryStorage::TRegistryStorage(const AnsiString AStorage, HKEY ARootKey):
  225. THierarchicalStorage(IncludeTrailingBackslash(AStorage))
  226. {
  227. Init();
  228. FRegistry->RootKey = ARootKey;
  229. }
  230. //---------------------------------------------------------------------------
  231. void __fastcall TRegistryStorage::Init()
  232. {
  233. FFailed = 0;
  234. FRegistry = new TRegistry();
  235. FRegistry->Access = KEY_READ;
  236. }
  237. //---------------------------------------------------------------------------
  238. __fastcall TRegistryStorage::~TRegistryStorage()
  239. {
  240. delete FRegistry;
  241. };
  242. //---------------------------------------------------------------------------
  243. void __fastcall TRegistryStorage::SetAccessMode(TStorageAccessMode value)
  244. {
  245. THierarchicalStorage::SetAccessMode(value);
  246. if (FRegistry)
  247. {
  248. switch (AccessMode) {
  249. case smRead:
  250. FRegistry->Access = KEY_READ;
  251. break;
  252. case smReadWrite:
  253. default:
  254. FRegistry->Access = KEY_READ | KEY_WRITE;
  255. break;
  256. }
  257. }
  258. }
  259. //---------------------------------------------------------------------------
  260. bool __fastcall TRegistryStorage::OpenSubKey(const AnsiString SubKey, bool CanCreate)
  261. {
  262. bool Result;
  263. if (FKeyHistory->Count > 0) FRegistry->CloseKey();
  264. Result = FRegistry->OpenKey(
  265. ExcludeTrailingBackslash(Storage + CurrentSubKey + SubKey), CanCreate);
  266. if (Result) Result = THierarchicalStorage::OpenSubKey(SubKey, CanCreate);
  267. return Result;
  268. }
  269. //---------------------------------------------------------------------------
  270. bool __fastcall TRegistryStorage::CreateSubKey(const AnsiString SubKey)
  271. {
  272. bool Result;
  273. if (FKeyHistory->Count) FRegistry->CloseKey();
  274. Result = FRegistry->CreateKey(ExcludeTrailingBackslash(Storage + CurrentSubKey + SubKey));
  275. if (Result) Result = THierarchicalStorage::CreateSubKey(CurrentSubKey + SubKey);
  276. return Result;
  277. }
  278. //---------------------------------------------------------------------------
  279. void __fastcall TRegistryStorage::CloseSubKey()
  280. {
  281. FRegistry->CloseKey();
  282. THierarchicalStorage::CloseSubKey();
  283. if (FKeyHistory->Count)
  284. {
  285. FRegistry->OpenKey(Storage + CurrentSubKey, True);
  286. }
  287. }
  288. //---------------------------------------------------------------------------
  289. bool __fastcall TRegistryStorage::DeleteSubKey(const AnsiString SubKey)
  290. {
  291. AnsiString K;
  292. if (FKeyHistory->Count == 0) K = Storage + CurrentSubKey;
  293. K += SubKey;
  294. return FRegistry->DeleteKey(K);
  295. }
  296. //---------------------------------------------------------------------------
  297. void __fastcall TRegistryStorage::GetSubKeyNames(Classes::TStrings* Strings)
  298. {
  299. FRegistry->GetKeyNames(Strings);
  300. }
  301. //---------------------------------------------------------------------------
  302. void __fastcall TRegistryStorage::GetValueNames(Classes::TStrings* Strings)
  303. {
  304. FRegistry->GetValueNames(Strings);
  305. }
  306. //---------------------------------------------------------------------------
  307. bool __fastcall TRegistryStorage::DeleteValue(const AnsiString Name)
  308. {
  309. return FRegistry->DeleteValue(Name);
  310. }
  311. //---------------------------------------------------------------------------
  312. bool __fastcall TRegistryStorage::KeyExists(const AnsiString SubKey)
  313. {
  314. return FRegistry->KeyExists(SubKey);
  315. }
  316. //---------------------------------------------------------------------------
  317. bool __fastcall TRegistryStorage::ValueExists(const AnsiString Value)
  318. {
  319. return FRegistry->ValueExists(Value);
  320. }
  321. //---------------------------------------------------------------------------
  322. int __fastcall TRegistryStorage::BinaryDataSize(const AnsiString Name)
  323. {
  324. return FRegistry->GetDataSize(Name);
  325. }
  326. //---------------------------------------------------------------------------
  327. bool __fastcall TRegistryStorage::ReadBool(const AnsiString Name, bool Default)
  328. {
  329. READ_REGISTRY(ReadBool);
  330. }
  331. //---------------------------------------------------------------------------
  332. TDateTime __fastcall TRegistryStorage::ReadDateTime(const AnsiString Name, TDateTime Default)
  333. {
  334. READ_REGISTRY(ReadDateTime);
  335. }
  336. //---------------------------------------------------------------------------
  337. double __fastcall TRegistryStorage::ReadFloat(const AnsiString Name, double Default)
  338. {
  339. READ_REGISTRY(ReadFloat);
  340. }
  341. //---------------------------------------------------------------------------
  342. int __fastcall TRegistryStorage::ReadInteger(const AnsiString Name, int Default)
  343. {
  344. READ_REGISTRY(ReadInteger);
  345. }
  346. //---------------------------------------------------------------------------
  347. __int64 __fastcall TRegistryStorage::ReadInt64(const AnsiString Name, __int64 Default)
  348. {
  349. __int64 Result = Default;
  350. if (FRegistry->ValueExists(Name))
  351. {
  352. try
  353. {
  354. FRegistry->ReadBinaryData(Name, &Result, sizeof(Result));
  355. }
  356. catch(...)
  357. {
  358. FFailed++;
  359. }
  360. }
  361. return Result;
  362. }
  363. //---------------------------------------------------------------------------
  364. AnsiString __fastcall TRegistryStorage::ReadStringRaw(const AnsiString Name, const AnsiString Default)
  365. {
  366. READ_REGISTRY(ReadString);
  367. }
  368. //---------------------------------------------------------------------------
  369. int __fastcall TRegistryStorage::ReadBinaryData(const AnsiString Name,
  370. void * Buffer, int Size)
  371. {
  372. int Result;
  373. if (FRegistry->ValueExists(Name))
  374. {
  375. try
  376. {
  377. Result = FRegistry->ReadBinaryData(Name, Buffer, Size);
  378. }
  379. catch(...)
  380. {
  381. Result = 0;
  382. FFailed++;
  383. }
  384. }
  385. else
  386. {
  387. Result = 0;
  388. }
  389. return Result;
  390. }
  391. //---------------------------------------------------------------------------
  392. void __fastcall TRegistryStorage::WriteBool(const AnsiString Name, bool Value)
  393. {
  394. WRITE_REGISTRY(WriteBool);
  395. }
  396. //---------------------------------------------------------------------------
  397. void __fastcall TRegistryStorage::WriteDateTime(const AnsiString Name, TDateTime Value)
  398. {
  399. WRITE_REGISTRY(WriteDateTime);
  400. }
  401. //---------------------------------------------------------------------------
  402. void __fastcall TRegistryStorage::WriteFloat(const AnsiString Name, double Value)
  403. {
  404. WRITE_REGISTRY(WriteFloat);
  405. }
  406. //---------------------------------------------------------------------------
  407. void __fastcall TRegistryStorage::WriteStringRaw(const AnsiString Name, const AnsiString Value)
  408. {
  409. WRITE_REGISTRY(WriteString);
  410. }
  411. //---------------------------------------------------------------------------
  412. void __fastcall TRegistryStorage::WriteInteger(const AnsiString Name, int Value)
  413. {
  414. WRITE_REGISTRY(WriteInteger);
  415. }
  416. //---------------------------------------------------------------------------
  417. void __fastcall TRegistryStorage::WriteInt64(const AnsiString Name, __int64 Value)
  418. {
  419. try
  420. {
  421. FRegistry->WriteBinaryData(Name, &Value, sizeof(Value));
  422. }
  423. catch(...)
  424. {
  425. FFailed++;
  426. }
  427. }
  428. //---------------------------------------------------------------------------
  429. void __fastcall TRegistryStorage::WriteBinaryData(const AnsiString Name,
  430. void * Buffer, int Size)
  431. {
  432. try
  433. {
  434. FRegistry->WriteBinaryData(Name, Buffer, Size);
  435. }
  436. catch(...)
  437. {
  438. FFailed++;
  439. }
  440. }
  441. //---------------------------------------------------------------------------
  442. int __fastcall TRegistryStorage::GetFailed()
  443. {
  444. int Result = FFailed;
  445. FFailed = 0;
  446. return Result;
  447. }
  448. //===========================================================================
  449. __fastcall TIniFileStorage::TIniFileStorage(const AnsiString AStorage):
  450. THierarchicalStorage(AStorage)
  451. {
  452. FIniFile = new TIniFile(Storage);
  453. }
  454. //---------------------------------------------------------------------------
  455. __fastcall TIniFileStorage::~TIniFileStorage()
  456. {
  457. delete FIniFile;
  458. }
  459. //---------------------------------------------------------------------------
  460. AnsiString __fastcall TIniFileStorage::GetCurrentSection()
  461. {
  462. return ExcludeTrailingBackslash(CurrentSubKey);
  463. }
  464. //---------------------------------------------------------------------------
  465. bool __fastcall TIniFileStorage::OpenSubKey(const AnsiString SubKey, bool CanCreate)
  466. {
  467. bool Result = CanCreate;
  468. if (!Result)
  469. {
  470. TStringList * Sections = new TStringList();
  471. try
  472. {
  473. Sections->Sorted = true;
  474. FIniFile->ReadSections(Sections);
  475. AnsiString NewKey = ExcludeTrailingBackslash(CurrentSubKey+SubKey);
  476. int Index = -1;
  477. if (Sections->Count)
  478. {
  479. Result = Sections->Find(NewKey, Index);
  480. if (!Result && Index < Sections->Count &&
  481. Sections->Strings[Index].SubString(1, NewKey.Length()+1) == NewKey + "\\")
  482. {
  483. Result = true;
  484. }
  485. }
  486. }
  487. __finally
  488. {
  489. delete Sections;
  490. }
  491. }
  492. if (Result)
  493. {
  494. Result = THierarchicalStorage::OpenSubKey(SubKey, CanCreate);
  495. }
  496. return Result;
  497. }
  498. //---------------------------------------------------------------------------
  499. bool __fastcall TIniFileStorage::DeleteSubKey(const AnsiString SubKey)
  500. {
  501. bool Result;
  502. try
  503. {
  504. FIniFile->EraseSection(CurrentSubKey + SubKey);
  505. Result = true;
  506. }
  507. catch (...)
  508. {
  509. Result = false;
  510. }
  511. return Result;
  512. }
  513. //---------------------------------------------------------------------------
  514. void __fastcall TIniFileStorage::GetSubKeyNames(Classes::TStrings* Strings)
  515. {
  516. TStrings * Sections = new TStringList();
  517. try
  518. {
  519. Strings->Clear();
  520. FIniFile->ReadSections(Sections);
  521. for (int i = 0; i < Sections->Count; i++)
  522. {
  523. AnsiString Section = Sections->Strings[i];
  524. if (AnsiCompareText(CurrentSubKey,
  525. Section.SubString(1, CurrentSubKey.Length())) == 0)
  526. {
  527. AnsiString SubSection = Section.SubString(CurrentSubKey.Length() + 1,
  528. Section.Length() - CurrentSubKey.Length());
  529. int P = SubSection.Pos("\\");
  530. if (P)
  531. {
  532. SubSection.SetLength(P - 1);
  533. }
  534. if (Strings->IndexOf(SubSection) < 0)
  535. {
  536. Strings->Add(SubSection);
  537. }
  538. }
  539. }
  540. }
  541. __finally
  542. {
  543. delete Sections;
  544. }
  545. }
  546. //---------------------------------------------------------------------------
  547. void __fastcall TIniFileStorage::GetValueNames(Classes::TStrings* Strings)
  548. {
  549. return FIniFile->ReadSection(CurrentSection, Strings);
  550. }
  551. //---------------------------------------------------------------------------
  552. bool __fastcall TIniFileStorage::KeyExists(const AnsiString SubKey)
  553. {
  554. return FIniFile->SectionExists(CurrentSubKey + SubKey);
  555. }
  556. //---------------------------------------------------------------------------
  557. bool __fastcall TIniFileStorage::ValueExists(const AnsiString Value)
  558. {
  559. return FIniFile->ValueExists(CurrentSection, Value);
  560. }
  561. //---------------------------------------------------------------------------
  562. bool __fastcall TIniFileStorage::DeleteValue(const AnsiString Name)
  563. {
  564. FIniFile->DeleteKey(CurrentSection, Name);
  565. return true;
  566. }
  567. //---------------------------------------------------------------------------
  568. int __fastcall TIniFileStorage::BinaryDataSize(const AnsiString Name)
  569. {
  570. return FIniFile->ReadString(CurrentSection, Name, "").Length() / 2;
  571. }
  572. //---------------------------------------------------------------------------
  573. bool __fastcall TIniFileStorage::ReadBool(const AnsiString Name, bool Default)
  574. {
  575. return FIniFile->ReadBool(CurrentSection, Name, Default);
  576. }
  577. //---------------------------------------------------------------------------
  578. int __fastcall TIniFileStorage::ReadInteger(const AnsiString Name, int Default)
  579. {
  580. return FIniFile->ReadInteger(CurrentSection, Name, Default);
  581. }
  582. //---------------------------------------------------------------------------
  583. __int64 __fastcall TIniFileStorage::ReadInt64(const AnsiString Name, __int64 Default)
  584. {
  585. __int64 Result = Default;
  586. AnsiString Str;
  587. Str = ReadStringRaw(Name, "");
  588. if (!Str.IsEmpty())
  589. {
  590. Result = StrToInt64Def(Str, Default);
  591. }
  592. return Result;
  593. }
  594. //---------------------------------------------------------------------------
  595. TDateTime __fastcall TIniFileStorage::ReadDateTime(const AnsiString Name, TDateTime Default)
  596. {
  597. return FIniFile->ReadDateTime(CurrentSection, Name, Default);
  598. }
  599. //---------------------------------------------------------------------------
  600. double __fastcall TIniFileStorage::ReadFloat(const AnsiString Name, double Default)
  601. {
  602. return FIniFile->ReadFloat(CurrentSection, Name, Default);
  603. }
  604. //---------------------------------------------------------------------------
  605. AnsiString __fastcall TIniFileStorage::ReadStringRaw(const AnsiString Name, AnsiString Default)
  606. {
  607. return FIniFile->ReadString(CurrentSection, Name, Default);
  608. }
  609. //---------------------------------------------------------------------------
  610. int __fastcall TIniFileStorage::ReadBinaryData(const AnsiString Name,
  611. void * Buffer, int Size)
  612. {
  613. AnsiString Value = HexToStr(ReadStringRaw(Name, ""));
  614. int Len = Value.Length();
  615. if (Size > Len)
  616. {
  617. Size = Len;
  618. }
  619. assert(Buffer);
  620. memcpy(Buffer, Value.c_str(), Size);
  621. return Size;
  622. }
  623. //---------------------------------------------------------------------------
  624. void __fastcall TIniFileStorage::WriteBool(const AnsiString Name, bool Value)
  625. {
  626. FIniFile->WriteBool(CurrentSection, Name, Value);
  627. }
  628. //---------------------------------------------------------------------------
  629. void __fastcall TIniFileStorage::WriteInteger(const AnsiString Name, int Value)
  630. {
  631. FIniFile->WriteInteger(CurrentSection, Name, Value);
  632. }
  633. //---------------------------------------------------------------------------
  634. void __fastcall TIniFileStorage::WriteInt64(const AnsiString Name, __int64 Value)
  635. {
  636. WriteStringRaw(Name, IntToStr(Value));
  637. }
  638. //---------------------------------------------------------------------------
  639. void __fastcall TIniFileStorage::WriteDateTime(const AnsiString Name, TDateTime Value)
  640. {
  641. FIniFile->WriteDateTime(CurrentSection, Name, Value);
  642. }
  643. //---------------------------------------------------------------------------
  644. void __fastcall TIniFileStorage::WriteFloat(const AnsiString Name, double Value)
  645. {
  646. FIniFile->WriteFloat(CurrentSection, Name, Value);
  647. }
  648. //---------------------------------------------------------------------------
  649. void __fastcall TIniFileStorage::WriteStringRaw(const AnsiString Name, const AnsiString Value)
  650. {
  651. FIniFile->WriteString(CurrentSection, Name, Value);
  652. }
  653. //---------------------------------------------------------------------------
  654. void __fastcall TIniFileStorage::WriteBinaryData(const AnsiString Name,
  655. void * Buffer, int Size)
  656. {
  657. WriteStringRaw(Name, StrToHex(AnsiString(static_cast<char*>(Buffer), Size)));
  658. }