xref: /openbmc/phosphor-bmc-code-mgmt/common/include/software_manager.hpp (revision e2cd67597447c000aa55bc454395bd81faf3e118)
1cc372355SAlexander Hansen #pragma once
2cc372355SAlexander Hansen 
3cc372355SAlexander Hansen #include "device.hpp"
4cec14752SAlexander Hansen #include "sdbusplus/async/match.hpp"
5cc372355SAlexander Hansen 
6cc372355SAlexander Hansen #include <boost/asio/steady_timer.hpp>
7cc372355SAlexander Hansen #include <phosphor-logging/lg2.hpp>
8cc372355SAlexander Hansen #include <sdbusplus/asio/connection.hpp>
9cc372355SAlexander Hansen #include <sdbusplus/asio/object_server.hpp>
10cc372355SAlexander Hansen #include <sdbusplus/async/context.hpp>
11cc372355SAlexander Hansen #include <sdbusplus/timer.hpp>
12cc372355SAlexander Hansen 
13cc372355SAlexander Hansen #include <string>
14cc372355SAlexander Hansen 
15cc372355SAlexander Hansen using namespace phosphor::software::config;
16cc372355SAlexander Hansen using namespace phosphor::software::device;
17cc372355SAlexander Hansen 
18cc372355SAlexander Hansen namespace phosphor::software::manager
19cc372355SAlexander Hansen {
20cc372355SAlexander Hansen 
21cc372355SAlexander Hansen // This is the base class for the code updater
22cc372355SAlexander Hansen // Every code updater can inherit from this
23cc372355SAlexander Hansen class SoftwareManager
24cc372355SAlexander Hansen {
25cc372355SAlexander Hansen   public:
26cc372355SAlexander Hansen     SoftwareManager(sdbusplus::async::context& ctx,
27cc372355SAlexander Hansen                     const std::string& serviceNameSuffix);
28cc372355SAlexander Hansen 
29cc372355SAlexander Hansen     // Fetches initial configuration from dbus and initializes devices.
30cc372355SAlexander Hansen     // This should be called once by a code updater at startup.
31cc372355SAlexander Hansen     // @param configurationInterfaces    the dbus interfaces from which to fetch
32cc372355SAlexander Hansen     // configuration
33cc372355SAlexander Hansen     sdbusplus::async::task<> initDevices(
34cc372355SAlexander Hansen         const std::vector<std::string>& configurationInterfaces);
35cc372355SAlexander Hansen 
36cc372355SAlexander Hansen     // Map of EM config object path to device.
37cc372355SAlexander Hansen     std::map<sdbusplus::message::object_path, std::unique_ptr<Device>> devices;
38cc372355SAlexander Hansen 
39cc372355SAlexander Hansen   protected:
40cc372355SAlexander Hansen     // This function receives a dbus name and object path for a single device,
41cc372355SAlexander Hansen     // which was configured.
42cc372355SAlexander Hansen     // The component code updater overrides this function and may create a
43cc372355SAlexander Hansen     // device instance internally, or reject the configuration as invalid.
44cc372355SAlexander Hansen     // @param service       The dbus name where our configuration is
45cc372355SAlexander Hansen     // @param config        The common configuration properties which are shared
46cc372355SAlexander Hansen     // by all devices.
47cc372355SAlexander Hansen     //                      Also includes the object path to fetch other
48cc372355SAlexander Hansen     //                      configuration properties.
49cc372355SAlexander Hansen     // @returns true        if the configuration was accepted
50cc372355SAlexander Hansen     virtual sdbusplus::async::task<bool> initDevice(const std::string& service,
51cc372355SAlexander Hansen                                                     const std::string& path,
52cc372355SAlexander Hansen                                                     SoftwareConfig& config) = 0;
53cc372355SAlexander Hansen 
54*e2cd6759SAlexander Hansen     std::string getBusName();
55*e2cd6759SAlexander Hansen 
56cc372355SAlexander Hansen     sdbusplus::async::context& ctx;
57cc372355SAlexander Hansen 
58cc372355SAlexander Hansen   private:
5990174799SAlexander Hansen     sdbusplus::async::task<void> handleInterfaceAdded(
6090174799SAlexander Hansen         const std::string& service, const std::string& path,
6190174799SAlexander Hansen         const std::string& interface);
6290174799SAlexander Hansen 
63cec14752SAlexander Hansen     sdbusplus::async::task<void> handleInterfaceRemoved(
64cec14752SAlexander Hansen         const sdbusplus::message::object_path& path);
65cec14752SAlexander Hansen 
66cec14752SAlexander Hansen     sdbusplus::async::task<void> interfaceAddedMatch(
67cec14752SAlexander Hansen         std::vector<std::string> interfaces);
68cec14752SAlexander Hansen     sdbusplus::async::task<void> interfaceRemovedMatch(
69cec14752SAlexander Hansen         std::vector<std::string> interfaces);
70cec14752SAlexander Hansen 
71cec14752SAlexander Hansen     // DBus matches for interfaces added and interfaces removed
72cec14752SAlexander Hansen     sdbusplus::async::match configIntfAddedMatch;
73cec14752SAlexander Hansen     sdbusplus::async::match configIntfRemovedMatch;
74cec14752SAlexander Hansen 
75*e2cd6759SAlexander Hansen     // the dbus name
76*e2cd6759SAlexander Hansen     const std::string serviceName;
77cc372355SAlexander Hansen 
78cc372355SAlexander Hansen     sdbusplus::server::manager_t manager;
79cc372355SAlexander Hansen 
80cc372355SAlexander Hansen     friend Software;
81cc372355SAlexander Hansen     friend Device;
82cc372355SAlexander Hansen };
83cc372355SAlexander Hansen 
84cc372355SAlexander Hansen }; // namespace phosphor::software::manager
85