blob: ac5970de74c8680b56a251bf570f22b74bb1fff4 [file] [log] [blame]
James Feist5b4aa862018-08-16 14:07:01 -07001/*
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
21namespace dbus
22{
23
24namespace utility
25{
26
Ed Tanousabf2add2019-01-22 16:40:12 -080027using 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>;
James Feist5b4aa862018-08-16 14:07:01 -070032
33using 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
James Feist73df0db2019-03-25 15:29:35 -070039using ManagedItem = std::pair<
40 sdbusplus::message::object_path,
41 boost::container::flat_map<
42 std::string, boost::container::flat_map<std::string, DbusVariantType>>>;
43
James Feist5b4aa862018-08-16 14:07:01 -070044inline void escapePathForDbus(std::string& path)
45{
46 const std::regex reg("[^A-Za-z0-9_/]");
47 std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_");
48}
49
50// gets the string N strings deep into a path
51// i.e. /0th/1st/2nd/3rd
52inline bool getNthStringFromPath(const std::string& path, int index,
53 std::string& result)
54{
55 int count = 0;
Ed Tanous271584a2019-07-09 16:24:22 -070056 std::string::const_iterator first = path.begin();
57 std::string::const_iterator last = path.end();
58 for (std::string::const_iterator it = path.begin(); it < path.end(); it++)
James Feist5b4aa862018-08-16 14:07:01 -070059 {
60 // skip first character as it's either a leading slash or the first
61 // character in the word
62 if (it == path.begin())
63 {
64 continue;
65 }
66 if (*it == '/')
67 {
68 count++;
69 if (count == index)
70 {
71 first = it;
72 }
73 if (count == index + 1)
74 {
75 last = it;
76 break;
77 }
78 }
79 }
80 if (count < index)
81 {
82 return false;
83 }
84 if (first != path.begin())
85 {
86 first++;
87 }
Ed Tanous271584a2019-07-09 16:24:22 -070088 result = path.substr(static_cast<size_t>(first - path.begin()),
89 static_cast<size_t>(last - first));
James Feist5b4aa862018-08-16 14:07:01 -070090 return true;
91}
92
Ratan Gupta22c33712019-05-03 21:50:28 +053093template <typename Callback>
94inline void checkDbusPathExists(const std::string& path, Callback&& callback)
95{
96 using GetObjectType =
97 std::vector<std::pair<std::string, std::vector<std::string>>>;
98
99 crow::connections::systemBus->async_method_call(
100 [callback{std::move(callback)}](const boost::system::error_code ec,
101 const GetObjectType& object_names) {
102 callback(!ec && object_names.size() != 0);
103 },
104 "xyz.openbmc_project.ObjectMapper",
105 "/xyz/openbmc_project/object_mapper",
106 "xyz.openbmc_project.ObjectMapper", "GetObject", path,
107 std::array<std::string, 0>());
108}
109
James Feist5b4aa862018-08-16 14:07:01 -0700110} // namespace utility
111} // namespace dbus