blob: ddf1e61c0996decaea09bbbac1586b6c54db603c [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
Zbigniew Kurzynski755a33c2020-02-28 14:06:37 +010033using DBusPropertiesMap =
34 boost::container::flat_map<std::string, DbusVariantType>;
35using DBusInteracesMap =
36 boost::container::flat_map<std::string, DBusPropertiesMap>;
37using ManagedObjectType =
38 std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>;
James Feist5b4aa862018-08-16 14:07:01 -070039
James Feist73df0db2019-03-25 15:29:35 -070040using ManagedItem = std::pair<
41 sdbusplus::message::object_path,
42 boost::container::flat_map<
43 std::string, boost::container::flat_map<std::string, DbusVariantType>>>;
44
James Feist5b4aa862018-08-16 14:07:01 -070045inline void escapePathForDbus(std::string& path)
46{
47 const std::regex reg("[^A-Za-z0-9_/]");
48 std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_");
49}
50
51// gets the string N strings deep into a path
52// i.e. /0th/1st/2nd/3rd
53inline bool getNthStringFromPath(const std::string& path, int index,
54 std::string& result)
55{
56 int count = 0;
Ed Tanous271584a2019-07-09 16:24:22 -070057 std::string::const_iterator first = path.begin();
58 std::string::const_iterator last = path.end();
59 for (std::string::const_iterator it = path.begin(); it < path.end(); it++)
James Feist5b4aa862018-08-16 14:07:01 -070060 {
61 // skip first character as it's either a leading slash or the first
62 // character in the word
63 if (it == path.begin())
64 {
65 continue;
66 }
67 if (*it == '/')
68 {
69 count++;
70 if (count == index)
71 {
72 first = it;
73 }
74 if (count == index + 1)
75 {
76 last = it;
77 break;
78 }
79 }
80 }
81 if (count < index)
82 {
83 return false;
84 }
85 if (first != path.begin())
86 {
87 first++;
88 }
Ed Tanous271584a2019-07-09 16:24:22 -070089 result = path.substr(static_cast<size_t>(first - path.begin()),
90 static_cast<size_t>(last - first));
James Feist5b4aa862018-08-16 14:07:01 -070091 return true;
92}
93
Ratan Gupta22c33712019-05-03 21:50:28 +053094template <typename Callback>
95inline void checkDbusPathExists(const std::string& path, Callback&& callback)
96{
97 using GetObjectType =
98 std::vector<std::pair<std::string, std::vector<std::string>>>;
99
100 crow::connections::systemBus->async_method_call(
101 [callback{std::move(callback)}](const boost::system::error_code ec,
102 const GetObjectType& object_names) {
103 callback(!ec && object_names.size() != 0);
104 },
105 "xyz.openbmc_project.ObjectMapper",
106 "/xyz/openbmc_project/object_mapper",
107 "xyz.openbmc_project.ObjectMapper", "GetObject", path,
108 std::array<std::string, 0>());
109}
110
James Feist5b4aa862018-08-16 14:07:01 -0700111} // namespace utility
112} // namespace dbus