1 /* 2 // Copyright (c) 2018 Intel Corporation 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 */ 16 #pragma once 17 18 #include <regex> 19 #include <sdbusplus/message.hpp> 20 21 namespace dbus 22 { 23 24 namespace utility 25 { 26 27 using DbusVariantType = 28 std::variant<std::vector<std::tuple<std::string, std::string, std::string>>, 29 std::vector<std::string>, std::vector<double>, std::string, 30 int64_t, uint64_t, double, int32_t, uint32_t, int16_t, 31 uint16_t, uint8_t, bool>; 32 33 using ManagedObjectType = std::vector< 34 std::pair<sdbusplus::message::object_path, 35 boost::container::flat_map< 36 std::string, 37 boost::container::flat_map<std::string, DbusVariantType>>>>; 38 39 inline void escapePathForDbus(std::string& path) 40 { 41 const std::regex reg("[^A-Za-z0-9_/]"); 42 std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_"); 43 } 44 45 // gets the string N strings deep into a path 46 // i.e. /0th/1st/2nd/3rd 47 inline bool getNthStringFromPath(const std::string& path, int index, 48 std::string& result) 49 { 50 int count = 0; 51 auto first = path.begin(); 52 auto last = path.end(); 53 for (auto it = path.begin(); it < path.end(); it++) 54 { 55 // skip first character as it's either a leading slash or the first 56 // character in the word 57 if (it == path.begin()) 58 { 59 continue; 60 } 61 if (*it == '/') 62 { 63 count++; 64 if (count == index) 65 { 66 first = it; 67 } 68 if (count == index + 1) 69 { 70 last = it; 71 break; 72 } 73 } 74 } 75 if (count < index) 76 { 77 return false; 78 } 79 if (first != path.begin()) 80 { 81 first++; 82 } 83 result = path.substr(first - path.begin(), last - first); 84 return true; 85 } 86 87 } // namespace utility 88 } // namespace dbus 89