HierarchicalStorage.cpp 22 KB

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