xref: /openbmc/phosphor-host-ipmid/sys_info_param.hpp (revision 69b4c2811a262094addab680c925e63dd3468440)
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