1 #pragma once 2 3 #include <human_sort.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<bmcweb::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 == boost::system::errc::io_error) 37 { 38 aResp->res.jsonValue["Members"] = nlohmann::json::array(); 39 aResp->res.jsonValue["Members@odata.count"] = 0; 40 return; 41 } 42 43 if (ec) 44 { 45 BMCWEB_LOG_DEBUG << "DBUS response error " << ec.value(); 46 messages::internalError(aResp->res); 47 return; 48 } 49 50 std::vector<std::string> pathNames; 51 for (const auto& object : objects) 52 { 53 sdbusplus::message::object_path path(object); 54 std::string leaf = path.filename(); 55 if (leaf.empty()) 56 { 57 continue; 58 } 59 pathNames.push_back(leaf); 60 } 61 std::sort(pathNames.begin(), pathNames.end(), 62 AlphanumLess<std::string>()); 63 64 nlohmann::json& members = aResp->res.jsonValue["Members"]; 65 members = nlohmann::json::array(); 66 for (const std::string& leaf : pathNames) 67 { 68 std::string newPath = collectionPath; 69 newPath += '/'; 70 newPath += leaf; 71 members.push_back({{"@odata.id", std::move(newPath)}}); 72 } 73 aResp->res.jsonValue["Members@odata.count"] = members.size(); 74 }, 75 "xyz.openbmc_project.ObjectMapper", 76 "/xyz/openbmc_project/object_mapper", 77 "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", subtree, 0, 78 interfaces); 79 } 80 81 } // namespace collection_util 82 } // namespace redfish 83