1 #include "config.h" 2 3 #include "serialize.hpp" 4 5 #include <cereal/archives/json.hpp> 6 #include <cereal/types/set.hpp> 7 #include <cereal/types/string.hpp> 8 #include <phosphor-logging/lg2.hpp> 9 10 #include <filesystem> 11 #include <fstream> 12 13 // Register class version with Cereal 14 CEREAL_CLASS_VERSION(phosphor::led::Serialize, CLASS_VERSION) 15 16 namespace phosphor 17 { 18 namespace led 19 { 20 21 namespace fs = std::filesystem; 22 23 bool Serialize::getGroupSavedState(const std::string& objPath) const 24 { 25 return savedGroups.contains(objPath); 26 } 27 28 void Serialize::storeGroups(const std::string& group, bool asserted) 29 { 30 // If the name of asserted group does not exist in the archive and the 31 // Asserted property is true, it is inserted into archive. 32 // If the name of asserted group exist in the archive and the Asserted 33 // property is false, entry is removed from the archive. 34 auto iter = savedGroups.find(group); 35 if (iter != savedGroups.end() && !asserted) 36 { 37 savedGroups.erase(iter); 38 } 39 40 if (iter == savedGroups.end() && asserted) 41 { 42 savedGroups.emplace(group); 43 } 44 45 auto dir = path.parent_path(); 46 if (!fs::exists(dir)) 47 { 48 fs::create_directories(dir); 49 } 50 51 std::ofstream os(path.c_str(), std::ios::binary); 52 cereal::JSONOutputArchive oarchive(os); 53 oarchive(savedGroups); 54 } 55 56 void Serialize::restoreGroups() 57 { 58 if (!fs::exists(path)) 59 { 60 lg2::info("File does not exist, FILE_PATH = {PATH}", "PATH", path); 61 return; 62 } 63 64 try 65 { 66 std::ifstream is(path.c_str(), std::ios::in | std::ios::binary); 67 cereal::JSONInputArchive iarchive(is); 68 iarchive(savedGroups); 69 } 70 catch (const cereal::Exception& e) 71 { 72 lg2::error("Failed to restore groups, ERROR = {ERROR}", "ERROR", e); 73 fs::remove(path); 74 } 75 } 76 77 } // namespace led 78 } // namespace phosphor 79