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