1 // 2 // Copyright (C) 2012 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #ifndef UPDATE_ENGINE_COMMON_PREFS_H_ 18 #define UPDATE_ENGINE_COMMON_PREFS_H_ 19 20 #include <functional> 21 #include <map> 22 #include <string> 23 #include <string_view> 24 #include <vector> 25 26 #include <base/files/file_path.h> 27 28 #include "gtest/gtest_prod.h" // for FRIEND_TEST 29 #include "update_engine/common/prefs_interface.h" 30 31 namespace chromeos_update_engine { 32 33 // Implements a preference store by storing the value associated with a key 34 // in a given storage passed during construction. 35 class PrefsBase : public PrefsInterface { 36 public: 37 // Storage interface used to set and retrieve keys. 38 class StorageInterface { 39 public: 40 StorageInterface() = default; 41 virtual ~StorageInterface() = default; 42 43 // Get the key named |key| and store its value in the referenced |value|. 44 // Returns whether the operation succeeded. 45 virtual bool GetKey(std::string_view key, std::string* value) const = 0; 46 47 // Get the keys stored within the namespace. If there are no keys in the 48 // namespace, |keys| will be empty. Returns whether the operation succeeded. 49 virtual bool GetSubKeys(std::string_view ns, 50 std::vector<std::string>* keys) const = 0; 51 52 // Set the value of the key named |key| to |value| regardless of the 53 // previous value. Returns whether the operation succeeded. 54 virtual bool SetKey(std::string_view key, std::string_view value) = 0; 55 56 // Returns whether the key named |key| exists. 57 virtual bool KeyExists(std::string_view key) const = 0; 58 59 // Deletes the value associated with the key name |key|. Returns whether the 60 // key was deleted. 61 virtual bool DeleteKey(std::string_view key) = 0; 62 63 private: 64 DISALLOW_COPY_AND_ASSIGN(StorageInterface); 65 }; 66 PrefsBase(StorageInterface * storage)67 explicit PrefsBase(StorageInterface* storage) : storage_(storage) {} 68 69 // PrefsInterface methods. 70 bool GetString(std::string_view key, std::string* value) const override; 71 bool SetString(std::string_view key, std::string_view value) override; 72 bool GetInt64(std::string_view key, int64_t* value) const override; 73 bool SetInt64(std::string_view key, const int64_t value) override; 74 bool GetBoolean(std::string_view key, bool* value) const override; 75 bool SetBoolean(std::string_view key, const bool value) override; 76 77 bool Exists(std::string_view key) const override; 78 bool Delete(std::string_view key) override; 79 bool Delete(std::string_view pref_key, 80 const std::vector<std::string>& nss) override; 81 82 bool GetSubKeys(std::string_view ns, 83 std::vector<std::string>* keys) const override; 84 85 void AddObserver(std::string_view key, ObserverInterface* observer) override; 86 void RemoveObserver(std::string_view key, 87 ObserverInterface* observer) override; 88 89 private: 90 // The registered observers watching for changes. 91 std::map<std::string, std::vector<ObserverInterface*>, std::less<>> 92 observers_; 93 94 // The concrete implementation of the storage used for the keys. 95 StorageInterface* storage_; 96 97 DISALLOW_COPY_AND_ASSIGN(PrefsBase); 98 }; 99 100 // Implements a preference store by storing the value associated with 101 // a key in a separate file named after the key under a preference 102 // store directory. 103 104 class Prefs : public PrefsBase { 105 public: Prefs()106 Prefs() : PrefsBase(&file_storage_) {} 107 108 // Initializes the store by associating this object with |prefs_dir| 109 // as the preference store directory. Returns true on success, false 110 // otherwise. 111 bool Init(const base::FilePath& prefs_dir); 112 113 private: 114 FRIEND_TEST(PrefsTest, GetFileNameForKey); 115 FRIEND_TEST(PrefsTest, GetFileNameForKeyBadCharacter); 116 FRIEND_TEST(PrefsTest, GetFileNameForKeyEmpty); 117 118 class FileStorage : public PrefsBase::StorageInterface { 119 public: 120 FileStorage() = default; 121 122 bool Init(const base::FilePath& prefs_dir); 123 124 // PrefsBase::StorageInterface overrides. 125 bool GetKey(std::string_view key, std::string* value) const override; 126 bool GetSubKeys(std::string_view ns, 127 std::vector<std::string>* keys) const override; 128 bool SetKey(std::string_view key, std::string_view value) override; 129 bool KeyExists(std::string_view key) const override; 130 bool DeleteKey(std::string_view key) override; 131 132 private: 133 FRIEND_TEST(PrefsTest, GetFileNameForKey); 134 FRIEND_TEST(PrefsTest, GetFileNameForKeyBadCharacter); 135 FRIEND_TEST(PrefsTest, GetFileNameForKeyEmpty); 136 137 // Sets |filename| to the full path to the file containing the data 138 // associated with |key|. Returns true on success, false otherwise. 139 bool GetFileNameForKey(std::string_view key, 140 base::FilePath* filename) const; 141 142 // Preference store directory. 143 base::FilePath prefs_dir_; 144 }; 145 146 // The concrete file storage implementation. 147 FileStorage file_storage_; 148 149 DISALLOW_COPY_AND_ASSIGN(Prefs); 150 }; 151 152 // Implements a preference store in memory. The stored values are lost when the 153 // object is destroyed. 154 155 class MemoryPrefs : public PrefsBase { 156 public: MemoryPrefs()157 MemoryPrefs() : PrefsBase(&mem_storage_) {} 158 159 private: 160 class MemoryStorage : public PrefsBase::StorageInterface { 161 public: 162 MemoryStorage() = default; 163 164 // PrefsBase::StorageInterface overrides. 165 bool GetKey(std::string_view, std::string* value) const override; 166 bool GetSubKeys(std::string_view ns, 167 std::vector<std::string>* keys) const override; 168 bool SetKey(std::string_view key, std::string_view value) override; 169 bool KeyExists(std::string_view key) const override; 170 bool DeleteKey(std::string_view key) override; 171 172 private: 173 // The std::map holding the values in memory. 174 std::map<std::string, std::string, std::less<>> values_; 175 }; 176 177 // The concrete memory storage implementation. 178 MemoryStorage mem_storage_; 179 180 DISALLOW_COPY_AND_ASSIGN(MemoryPrefs); 181 }; 182 } // namespace chromeos_update_engine 183 184 #endif // UPDATE_ENGINE_COMMON_PREFS_H_ 185