blob: 16b79d5c9a75447736be7b0c9a2283e5757de0b5 [file] [log] [blame]
/*
// Copyright (c) 2020 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
*/
#pragma once
#include "config.h"
#include <sdbusplus/asio/object_server.hpp>
#include <sdbusplus/server.hpp>
#include <xyz/openbmc_project/BIOSConfig/Manager/server.hpp>
#include <filesystem>
#include <string>
namespace bios_config
{
static constexpr auto service = "xyz.openbmc_project.BIOSConfigManager";
static constexpr auto objectPath = "/xyz/openbmc_project/bios_config/manager";
constexpr auto biosPersistFile = "biosData";
using Base = sdbusplus::xyz::openbmc_project::BIOSConfig::server::Manager;
namespace fs = std::filesystem;
/** @class Manager
*
* @brief Implements the BIOS Manager
*/
class Manager : public Base
{
public:
using BaseTable = std::map<
std::string,
std::tuple<AttributeType, bool, std::string, std::string, std::string,
std::variant<int64_t, std::string>,
std::variant<int64_t, std::string>,
std::vector<std::tuple<
BoundType, std::variant<int64_t, std::string>>>>>;
using ResetFlag = std::map<std::string, ResetFlag>;
using PendingAttributes =
std::map<std::string,
std::tuple<AttributeType, std::variant<int64_t, std::string>>>;
using PendingAttribute =
std::tuple<AttributeType, std::variant<int64_t, std::string>>;
using AttributeName = std::string;
using AttributeValue = std::variant<int64_t, std::string>;
using CurrentValue = std::variant<int64_t, std::string>;
using PendingValue = std::variant<int64_t, std::string>;
using AttributeDetails =
std::tuple<AttributeType, CurrentValue, PendingValue>;
Manager() = delete;
~Manager() = default;
Manager(const Manager&) = delete;
Manager& operator=(const Manager&) = delete;
Manager(Manager&&) = delete;
Manager& operator=(Manager&&) = delete;
/** @brief Constructs Manager object.
*
* @param[in] objectServer - object server
* @param[in] systemBus - bus connection
*/
Manager(sdbusplus::asio::object_server& objectServer,
std::shared_ptr<sdbusplus::asio::connection>& systemBus);
/** @brief Set the BIOS attribute with a new value, the new value is added
* to the PendingAttribute.
*
* @param[in] attribute - attribute name
* @param[in] value - new value for the attribute
*
* @return On error, throw exception
*/
void setAttribute(AttributeName attribute, AttributeValue value) override;
/** @brief Get the details of the BIOS attribute
*
* @param[in] attribute - attribute name
*
* @return On success, return the attribute details: attribute type,
* current value, pending value. On error, throw exception
*/
AttributeDetails getAttribute(AttributeName attribute) override;
/** @brief Set the BaseBIOSTable property and clears the PendingAttributes
* property
*
* @param[in] value - new BaseBIOSTable
*
* @return The new BaseBIOSTable that is applied.
*/
BaseTable baseBIOSTable(BaseTable value) override;
ResetFlag resetBIOSSettings(ResetFlag value);
/** @brief Set the PendingAttributes property, additionally checks if the
* attributes are in the BaseBIOSTable, whether the attributes are
* read only and validate the attribute value based on the
* attribute type. PendingAttributes is cleared if value is empty.
*
* @param[in] value - new PendingAttributes to append to the
* PendingAttributes property
*
* @return On success, return the new PendingAttributes property that is
* set.Throw exception if the validation fails.
*/
PendingAttributes pendingAttributes(PendingAttributes value) override;
private:
/** @enum Index into the fields in the BaseBIOSTable
*/
enum class Index : uint8_t
{
attributeType = 0,
readOnly,
displayName,
description,
menuPath,
currentValue,
defaultValue,
options,
};
sdbusplus::asio::object_server& objServer;
std::shared_ptr<sdbusplus::asio::connection>& systemBus;
std::filesystem::path biosFile;
};
} // namespace bios_config