1953315d2SPatrick Williams #include "config.h"
2953315d2SPatrick Williams
3953315d2SPatrick Williams #include "serialize.hpp"
4953315d2SPatrick Williams
5953315d2SPatrick Williams #include <cereal/archives/json.hpp>
6953315d2SPatrick Williams #include <cereal/types/set.hpp>
7953315d2SPatrick Williams #include <cereal/types/string.hpp>
8953315d2SPatrick Williams #include <phosphor-logging/lg2.hpp>
9953315d2SPatrick Williams
10953315d2SPatrick Williams #include <filesystem>
11953315d2SPatrick Williams #include <fstream>
12953315d2SPatrick Williams
13953315d2SPatrick Williams // Register class version with Cereal
14953315d2SPatrick Williams CEREAL_CLASS_VERSION(phosphor::led::Serialize, CLASS_VERSION)
15953315d2SPatrick Williams
16953315d2SPatrick Williams namespace phosphor
17953315d2SPatrick Williams {
18953315d2SPatrick Williams namespace led
19953315d2SPatrick Williams {
20953315d2SPatrick Williams
21953315d2SPatrick Williams namespace fs = std::filesystem;
22953315d2SPatrick Williams
getGroupSavedState(const std::string & objPath) const23953315d2SPatrick Williams bool Serialize::getGroupSavedState(const std::string& objPath) const
24953315d2SPatrick Williams {
25953315d2SPatrick Williams return savedGroups.contains(objPath);
26953315d2SPatrick Williams }
27953315d2SPatrick Williams
storeGroups(const std::string & group,bool asserted)28953315d2SPatrick Williams void Serialize::storeGroups(const std::string& group, bool asserted)
29953315d2SPatrick Williams {
30953315d2SPatrick Williams // If the name of asserted group does not exist in the archive and the
31953315d2SPatrick Williams // Asserted property is true, it is inserted into archive.
32953315d2SPatrick Williams // If the name of asserted group exist in the archive and the Asserted
33953315d2SPatrick Williams // property is false, entry is removed from the archive.
34953315d2SPatrick Williams auto iter = savedGroups.find(group);
35*349d22e3SGeorge Liu if (iter != savedGroups.end() && !asserted)
36953315d2SPatrick Williams {
37953315d2SPatrick Williams savedGroups.erase(iter);
38953315d2SPatrick Williams }
39953315d2SPatrick Williams
40953315d2SPatrick Williams if (iter == savedGroups.end() && asserted)
41953315d2SPatrick Williams {
42953315d2SPatrick Williams savedGroups.emplace(group);
43953315d2SPatrick Williams }
44953315d2SPatrick Williams
45953315d2SPatrick Williams auto dir = path.parent_path();
46953315d2SPatrick Williams if (!fs::exists(dir))
47953315d2SPatrick Williams {
48953315d2SPatrick Williams fs::create_directories(dir);
49953315d2SPatrick Williams }
50953315d2SPatrick Williams
51953315d2SPatrick Williams std::ofstream os(path.c_str(), std::ios::binary);
52953315d2SPatrick Williams cereal::JSONOutputArchive oarchive(os);
53953315d2SPatrick Williams oarchive(savedGroups);
54953315d2SPatrick Williams }
55953315d2SPatrick Williams
restoreGroups()56953315d2SPatrick Williams void Serialize::restoreGroups()
57953315d2SPatrick Williams {
58953315d2SPatrick Williams if (!fs::exists(path))
59953315d2SPatrick Williams {
60953315d2SPatrick Williams lg2::info("File does not exist, FILE_PATH = {PATH}", "PATH", path);
61953315d2SPatrick Williams return;
62953315d2SPatrick Williams }
63953315d2SPatrick Williams
64953315d2SPatrick Williams try
65953315d2SPatrick Williams {
66953315d2SPatrick Williams std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
67953315d2SPatrick Williams cereal::JSONInputArchive iarchive(is);
68953315d2SPatrick Williams iarchive(savedGroups);
69953315d2SPatrick Williams }
70953315d2SPatrick Williams catch (const cereal::Exception& e)
71953315d2SPatrick Williams {
72953315d2SPatrick Williams lg2::error("Failed to restore groups, ERROR = {ERROR}", "ERROR", e);
73953315d2SPatrick Williams fs::remove(path);
74953315d2SPatrick Williams }
75953315d2SPatrick Williams }
76953315d2SPatrick Williams
77953315d2SPatrick Williams } // namespace led
78953315d2SPatrick Williams } // namespace phosphor
79