1069db2fdSXo Wang #pragma once 2069db2fdSXo Wang 3069db2fdSXo Wang #include <cstdint> 4069db2fdSXo Wang #include <functional> 5069db2fdSXo Wang #include <map> 6069db2fdSXo Wang #include <string> 7069db2fdSXo Wang #include <tuple> 8069db2fdSXo Wang 9069db2fdSXo Wang /** 10069db2fdSXo Wang * Key-value store for string-type system info parameters. 11069db2fdSXo Wang */ 12069db2fdSXo Wang class SysInfoParamStoreIntf 13069db2fdSXo Wang { 14069db2fdSXo Wang public: ~SysInfoParamStoreIntf()15fbc6c9d7SPatrick Williams virtual ~SysInfoParamStoreIntf() {} 16069db2fdSXo Wang 17069db2fdSXo Wang /** 18069db2fdSXo Wang * Returns true if parameter is found. If and only if s is non-null, 19069db2fdSXo Wang * invokes the parameter's callback and writes the value. 20069db2fdSXo Wang * 21069db2fdSXo Wang * @param[in] paramSelector - the key to lookup. 22069db2fdSXo Wang * @return tuple of bool and string, true if parameter is found and 23069db2fdSXo Wang * string set accordingly. 24069db2fdSXo Wang */ 25*69b4c281SPatrick Williams virtual std::tuple<bool, std::string> lookup( 26*69b4c281SPatrick Williams uint8_t paramSelector) const = 0; 27069db2fdSXo Wang 28069db2fdSXo Wang /** 29069db2fdSXo Wang * Update a parameter by its code with a string value. 30069db2fdSXo Wang * 31069db2fdSXo Wang * @param[in] paramSelector - the key to update. 32069db2fdSXo Wang * @param[in] s - the value to set. 33069db2fdSXo Wang */ 34069db2fdSXo Wang virtual void update(uint8_t paramSelector, const std::string& s) = 0; 35069db2fdSXo Wang 36069db2fdSXo Wang /** 37069db2fdSXo Wang * Update a parameter by its code with a callback that is called to retrieve 38069db2fdSXo Wang * its value whenever called. Callback must be idempotent, as it may be 39069db2fdSXo Wang * called multiple times by the host to retrieve the parameter by chunks. 40069db2fdSXo Wang * 41069db2fdSXo Wang * @param[in] paramSelector - the key to update. 42069db2fdSXo Wang * @param[in] callback - the callback to use for parameter retrieval. 43069db2fdSXo Wang */ 44069db2fdSXo Wang virtual void update(uint8_t paramSelector, 45069db2fdSXo Wang const std::function<std::string()>& callback) = 0; 46069db2fdSXo Wang 47069db2fdSXo Wang // TODO: Store "read-only" flag for each parameter. 48069db2fdSXo Wang // TODO: Function to erase a parameter? 49069db2fdSXo Wang }; 50069db2fdSXo Wang 51069db2fdSXo Wang /** 52069db2fdSXo Wang * Implement the system info parameters store as a map of callbacks. 53069db2fdSXo Wang */ 54069db2fdSXo Wang class SysInfoParamStore : public SysInfoParamStoreIntf 55069db2fdSXo Wang { 56069db2fdSXo Wang public: 57069db2fdSXo Wang std::tuple<bool, std::string> lookup(uint8_t paramSelector) const override; 58069db2fdSXo Wang void update(uint8_t paramSelector, const std::string& s) override; 59069db2fdSXo Wang void update(uint8_t paramSelector, 60069db2fdSXo Wang const std::function<std::string()>& callback) override; 61069db2fdSXo Wang 62069db2fdSXo Wang private: 63069db2fdSXo Wang std::map<uint8_t, std::function<std::string()>> params; 64069db2fdSXo Wang }; 65