blob: ef7b1b4bc19c91ac2e6c09d5874faf39741ba1de [file] [log] [blame]
#include "manager_serialize.hpp"
#include <cereal/archives/binary.hpp>
#include <cereal/cereal.hpp>
#include <cereal/types/map.hpp>
#include <cereal/types/string.hpp>
#include <cereal/types/tuple.hpp>
#include <cereal/types/variant.hpp>
#include <cereal/types/vector.hpp>
#include <phosphor-logging/log.hpp>
#include <fstream>
namespace bios_config
{
using namespace phosphor::logging;
/** @brief Function required by Cereal to perform serialization.
*
* @tparam Archive - Cereal archive type (binary in this case).
* @param[in] archive - reference to cereal archive.
* @param[in] entry- const reference to bios manager object
* @param[in] version - Class version that enables handling a serialized data
* across code levels
*/
template <class Archive>
void save(Archive& archive, const Manager& entry,
const std::uint32_t /*version*/)
{
archive(entry.sdbusplus::xyz::openbmc_project::BIOSConfig::server::Manager::
baseBIOSTable(),
entry.sdbusplus::xyz::openbmc_project::BIOSConfig::server::Manager::
pendingAttributes());
}
/** @brief Function required by Cereal to perform deserialization.
*
* @tparam Archive - Cereal archive type (binary in our case).
* @param[in] archive - reference to cereal archive.
* @param[out] entry - reference to bios manager object
* @param[in] version - Class version that enables handling a serialized data
* across code levels
*/
template <class Archive>
void load(Archive& archive, Manager& entry, const std::uint32_t /*version*/)
{
Manager::BaseTable baseTable;
Manager::PendingAttributes pendingAttrs;
archive(baseTable, pendingAttrs);
entry.sdbusplus::xyz::openbmc_project::BIOSConfig::server::Manager::
baseBIOSTable(baseTable, true);
entry.sdbusplus::xyz::openbmc_project::BIOSConfig::server::Manager::
pendingAttributes(pendingAttrs, true);
}
void serialize(const Manager& obj, const fs::path& path)
{
std::ofstream os(path.c_str(), std::ios::out | std::ios::binary);
cereal::BinaryOutputArchive oarchive(os);
oarchive(obj);
}
bool deserialize(const fs::path& path, Manager& entry)
{
try
{
if (fs::exists(path))
{
std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
cereal::BinaryInputArchive iarchive(is);
iarchive(entry);
return true;
}
return false;
}
catch (cereal::Exception& e)
{
log<level::ERR>(e.what());
fs::remove(path);
return false;
}
catch (const std::length_error& e)
{
log<level::ERR>(e.what());
fs::remove(path);
return false;
}
}
} // namespace bios_config