188d7cf8dSAdriana Kobylak #pragma once
288d7cf8dSAdriana Kobylak 
388d7cf8dSAdriana Kobylak #include "xyz/openbmc_project/Logging/Entry/server.hpp"
436db46c2SDeepak Kodihalli #include "xyz/openbmc_project/Object/Delete/server.hpp"
5375ac9b9SMatt Spinler #include "xyz/openbmc_project/Software/Version/server.hpp"
6f18bf836SPatrick Venture 
7f18bf836SPatrick Venture #include <sdbusplus/bus.hpp>
8f18bf836SPatrick Venture #include <sdbusplus/server/object.hpp>
9eb5d3f2fSAdriana Kobylak #include <sdeventplus/event.hpp>
10eb5d3f2fSAdriana Kobylak #include <sdeventplus/source/event.hpp>
1127d82814SJohn Wang #include <xyz/openbmc_project/Association/Definitions/server.hpp>
121ff95efeSAdriana Kobylak #include <xyz/openbmc_project/Common/FilePath/server.hpp>
1388d7cf8dSAdriana Kobylak 
1488d7cf8dSAdriana Kobylak namespace phosphor
1588d7cf8dSAdriana Kobylak {
1688d7cf8dSAdriana Kobylak namespace logging
1788d7cf8dSAdriana Kobylak {
1888d7cf8dSAdriana Kobylak 
1945e83521SPatrick Williams using EntryIfaces = sdbusplus::server::object_t<
20*6ddbf69eSWilly Tu     sdbusplus::server::xyz::openbmc_project::logging::Entry,
21*6ddbf69eSWilly Tu     sdbusplus::server::xyz::openbmc_project::object::Delete,
22*6ddbf69eSWilly Tu     sdbusplus::server::xyz::openbmc_project::association::Definitions,
23*6ddbf69eSWilly Tu     sdbusplus::server::xyz::openbmc_project::software::Version,
24*6ddbf69eSWilly Tu     sdbusplus::server::xyz::openbmc_project::common::FilePath>;
2588d7cf8dSAdriana Kobylak 
2635b46379SDeepak Kodihalli using AssociationList =
2735b46379SDeepak Kodihalli     std::vector<std::tuple<std::string, std::string, std::string>>;
2835b46379SDeepak Kodihalli 
2905aae8bcSNagaraju Goruganti namespace internal
3005aae8bcSNagaraju Goruganti {
318110ca6dSDeepak Kodihalli class Manager;
3205aae8bcSNagaraju Goruganti }
338110ca6dSDeepak Kodihalli 
3488d7cf8dSAdriana Kobylak /** @class Entry
3588d7cf8dSAdriana Kobylak  *  @brief OpenBMC logging entry implementation.
3688d7cf8dSAdriana Kobylak  *  @details A concrete implementation for the
37b388da65SDeepak Kodihalli  *  xyz.openbmc_project.Logging.Entry and
3827d82814SJohn Wang  *  xyz.openbmc_project.Associations.Definitions DBus APIs.
3988d7cf8dSAdriana Kobylak  */
40b388da65SDeepak Kodihalli class Entry : public EntryIfaces
4188d7cf8dSAdriana Kobylak {
4288d7cf8dSAdriana Kobylak   public:
4388d7cf8dSAdriana Kobylak     Entry() = delete;
4488d7cf8dSAdriana Kobylak     Entry(const Entry&) = delete;
4588d7cf8dSAdriana Kobylak     Entry& operator=(const Entry&) = delete;
4688d7cf8dSAdriana Kobylak     Entry(Entry&&) = delete;
4788d7cf8dSAdriana Kobylak     Entry& operator=(Entry&&) = delete;
4888d7cf8dSAdriana Kobylak     virtual ~Entry() = default;
4988d7cf8dSAdriana Kobylak 
50df995fafSAdriana Kobylak     /** @brief Constructor to put object onto bus at a dbus path.
514ea7f312SAdriana Kobylak      *         Defer signal registration (pass true for deferSignal to the
524ea7f312SAdriana Kobylak      *         base class) until after the properties are set.
53df995fafSAdriana Kobylak      *  @param[in] bus - Bus to attach to.
54fb978da4SMatt Spinler      *  @param[in] objectPath - Path to attach at.
55c5f0bbd9SAdriana Kobylak      *  @param[in] idErr - The error entry id.
56c5f0bbd9SAdriana Kobylak      *  @param[in] timestampErr - The commit timestamp.
57c5f0bbd9SAdriana Kobylak      *  @param[in] severityErr - The severity of the error.
58c5f0bbd9SAdriana Kobylak      *  @param[in] msgErr - The message of the error.
59c5f0bbd9SAdriana Kobylak      *  @param[in] additionalDataErr - The error metadata.
60375ac9b9SMatt Spinler      *  @param[in] objects - The list of associations.
61375ac9b9SMatt Spinler      *  @param[in] fwVersion - The BMC code version.
62fb978da4SMatt Spinler      *  @param[in] filePath - Serialization path
638110ca6dSDeepak Kodihalli      *  @param[in] parent - The error's parent.
6488d7cf8dSAdriana Kobylak      */
Entry(sdbusplus::bus_t & bus,const std::string & objectPath,uint32_t idErr,uint64_t timestampErr,Level severityErr,std::string && msgErr,std::vector<std::string> && additionalDataErr,AssociationList && objects,const std::string & fwVersion,const std::string & filePath,internal::Manager & parent)6545e83521SPatrick Williams     Entry(sdbusplus::bus_t& bus, const std::string& objectPath, uint32_t idErr,
6645e83521SPatrick Williams           uint64_t timestampErr, Level severityErr, std::string&& msgErr,
6745e83521SPatrick Williams           std::vector<std::string>&& additionalDataErr,
68f18bf836SPatrick Venture           AssociationList&& objects, const std::string& fwVersion,
69fb978da4SMatt Spinler           const std::string& filePath, internal::Manager& parent) :
706ef6b25eSPatrick Williams         EntryIfaces(bus, objectPath.c_str(), EntryIfaces::action::defer_emit),
718110ca6dSDeepak Kodihalli         parent(parent)
724ea7f312SAdriana Kobylak     {
73ef952af2SMatt Spinler         id(idErr, true);
74ef952af2SMatt Spinler         severity(severityErr, true);
75ef952af2SMatt Spinler         timestamp(timestampErr, true);
76ef952af2SMatt Spinler         updateTimestamp(timestampErr, true);
77ef952af2SMatt Spinler         message(std::move(msgErr), true);
78ef952af2SMatt Spinler         additionalData(std::move(additionalDataErr), true);
79ef952af2SMatt Spinler         associations(std::move(objects), true);
8016aed11dSDeepak Kodihalli         // Store a copy of associations in case we need to recreate
8116aed11dSDeepak Kodihalli         assocs = associations();
82*6ddbf69eSWilly Tu         sdbusplus::server::xyz::openbmc_project::logging::Entry::resolved(false,
83ef952af2SMatt Spinler                                                                           true);
844ea7f312SAdriana Kobylak 
85ef952af2SMatt Spinler         version(fwVersion, true);
86ef952af2SMatt Spinler         purpose(VersionPurpose::BMC, true);
87fb978da4SMatt Spinler         path(filePath, true);
88375ac9b9SMatt Spinler 
894ea7f312SAdriana Kobylak         // Emit deferred signal.
904ea7f312SAdriana Kobylak         this->emit_object_added();
914ea7f312SAdriana Kobylak     };
924ea7f312SAdriana Kobylak 
9372654f10SDeepak Kodihalli     /** @brief Constructor that puts an "empty" error object on the bus,
9472654f10SDeepak Kodihalli      *         with only the id property populated. Rest of the properties
9572654f10SDeepak Kodihalli      *         to be set by the caller. Caller should emit the added signal.
9672654f10SDeepak Kodihalli      *  @param[in] bus - Bus to attach to.
9772654f10SDeepak Kodihalli      *  @param[in] path - Path to attach at.
9872654f10SDeepak Kodihalli      *  @param[in] id - The error entry id.
9972654f10SDeepak Kodihalli      *  @param[in] parent - The error's parent.
10072654f10SDeepak Kodihalli      */
Entry(sdbusplus::bus_t & bus,const std::string & path,uint32_t entryId,internal::Manager & parent)10145e83521SPatrick Williams     Entry(sdbusplus::bus_t& bus, const std::string& path, uint32_t entryId,
10205aae8bcSNagaraju Goruganti           internal::Manager& parent) :
1036ef6b25eSPatrick Williams         EntryIfaces(bus, path.c_str(), EntryIfaces::action::defer_emit),
10472654f10SDeepak Kodihalli         parent(parent)
10572654f10SDeepak Kodihalli     {
106ef952af2SMatt Spinler         id(entryId, true);
10772654f10SDeepak Kodihalli     };
10872654f10SDeepak Kodihalli 
10990abed66SDeepak Kodihalli     /** @brief Set resolution status of the error.
11090abed66SDeepak Kodihalli      *  @param[in] value - boolean indicating resolution
11190abed66SDeepak Kodihalli      *  status (true = resolved)
11290abed66SDeepak Kodihalli      *  @returns value of 'Resolved' property
11390abed66SDeepak Kodihalli      */
1149743189cSDeepak Kodihalli     bool resolved(bool value) override;
11590abed66SDeepak Kodihalli 
116*6ddbf69eSWilly Tu     using sdbusplus::server::xyz::openbmc_project::logging::Entry::resolved;
11790abed66SDeepak Kodihalli 
118d354a398SVijay Lobo     /** @brief Update eventId string of the error.
119d354a398SVijay Lobo      *  @param[in] value - The eventID
120d354a398SVijay Lobo      *  @returns New property value
121d354a398SVijay Lobo      */
122d354a398SVijay Lobo     std::string eventId(std::string value) override;
123d354a398SVijay Lobo 
124*6ddbf69eSWilly Tu     using sdbusplus::server::xyz::openbmc_project::logging::Entry::eventId;
125d354a398SVijay Lobo 
126593a4c66SVijay Lobo     /** @brief Update resolution string of the error.
127593a4c66SVijay Lobo      *  @param[in] value - The resolution
128593a4c66SVijay Lobo      *  @returns New property value
129593a4c66SVijay Lobo      */
130593a4c66SVijay Lobo     std::string resolution(std::string value) override;
131593a4c66SVijay Lobo 
132*6ddbf69eSWilly Tu     using sdbusplus::server::xyz::openbmc_project::logging::Entry::resolution;
133593a4c66SVijay Lobo 
13436db46c2SDeepak Kodihalli     /** @brief Delete this d-bus object.
13536db46c2SDeepak Kodihalli      */
13636db46c2SDeepak Kodihalli     void delete_() override;
13736db46c2SDeepak Kodihalli 
138f8a5a797SNagaraju Goruganti     /** @brief Severity level to check in cap.
139f8a5a797SNagaraju Goruganti      *  @details Errors with severity lesser than this will be
140f8a5a797SNagaraju Goruganti      *           considered as low priority and maximum ERROR_INFO_CAP
141f8a5a797SNagaraju Goruganti      *           number errors of this category will be captured.
142f8a5a797SNagaraju Goruganti      */
143f8a5a797SNagaraju Goruganti     static constexpr auto sevLowerLimit = Entry::Level::Informational;
144f8a5a797SNagaraju Goruganti 
145eb5d3f2fSAdriana Kobylak     /**
146eb5d3f2fSAdriana Kobylak      * @brief Returns the file descriptor to the Entry file.
147eb5d3f2fSAdriana Kobylak      * @return unix_fd - File descriptor to the Entry file.
148eb5d3f2fSAdriana Kobylak      */
149eb5d3f2fSAdriana Kobylak     sdbusplus::message::unix_fd getEntry() override;
150eb5d3f2fSAdriana Kobylak 
15116aed11dSDeepak Kodihalli   private:
15216aed11dSDeepak Kodihalli     /** @brief This entry's associations */
15316aed11dSDeepak Kodihalli     AssociationList assocs = {};
1548110ca6dSDeepak Kodihalli 
1558110ca6dSDeepak Kodihalli     /** @brief This entry's parent */
15605aae8bcSNagaraju Goruganti     internal::Manager& parent;
157eb5d3f2fSAdriana Kobylak 
158eb5d3f2fSAdriana Kobylak     /**
159eb5d3f2fSAdriana Kobylak      * @brief The event source for closing the Entry file descriptor after it
160eb5d3f2fSAdriana Kobylak      *        has been returned from the getEntry D-Bus method.
161eb5d3f2fSAdriana Kobylak      */
162eb5d3f2fSAdriana Kobylak     std::unique_ptr<sdeventplus::source::Defer> fdCloseEventSource;
163eb5d3f2fSAdriana Kobylak 
164eb5d3f2fSAdriana Kobylak     /**
165eb5d3f2fSAdriana Kobylak      * @brief Closes the file descriptor passed in.
166eb5d3f2fSAdriana Kobylak      * @details This is called from the event loop to close FDs returned from
167eb5d3f2fSAdriana Kobylak      * getEntry().
168eb5d3f2fSAdriana Kobylak      * @param[in] fd - The file descriptor to close
169eb5d3f2fSAdriana Kobylak      * @param[in] source - The event source object used
170eb5d3f2fSAdriana Kobylak      */
171eb5d3f2fSAdriana Kobylak     void closeFD(int fd, sdeventplus::source::EventBase& source);
17288d7cf8dSAdriana Kobylak };
17388d7cf8dSAdriana Kobylak 
17488d7cf8dSAdriana Kobylak } // namespace logging
17588d7cf8dSAdriana Kobylak } // namespace phosphor
176