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 GetSubTreePaths 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 * @param[in] subtree D-Bus base path to constrain search to. 22 * 23 * @return void 24 */ 25 inline void 26 getCollectionMembers(std::shared_ptr<AsyncResp> aResp, 27 const std::string& collectionPath, 28 const std::vector<const char*>& interfaces, 29 const char* subtree = "/xyz/openbmc_project/inventory") 30 { 31 BMCWEB_LOG_DEBUG << "Get collection members for: " << collectionPath; 32 crow::connections::systemBus->async_method_call( 33 [collectionPath, 34 aResp{std::move(aResp)}](const boost::system::error_code ec, 35 const std::vector<std::string>& objects) { 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 : objects) 46 { 47 auto pos = object.rfind('/'); 48 if ((pos != std::string::npos) && (pos < (object.size() - 1))) 49 { 50 members.push_back( 51 {{"@odata.id", 52 collectionPath + "/" + object.substr(pos + 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", "GetSubTreePaths", subtree, 0, 60 interfaces); 61 } 62 63 } // namespace collection_util 64 } // namespace redfish 65