1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors 3 // SPDX-FileCopyrightText: Copyright 2018 Intel Corporation 4 #pragma once 5 6 #include "boost_formatters.hpp" 7 #include "dbus_singleton.hpp" 8 9 #include <boost/system/error_code.hpp> 10 #include <sdbusplus/asio/connection.hpp> 11 #include <sdbusplus/asio/property.hpp> 12 #include <sdbusplus/message/native_types.hpp> 13 14 #include <cstddef> 15 #include <cstdint> 16 #include <functional> 17 #include <span> 18 #include <string> 19 #include <string_view> 20 #include <tuple> 21 #include <utility> 22 #include <variant> 23 #include <vector> 24 25 namespace dbus 26 { 27 28 namespace utility 29 { 30 31 // clang-format off 32 using DbusVariantType = std::variant< 33 std::vector<std::tuple<std::string, std::string, std::string>>, 34 std::vector<std::string>, 35 std::vector<double>, 36 std::string, 37 int64_t, 38 uint64_t, 39 double, 40 int32_t, 41 uint32_t, 42 int16_t, 43 uint16_t, 44 uint8_t, 45 bool, 46 std::vector<uint32_t>, 47 std::vector<uint16_t>, 48 sdbusplus::message::object_path, 49 std::tuple<uint64_t, std::vector<std::tuple<std::string, double, uint64_t>>>, 50 std::vector<sdbusplus::message::object_path>, 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< 55 std::vector<std::tuple<sdbusplus::message::object_path, std::string>>, 56 std::string, std::string, uint64_t>>, 57 std::vector<std::pair<sdbusplus::message::object_path, std::string>>, 58 std::vector<std::tuple<std::string, uint64_t, std::string, double>>, 59 std::vector<std::tuple<std::string, std::string, uint64_t, std::string>> 60 >; 61 62 // clang-format on 63 using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>; 64 using DBusInterfacesMap = 65 std::vector<std::pair<std::string, DBusPropertiesMap>>; 66 using ManagedObjectType = 67 std::vector<std::pair<sdbusplus::message::object_path, DBusInterfacesMap>>; 68 69 // Map of service name to list of interfaces 70 using MapperServiceMap = 71 std::vector<std::pair<std::string, std::vector<std::string>>>; 72 73 // Map of object paths to MapperServiceMaps 74 using MapperGetSubTreeResponse = 75 std::vector<std::pair<std::string, MapperServiceMap>>; 76 77 using MapperGetObject = 78 std::vector<std::pair<std::string, std::vector<std::string>>>; 79 80 using MapperGetAncestorsResponse = std::vector< 81 std::pair<std::string, 82 std::vector<std::pair<std::string, std::vector<std::string>>>>>; 83 84 using MapperGetSubTreePathsResponse = std::vector<std::string>; 85 86 using MapperEndPoints = std::vector<std::string>; 87 88 void escapePathForDbus(std::string& path); 89 90 void logError(const boost::system::error_code& ec); 91 92 // gets the string N strings deep into a path 93 // i.e. /0th/1st/2nd/3rd 94 bool getNthStringFromPath(const std::string& path, int index, 95 std::string& result); 96 97 void getAllProperties(const std::string& service, const std::string& objectPath, 98 const std::string& interface, 99 std::function<void(const boost::system::error_code&, 100 const DBusPropertiesMap&)>&& callback); 101 102 template <typename PropertyType> 103 void getProperty(const std::string& service, const std::string& objectPath, 104 const std::string& interface, const std::string& propertyName, 105 std::function<void(const boost::system::error_code&, 106 const PropertyType&)>&& callback) 107 { 108 sdbusplus::asio::getProperty<PropertyType>( 109 *crow::connections::systemBus, service, objectPath, interface, 110 propertyName, std::move(callback)); 111 } 112 113 template <typename PropertyType> 114 void getProperty(sdbusplus::asio::connection& /*conn*/, 115 const std::string& service, const std::string& objectPath, 116 const std::string& interface, const std::string& propertyName, 117 std::function<void(const boost::system::error_code&, 118 const PropertyType&)>&& callback) 119 { 120 getProperty(service, objectPath, interface, propertyName, 121 std::move(callback)); 122 } 123 124 void getAllProperties(sdbusplus::asio::connection& /*conn*/, 125 const std::string& service, const std::string& objectPath, 126 const std::string& interface, 127 std::function<void(const boost::system::error_code&, 128 const DBusPropertiesMap&)>&& callback); 129 130 void checkDbusPathExists(const std::string& path, 131 std::function<void(bool)>&& callback); 132 133 void getSubTree( 134 const std::string& path, int32_t depth, 135 std::span<const std::string_view> interfaces, 136 std::function<void(const boost::system::error_code&, 137 const MapperGetSubTreeResponse&)>&& callback); 138 139 void getSubTreePaths( 140 const std::string& path, int32_t depth, 141 std::span<const std::string_view> interfaces, 142 std::function<void(const boost::system::error_code&, 143 const MapperGetSubTreePathsResponse&)>&& callback); 144 145 void getAssociatedSubTree( 146 const sdbusplus::message::object_path& associatedPath, 147 const sdbusplus::message::object_path& path, int32_t depth, 148 std::span<const std::string_view> interfaces, 149 std::function<void(const boost::system::error_code&, 150 const MapperGetSubTreeResponse&)>&& callback); 151 152 void getAssociatedSubTreePaths( 153 const sdbusplus::message::object_path& associatedPath, 154 const sdbusplus::message::object_path& path, int32_t depth, 155 std::span<const std::string_view> interfaces, 156 std::function<void(const boost::system::error_code&, 157 const MapperGetSubTreePathsResponse&)>&& callback); 158 159 void getAssociatedSubTreeById( 160 const std::string& id, const std::string& path, 161 std::span<const std::string_view> subtreeInterfaces, 162 std::string_view association, 163 std::span<const std::string_view> endpointInterfaces, 164 std::function<void(const boost::system::error_code&, 165 const MapperGetSubTreeResponse&)>&& callback); 166 167 void getAssociatedSubTreePathsById( 168 const std::string& id, const std::string& path, 169 std::span<const std::string_view> subtreeInterfaces, 170 std::string_view association, 171 std::span<const std::string_view> endpointInterfaces, 172 std::function<void(const boost::system::error_code&, 173 const MapperGetSubTreePathsResponse&)>&& callback); 174 175 void getDbusObject(const std::string& path, 176 std::span<const std::string_view> interfaces, 177 std::function<void(const boost::system::error_code&, 178 const MapperGetObject&)>&& callback); 179 180 void getAssociationEndPoints( 181 const std::string& path, 182 std::function<void(const boost::system::error_code&, 183 const MapperEndPoints&)>&& callback); 184 185 void getManagedObjects( 186 const std::string& service, const sdbusplus::message::object_path& path, 187 std::function<void(const boost::system::error_code&, 188 const ManagedObjectType&)>&& callback); 189 } // namespace utility 190 } // namespace dbus 191