xref: /openbmc/phosphor-inventory-manager/serialize.hpp (revision e6b21c74581c30ea635aabbbc08d0a56f8e27063)
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