xref: /openbmc/phosphor-led-manager/manager/serialize.cpp (revision 349d22e358945cce4d6b1d6df808a00bc06e378c)
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