11334b7b3SPatrick Williams #include "config.h"
2212f53e8SRatan Gupta 
3212f53e8SRatan Gupta #include "snmp_serialize.hpp"
41334b7b3SPatrick Williams 
5212f53e8SRatan Gupta #include "snmp_client.hpp"
61334b7b3SPatrick Williams 
71334b7b3SPatrick Williams #include <cereal/archives/binary.hpp>
81334b7b3SPatrick Williams #include <cereal/types/string.hpp>
91334b7b3SPatrick Williams #include <cereal/types/vector.hpp>
10*4caedfbbSGeorge Liu #include <phosphor-logging/lg2.hpp>
111334b7b3SPatrick Williams 
121334b7b3SPatrick Williams #include <fstream>
13212f53e8SRatan Gupta 
14212f53e8SRatan Gupta // Register class version
15212f53e8SRatan Gupta // From cereal documentation;
16212f53e8SRatan Gupta // "This macro should be placed at global scope"
17212f53e8SRatan Gupta CEREAL_CLASS_VERSION(phosphor::network::snmp::Client, CLASS_VERSION);
18212f53e8SRatan Gupta 
19212f53e8SRatan Gupta namespace phosphor
20212f53e8SRatan Gupta {
21212f53e8SRatan Gupta namespace network
22212f53e8SRatan Gupta {
23212f53e8SRatan Gupta namespace snmp
24212f53e8SRatan Gupta {
25212f53e8SRatan Gupta 
26212f53e8SRatan Gupta /** @brief Function required by Cereal to perform serialization.
27212f53e8SRatan Gupta  *  @tparam Archive - Cereal archive type (binary in our case).
28212f53e8SRatan Gupta  *  @param[in] archive - reference to Cereal archive.
29212f53e8SRatan Gupta  *  @param[in] manager - const reference to snmp manager info.
30212f53e8SRatan Gupta  *  @param[in] version - Class version that enables handling
31212f53e8SRatan Gupta  *                       a serialized data across code levels
32212f53e8SRatan Gupta  */
33212f53e8SRatan Gupta template <class Archive>
save(Archive & archive,const Client & manager,const std::uint32_t)3434d129a9SRatan Gupta void save(Archive& archive, const Client& manager,
3534d129a9SRatan Gupta           const std::uint32_t /*version*/)
36212f53e8SRatan Gupta {
37212f53e8SRatan Gupta     archive(manager.address(), manager.port());
38212f53e8SRatan Gupta }
39212f53e8SRatan Gupta 
40212f53e8SRatan Gupta /** @brief Function required by Cereal to perform deserialization.
41212f53e8SRatan Gupta  *  @tparam Archive - Cereal archive type (binary in our case).
42212f53e8SRatan Gupta  *  @param[in] archive - reference to Cereal archive.
43212f53e8SRatan Gupta  *  @param[in] manager - reference to snmp manager info.
44212f53e8SRatan Gupta  *  @param[in] version - Class version that enables handling
45212f53e8SRatan Gupta  *                       a serialized data across code levels
46212f53e8SRatan Gupta  */
47212f53e8SRatan Gupta template <class Archive>
load(Archive & archive,Client & manager,const std::uint32_t)4834d129a9SRatan Gupta void load(Archive& archive, Client& manager, const std::uint32_t /*version*/)
49212f53e8SRatan Gupta {
50212f53e8SRatan Gupta     std::string ipaddress{};
51212f53e8SRatan Gupta     uint16_t port{};
52212f53e8SRatan Gupta 
53212f53e8SRatan Gupta     archive(ipaddress, port);
54212f53e8SRatan Gupta 
55212f53e8SRatan Gupta     manager.address(ipaddress);
56212f53e8SRatan Gupta     manager.port(port);
57212f53e8SRatan Gupta }
58212f53e8SRatan Gupta 
serialize(Id id,const Client & manager,const fs::path & dir)59a7ff3850SRatan Gupta fs::path serialize(Id id, const Client& manager, const fs::path& dir)
60212f53e8SRatan Gupta {
61212f53e8SRatan Gupta     fs::path fileName = dir;
62212f53e8SRatan Gupta     fs::create_directories(dir);
63a7ff3850SRatan Gupta     fileName /= std::to_string(id);
64212f53e8SRatan Gupta 
65212f53e8SRatan Gupta     std::ofstream os(fileName.string(), std::ios::binary);
66212f53e8SRatan Gupta     cereal::BinaryOutputArchive oarchive(os);
67212f53e8SRatan Gupta     oarchive(manager);
68212f53e8SRatan Gupta     return fileName;
69212f53e8SRatan Gupta }
70212f53e8SRatan Gupta 
deserialize(const fs::path & path,Client & manager)71212f53e8SRatan Gupta bool deserialize(const fs::path& path, Client& manager)
72212f53e8SRatan Gupta {
73212f53e8SRatan Gupta     try
74212f53e8SRatan Gupta     {
75212f53e8SRatan Gupta         if (fs::exists(path))
76212f53e8SRatan Gupta         {
77212f53e8SRatan Gupta             std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
78212f53e8SRatan Gupta             cereal::BinaryInputArchive iarchive(is);
79212f53e8SRatan Gupta             iarchive(manager);
80212f53e8SRatan Gupta             return true;
81212f53e8SRatan Gupta         }
82212f53e8SRatan Gupta         return false;
83212f53e8SRatan Gupta     }
84c3600d86SPatrick Williams     catch (const cereal::Exception& e)
85212f53e8SRatan Gupta     {
86*4caedfbbSGeorge Liu         lg2::error("Deserialization failed: {ERROR}", "ERROR", e);
87212f53e8SRatan Gupta         std::error_code ec;
88212f53e8SRatan Gupta         fs::remove(path, ec);
89212f53e8SRatan Gupta         return false;
90212f53e8SRatan Gupta     }
91212f53e8SRatan Gupta     catch (const fs::filesystem_error& e)
92212f53e8SRatan Gupta     {
93212f53e8SRatan Gupta         return false;
94212f53e8SRatan Gupta     }
95212f53e8SRatan Gupta }
96212f53e8SRatan Gupta 
97212f53e8SRatan Gupta } // namespace snmp
98212f53e8SRatan Gupta } // namespace network
99212f53e8SRatan Gupta } // namespace phosphor
100