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