#pragma once #include "config.h" #include #include #include #include #include namespace phosphor::software::updater { class ItemUpdater; } namespace phosphor::software::update { using UpdateIntf = sdbusplus::server::object_t< sdbusplus::xyz::openbmc_project::Software::server::Update>; using ItemUpdaterIntf = phosphor::software::updater::ItemUpdater; using ApplyTimeIntf = sdbusplus::common::xyz::openbmc_project::software::ApplyTime; /** @class Manager * @brief Processes the image file from update D-Bus interface. * @details The update manager class handles software updates and manages * software info through version and activation objects. */ class Manager : public UpdateIntf { public: /** @brief Constructs Manager Class * * @param[in] bus - The Dbus bus object */ explicit Manager(sdbusplus::async::context& ctx, const std::string& path, ItemUpdaterIntf& itemUpdater) : UpdateIntf(ctx.get_bus(), path.c_str(), UpdateIntf::action::defer_emit), ctx(ctx), itemUpdater(itemUpdater) { emit_object_added(); } private: /** @brief Implementation for StartUpdate * Start a firware update to be performed asynchronously. */ sdbusplus::message::object_path startUpdate( sdbusplus::message::unix_fd image, ApplyTimeIntf::RequestedApplyTimes applyTime) override; /* @brief Process the image supplied via image fd */ auto processImage(sdbusplus::message::unix_fd image, ApplyTimeIntf::RequestedApplyTimes applyTime, std::string id, std::string objPath) -> sdbusplus::async::task<>; /* @brief The handler for the image processing failure */ void processImageFailed(sdbusplus::message::unix_fd image, std::string& id); /** @brief The random generator for the software id */ std::mt19937 randomGen{static_cast( std::chrono::system_clock::now().time_since_epoch().count())}; /** @brief D-Bus context */ sdbusplus::async::context& ctx; /** @brief item_updater reference */ ItemUpdaterIntf& itemUpdater; /** @brief State whether update is in progress */ bool updateInProgress = false; }; } // namespace phosphor::software::update