xref: /openbmc/bmcweb/include/dbus_utility.hpp (revision cb103130)
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 using ManagedItem = std::pair<
40     sdbusplus::message::object_path,
41     boost::container::flat_map<
42         std::string, boost::container::flat_map<std::string, DbusVariantType>>>;
43 
44 inline 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
52 inline bool getNthStringFromPath(const std::string& path, int index,
53                                  std::string& result)
54 {
55     int count = 0;
56     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++)
59     {
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     }
88     result = path.substr(static_cast<size_t>(first - path.begin()),
89                          static_cast<size_t>(last - first));
90     return true;
91 }
92 
93 template <typename Callback>
94 inline 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 
110 } // namespace utility
111 } // namespace dbus
112