//--------------------------------------------------------------------------- void TConfiguration::DoSave(bool All, bool Explicit) { if (FDontSave) { return; } std::unique_ptr<THierarchicalStorage> Storage(CreateStorage(false)); Storage->SetAccessMode(smReadWrite); Storage->SetExplicit(Explicit); if (Storage->OpenSubKey(GetConfigurationSubKey(), true)) { SaveData(Storage.get(), All); } Saved(); if (All) { StoredSessions->Save(true, Explicit); } // clean up as last, so that if it fails (read only INI), the saving can proceed if (GetStorage() == stRegistry) { CleanupIniFile(); } }
void TConfiguration::DoSave(bool All, bool Explicit) { if (FDontSave) { return; } std::unique_ptr<THierarchicalStorage> Storage(CreateConfigStorage()); Storage->SetAccessMode(smReadWrite); Storage->SetExplicit(Explicit); if (Storage->OpenSubKey(GetConfigurationSubKey(), true)) { // if saving to TOptionsStorage, make sure we save everything so that // all configuration is properly transferred to the master storage bool ConfigAll = All || Storage->GetTemporary(); SaveData(Storage.get(), ConfigAll); } Saved(); if (All) { StoredSessions->Save(true, Explicit); } // clean up as last, so that if it fails (read only INI), the saving can proceed if (GetStorage() == stRegistry) { CleanupIniFile(); } }
void TConfiguration::LoadFrom(THierarchicalStorage * Storage) { if (Storage->OpenSubKey(GetConfigurationSubKey(), false)) { LoadData(Storage); Storage->CloseSubKey(); } }
void TConfiguration::RememberLastFingerprint(const UnicodeString & SiteKey, const UnicodeString & FingerprintType, const UnicodeString & Fingerprint) { std::unique_ptr<THierarchicalStorage> Storage(CreateConfigStorage()); Storage->SetAccessMode(smReadWrite); if (Storage->OpenSubKey(GetConfigurationSubKey(), true) && Storage->OpenSubKey("LastFingerprints", true)) { UnicodeString FingerprintKey = FormatFingerprintKey(SiteKey, FingerprintType); Storage->WriteString(FingerprintKey, Fingerprint); } }
//--------------------------------------------------------------------------- void TConfiguration::NeverShowBanner(const UnicodeString & SessionKey, const UnicodeString & Banner) { std::unique_ptr<THierarchicalStorage> Storage(CreateStorage(false)); Storage->SetAccessMode(smReadWrite); if (Storage->OpenSubKey(GetConfigurationSubKey(), true) && Storage->OpenSubKey(L"Banners", true)) { Storage->WriteString(SessionKey, BannerHash(Banner)); } }
//--------------------------------------------------------------------------- void TConfiguration::LoadDirectoryChangesCache(const UnicodeString & SessionKey, TRemoteDirectoryChangesCache * DirectoryChangesCache) { std::unique_ptr<THierarchicalStorage> Storage(CreateStorage(false)); Storage->SetAccessMode(smRead); if (Storage->OpenSubKey(GetConfigurationSubKey(), false) && Storage->OpenSubKey(L"CDCache", false) && Storage->ValueExists(SessionKey)) { DirectoryChangesCache->Deserialize(Storage->ReadBinaryData(SessionKey)); } }
//--------------------------------------------------------------------------- bool TConfiguration::ShowBanner(const UnicodeString & SessionKey, const UnicodeString & Banner) { std::unique_ptr<THierarchicalStorage> Storage(CreateStorage(false)); Storage->SetAccessMode(smRead); bool Result = !Storage->OpenSubKey(GetConfigurationSubKey(), false) || !Storage->OpenSubKey(L"Banners", false) || !Storage->ValueExists(SessionKey) || (Storage->ReadString(SessionKey, L"") != BannerHash(Banner)); return Result; }
//--------------------------------------------------------------------------- void TConfiguration::SaveDirectoryChangesCache(const UnicodeString & SessionKey, TRemoteDirectoryChangesCache * DirectoryChangesCache) { std::unique_ptr<THierarchicalStorage> Storage(CreateStorage(false)); Storage->SetAccessMode(smReadWrite); if (Storage->OpenSubKey(GetConfigurationSubKey(), true) && Storage->OpenSubKey(L"CDCache", true)) { UnicodeString Data; DirectoryChangesCache->Serialize(Data); Storage->WriteBinaryData(SessionKey, Data); } }
void TConfiguration::CleanupConfiguration() { try { CleanupRegistry(GetConfigurationSubKey()); if (GetStorage() == stRegistry) { FDontSave = true; } } catch (Exception & E) { throw ExtException(&E, LoadStr(CLEANUP_CONFIG_ERROR)); } }
UnicodeString TConfiguration::GetLastFingerprint(const UnicodeString & SiteKey, const UnicodeString & FingerprintType) { UnicodeString Result; std::unique_ptr<THierarchicalStorage> Storage(CreateConfigStorage()); Storage->SetAccessMode(smRead); if (Storage->OpenSubKey(GetConfigurationSubKey(), false) && Storage->OpenSubKey("LastFingerprints", false)) { UnicodeString FingerprintKey = FormatFingerprintKey(SiteKey, FingerprintType); Result = Storage->ReadString(FingerprintKey, L""); } return Result; }
bool TConfiguration::ShowBanner(const UnicodeString & SessionKey, const UnicodeString & Banner) { bool Result = false; std::unique_ptr<THierarchicalStorage> Storage(CreateConfigStorage()); try__finally { Storage->SetAccessMode(smRead); Result = !Storage->OpenSubKey(GetConfigurationSubKey(), false) || !Storage->OpenSubKey("Banners", false) || !Storage->ValueExists(SessionKey) || (Storage->ReadString(SessionKey, L"") != BannerHash(Banner)); return Result; } __finally { // delete Storage; }; return Result; }
void TConfiguration::CopyData(THierarchicalStorage * Source, THierarchicalStorage * Target) { std::unique_ptr<TStrings > Names(new TStringList()); try__finally { if (Source->OpenSubKey(GetConfigurationSubKey(), false)) { if (Target->OpenSubKey(GetConfigurationSubKey(), true)) { if (Source->OpenSubKey("CDCache", false)) { if (Target->OpenSubKey("CDCache", true)) { Names->Clear(); Source->GetValueNames(Names.get()); for (intptr_t Index = 0; Index < Names->GetCount(); ++Index) { Target->WriteBinaryData(Names->GetString(Index), Source->ReadBinaryData(Names->GetString(Index))); } Target->CloseSubKey(); } Source->CloseSubKey(); } if (Source->OpenSubKey("Banners", false)) { if (Target->OpenSubKey("Banners", true)) { Names->Clear(); Source->GetValueNames(Names.get()); for (intptr_t Index = 0; Index < Names->GetCount(); ++Index) { Target->WriteString(Names->GetString(Index), Source->ReadString(Names->GetString(Index), L"")); } Target->CloseSubKey(); } Source->CloseSubKey(); } Target->CloseSubKey(); } Source->CloseSubKey(); } if (Source->OpenSubKey(GetSshHostKeysSubKey(), false)) { if (Target->OpenSubKey(GetSshHostKeysSubKey(), true)) { Names->Clear(); Source->GetValueNames(Names.get()); for (intptr_t Index = 0; Index < Names->GetCount(); ++Index) { Target->WriteStringRaw(Names->GetString(Index), Source->ReadStringRaw(Names->GetString(Index), L"")); } Target->CloseSubKey(); } Source->CloseSubKey(); } } __finally { // delete Names; }; }