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