1 #include "report_manager.hpp" 2 3 #include <sdbusplus/exception.hpp> 4 5 #include <system_error> 6 7 ReportManager::ReportManager( 8 std::unique_ptr<interfaces::ReportFactory> reportFactoryIn, 9 const std::shared_ptr<sdbusplus::asio::object_server>& objServerIn) : 10 reportFactory(std::move(reportFactoryIn)), 11 objServer(objServerIn) 12 { 13 reports.reserve(maxReports); 14 15 reportManagerIface = objServer->add_unique_interface( 16 reportManagerPath, reportManagerIfaceName, [this](auto& dbusIface) { 17 dbusIface.register_property_r( 18 "MaxReports", uint32_t{}, sdbusplus::vtable::property_::const_, 19 [](const auto&) { return maxReports; }); 20 dbusIface.register_property_r( 21 "MinInterval", uint64_t{}, sdbusplus::vtable::property_::const_, 22 [](const auto&) -> uint64_t { return minInterval.count(); }); 23 24 dbusIface.register_method( 25 "AddReport", [this](const std::string& reportName, 26 const std::string& reportingType, 27 const bool emitsReadingsUpdate, 28 const bool logToMetricReportsCollection, 29 const uint64_t interval, 30 const ReadingParameters& metricParams) { 31 if (reports.size() >= maxReports) 32 { 33 throw sdbusplus::exception::SdBusError( 34 static_cast<int>(std::errc::too_many_files_open), 35 "Reached maximal report count"); 36 } 37 38 for (const auto& report : reports) 39 { 40 if (report->getName() == reportName) 41 { 42 throw sdbusplus::exception::SdBusError( 43 static_cast<int>(std::errc::file_exists), 44 "Duplicate report"); 45 } 46 } 47 48 std::chrono::milliseconds reportInterval{interval}; 49 if (reportInterval < minInterval) 50 { 51 throw sdbusplus::exception::SdBusError( 52 static_cast<int>(std::errc::invalid_argument), 53 "Invalid interval"); 54 } 55 56 reports.emplace_back(reportFactory->make( 57 reportName, reportingType, emitsReadingsUpdate, 58 logToMetricReportsCollection, std::move(reportInterval), 59 metricParams, *this)); 60 return reports.back()->getPath(); 61 }); 62 }); 63 } 64 65 void ReportManager::removeReport(const interfaces::Report* report) 66 { 67 reports.erase( 68 std::remove_if(reports.begin(), reports.end(), 69 [report](const auto& x) { return report == x.get(); }), 70 reports.end()); 71 } 72