diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | sys_info_param.cpp | 33 | ||||
-rw-r--r-- | sys_info_param.hpp | 66 |
3 files changed, 100 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am index 8286fd4..28ae7ed 100644 --- a/Makefile.am +++ b/Makefile.am @@ -70,6 +70,7 @@ libipmi20_la_SOURCES = \ app/watchdog.cpp \ app/watchdog_service.cpp \ apphandler.cpp \ + sys_info_param.cpp \ sensorhandler.cpp \ storagehandler.cpp \ chassishandler.cpp \ diff --git a/sys_info_param.cpp b/sys_info_param.cpp new file mode 100644 index 0000000..c9bee32 --- /dev/null +++ b/sys_info_param.cpp @@ -0,0 +1,33 @@ +#include "sys_info_param.hpp" + +std::tuple<bool, std::string> + SysInfoParamStore::lookup(uint8_t paramSelector) const +{ + const auto iterator = params.find(paramSelector); + if (iterator == params.end()) + { + return std::make_tuple(false, ""); + } + + auto& callback = iterator->second; + auto s = callback(); + return std::make_tuple(true, s); +} + +void SysInfoParamStore::update(uint8_t paramSelector, const std::string& s) +{ + // Add a callback that captures a copy of the string passed and returns it + // when invoked. + + // clang-format off + update(paramSelector, [s]() { + return s; + }); + // clang-format on +} + +void SysInfoParamStore::update(uint8_t paramSelector, + const std::function<std::string()>& callback) +{ + params[paramSelector] = callback; +} diff --git a/sys_info_param.hpp b/sys_info_param.hpp new file mode 100644 index 0000000..6088626 --- /dev/null +++ b/sys_info_param.hpp @@ -0,0 +1,66 @@ +#pragma once + +#include <cstdint> +#include <functional> +#include <map> +#include <string> +#include <tuple> + +/** + * Key-value store for string-type system info parameters. + */ +class SysInfoParamStoreIntf +{ + public: + virtual ~SysInfoParamStoreIntf() + { + } + + /** + * Returns true if parameter is found. If and only if s is non-null, + * invokes the parameter's callback and writes the value. + * + * @param[in] paramSelector - the key to lookup. + * @return tuple of bool and string, true if parameter is found and + * string set accordingly. + */ + virtual std::tuple<bool, std::string> + lookup(uint8_t paramSelector) const = 0; + + /** + * Update a parameter by its code with a string value. + * + * @param[in] paramSelector - the key to update. + * @param[in] s - the value to set. + */ + virtual void update(uint8_t paramSelector, const std::string& s) = 0; + + /** + * Update a parameter by its code with a callback that is called to retrieve + * its value whenever called. Callback must be idempotent, as it may be + * called multiple times by the host to retrieve the parameter by chunks. + * + * @param[in] paramSelector - the key to update. + * @param[in] callback - the callback to use for parameter retrieval. + */ + virtual void update(uint8_t paramSelector, + const std::function<std::string()>& callback) = 0; + + // TODO: Store "read-only" flag for each parameter. + // TODO: Function to erase a parameter? +}; + +/** + * Implement the system info parameters store as a map of callbacks. + */ +class SysInfoParamStore : public SysInfoParamStoreIntf +{ + public: + std::tuple<bool, std::string> lookup(uint8_t paramSelector) const override; + void update(uint8_t paramSelector, const std::string& s) override; + void update(uint8_t paramSelector, + const std::function<std::string()>& callback) override; + + private: + std::map<uint8_t, std::function<std::string()>> params; +}; |