16620e98dSDeepak Kodihalli #pragma once 26620e98dSDeepak Kodihalli 3a680d1efSPatrick Venture #include "config.h" 4a680d1efSPatrick Venture 56620e98dSDeepak Kodihalli #include <cereal/archives/json.hpp> 6*e6b21c74SKun Yi #include <filesystem> 76620e98dSDeepak Kodihalli #include <fstream> 886ad3c67SJayanth Othayoth #include <phosphor-logging/log.hpp> 986ad3c67SJayanth Othayoth 107dfd08f8SBrad Bishop namespace phosphor 117dfd08f8SBrad Bishop { 127dfd08f8SBrad Bishop namespace inventory 137dfd08f8SBrad Bishop { 147dfd08f8SBrad Bishop namespace manager 156620e98dSDeepak Kodihalli { 166620e98dSDeepak Kodihalli 17*e6b21c74SKun Yi namespace fs = std::filesystem; 186620e98dSDeepak Kodihalli 197dfd08f8SBrad Bishop struct SerialOps 207dfd08f8SBrad Bishop { 217dfd08f8SBrad Bishop /** @brief Serialize inventory item path 227dfd08f8SBrad Bishop * Serializing only path for an empty interface to be consistent 237dfd08f8SBrad Bishop * interfaces. 247dfd08f8SBrad Bishop * @param[in] path - DBus object path 257dfd08f8SBrad Bishop * @param[in] iface - Inventory interface name 267dfd08f8SBrad Bishop */ 277dfd08f8SBrad Bishop static void serialize(const std::string& path, const std::string& iface) 287dfd08f8SBrad Bishop { 297dfd08f8SBrad Bishop fs::path p(PIM_PERSIST_PATH); 307dfd08f8SBrad Bishop p /= path; 317dfd08f8SBrad Bishop fs::create_directories(p); 327dfd08f8SBrad Bishop p /= iface; 337dfd08f8SBrad Bishop std::ofstream os(p, std::ios::binary); 347dfd08f8SBrad Bishop } 356620e98dSDeepak Kodihalli 366620e98dSDeepak Kodihalli /** @brief Serialize inventory item 376620e98dSDeepak Kodihalli * 386620e98dSDeepak Kodihalli * @param[in] path - DBus object path 396620e98dSDeepak Kodihalli * @param[in] iface - Inventory interface name 406620e98dSDeepak Kodihalli * @param[in] object - Object to be serialized 416620e98dSDeepak Kodihalli */ 426620e98dSDeepak Kodihalli template <typename T> 437dfd08f8SBrad Bishop static void serialize(const std::string& path, const std::string& iface, 447dfd08f8SBrad Bishop const T& object) 456620e98dSDeepak Kodihalli { 466620e98dSDeepak Kodihalli fs::path p(PIM_PERSIST_PATH); 476620e98dSDeepak Kodihalli p /= path; 486620e98dSDeepak Kodihalli fs::create_directories(p); 496620e98dSDeepak Kodihalli p /= iface; 506620e98dSDeepak Kodihalli std::ofstream os(p, std::ios::binary); 516620e98dSDeepak Kodihalli cereal::JSONOutputArchive oarchive(os); 526620e98dSDeepak Kodihalli oarchive(object); 536620e98dSDeepak Kodihalli } 546620e98dSDeepak Kodihalli 557dfd08f8SBrad Bishop static void deserialize(const std::string&, const std::string&) 56fa23d704SMarri Devender Rao { 577dfd08f8SBrad Bishop // This is intentionally a noop. 58fa23d704SMarri Devender Rao } 59fa23d704SMarri Devender Rao 60b28990f3SDeepak Kodihalli /** @brief Deserialize inventory item 61b28990f3SDeepak Kodihalli * 62b28990f3SDeepak Kodihalli * @param[in] path - DBus object path 63b28990f3SDeepak Kodihalli * @param[in] iface - Inventory interface name 64b28990f3SDeepak Kodihalli * @param[in] object - Object to be serialized 65b28990f3SDeepak Kodihalli */ 66b28990f3SDeepak Kodihalli template <typename T> 677dfd08f8SBrad Bishop static void deserialize(const std::string& path, const std::string& iface, 687dfd08f8SBrad Bishop T& object) 69b28990f3SDeepak Kodihalli { 70b28990f3SDeepak Kodihalli fs::path p(PIM_PERSIST_PATH); 71b28990f3SDeepak Kodihalli p /= path; 72b28990f3SDeepak Kodihalli p /= iface; 7386ad3c67SJayanth Othayoth try 7486ad3c67SJayanth Othayoth { 75b28990f3SDeepak Kodihalli if (fs::exists(p)) 76b28990f3SDeepak Kodihalli { 77b28990f3SDeepak Kodihalli std::ifstream is(p, std::ios::in | std::ios::binary); 78b28990f3SDeepak Kodihalli cereal::JSONInputArchive iarchive(is); 79b28990f3SDeepak Kodihalli iarchive(object); 80b28990f3SDeepak Kodihalli } 81b28990f3SDeepak Kodihalli } 8286ad3c67SJayanth Othayoth catch (cereal::Exception& e) 8386ad3c67SJayanth Othayoth { 847dfd08f8SBrad Bishop phosphor::logging::log<phosphor::logging::level::ERR>(e.what()); 8586ad3c67SJayanth Othayoth fs::remove(p); 8686ad3c67SJayanth Othayoth } 8786ad3c67SJayanth Othayoth } 887dfd08f8SBrad Bishop }; 897dfd08f8SBrad Bishop } // namespace manager 907dfd08f8SBrad Bishop } // namespace inventory 917dfd08f8SBrad Bishop } // namespace phosphor 92