#pragma once #include "config.h" #include #include #include #include namespace phosphor { namespace inventory { namespace manager { namespace fs = std::experimental::filesystem; struct SerialOps { /** @brief Serialize inventory item path * Serializing only path for an empty interface to be consistent * interfaces. * @param[in] path - DBus object path * @param[in] iface - Inventory interface name */ static void serialize(const std::string& path, const std::string& iface) { fs::path p(PIM_PERSIST_PATH); p /= path; fs::create_directories(p); p /= iface; std::ofstream os(p, std::ios::binary); } /** @brief Serialize inventory item * * @param[in] path - DBus object path * @param[in] iface - Inventory interface name * @param[in] object - Object to be serialized */ template static void serialize(const std::string& path, const std::string& iface, const T& object) { fs::path p(PIM_PERSIST_PATH); p /= path; fs::create_directories(p); p /= iface; std::ofstream os(p, std::ios::binary); cereal::JSONOutputArchive oarchive(os); oarchive(object); } static void deserialize(const std::string&, const std::string&) { // This is intentionally a noop. } /** @brief Deserialize inventory item * * @param[in] path - DBus object path * @param[in] iface - Inventory interface name * @param[in] object - Object to be serialized */ template static void deserialize(const std::string& path, const std::string& iface, T& object) { fs::path p(PIM_PERSIST_PATH); p /= path; p /= iface; try { if (fs::exists(p)) { std::ifstream is(p, std::ios::in | std::ios::binary); cereal::JSONInputArchive iarchive(is); iarchive(object); } } catch (cereal::Exception& e) { phosphor::logging::log(e.what()); fs::remove(p); } } }; } // namespace manager } // namespace inventory } // namespace phosphor