xref: /openbmc/bmcweb/include/dbus_utility.hpp (revision 57fce80e)
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 <sdbusplus/message.hpp>
19 
20 #include <regex>
21 
22 namespace dbus
23 {
24 
25 namespace utility
26 {
27 
28 using DbusVariantType =
29     std::variant<std::vector<std::tuple<std::string, std::string, std::string>>,
30                  std::vector<std::string>, std::vector<double>, std::string,
31                  int64_t, uint64_t, double, int32_t, uint32_t, int16_t,
32                  uint16_t, uint8_t, bool>;
33 
34 using DBusPropertiesMap =
35     boost::container::flat_map<std::string, DbusVariantType>;
36 using DBusInteracesMap =
37     boost::container::flat_map<std::string, DBusPropertiesMap>;
38 using ManagedObjectType =
39     std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>;
40 
41 using ManagedItem = std::pair<
42     sdbusplus::message::object_path,
43     boost::container::flat_map<
44         std::string, boost::container::flat_map<std::string, DbusVariantType>>>;
45 
46 inline void escapePathForDbus(std::string& path)
47 {
48     const std::regex reg("[^A-Za-z0-9_/]");
49     std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_");
50 }
51 
52 // gets the string N strings deep into a path
53 // i.e.  /0th/1st/2nd/3rd
54 inline bool getNthStringFromPath(const std::string& path, int index,
55                                  std::string& result)
56 {
57     int count = 0;
58     std::string::const_iterator first = path.begin();
59     std::string::const_iterator last = path.end();
60     for (std::string::const_iterator it = path.begin(); it < path.end(); it++)
61     {
62         // skip first character as it's either a leading slash or the first
63         // character in the word
64         if (it == path.begin())
65         {
66             continue;
67         }
68         if (*it == '/')
69         {
70             count++;
71             if (count == index)
72             {
73                 first = it;
74             }
75             if (count == index + 1)
76             {
77                 last = it;
78                 break;
79             }
80         }
81     }
82     if (count < index)
83     {
84         return false;
85     }
86     if (first != path.begin())
87     {
88         first++;
89     }
90     result = path.substr(static_cast<size_t>(first - path.begin()),
91                          static_cast<size_t>(last - first));
92     return true;
93 }
94 
95 template <typename Callback>
96 inline void checkDbusPathExists(const std::string& path, Callback&& callback)
97 {
98     using GetObjectType =
99         std::vector<std::pair<std::string, std::vector<std::string>>>;
100 
101     crow::connections::systemBus->async_method_call(
102         [callback{std::move(callback)}](const boost::system::error_code ec,
103                                         const GetObjectType& object_names) {
104             callback(!ec && object_names.size() != 0);
105         },
106         "xyz.openbmc_project.ObjectMapper",
107         "/xyz/openbmc_project/object_mapper",
108         "xyz.openbmc_project.ObjectMapper", "GetObject", path,
109         std::array<std::string, 0>());
110 }
111 
112 } // namespace utility
113 } // namespace dbus
114