void TConfiguration::SetStorage(TStorage Value) { if (FStorage != Value) { TStorage StorageBak = FStorage; try { std::unique_ptr<THierarchicalStorage> SourceStorage(CreateConfigStorage()); std::unique_ptr<THierarchicalStorage> TargetStorage(CreateConfigStorage()); SourceStorage->SetAccessMode(smRead); FStorage = Value; TargetStorage->SetAccessMode(smReadWrite); TargetStorage->SetExplicit(true); // copy before save as it removes the ini file, // when switching from ini to registry CopyData(SourceStorage.get(), TargetStorage.get()); // save all and explicit DoSave(true, true); } catch (...) { // If this fails, do not pretend that storage was switched. // For instance: // - When writing to an INI file fails (unlikely, as we fallback to user profile) // - When removing INI file fails, when switching to registry // (possible, when the INI file is in Program Files folder) FStorage = StorageBak; throw; } } }
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 TFarConfiguration::Load() { std::unique_ptr<THierarchicalStorage> Storage(CreateConfigStorage()); FForceInheritance = true; SCOPE_EXIT { FForceInheritance = false; }; TGUIConfiguration::Load(Storage.get()); }
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(CreateConfigStorage()); 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(CreateConfigStorage()); 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(CreateConfigStorage()); 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(CreateConfigStorage()); Storage->SetAccessMode(smReadWrite); if (Storage->OpenSubKey(GetConfigurationSubKey(), true) && Storage->OpenSubKey(L"CDCache", true)) { UnicodeString Data; DirectoryChangesCache->Serialize(Data); Storage->WriteBinaryData(SessionKey, Data); } }
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; }