blob: a971325549446f2b45d7c41a7cc92a831c99afd4 [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
James Feist5b4aa862018-08-16 14:07:01 -070018#include <sdbusplus/message.hpp>
Ed Tanousd1a64812021-12-13 12:14:05 -080019#include <sdbusplus/utility/dedup_variant.hpp>
James Feist5b4aa862018-08-16 14:07:01 -070020
Manojkiran Eda17a897d2020-09-12 15:31:58 +053021#include <filesystem>
Gunnar Mills1214b7e2020-06-04 10:11:30 -050022#include <regex>
23
James Feist5b4aa862018-08-16 14:07:01 -070024namespace dbus
25{
26
27namespace utility
28{
29
Ed Tanousd1a64812021-12-13 12:14:05 -080030// clang-format off
31using DbusVariantType = sdbusplus::utility::dedup_variant_t<
32 std::vector<std::tuple<std::string, std::string, std::string>>,
33 std::vector<std::string>,
34 std::vector<double>,
35 std::string,
36 int64_t,
37 uint64_t,
38 double,
39 int32_t,
40 uint32_t,
41 int16_t,
42 uint16_t,
43 uint8_t,
44 bool,
45 size_t,
46 sdbusplus::message::unix_fd,
47 std::vector<uint32_t>,
48 std::vector<uint16_t>,
49 sdbusplus::message::object_path,
50 std::tuple<uint64_t, std::vector<std::tuple<std::string, std::string, double, uint64_t>>>,
51 std::vector<std::tuple<std::string, std::string>>,
52 std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>,
53 std::vector<std::tuple<uint32_t, size_t>>,
54 std::vector<std::tuple<sdbusplus::message::object_path, std::string,
55 std::string, std::string>>
56 >;
James Feist5b4aa862018-08-16 14:07:01 -070057
Ed Tanousd1a64812021-12-13 12:14:05 -080058// clang-format on
Zbigniew Kurzynski755a33c2020-02-28 14:06:37 +010059using DBusPropertiesMap =
60 boost::container::flat_map<std::string, DbusVariantType>;
61using DBusInteracesMap =
62 boost::container::flat_map<std::string, DBusPropertiesMap>;
63using ManagedObjectType =
64 std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>;
James Feist5b4aa862018-08-16 14:07:01 -070065
James Feist73df0db2019-03-25 15:29:35 -070066using ManagedItem = std::pair<
67 sdbusplus::message::object_path,
68 boost::container::flat_map<
69 std::string, boost::container::flat_map<std::string, DbusVariantType>>>;
70
James Feist5b4aa862018-08-16 14:07:01 -070071inline void escapePathForDbus(std::string& path)
72{
73 const std::regex reg("[^A-Za-z0-9_/]");
74 std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_");
75}
76
77// gets the string N strings deep into a path
78// i.e. /0th/1st/2nd/3rd
79inline bool getNthStringFromPath(const std::string& path, int index,
80 std::string& result)
81{
Manojkiran Eda17a897d2020-09-12 15:31:58 +053082 if (index < 0)
James Feist5b4aa862018-08-16 14:07:01 -070083 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +053084 return false;
85 }
86
87 std::filesystem::path p1(path);
88 int count = -1;
89 for (auto const& element : p1)
90 {
91 if (element.has_filename())
James Feist5b4aa862018-08-16 14:07:01 -070092 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +053093 ++count;
James Feist5b4aa862018-08-16 14:07:01 -070094 if (count == index)
95 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +053096 result = element.stem().string();
James Feist5b4aa862018-08-16 14:07:01 -070097 break;
98 }
99 }
100 }
101 if (count < index)
102 {
103 return false;
104 }
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530105
James Feist5b4aa862018-08-16 14:07:01 -0700106 return true;
107}
108
Ratan Gupta22c33712019-05-03 21:50:28 +0530109template <typename Callback>
110inline void checkDbusPathExists(const std::string& path, Callback&& callback)
111{
112 using GetObjectType =
113 std::vector<std::pair<std::string, std::vector<std::string>>>;
114
115 crow::connections::systemBus->async_method_call(
116 [callback{std::move(callback)}](const boost::system::error_code ec,
Ed Tanous81ce6092020-12-17 16:54:55 +0000117 const GetObjectType& objectNames) {
118 callback(!ec && objectNames.size() != 0);
Ratan Gupta22c33712019-05-03 21:50:28 +0530119 },
120 "xyz.openbmc_project.ObjectMapper",
121 "/xyz/openbmc_project/object_mapper",
122 "xyz.openbmc_project.ObjectMapper", "GetObject", path,
123 std::array<std::string, 0>());
124}
125
James Feist5b4aa862018-08-16 14:07:01 -0700126} // namespace utility
127} // namespace dbus