Cache service names for paths and interfaces

To lookup a service name for a given path and interface, use GetSubTree
to retrieve all the service names from the root path for the interface
and add each entry to a cached dataset.

Tested:
    Check that a missing interface's service is added
    Check that a missing path that exists has its service added
    Inspect all missing paths for an interface are added
    Inspect missing interfaces are added to existing service
    Returned service name matches the service for a path/interface

Change-Id: I6db05479e825350198896b2e237882f7ebc58d51
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/zone.hpp b/control/zone.hpp
index 406af13..c047b62 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -382,6 +382,34 @@
          */
         void timerExpired(Group eventGroup, std::vector<Action> eventActions);
 
+        /**
+         * @brief Get the service for a given path and interface from cached
+         * dataset and add a service that's not found
+         *
+         * @param[in] path - Path to get service for
+         * @param[in] intf - Interface to get service for
+         *
+         * @return - The service name
+         */
+        const std::string& getService(const std::string& path,
+                                      const std::string& intf);
+
+        /**
+         * @brief Add a set of services for a path and interface
+         * by retrieving all the path subtrees to the given depth
+         * from root for the interface
+         *
+         * @param[in] path - Path to add services for
+         * @param[in] intf - Interface to add services for
+         * @param[in] depth - Depth of tree traversal from root path
+         *
+         * @return - The associated service to the given path and interface
+         * or empty string for no service found
+         */
+        const std::string& addServices(const std::string& path,
+                                       const std::string& intf,
+                                       int32_t depth);
+
     private:
 
         /**
@@ -508,6 +536,13 @@
         std::map<const Group, std::vector<Service>> _services;
 
         /**
+         * @brief Map tree of paths to services of interfaces
+         */
+        std::map<std::string,
+                std::map<std::string,
+                std::vector<std::string>>> _servTree;
+
+        /**
          * @brief List of signal event arguments and Dbus matches for callbacks
          */
         std::vector<SignalEvent> _signalEvents;