16620e98dSDeepak Kodihalli #pragma once 26620e98dSDeepak Kodihalli 36620e98dSDeepak Kodihalli #include <cereal/archives/json.hpp> 46620e98dSDeepak Kodihalli #include <experimental/filesystem> 56620e98dSDeepak Kodihalli #include <fstream> 66620e98dSDeepak Kodihalli #include "config.h" 76620e98dSDeepak Kodihalli 886ad3c67SJayanth Othayoth #include <phosphor-logging/log.hpp> 986ad3c67SJayanth Othayoth 106620e98dSDeepak Kodihalli namespace cereal 116620e98dSDeepak Kodihalli { 126620e98dSDeepak Kodihalli 136620e98dSDeepak Kodihalli namespace fs = std::experimental::filesystem; 146620e98dSDeepak Kodihalli 156620e98dSDeepak Kodihalli using Path = std::string; 166620e98dSDeepak Kodihalli using Interface = std::string; 1786ad3c67SJayanth Othayoth using namespace phosphor::logging; 186620e98dSDeepak Kodihalli 196620e98dSDeepak Kodihalli /** @brief Serialize inventory item 206620e98dSDeepak Kodihalli * 216620e98dSDeepak Kodihalli * @param[in] path - DBus object path 226620e98dSDeepak Kodihalli * @param[in] iface - Inventory interface name 236620e98dSDeepak Kodihalli * @param[in] object - Object to be serialized 246620e98dSDeepak Kodihalli */ 256620e98dSDeepak Kodihalli template <typename T> 266620e98dSDeepak Kodihalli inline void serialize(const Path& path, const Interface& iface, const T& object) 276620e98dSDeepak Kodihalli { 286620e98dSDeepak Kodihalli fs::path p(PIM_PERSIST_PATH); 296620e98dSDeepak Kodihalli p /= path; 306620e98dSDeepak Kodihalli fs::create_directories(p); 316620e98dSDeepak Kodihalli p /= iface; 326620e98dSDeepak Kodihalli std::ofstream os(p, std::ios::binary); 336620e98dSDeepak Kodihalli cereal::JSONOutputArchive oarchive(os); 346620e98dSDeepak Kodihalli oarchive(object); 356620e98dSDeepak Kodihalli } 366620e98dSDeepak Kodihalli 37*fa23d704SMarri Devender Rao /** @brief Serialize inventory item path 38*fa23d704SMarri Devender Rao * Serializing only path for an empty interface to be consistent 39*fa23d704SMarri Devender Rao * interfaces. 40*fa23d704SMarri Devender Rao * @param[in] path - DBus object path 41*fa23d704SMarri Devender Rao * @param[in] iface - Inventory interface name 42*fa23d704SMarri Devender Rao */ 43*fa23d704SMarri Devender Rao inline void serialize(const Path& path, const Interface& iface) 44*fa23d704SMarri Devender Rao { 45*fa23d704SMarri Devender Rao fs::path p(PIM_PERSIST_PATH); 46*fa23d704SMarri Devender Rao p /= path; 47*fa23d704SMarri Devender Rao fs::create_directories(p); 48*fa23d704SMarri Devender Rao p /= iface; 49*fa23d704SMarri Devender Rao std::ofstream os(p, std::ios::binary); 50*fa23d704SMarri Devender Rao } 51*fa23d704SMarri Devender Rao 52b28990f3SDeepak Kodihalli /** @brief Deserialize inventory item 53b28990f3SDeepak Kodihalli * 54b28990f3SDeepak Kodihalli * @param[in] path - DBus object path 55b28990f3SDeepak Kodihalli * @param[in] iface - Inventory interface name 56b28990f3SDeepak Kodihalli * @param[in] object - Object to be serialized 57b28990f3SDeepak Kodihalli */ 58b28990f3SDeepak Kodihalli template <typename T> 59b28990f3SDeepak Kodihalli inline void deserialize( 60b28990f3SDeepak Kodihalli const Path& path, const Interface& iface, T& object) 61b28990f3SDeepak Kodihalli { 62b28990f3SDeepak Kodihalli fs::path p(PIM_PERSIST_PATH); 63b28990f3SDeepak Kodihalli p /= path; 64b28990f3SDeepak Kodihalli p /= iface; 6586ad3c67SJayanth Othayoth try 6686ad3c67SJayanth Othayoth { 67b28990f3SDeepak Kodihalli if (fs::exists(p)) 68b28990f3SDeepak Kodihalli { 69b28990f3SDeepak Kodihalli std::ifstream is(p, std::ios::in | std::ios::binary); 70b28990f3SDeepak Kodihalli cereal::JSONInputArchive iarchive(is); 71b28990f3SDeepak Kodihalli iarchive(object); 72b28990f3SDeepak Kodihalli } 73b28990f3SDeepak Kodihalli } 7486ad3c67SJayanth Othayoth catch(cereal::Exception& e) 7586ad3c67SJayanth Othayoth { 7686ad3c67SJayanth Othayoth log<level::ERR>(e.what()); 7786ad3c67SJayanth Othayoth fs::remove(p); 7886ad3c67SJayanth Othayoth } 7986ad3c67SJayanth Othayoth } 80b28990f3SDeepak Kodihalli 816620e98dSDeepak Kodihalli } // namespace cereal 82