#pragma once #include namespace redfish { namespace chassis_utils { /** * @brief Retrieves valid chassis path * @param asyncResp Pointer to object holding response data * @param callback Callback for next step to get valid chassis path */ template void getValidChassisPath(const std::shared_ptr& asyncResp, const std::string& chassisId, Callback&& callback) { BMCWEB_LOG_DEBUG << "checkChassisId enter"; const std::array interfaces = { "xyz.openbmc_project.Inventory.Item.Board", "xyz.openbmc_project.Inventory.Item.Chassis"}; auto respHandler = [callback{std::forward(callback)}, asyncResp, chassisId](const boost::system::error_code ec, const dbus::utility::MapperGetSubTreePathsResponse& chassisPaths) mutable { BMCWEB_LOG_DEBUG << "getValidChassisPath respHandler enter"; if (ec) { BMCWEB_LOG_ERROR << "getValidChassisPath respHandler DBUS error: " << ec; messages::internalError(asyncResp->res); return; } std::optional chassisPath; std::string chassisName; for (const std::string& chassis : chassisPaths) { sdbusplus::message::object_path path(chassis); chassisName = path.filename(); if (chassisName.empty()) { BMCWEB_LOG_ERROR << "Failed to find '/' in " << chassis; continue; } if (chassisName == chassisId) { chassisPath = chassis; break; } } callback(chassisPath); }; // Get the Chassis Collection crow::connections::systemBus->async_method_call( respHandler, "xyz.openbmc_project.ObjectMapper", "/xyz/openbmc_project/object_mapper", "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", "/xyz/openbmc_project/inventory", 0, interfaces); BMCWEB_LOG_DEBUG << "checkChassisId exit"; } } // namespace chassis_utils } // namespace redfish