Add PID Get To Redfish

Add doGet to managers for PID configuration data.
Make sure passes schema validation.

Change-Id: Ieeb97bf76a3d8a3c06f59f79cc0887aec746675e
Signed-off-by: James Feist <james.feist@linux.intel.com>
Signed-off-by: Ed Tanous <ed.tanous@intel.com>
diff --git a/include/dbus_utility.hpp b/include/dbus_utility.hpp
new file mode 100644
index 0000000..e527e90
--- /dev/null
+++ b/include/dbus_utility.hpp
@@ -0,0 +1,87 @@
+/*
+ // Copyright (c) 2018 Intel Corporation
+ //
+ // Licensed under the Apache License, Version 2.0 (the "License");
+ // you may not use this file except in compliance with the License.
+ // You may obtain a copy of the License at
+ //
+ //      http://www.apache.org/licenses/LICENSE-2.0
+ //
+ // Unless required by applicable law or agreed to in writing, software
+ // distributed under the License is distributed on an "AS IS" BASIS,
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ // See the License for the specific language governing permissions and
+ // limitations under the License.
+ */
+#pragma once
+
+#include <regex>
+#include <sdbusplus/message.hpp>
+
+namespace dbus
+{
+
+namespace utility
+{
+
+using DbusVariantType = sdbusplus::message::variant<
+    std::vector<std::tuple<std::string, std::string, std::string>>,
+    std::vector<std::string>, std::string, int64_t, uint64_t, double, int32_t,
+    uint32_t, int16_t, uint16_t, uint8_t, bool>;
+
+using ManagedObjectType = std::vector<
+    std::pair<sdbusplus::message::object_path,
+              boost::container::flat_map<
+                  std::string,
+                  boost::container::flat_map<std::string, DbusVariantType>>>>;
+
+inline void escapePathForDbus(std::string& path)
+{
+    const std::regex reg("[^A-Za-z0-9_/]");
+    std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_");
+}
+
+// gets the string N strings deep into a path
+// i.e.  /0th/1st/2nd/3rd
+inline bool getNthStringFromPath(const std::string& path, int index,
+                                 std::string& result)
+{
+    int count = 0;
+    auto first = path.begin();
+    auto last = path.end();
+    for (auto it = path.begin(); it < path.end(); it++)
+    {
+        // skip first character as it's either a leading slash or the first
+        // character in the word
+        if (it == path.begin())
+        {
+            continue;
+        }
+        if (*it == '/')
+        {
+            count++;
+            if (count == index)
+            {
+                first = it;
+            }
+            if (count == index + 1)
+            {
+                last = it;
+                break;
+            }
+        }
+    }
+    if (count < index)
+    {
+        return false;
+    }
+    if (first != path.begin())
+    {
+        first++;
+    }
+    result = path.substr(first - path.begin(), last - first);
+    return true;
+}
+
+} // namespace utility
+} // namespace dbus
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 110e6ac..aa6c95f 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -1,5 +1,18 @@
-#pragma once
+// Copyright (c) 2018 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 
+#pragma once
 #include <crow/app.h>
 #include <tinyxml2.h>
 
@@ -7,6 +20,7 @@
 #include <boost/algorithm/string.hpp>
 #include <boost/container/flat_set.hpp>
 #include <dbus_singleton.hpp>
+#include <dbus_utility.hpp>
 #include <experimental/filesystem>
 #include <fstream>
 
@@ -77,19 +91,6 @@
         "Introspect");
 }
 
-// A smattering of common types to unpack.  TODO(ed) this should really iterate
-// the sdbusplus object directly and build the json response
-using DbusRestVariantType = sdbusplus::message::variant<
-    std::vector<std::tuple<std::string, std::string, std::string>>, std::string,
-    int64_t, uint64_t, double, int32_t, uint32_t, int16_t, uint16_t, uint8_t,
-    bool>;
-
-using ManagedObjectType = std::vector<std::pair<
-    sdbusplus::message::object_path,
-    boost::container::flat_map<
-        std::string,
-        boost::container::flat_map<std::string, DbusRestVariantType>>>>;
-
 void getManagedObjectsForEnumerate(const std::string &object_name,
                                    const std::string &object_manager_path,
                                    const std::string &connection_name,
@@ -97,9 +98,8 @@
                                    std::shared_ptr<nlohmann::json> transaction)
 {
     crow::connections::systemBus->async_method_call(
-        [&res, transaction, object_name{std::string(object_name)}](
-            const boost::system::error_code ec,
-            const ManagedObjectType &objects) {
+        [&res, transaction](const boost::system::error_code ec,
+                            const dbus::utility::ManagedObjectType &objects) {
             if (ec)
             {
                 BMCWEB_LOG_ERROR << ec;
@@ -840,8 +840,8 @@
                     crow::connections::systemBus->async_method_call(
                         [&res, response, propertyName](
                             const boost::system::error_code ec,
-                            const std::vector<
-                                std::pair<std::string, DbusRestVariantType>>
+                            const std::vector<std::pair<
+                                std::string, dbus::utility::DbusVariantType>>
                                 &properties) {
                             if (ec)
                             {
@@ -850,8 +850,9 @@
                             }
                             else
                             {
-                                for (const std::pair<std::string,
-                                                     DbusRestVariantType>
+                                for (const std::pair<
+                                         std::string,
+                                         dbus::utility::DbusVariantType>
                                          &property : properties)
                                 {
                                     // if property name is empty, or matches our