| #include "managed_store_serialization.h" | |
| #include <cerrno> | |
| #include <cstddef> | |
| #include <cstdint> | |
| #include <cstring> | |
| #include <filesystem> | |
| #include <fstream> | |
| #include <ios> | |
| #include <iterator> | |
| #include <optional> | |
| #include <string> | |
| #include <tuple> | |
| #include <utility> | |
| #include <variant> | |
| #include <vector> | |
| #include "logging.hpp" | |
| #include "dbus_utility.hpp" | |
| #include <nlohmann/json.hpp> | |
| #include "sdbusplus/message/native_types.hpp" | |
| namespace serialize { | |
| using dbus::utility::DbusVariantType; | |
| using dbus::utility::MapperGetObject; | |
| using dbus::utility::MapperGetSubTreePathsResponse; | |
| using dbus::utility::MapperGetSubTreeResponse; | |
| using dbus::utility::MapperServiceMap; | |
| using dbus::utility::SystemdListUnits; | |
| using dbus::utility::SystemdUnitStruct; | |
| enum class Serialize : uint8_t { | |
| string_type, | |
| int64_t_type, | |
| uint64_t_type, | |
| double_type, | |
| int32_t_type, | |
| uint32_t_type, | |
| uint16_t_type, | |
| int16_t_type, | |
| uint8_t_type, | |
| bool_type, | |
| size_t_type, | |
| iter_type, | |
| tup_type | |
| }; | |
| static std::string SerializeToString(enum Serialize in) { | |
| switch (in) { | |
| case Serialize::string_type: | |
| return "string"; | |
| case Serialize::int64_t_type: | |
| return "int64_t"; | |
| case Serialize::uint64_t_type: | |
| return "uint64_t"; | |
| case Serialize::double_type: | |
| return "double"; | |
| case Serialize::int32_t_type: | |
| return "int32_t"; | |
| case Serialize::uint32_t_type: | |
| return "uint32_t"; | |
| case Serialize::uint16_t_type: | |
| return "uint16_t"; | |
| case Serialize::int16_t_type: | |
| return "int16_t"; | |
| case Serialize::uint8_t_type: | |
| return "uint8_t"; | |
| case Serialize::bool_type: | |
| return "bool"; | |
| case Serialize::size_t_type: | |
| return "size_t"; | |
| case Serialize::iter_type: | |
| return "iter_type"; | |
| case Serialize::tup_type: | |
| return "tup"; | |
| default: | |
| BMCWEB_LOG_STATEFUL_DEBUG << "unable to serialize enum value "; | |
| return "unknown"; | |
| } | |
| } | |
| template <typename T> | |
| nlohmann::json iterate_serialize(const std::vector<T>& in) { | |
| nlohmann::json arr = nlohmann::json::array(); | |
| for (auto& itor : in) { | |
| DbusVariantType temp = itor; | |
| arr.push_back(Serialize(temp)); | |
| } | |
| return arr; | |
| } | |
| nlohmann::json Serialize(const DbusVariantType& v) { | |
| nlohmann::json j; | |
| if (const std::string* pval = std::get_if<std::string>(&v)) { | |
| j["type"] = "string"; | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const int64_t* pval = std::get_if<int64_t>(&v)) { | |
| j["type"] = SerializeToString(Serialize::int64_t_type); | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const uint64_t* pval = std::get_if<uint64_t>(&v)) { | |
| j["type"] = SerializeToString(Serialize::uint64_t_type); | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const double* pval = std::get_if<double>(&v)) { | |
| j["type"] = SerializeToString(Serialize::double_type); | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const int32_t* pval = std::get_if<int32_t>(&v)) { | |
| j["type"] = SerializeToString(Serialize::int32_t_type); | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const uint32_t* pval = std::get_if<uint32_t>(&v)) { | |
| j["type"] = SerializeToString(Serialize::uint32_t_type); | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const uint16_t* pval = std::get_if<uint16_t>(&v)) { | |
| j["type"] = SerializeToString(Serialize::uint16_t_type); | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const int16_t* pval = std::get_if<int16_t>(&v)) { | |
| j["type"] = SerializeToString(Serialize::int16_t_type); | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const uint8_t* pval = std::get_if<uint8_t>(&v)) { | |
| j["type"] = SerializeToString(Serialize::uint8_t_type); | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const bool* pval = std::get_if<bool>(&v)) { | |
| j["type"] = SerializeToString(Serialize::bool_type); | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const size_t* pval = std::get_if<size_t>(&v)) { | |
| j["type"] = SerializeToString(Serialize::size_t_type); | |
| j["val"] = *pval; | |
| return j; | |
| } | |
| if (const std::vector<std::tuple<std::string, std::string, std::string>>* t = | |
| std::get_if< | |
| std::vector<std::tuple<std::string, std::string, std::string>>>( | |
| &v)) { | |
| j["type"] = SerializeToString(Serialize::iter_type); | |
| j["iterType"] = "v_t_s_s_s"; | |
| j["val"] = iterate_serialize(*t); | |
| return j; | |
| } | |
| if (const std::vector<std::string>* t = | |
| std::get_if<std::vector<std::string>>(&v)) { | |
| j["type"] = SerializeToString(Serialize::iter_type); | |
| j["iterType"] = "v_s"; | |
| j["val"] = iterate_serialize(*t); | |
| return j; | |
| } | |
| if (const std::vector<double>* t = std::get_if<std::vector<double>>(&v)) { | |
| j["type"] = SerializeToString(Serialize::iter_type); | |
| j["iterType"] = "v_d"; | |
| j["val"] = iterate_serialize(*t); | |
| return j; | |
| } | |
| if (const std::vector<uint32_t>* t = std::get_if<std::vector<uint32_t>>(&v)) { | |
| j["type"] = SerializeToString(Serialize::iter_type); | |
| j["iterType"] = "v_u32"; | |
| j["val"] = iterate_serialize(*t); | |
| return j; | |
| } | |
| if (const std::vector<uint16_t>* t = std::get_if<std::vector<uint16_t>>(&v)) { | |
| j["type"] = SerializeToString(Serialize::iter_type); | |
| j["iterType"] = "v_u16"; | |
| j["val"] = iterate_serialize(*t); | |
| return j; | |
| } | |
| if (const std::vector<std::tuple<std::string, std::string>>* t = | |
| std::get_if<std::vector<std::tuple<std::string, std::string>>>(&v)) { | |
| j["type"] = SerializeToString(Serialize::iter_type); | |
| j["iterType"] = "v_t_s_s"; | |
| j["val"] = iterate_serialize(*t); | |
| return j; | |
| } | |
| if (const std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>* t = | |
| std::get_if<std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>>( | |
| &v)) { | |
| j["type"] = SerializeToString(Serialize::iter_type); | |
| ; | |
| j["iterType"] = "v_t_u32_v_u32"; | |
| j["val"] = iterate_serialize(*t); | |
| return j; | |
| } | |
| if (const std::vector<std::tuple<uint32_t, size_t>>* t = | |
| std::get_if<std::vector<std::tuple<uint32_t, size_t>>>(&v)) { | |
| j["type"] = SerializeToString(Serialize::iter_type); | |
| ; | |
| j["iterType"] = "v_t_u32_size"; | |
| j["val"] = iterate_serialize(*t); | |
| return j; | |
| } | |
| if (const std::tuple<std::string, std::string, std::string>* t = | |
| std::get_if<std::tuple<std::string, std::string, std::string>>(&v)) { | |
| j["type"] = SerializeToString(Serialize::tup_type); | |
| j["iterType"] = "t_s_s_s"; | |
| nlohmann::json arr = nlohmann::json::array(); | |
| DbusVariantType tmp_var = std::get<0>(*t); | |
| arr.push_back(Serialize(tmp_var)); | |
| tmp_var = std::get<1>(*t); | |
| arr.push_back(Serialize(tmp_var)); | |
| tmp_var = std::get<2>(*t); | |
| arr.push_back(Serialize(tmp_var)); | |
| j["val"] = arr; | |
| return j; | |
| } | |
| if (const std::tuple<std::string, std::string>* t = | |
| std::get_if<std::tuple<std::string, std::string>>(&v)) { | |
| j["type"] = SerializeToString(Serialize::tup_type); | |
| j["iterType"] = "t_s_s"; | |
| nlohmann::json arr = nlohmann::json::array(); | |
| DbusVariantType tmp_var = std::get<0>(*t); | |
| arr.push_back(Serialize(tmp_var)); | |
| tmp_var = std::get<1>(*t); | |
| arr.push_back(Serialize(tmp_var)); | |
| j["val"] = arr; | |
| return j; | |
| } | |
| if (const std::tuple<uint32_t, std::vector<uint32_t>>* t = | |
| std::get_if<std::tuple<uint32_t, std::vector<uint32_t>>>(&v)) { | |
| j["type"] = SerializeToString(Serialize::tup_type); | |
| ; | |
| j["iterType"] = "t_u32_v_u32"; | |
| nlohmann::json arr = nlohmann::json::array(); | |
| DbusVariantType tmp_var = std::get<0>(*t); | |
| arr.push_back(Serialize(tmp_var)); | |
| tmp_var = std::get<1>(*t); | |
| arr.push_back(Serialize(tmp_var)); | |
| j["val"] = arr; | |
| return j; | |
| } | |
| /* | |
| * TODO deal with sdbusplus::message::object_path,and size_t | |
| */ | |
| BMCWEB_LOG_STATEFUL_DEBUG << "unable to serialize DbusVariantType, index " | |
| << v.index(); | |
| return j; | |
| } | |
| inline DbusVariantType DeserializeIter(nlohmann::json::reference j, | |
| const std::string& type) { | |
| if (type == "v_t_s_s_s") { | |
| std::vector<std::tuple<std::string, std::string, std::string>> vec; | |
| for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | |
| DbusVariantType tmp = Deserialize(*itor); | |
| if (const std::tuple<std::string, std::string, std::string>* pval = | |
| std::get_if<std::tuple<std::string, std::string, std::string>>( | |
| &tmp)) { | |
| vec.push_back(*pval); | |
| } else { | |
| BMCWEB_LOG_STATEFUL_DEBUG | |
| << "unable to deserialize vector tuple string string string"; | |
| } | |
| } | |
| return vec; | |
| } | |
| if (type == "v_s") { | |
| std::vector<std::string> vec; | |
| for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | |
| DbusVariantType tmp = Deserialize(*itor); | |
| if (const std::string* pval = std::get_if<std::string>(&tmp)) { | |
| vec.push_back(*pval); | |
| } else { | |
| BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector of string"; | |
| } | |
| } | |
| return vec; | |
| } | |
| if (type == "v_d") { | |
| std::vector<double> vec; | |
| for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | |
| DbusVariantType tmp = Deserialize(*itor); | |
| if (const double* pval = std::get_if<double>(&tmp)) { | |
| vec.push_back(*pval); | |
| } else { | |
| BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector double"; | |
| } | |
| } | |
| return vec; | |
| } | |
| if (type == "v_u32") { | |
| std::vector<uint32_t> vec; | |
| for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | |
| DbusVariantType tmp = Deserialize(*itor); | |
| if (const std::uint32_t* pval = std::get_if<uint32_t>(&tmp)) { | |
| vec.push_back(*pval); | |
| } else { | |
| BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector u32"; | |
| } | |
| } | |
| return vec; | |
| } | |
| if (type == "v_u16") { | |
| std::vector<uint16_t> vec; | |
| for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | |
| DbusVariantType tmp = Deserialize(*itor); | |
| if (const std::uint16_t* pval = std::get_if<uint16_t>(&tmp)) { | |
| vec.push_back(*pval); | |
| } else { | |
| BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector u16"; | |
| } | |
| } | |
| return vec; | |
| } | |
| if (type == "v_t_s_s") { | |
| std::vector<std::tuple<std::string, std::string>> vec; | |
| for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | |
| DbusVariantType tmp = Deserialize(*itor); | |
| if (const std::tuple<std::string, std::string>* pval = | |
| std::get_if<std::tuple<std::string, std::string>>(&tmp)) { | |
| vec.push_back(*pval); | |
| } else { | |
| BMCWEB_LOG_STATEFUL_DEBUG | |
| << "unable to deserialize vector tuple string string"; | |
| } | |
| } | |
| return vec; | |
| } | |
| if (type == "v_t_u32_v_u32") { | |
| std::vector<std::tuple<uint32_t, std::vector<uint32_t>>> vec; | |
| for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | |
| DbusVariantType tmp = Deserialize(*itor); | |
| if (const std::tuple<uint32_t, std::vector<uint32_t>>* pval = | |
| std::get_if<std::tuple<uint32_t, std::vector<uint32_t>>>(&tmp)) { | |
| vec.push_back(*pval); | |
| } else { | |
| BMCWEB_LOG_STATEFUL_DEBUG | |
| << "unable to deserialize vector tuple uint32 vector uint32"; | |
| } | |
| } | |
| return vec; | |
| } | |
| if (type == "v_t_u32_size") { | |
| std::vector<std::tuple<uint32_t, size_t>> vec; | |
| for (nlohmann::json::iterator itor = j.begin(); itor != j.end(); itor++) { | |
| DbusVariantType tmp = Deserialize(*itor); | |
| if (const std::tuple<uint32_t, size_t>* pval = | |
| std::get_if<std::tuple<uint32_t, size_t>>(&tmp)) { | |
| vec.push_back(*pval); | |
| } else { | |
| BMCWEB_LOG_STATEFUL_DEBUG << "unable to deserialize vector uint32 size"; | |
| } | |
| } | |
| return vec; | |
| } | |
| BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown iter type, iterType: " | |
| << type; | |
| return {}; | |
| } | |
| inline DbusVariantType DeserializeTup(nlohmann::json::reference j, | |
| const std::string& type) { | |
| if (type == "t_s_s") { | |
| std::tuple<std::string, std::string> tup; | |
| DbusVariantType tmp = Deserialize(j[0]); | |
| if (const std::string* pval = std::get_if<std::string>(&tmp)) { | |
| std::get<0>(tup) = *pval; | |
| } else { | |
| BMCWEB_LOG_ERROR << "Unable to derizlize tup t_s_s 0"; | |
| } | |
| tmp = Deserialize(j[1]); | |
| if (const std::string* pval = std::get_if<std::string>(&tmp)) { | |
| std::get<1>(tup) = *pval; | |
| } else { | |
| BMCWEB_LOG_ERROR << "Unable to derizlize tup t_s_s 1"; | |
| } | |
| return tup; | |
| } | |
| if (type == "t_s_s_s") { | |
| std::tuple<std::string, std::string, std::string> tup; | |
| DbusVariantType tmp = Deserialize(j[0]); | |
| if (const std::string* pval = std::get_if<std::string>(&tmp)) { | |
| std::get<0>(tup) = *pval; | |
| } else { | |
| BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 0"; | |
| } | |
| tmp = Deserialize(j[1]); | |
| if (const std::string* pval = std::get_if<std::string>(&tmp)) { | |
| std::get<1>(tup) = *pval; | |
| } else { | |
| BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 1"; | |
| } | |
| tmp = Deserialize(j[2]); | |
| if (const std::string* pval = std::get_if<std::string>(&tmp)) { | |
| std::get<2>(tup) = *pval; | |
| } else { | |
| BMCWEB_LOG_ERROR << "Unable to derizlize up t_s_s_s 2"; | |
| } | |
| return tup; | |
| } | |
| if (type == "t_u32_v_u32") { | |
| std::tuple<uint32_t, std::vector<uint32_t>> tup; | |
| DbusVariantType tmp = Deserialize(j[0]); | |
| if (const uint32_t* pval = std::get_if<uint32_t>(&tmp)) { | |
| std::get<0>(tup) = *pval; | |
| } else { | |
| BMCWEB_LOG_ERROR << "Unable to derizlize tup t_u32_v_u32 0"; | |
| } | |
| tmp = Deserialize(j[1]); | |
| if (const std::vector<uint32_t>* pval = | |
| std::get_if<std::vector<uint32_t>>(&tmp)) { | |
| std::get<1>(tup) = *pval; | |
| } else { | |
| BMCWEB_LOG_ERROR << "Unable to derizlize tup t_u32_v_u32 2"; | |
| } | |
| return tup; | |
| } | |
| BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown tuple type, iterType: " | |
| << type; | |
| return {}; | |
| } | |
| DbusVariantType Deserialize(nlohmann::json::reference j) { | |
| try { | |
| std::string vtype = j["type"]; | |
| BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: vtype: "; | |
| BMCWEB_LOG_STATEFUL_DEBUG << vtype; | |
| if (vtype == SerializeToString(Serialize::string_type)) { | |
| std::string r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::int64_t_type)) { | |
| int64_t r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::uint64_t_type)) { | |
| uint64_t r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::double_type)) { | |
| if (j["val"].is_null()) { | |
| return {0.0}; | |
| } | |
| double r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::int32_t_type)) { | |
| int32_t r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::uint32_t_type)) { | |
| uint32_t r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::int16_t_type)) { | |
| int16_t r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::uint16_t_type)) { | |
| uint16_t r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::uint8_t_type)) { | |
| uint8_t r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::bool_type)) { | |
| bool r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::size_t_type)) { | |
| size_t r = j["val"]; | |
| return {r}; | |
| } | |
| if (vtype == SerializeToString(Serialize::iter_type)) { | |
| nlohmann::json::reference ref = j["val"]; | |
| std::string iter_type = j["iterType"]; | |
| DbusVariantType r = DeserializeIter(ref, iter_type); | |
| return r; | |
| } | |
| if (vtype == SerializeToString(Serialize::tup_type)) { | |
| nlohmann::json::reference ref = j["val"]; | |
| std::string iter_type = j["iterType"]; | |
| DbusVariantType r = DeserializeTup(ref, iter_type); | |
| return r; | |
| } | |
| BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: unknown Type: " << vtype; | |
| return {}; | |
| } catch (...) { | |
| BMCWEB_LOG_STATEFUL_DEBUG << "deserialize: catch "; | |
| return {}; | |
| } | |
| } | |
| using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>; | |
| using DBusInteracesMap = std::vector<std::pair<std::string, DBusPropertiesMap>>; | |
| using ManagedObjectType = | |
| std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>; | |
| nlohmann::json SerializePropMap(DBusPropertiesMap& in) { | |
| nlohmann::json j; | |
| j["type"] = "PropMap"; | |
| nlohmann::json arr = nlohmann::json::array(); | |
| for (DBusPropertiesMap::iterator itor = in.begin(); itor != in.end(); | |
| itor++) { | |
| nlohmann::json tmp; | |
| tmp["string"] = itor->first; | |
| DbusVariantType var = itor->second; | |
| tmp["val"] = Serialize(var); | |
| arr.push_back(tmp); | |
| } | |
| j["val"] = arr; | |
| return j; | |
| } | |
| DBusPropertiesMap DeserializePropMap(nlohmann::json::reference j) { | |
| BMCWEB_LOG_STATEFUL_DEBUG << "deserialize propMap" << j.dump(); | |
| DBusPropertiesMap ret; | |
| nlohmann::json::reference val = j["val"]; | |
| for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | |
| nlohmann::json::reference innerval = (*itor)["val"]; | |
| DbusVariantType tmp_variant = Deserialize(innerval); | |
| std::pair<std::string, DbusVariantType> tmp = {(*itor)["string"], | |
| tmp_variant}; | |
| ret.push_back(tmp); | |
| } | |
| return ret; | |
| } | |
| nlohmann::json SerializeInterfaceMap(DBusInteracesMap& in) { | |
| nlohmann::json j; | |
| j["type"] = "interaceMap"; | |
| nlohmann::json arr = nlohmann::json::array(); | |
| for (DBusInteracesMap::iterator itor = in.begin(); itor != in.end(); itor++) { | |
| nlohmann::json tmp; | |
| tmp["string"] = itor->first; | |
| tmp["val"] = SerializePropMap(itor->second); | |
| arr.push_back(tmp); | |
| } | |
| j["val"] = arr; | |
| return j; | |
| } | |
| DBusInteracesMap DeserializeInterfaceMap(nlohmann::json::reference& j) { | |
| DBusInteracesMap ret; | |
| nlohmann::json::reference val = j["val"]; | |
| for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | |
| nlohmann::json::reference innerval = (*itor)["val"]; | |
| std::pair<std::string, DBusPropertiesMap> tmp = { | |
| (*itor)["string"], DeserializePropMap(innerval)}; | |
| ret.push_back(tmp); | |
| } | |
| return ret; | |
| } | |
| nlohmann::json SerializeObject(ManagedObjectType& in) { | |
| nlohmann::json j; | |
| j["type"] = "object"; | |
| nlohmann::json arr = nlohmann::json::array(); | |
| for (ManagedObjectType::iterator itor = in.begin(); itor != in.end(); | |
| itor++) { | |
| nlohmann::json tmp; | |
| tmp["string"] = itor->first; | |
| tmp["val"] = SerializeInterfaceMap(itor->second); | |
| arr.push_back(tmp); | |
| } | |
| j["val"] = arr; | |
| return j; | |
| } | |
| ManagedObjectType DeserializeObject(nlohmann::json::reference j) { | |
| ManagedObjectType ret; | |
| nlohmann::json::reference val = j["val"]; | |
| for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | |
| nlohmann::json::reference innerval = (*itor)["val"]; | |
| std::pair<std::string, DBusInteracesMap> tmp = { | |
| (*itor)["string"], DeserializeInterfaceMap(innerval)}; | |
| ret.push_back(tmp); | |
| } | |
| return ret; | |
| } | |
| nlohmann::json SerializeMapperServiceMap( | |
| const dbus::utility::MapperServiceMap& in) { | |
| nlohmann::json j; | |
| j["type"] = "mapperServiceMap"; | |
| nlohmann::json arr = nlohmann::json::array(); | |
| for (MapperServiceMap::const_iterator itor = in.begin(); itor != in.end(); | |
| itor++) { | |
| nlohmann::json elem; | |
| elem["string"] = itor->first; | |
| nlohmann::json inner_arr = nlohmann::json::array(); | |
| for (std::vector<std::string>::const_iterator inner_itor = | |
| itor->second.begin(); | |
| inner_itor != itor->second.end(); inner_itor++) { | |
| nlohmann::json inner_elem; | |
| inner_elem["type"] = "string"; | |
| inner_elem["val"] = *inner_itor; | |
| inner_arr.push_back(inner_elem); | |
| } | |
| elem["val"] = inner_arr; | |
| arr.push_back(elem); | |
| } | |
| j["val"] = arr; | |
| return j; | |
| } | |
| MapperServiceMap DeserializeMapperServiceMap(nlohmann::json::reference j) { | |
| MapperServiceMap ret; | |
| nlohmann::json::reference val = j["val"]; | |
| for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | |
| std::vector<std::string> inner_tmp = {}; | |
| for (nlohmann::json::iterator inner_itor = (*itor)["val"].begin(); | |
| inner_itor != (*itor)["val"].end(); inner_itor++) { | |
| inner_tmp.push_back((*inner_itor)["val"]); | |
| } | |
| const std::pair<std::string, std::vector<std::string>> tmp = { | |
| (*itor)["string"], inner_tmp}; | |
| ret.push_back(tmp); | |
| } | |
| return ret; | |
| } | |
| nlohmann::json SerializeSubtree(dbus::utility::MapperGetSubTreeResponse& in) { | |
| nlohmann::json j; | |
| j["type"] = "subTreeResponse"; | |
| nlohmann::json arr = nlohmann::json::array(); | |
| for (MapperGetSubTreeResponse::iterator itor = in.begin(); itor != in.end(); | |
| itor++) { | |
| nlohmann::json tmp; | |
| tmp["string"] = itor->first; | |
| tmp["val"] = SerializeMapperServiceMap(itor->second); | |
| arr.push_back(tmp); | |
| } | |
| j["val"] = arr; | |
| return j; | |
| } | |
| MapperGetSubTreeResponse DeserializeSubtree(nlohmann::json::reference j) { | |
| MapperGetSubTreeResponse ret; | |
| nlohmann::json::reference val = j["val"]; | |
| for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | |
| nlohmann::json::reference innerval = (*itor)["val"]; | |
| std::pair<std::string, MapperServiceMap> tmp = { | |
| (*itor)["string"], DeserializeMapperServiceMap(innerval)}; | |
| ret.push_back(tmp); | |
| } | |
| return ret; | |
| } | |
| nlohmann::json SerializeSubtreePaths(MapperGetSubTreePathsResponse& in) { | |
| nlohmann::json j; | |
| j["type"] = "subTreePathsResponse"; | |
| nlohmann::json arr = nlohmann::json::array(); | |
| for (MapperGetSubTreePathsResponse::iterator itor = in.begin(); | |
| itor != in.end(); itor++) { | |
| arr.push_back(*itor); | |
| } | |
| j["val"] = arr; | |
| return j; | |
| } | |
| MapperGetSubTreePathsResponse DeserializeSubtreePaths( | |
| nlohmann::json::reference j) { | |
| MapperGetSubTreePathsResponse ret; | |
| nlohmann::json::reference val = j["val"]; | |
| for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | |
| ret.push_back(*itor); | |
| } | |
| return ret; | |
| } | |
| // MapperObject is equivalent to MapperServiceMap | |
| nlohmann::json SerializeMapperObject(MapperGetObject& in) { | |
| return SerializeMapperServiceMap(in); | |
| } | |
| MapperGetObject DeserializeMapperObject(nlohmann::json::reference j) { | |
| return DeserializeMapperServiceMap(j); | |
| } | |
| nlohmann::json SerializeSystemdUnitStruct(SystemdUnitStruct& in) { | |
| nlohmann::json j; | |
| j["type"] = "systemdUnitStruct"; | |
| nlohmann::json::reference val = j["val"]; | |
| // Serialize all parts of the systemd unit struct a(ssssssouso) | |
| val["name"] = std::get<0>(in); | |
| val["description"] = std::get<1>(in); | |
| val["load_state"] = std::get<2>(in); | |
| val["active_state"] = std::get<3>(in); | |
| val["substate"] = std::get<4>(in); | |
| val["followed_unit"] = std::get<5>(in); | |
| val["unit_path"] = std::get<6>(in).str; | |
| val["job_id"] = std::get<7>(in); | |
| val["job_type"] = std::get<8>(in); | |
| val["job_path"] = std::get<9>(in).str; | |
| return j; | |
| } | |
| nlohmann::json SerializeSystemdListUnits(SystemdListUnits& in) { | |
| nlohmann::json j; | |
| j["type"] = "systemdListUnits"; | |
| nlohmann::json arr = nlohmann::json::array(); | |
| for (SystemdListUnits::iterator itor = in.begin(); itor != in.end(); itor++) { | |
| arr.push_back(SerializeSystemdUnitStruct(*itor)); | |
| } | |
| j["val"] = arr; | |
| return j; | |
| } | |
| SystemdUnitStruct DeserializeSystemdUnitStruct(nlohmann::json::reference j) { | |
| SystemdUnitStruct ret; | |
| nlohmann::json::reference val = j["val"]; | |
| return std::make_tuple( | |
| val["name"], val["description"], val["load_state"], val["active_state"], | |
| val["substate"], val["followed_unit"], | |
| sdbusplus::message::object_path(val["unit_path"]), val["job_id"], | |
| val["job_type"], sdbusplus::message::object_path(val["job_path"])); | |
| } | |
| SystemdListUnits DeserializeSystemdListUnits(nlohmann::json::reference j) { | |
| SystemdListUnits ret; | |
| nlohmann::json::reference val = j["val"]; | |
| for (nlohmann::json::iterator itor = val.begin(); itor != val.end(); itor++) { | |
| ret.push_back(DeserializeSystemdUnitStruct(*itor)); | |
| } | |
| return ret; | |
| } | |
| std::optional<std::string> ReadBinaryFileToString( | |
| const std::filesystem::path& file) { | |
| std::ifstream f(file, std::ios_base::in | std::ios::binary); | |
| if (!f.is_open()) { | |
| BMCWEB_LOG_STATEFUL_DEBUG << "unable to open file " << file; | |
| return std::nullopt; | |
| } | |
| std::string content{std::istreambuf_iterator<char>(f), | |
| std::istreambuf_iterator<char>()}; | |
| if (!f) { | |
| BMCWEB_LOG_STATEFUL_DEBUG << "unable to read file " << file | |
| << strerror(errno); | |
| return std::nullopt; | |
| } | |
| f.close(); | |
| if (!f) { | |
| BMCWEB_LOG_STATEFUL_DEBUG << "unable to close file " << file | |
| << strerror(errno); | |
| return std::nullopt; | |
| } | |
| return content; | |
| } | |
| } // namespace serialize |