1 #pragma once 2 3 #include <cstdint> 4 #include <functional> 5 #include <map> 6 #include <string> 7 #include <tuple> 8 9 /** 10 * Key-value store for string-type system info parameters. 11 */ 12 class SysInfoParamStoreIntf 13 { 14 public: 15 virtual ~SysInfoParamStoreIntf() 16 { 17 } 18 19 /** 20 * Returns true if parameter is found. If and only if s is non-null, 21 * invokes the parameter's callback and writes the value. 22 * 23 * @param[in] paramSelector - the key to lookup. 24 * @return tuple of bool and string, true if parameter is found and 25 * string set accordingly. 26 */ 27 virtual std::tuple<bool, std::string> 28 lookup(uint8_t paramSelector) const = 0; 29 30 /** 31 * Update a parameter by its code with a string value. 32 * 33 * @param[in] paramSelector - the key to update. 34 * @param[in] s - the value to set. 35 */ 36 virtual void update(uint8_t paramSelector, const std::string& s) = 0; 37 38 /** 39 * Update a parameter by its code with a callback that is called to retrieve 40 * its value whenever called. Callback must be idempotent, as it may be 41 * called multiple times by the host to retrieve the parameter by chunks. 42 * 43 * @param[in] paramSelector - the key to update. 44 * @param[in] callback - the callback to use for parameter retrieval. 45 */ 46 virtual void update(uint8_t paramSelector, 47 const std::function<std::string()>& callback) = 0; 48 49 // TODO: Store "read-only" flag for each parameter. 50 // TODO: Function to erase a parameter? 51 }; 52 53 /** 54 * Implement the system info parameters store as a map of callbacks. 55 */ 56 class SysInfoParamStore : public SysInfoParamStoreIntf 57 { 58 public: 59 std::tuple<bool, std::string> lookup(uint8_t paramSelector) const override; 60 void update(uint8_t paramSelector, const std::string& s) override; 61 void update(uint8_t paramSelector, 62 const std::function<std::string()>& callback) override; 63 64 private: 65 std::map<uint8_t, std::function<std::string()>> params; 66 }; 67