led-use-json: Use specific config files

- When enabled `led-use-json`, it should use the JsonConfig class to
  find the JSON file name, and do not start until JSON config is
  found.

- If it has to wait for the IBMCompatible interface to show up on
  D-bus first, it will wait for that.

Tested:
- If there is a `/etc/phosphor-led-manager/led-group-config.json`
  path, congfile=/etc/phosphor-led-manager/led-group-config.json
- If there is a `/usr/share/phosphor-led-manager/led-group-config.json`
  path and there is not `/etc/phosphor-led-manager/`,
  congfile=/usr/share/phosphor-led-manager/led-group-config.json
- If the above two paths do not exist, get the `Name` property of the
  `xyz.openbmc_project.Configuration.IBMCompatibleSystem` interface,
  congfile=/usr/share/phosphor-led-manager/${Name}/led-group-config.json

Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: I1528a3d3711ef6b604868387ad42cb3c0afde119
diff --git a/utils.cpp b/utils.cpp
index c9a21e5..6c122f9 100644
--- a/utils.cpp
+++ b/utils.cpp
@@ -92,6 +92,26 @@
     bus.call_noreply(method);
 }
 
+const std::vector<std::string>
+    DBusHandler::getSubTreePaths(const std::string& objectPath,
+                                 const std::string& interface)
+{
+    std::vector<std::string> paths;
+
+    auto& bus = DBusHandler::getBus();
+
+    auto method = bus.new_method_call(MAPPER_BUSNAME, MAPPER_OBJ_PATH,
+                                      MAPPER_IFACE, "GetSubTreePaths");
+    method.append(objectPath.c_str());
+    method.append(0); // Depth 0 to search all
+    method.append(std::vector<std::string>({interface.c_str()}));
+    auto reply = bus.call(method);
+
+    reply.read(paths);
+
+    return paths;
+}
+
 } // namespace utils
 } // namespace led
 } // namespace phosphor
\ No newline at end of file