| /* | |
| // Copyright (c) 2018 Intel Corporation | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| */ | |
| #ifndef THIRD_PARTY_GBMCWEB_INCLUDE_DBUS_UTILITY_H_ | |
| #define THIRD_PARTY_GBMCWEB_INCLUDE_DBUS_UTILITY_H_ | |
| #include <cstddef> | |
| #include <cstdint> | |
| #include <regex> // NOLINT | |
| #include <string> | |
| #include <tuple> | |
| #include <utility> | |
| #include <variant> | |
| #include <vector> | |
| #include "boost/system/error_code.hpp" // IWYU pragma: keep // NOLINT | |
| #include "logging.hpp" | |
| #include "sdbusplus/asio/property.hpp" // NOLINT | |
| #include "sdbusplus/message/native_types.hpp" | |
| // IWYU pragma: no_include <stddef.h> | |
| // IWYU pragma: no_include <stdint.h> | |
| // IWYU pragma: no_include <boost/system/detail/error_code.hpp> | |
| namespace dbus { | |
| namespace utility { | |
| // clang-format off | |
| using DbusVariantType = std::variant< | |
| std::vector<std::tuple<std::string, std::string, std::string>>, | |
| std::vector<std::string>, | |
| std::vector<double>, | |
| std::string, | |
| int64_t, | |
| uint64_t, | |
| double, | |
| int32_t, | |
| uint32_t, | |
| int16_t, | |
| uint16_t, | |
| uint8_t, | |
| bool, | |
| sdbusplus::message::unix_fd, | |
| std::vector<uint32_t>, | |
| std::vector<uint16_t>, | |
| sdbusplus::message::object_path, | |
| std::tuple<uint64_t, | |
| std::vector<std::tuple<std::string, std::string, double, | |
| uint64_t>>>, | |
| std::tuple<uint64_t, std::vector<uint8_t>>, | |
| std::vector<std::tuple<std::string, std::string>>, | |
| std::vector<std::tuple<uint64_t, uint64_t, std::string>>, | |
| std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>, | |
| std::vector<std::tuple<uint32_t, size_t>>, | |
| std::vector<std::tuple<sdbusplus::message::object_path, std::string, | |
| std::string, std::string>>, | |
| std::vector<std::tuple<size_t, size_t, size_t, std::string>>, | |
| // decomposition types | |
| std::tuple<std::string, std::string, std::string>, | |
| std::tuple<std::string, std::string>, | |
| std::tuple<uint32_t, std::vector<uint32_t>>, | |
| std::tuple<sdbusplus::message::object_path, std::string, | |
| std::string, std::string>, | |
| std::tuple<uint32_t, size_t> | |
| >; | |
| // clang-format on | |
| using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>; | |
| using DBusInteracesMap = std::vector<std::pair<std::string, DBusPropertiesMap>>; | |
| using ManagedObjectType = | |
| std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>; | |
| // Map of service name to list of interfaces | |
| using MapperServiceMap = | |
| std::vector<std::pair<std::string, std::vector<std::string>>>; | |
| // Map of object paths to MapperServiceMaps | |
| using MapperGetSubTreeResponse = | |
| std::vector<std::pair<std::string, MapperServiceMap>>; | |
| using MapperGetObject = | |
| std::vector<std::pair<std::string, std::vector<std::string>>>; | |
| using MapperGetAncestorsResponse = std::vector< | |
| std::pair<std::string, | |
| std::vector<std::pair<std::string, std::vector<std::string>>>>>; | |
| using MapperGetSubTreePathsResponse = std::vector<std::string>; | |
| using MapperEndPoints = std::vector<std::string>; | |
| using SystemdUnitStruct = | |
| std::tuple<std::string, std::string, std::string, std::string, std::string, | |
| std::string, sdbusplus::message::object_path, uint32_t, | |
| std::string, sdbusplus::message::object_path>; | |
| // Return type for ListUnits as described in DBus API of systemd. | |
| // https://www.freedesktop.org/wiki/Software/systemd/dbus | |
| using SystemdListUnits = std::vector<SystemdUnitStruct>; | |
| inline void escapePathForDbus(std::string& path) { | |
| const static std::regex reg("[^A-Za-z0-9_/]"); // NOLINT | |
| std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_"); | |
| } | |
| inline void logError(const boost::system::error_code& ec) { | |
| if (ec) { | |
| BMCWEB_LOG_ERROR << "DBus error: " << ec << ", cannot call method"; | |
| } | |
| } | |
| // gets the string N strings deep into a path | |
| // i.e. /0th/1st/2nd/3rd | |
| bool getNthStringFromPath(const std::string& path, int index, | |
| std::string& result); | |
| } // namespace utility | |
| } // namespace dbus | |
| #endif // THIRD_PARTY_GBMCWEB_INCLUDE_DBUS_UTILITY_H_ |