1 // Copyright 2015 The Weave Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_CONFIG_STORE_H_ 6 #define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_CONFIG_STORE_H_ 7 8 #include <map> 9 #include <set> 10 #include <string> 11 #include <vector> 12 13 #include <base/callback.h> 14 #include <base/time/time.h> 15 #include <weave/enum_to_string.h> 16 #include <weave/error.h> 17 #include <weave/settings.h> 18 19 namespace weave { 20 namespace provider { 21 22 // This interface should be implemented by the user of libweave and 23 // provided during device creation in Device::Create(...) 24 // libweave will use this interface to get default settings and load / save 25 // settings to a persistent storage. 26 // 27 // Implementation of the LoadDefaults(...) method may load settings from 28 // a file or just hardcode defaults for this device. 29 // For example: 30 // bool FileConfigStore::LoadDefaults(Settings* settings) { 31 // settings->name = "My device"; 32 // settings->pairing_modes.insert(kPinCode); 33 // // set all other required settings, see include/weave/settings.h 34 // return true; 35 // } 36 // 37 // Implementation of LoadSettings() method should load previously 38 // stored settings from the persistent storage (file, flash, etc). 39 // For example: 40 // std::string FileConfigStore::LoadSettings(const std::string& name) { 41 // std::ifstream str("/var/lib/weave/weave_" + name + ".json"); 42 // return std::string(std::istreambuf_iterator<char>(str), 43 // std::istreambuf_iterator<char>()); 44 // } 45 // If data stored encrypted (highly recommended), LoadSettings() 46 // implementation should decrypt the data before returning it to libweave. 47 // 48 // Implementation of SaveSettings(...) method should store data in the 49 // persistent storage (file, flash, etc). 50 // For example: 51 // void FileConfigStore::SaveSettings(const std::string& name, 52 // const std::string& settings, 53 // const DoneCallback& callback) { 54 // std::ofstream str("/var/lib/weave/weave_" + name + ".json"); 55 // str << settings; 56 // if (!callback.is_null()) 57 // task_runner_->PostDelayedTask(FROM_HERE, base::Bind(callback, nullptr), 58 // {}); 59 // } 60 // It is highly recommended to protected data using encryption with 61 // hardware backed key. 62 // 63 // See libweave/examples/provider/file_config_store.cc for a complete 64 // example. 65 66 // Interface with methods to read/write libweave settings, device state and 67 // commands definitions. 68 class ConfigStore { 69 public: 70 // Returns default settings. This settings used for a new device or after 71 // a factory reset. 72 virtual bool LoadDefaults(Settings* settings) = 0; 73 74 // Returns settings saved by SaveSettings during last run of libweave. 75 // Implementation should return data as-is without parsing or modifications. 76 // |name| is the name of settings blob. Could be used as filename. 77 virtual std::string LoadSettings(const std::string& name) = 0; 78 79 // Saves settings. Implementation should save data as-is without parsing or 80 // modifications. Data stored in settings can be sensitive, so it's highly 81 // recommended to protect data, e.g. using encryption. 82 // |name| is the name of settings blob. Could be used as filename. 83 // Implementation must call or post callback 84 virtual void SaveSettings(const std::string& name, 85 const std::string& settings, 86 const DoneCallback& callback) = 0; 87 88 // Deprecated: only for migration of old configs to version with |name|. 89 virtual std::string LoadSettings() = 0; 90 91 protected: ~ConfigStore()92 virtual ~ConfigStore() {} 93 }; 94 95 } // namespace provider 96 } // namespace weave 97 98 #endif // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_CONFIG_STORE_H_ 99