1073a6530SGeorge Liu #pragma once
2073a6530SGeorge Liu 
35107c45fSGeorge Liu #include "utils.hpp"
45107c45fSGeorge Liu 
5073a6530SGeorge Liu #include <phosphor-logging/lg2.hpp>
65107c45fSGeorge Liu #include <sdeventplus/event.hpp>
7073a6530SGeorge Liu 
8073a6530SGeorge Liu #include <filesystem>
9073a6530SGeorge Liu 
10073a6530SGeorge Liu namespace phosphor
11073a6530SGeorge Liu {
12073a6530SGeorge Liu namespace usb
13073a6530SGeorge Liu {
14073a6530SGeorge Liu namespace fs = std::filesystem;
155107c45fSGeorge Liu namespace MatchRules = sdbusplus::bus::match::rules;
16073a6530SGeorge Liu 
17073a6530SGeorge Liu class USBManager
18073a6530SGeorge Liu {
19073a6530SGeorge Liu   public:
20073a6530SGeorge Liu     ~USBManager() = default;
21073a6530SGeorge Liu     USBManager() = delete;
22073a6530SGeorge Liu     USBManager(const USBManager&) = delete;
23073a6530SGeorge Liu     USBManager(USBManager&&) = default;
24073a6530SGeorge Liu     USBManager& operator=(const USBManager&) = delete;
25073a6530SGeorge Liu     USBManager& operator=(USBManager&&) = default;
26073a6530SGeorge Liu 
275107c45fSGeorge Liu     explicit USBManager(sdbusplus::bus::bus& bus, sdeventplus::Event& event,
28*6d775e64SGeorge Liu                         const fs::path& devPath, const fs::path& usbPath) :
295107c45fSGeorge Liu         bus(bus),
30*6d775e64SGeorge Liu         event(event), devicePath(devPath), usbPath(usbPath),
31*6d775e64SGeorge Liu         isUSBCodeUpdate(false),
325107c45fSGeorge Liu         fwUpdateMatcher(bus,
335107c45fSGeorge Liu                         MatchRules::interfacesAdded() +
345107c45fSGeorge Liu                             MatchRules::path("/xyz/openbmc_project/software"),
355107c45fSGeorge Liu                         std::bind(std::mem_fn(&USBManager::updateActivation),
365107c45fSGeorge Liu                                   this, std::placeholders::_1))
375107c45fSGeorge Liu     {
385107c45fSGeorge Liu         if (!run())
395107c45fSGeorge Liu         {
405107c45fSGeorge Liu             lg2::error("Failed to FW Update via USB, usbPath:{USBPATH}",
415107c45fSGeorge Liu                        "USBPATH", usbPath);
425107c45fSGeorge Liu             event.exit(0);
435107c45fSGeorge Liu         }
445107c45fSGeorge Liu 
455107c45fSGeorge Liu         isUSBCodeUpdate = true;
465107c45fSGeorge Liu     }
47073a6530SGeorge Liu 
48073a6530SGeorge Liu     /** @brief Find the first file with a .tar extension according to the USB
49073a6530SGeorge Liu      *         file path.
50073a6530SGeorge Liu      *
51073a6530SGeorge Liu      *  @return Success or Fail
52073a6530SGeorge Liu      */
53073a6530SGeorge Liu     bool run();
54073a6530SGeorge Liu 
555107c45fSGeorge Liu     /** @brief Creates an Activation D-Bus object.
565107c45fSGeorge Liu      *
575107c45fSGeorge Liu      * @param[in]  msg   - Data associated with subscribed signal
585107c45fSGeorge Liu      */
595107c45fSGeorge Liu     void updateActivation(sdbusplus::message::message& msg);
605107c45fSGeorge Liu 
615107c45fSGeorge Liu     /** @brief Set Apply Time to OnReset.
625107c45fSGeorge Liu      *
635107c45fSGeorge Liu      */
645107c45fSGeorge Liu     void setApplyTime();
655107c45fSGeorge Liu 
665107c45fSGeorge Liu     /** @brief Method to set the RequestedActivation D-Bus property.
675107c45fSGeorge Liu      *
685107c45fSGeorge Liu      *  @param[in] path  - Update the object path of the firmware
695107c45fSGeorge Liu      */
705107c45fSGeorge Liu     void setRequestedActivation(const std::string& path);
715107c45fSGeorge Liu 
72073a6530SGeorge Liu   private:
735107c45fSGeorge Liu     /** @brief Persistent sdbusplus DBus bus connection. */
745107c45fSGeorge Liu     sdbusplus::bus::bus& bus;
755107c45fSGeorge Liu 
765107c45fSGeorge Liu     /** sd event handler. */
775107c45fSGeorge Liu     sdeventplus::Event& event;
785107c45fSGeorge Liu 
79*6d775e64SGeorge Liu     /** The USB device path. */
80*6d775e64SGeorge Liu     const fs::path& devicePath;
81*6d775e64SGeorge Liu 
82*6d775e64SGeorge Liu     /** The USB mount path. */
83073a6530SGeorge Liu     const fs::path& usbPath;
845107c45fSGeorge Liu 
855107c45fSGeorge Liu     /** Indicates whether USB codeupdate is going on. */
865107c45fSGeorge Liu     bool isUSBCodeUpdate;
875107c45fSGeorge Liu 
885107c45fSGeorge Liu     /** sdbusplus signal match for new image. */
895107c45fSGeorge Liu     sdbusplus::bus::match_t fwUpdateMatcher;
90073a6530SGeorge Liu };
91073a6530SGeorge Liu 
92073a6530SGeorge Liu } // namespace usb
93073a6530SGeorge Liu } // namespace phosphor
94