blob: 19f24cbd208e006d51e6fc626e65f6cb28b386a3 [file]
#pragma once
#include "MctpEndpoint.hpp"
#include "MctpUtil.hpp"
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/bus/match.hpp>
#include <sdbusplus/message.hpp>
/**
* @brief An implementation of MctpDevice in terms of D-Bus interfaces exposed
* by @c mctpreactor.
*
* The construction or destruction of an MctpReactorDevice is not required to be
* correlated with signals from @c mctpreactor. For instance, EntityManager may
* expose the existence of an MCTP-capable device through its usual
* configuration mechanisms.
*/
class MctpReactorDevice :
public MctpDevice,
public std::enable_shared_from_this<MctpReactorDevice>
{
public:
MctpReactorDevice() = delete;
MctpReactorDevice(
const std::shared_ptr<sdbusplus::asio::connection>& connection,
const std::string& deviceObjectPath, std::optional<int> busNumber,
std::optional<int> address);
MctpReactorDevice(
const std::shared_ptr<sdbusplus::asio::connection>& connection,
const std::string& deviceObjectPath,
const std::vector<BusInfo>& busInfo, std::optional<int> busNumber,
std::optional<int> address);
MctpReactorDevice(const MctpDevice& other) = delete;
MctpReactorDevice(MctpDevice&& other) = delete;
~MctpReactorDevice() override;
void setup(std::function<void(const std::error_code& ec,
const std::shared_ptr<MctpEndpoint>& ep)>&&
action) override;
void remove() override;
std::string describe() const override;
private:
static void onEndpointInterfacesRemoved(
const std::weak_ptr<MctpReactorDevice>& weak,
const std::string& endpointObjectPath, sdbusplus::message_t& msg);
void finaliseEndpoint(
const std::string& endpointObjectPath,
std::function<void(const std::error_code& ec,
const std::shared_ptr<MctpEndpoint>& ep)>&& action);
void endpointRemoved();
std::shared_ptr<sdbusplus::asio::connection> connection;
const std::string deviceObjectPath;
std::string resolvedEndpointPath;
const std::string prettyObjectName; // Suffix of deviceObjectPath.
const bool isI2cAccessible;
const int i2cBusNumber; // Invalid if isI2cAccessible is false.
const int i2cAddress; // Invalid if isI2cAccessible is false.
std::shared_ptr<MctpdEndpoint> endpoint;
std::unique_ptr<sdbusplus::bus::match_t> removeMatch;
std::vector<BusInfo> targetBusInfo;
std::optional<MctpCallbackToken> callbackToken;
std::function<void(const std::error_code&,
const std::shared_ptr<MctpEndpoint>&)>
savedAction;
};