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