1 #pragma once 2 3 #include <boost/container/flat_map.hpp> 4 5 #include <string> 6 #include <vector> 7 8 namespace redfish 9 { 10 namespace collection_util 11 { 12 13 /** 14 * @brief Populate the collection "Members" from a GetSubTree search of 15 * inventory 16 * 17 * @param[i,o] aResp Async response object 18 * @param[i] collectionPath Redfish collection path which is used for the 19 * Members Redfish Path 20 * @param[i] interfaces List of interfaces to constrain the GetSubTree search 21 * 22 * @return void 23 */ 24 inline void getCollectionMembers(std::shared_ptr<AsyncResp> aResp, 25 const std::string& collectionPath, 26 const std::vector<const char*>& interfaces) 27 { 28 BMCWEB_LOG_DEBUG << "Get collection members for: " << collectionPath; 29 crow::connections::systemBus->async_method_call( 30 [collectionPath, aResp{std::move(aResp)}]( 31 const boost::system::error_code ec, 32 const boost::container::flat_map< 33 std::string, boost::container::flat_map< 34 std::string, std::vector<std::string>>>& 35 subtree) { 36 if (ec) 37 { 38 BMCWEB_LOG_DEBUG << "DBUS response error"; 39 messages::internalError(aResp->res); 40 return; 41 } 42 nlohmann::json& members = aResp->res.jsonValue["Members"]; 43 members = nlohmann::json::array(); 44 45 for (const auto& object : subtree) 46 { 47 auto iter = object.first.rfind('/'); 48 if ((iter != std::string::npos) && (iter < object.first.size())) 49 { 50 members.push_back( 51 {{"@odata.id", collectionPath + "/" + 52 object.first.substr(iter + 1)}}); 53 } 54 } 55 aResp->res.jsonValue["Members@odata.count"] = members.size(); 56 }, 57 "xyz.openbmc_project.ObjectMapper", 58 "/xyz/openbmc_project/object_mapper", 59 "xyz.openbmc_project.ObjectMapper", "GetSubTree", 60 "/xyz/openbmc_project/inventory", 0, interfaces); 61 } 62 63 } // namespace collection_util 64 } // namespace redfish 65