1 #pragma once 2 3 #include "types.hpp" 4 5 #include <phosphor-logging/lg2.hpp> 6 #include <sdbusplus/bus.hpp> 7 8 #include <string_view> 9 #include <vector> 10 11 namespace phosphor 12 { 13 namespace time 14 { 15 namespace utils 16 { 17 18 using Path = std::string; 19 using Service = std::string; 20 using Interface = std::string; 21 using Interfaces = std::vector<Interface>; 22 using MapperResponse = 23 std::vector<std::pair<Path, std::vector<std::pair<Service, Interfaces>>>>; 24 25 PHOSPHOR_LOG2_USING; 26 27 /** @brief The template function to get property from the requested dbus path 28 * 29 * @param[in] bus - The Dbus bus object 30 * @param[in] service - The Dbus service name 31 * @param[in] path - The Dbus object path 32 * @param[in] interface - The Dbus interface 33 * @param[in] propertyName - The property name to get 34 * 35 * @return The value of the property 36 */ 37 template <typename T> 38 T getProperty(sdbusplus::bus_t& bus, const char* service, const char* path, 39 const char* interface, const char* propertyName) 40 { 41 auto method = bus.new_method_call(service, path, 42 "org.freedesktop.DBus.Properties", "Get"); 43 method.append(interface, propertyName); 44 try 45 { 46 std::variant<T> value{}; 47 auto reply = bus.call(method); 48 reply.read(value); 49 return std::get<T>(value); 50 } 51 catch (const sdbusplus::exception_t& ex) 52 { 53 error("GetProperty call failed, path:{PATH}, interface:{INTF}, " 54 "propertyName:{NAME}, error:{ERROR}", 55 "PATH", path, "INTF", interface, "NAME", propertyName, "ERROR", 56 ex); 57 throw std::runtime_error("GetProperty call failed"); 58 } 59 } 60 61 /** @brief The template function to set property to the requested dbus path 62 * 63 * @param[in] bus - The Dbus bus object 64 * @param[in] service - The Dbus service name 65 * @param[in] path - The Dbus object path 66 * @param[in] interface - The Dbus interface 67 * @param[in] propertyName - The property name to set 68 * @param[in] value - the value to set the property to 69 * 70 */ 71 template <typename T> 72 void setProperty(sdbusplus::bus_t& bus, const std::string& service, 73 const std::string& path, const std::string& interface, 74 const std::string& propertyName, T& value) 75 { 76 std::variant<T> propertyValue(value); 77 78 auto method = bus.new_method_call(service.c_str(), path.c_str(), 79 "org.freedesktop.DBus.Properties", "Set"); 80 81 method.append(interface, propertyName, propertyValue); 82 83 try 84 { 85 auto reply = bus.call(method); 86 } 87 catch (const sdbusplus::exception_t& ex) 88 { 89 error("SetProperty call failed, path:{PATH}, interface:{INTF}, " 90 "propertyName:{NAME}, error:{ERROR}", 91 "PATH", path, "INTF", interface, "NAME", propertyName, "ERROR", 92 ex); 93 throw std::runtime_error("SetProperty call failed"); 94 } 95 } 96 97 /** @brief Get service name from object path and interface 98 * 99 * @param[in] bus - The Dbus bus object 100 * @param[in] path - The Dbus object path 101 * @param[in] interface - The Dbus interface 102 * 103 * @return The name of the service 104 */ 105 std::string getService(sdbusplus::bus_t& bus, const char* path, 106 const char* interface); 107 108 /** @brief Get sub tree from root, depth and interfaces 109 * 110 * @param[in] bus - The Dbus bus object 111 * @param[in] root - The root of the tree to search 112 * @param[in] interfaces - All interfaces in the subtree to search for 113 * @param[in] depth - The number of path elements to descend 114 * 115 * @return The name of the service 116 * 117 * @throw sdbusplus::exception_t when it fails 118 */ 119 MapperResponse getSubTree(sdbusplus::bus_t& bus, const std::string& root, 120 const Interfaces& interfaces, int32_t depth); 121 122 /** @brief Convert a string to enum Mode 123 * 124 * Convert the time mode string to enum. 125 * Valid strings are 126 * "xyz.openbmc_project.Time.Synchronization.Method.NTP" 127 * "xyz.openbmc_project.Time.Synchronization.Method.Manual" 128 * If it's not a valid time mode string, it means something 129 * goes wrong so raise exception. 130 * 131 * @param[in] mode - The string of time mode 132 * 133 * @return The Mode enum 134 */ 135 Mode strToMode(const std::string& mode); 136 137 /** @brief Convert a mode enum to mode string 138 * 139 * @param[in] mode - The Mode enum 140 * 141 * @return The string of the mode 142 */ 143 std::string modeToStr(Mode mode); 144 145 } // namespace utils 146 } // namespace time 147 } // namespace phosphor 148