Add the getAssociationEndPoints method

There are currently many files that use the get endpoints methods[1].
Since they are general methods, they are defined in the
dbus_utility.hpp file and will be further refactored in subsequent
patches.

Also, Updated the populateSoftwareInformation method of sw_utils.hpp

[1] https://github.com/openbmc/docs/blob/master/architecture/object-mapper.md#associations
When an object with, for example, an object path of pathA uses
the following values:

["foo", "bar", "pathB"]

The mapper will create 2 new objects:

pathA/foo
pathB/bar

Tested: Built bmcweb successuflly and Validator passes
curl -k -H "X-Auth-Token: $token" -X GET
https://${bmc}/redfish/v1/Managers/bmc
{
  "@odata.id": "/redfish/v1/Managers/bmc",
  "@odata.type": "#Manager.v1_14_0.Manager",
  ...
  "FirmwareVersion": "2.14.0-dev-95-gea3949e76-dirty",
  ...
}

Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: I6567f63ab63709504b46ed49b00055a8ffc34124
diff --git a/include/dbus_utility.hpp b/include/dbus_utility.hpp
index e953a9f..eac3099 100644
--- a/include/dbus_utility.hpp
+++ b/include/dbus_utility.hpp
@@ -18,6 +18,7 @@
 #include "dbus_singleton.hpp"
 
 #include <boost/system/error_code.hpp> // IWYU pragma: keep
+#include <sdbusplus/asio/property.hpp>
 #include <sdbusplus/message/native_types.hpp>
 
 #include <array>
@@ -94,6 +95,7 @@
               std::vector<std::pair<std::string, std::vector<std::string>>>>>;
 
 using MapperGetSubTreePathsResponse = std::vector<std::string>;
+using MapperEndPoints = std::vector<sdbusplus::message::object_path>;
 
 inline void escapePathForDbus(std::string& path)
 {
@@ -193,5 +195,15 @@
         "xyz.openbmc_project.ObjectMapper", "GetObject", path, interfaces);
 }
 
+inline void getAssociationEndPoints(
+    const std::string& path,
+    std::function<void(const boost::system::error_code&,
+                       const MapperEndPoints&)>&& callback)
+{
+    sdbusplus::asio::getProperty<MapperEndPoints>(
+        *crow::connections::systemBus, "xyz.openbmc_project.ObjectMapper", path,
+        "xyz.openbmc_project.Association", "endpoints", std::move(callback));
+}
+
 } // namespace utility
 } // namespace dbus