blob: f97b5058aa82e5cff378d118b4841a50371e3b70 [file] [log] [blame]
Brandon Wyman5914f652017-03-16 18:17:07 -05001#pragma once
2
3#include <sdbusplus/bus.hpp>
Brandon Wymanfef02952017-03-31 18:13:21 -05004#include <unistd.h>
Brandon Wymance822442017-04-10 17:48:02 -05005#include <fcntl.h>
Dinesh Chinari618027a2017-06-26 23:26:50 -05006#include <phosphor-logging/log.hpp>
7#include <phosphor-logging/elog.hpp>
8#include <phosphor-logging/elog-errors.hpp>
9#include <xyz/openbmc_project/Common/error.hpp>
Brandon Wymance822442017-04-10 17:48:02 -050010
Brandon Wyman5914f652017-03-16 18:17:07 -050011
Dinesh Chinari618027a2017-06-26 23:26:50 -050012using namespace phosphor::logging;
13using InternalFailure = sdbusplus::xyz::openbmc_project::Common::
14 Error::InternalFailure;
15
Brandon Wyman5914f652017-03-16 18:17:07 -050016namespace phosphor
17{
18namespace fan
19{
Matt Spinler5cfdf942017-04-10 14:25:47 -050020namespace util
Brandon Wyman5914f652017-03-16 18:17:07 -050021{
22
Matthew Barth51dd1852017-11-16 15:21:13 -060023constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper";
24constexpr auto MAPPER_PATH = "/xyz/openbmc_project/object_mapper";
25constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper";
26
27constexpr auto INVENTORY_PATH = "/xyz/openbmc_project/inventory";
28constexpr auto INVENTORY_INTF = "xyz.openbmc_project.Inventory.Manager";
29
30constexpr auto OPERATIONAL_STATUS_INTF =
31 "xyz.openbmc_project.State.Decorator.OperationalStatus";
32constexpr auto FUNCTIONAL_PROPERTY = "Functional";
33
Brandon Wymanfef02952017-03-31 18:13:21 -050034class FileDescriptor
35{
36 public:
37 FileDescriptor() = delete;
38 FileDescriptor(const FileDescriptor&) = delete;
39 FileDescriptor(FileDescriptor&&) = default;
40 FileDescriptor& operator=(const FileDescriptor&) = delete;
41 FileDescriptor& operator=(FileDescriptor&&) = default;
42
43 FileDescriptor(int fd) : fd(fd)
44 {
45 }
46
47 ~FileDescriptor()
48 {
49 if (fd != -1)
50 {
51 close(fd);
52 }
53 }
54
Brandon Wymance822442017-04-10 17:48:02 -050055 int operator()()
56 {
57 return fd;
58 }
59
60 void open(const std::string& pathname, int flags)
61 {
62 fd = ::open(pathname.c_str(), flags);
63 if (-1 == fd)
64 {
Dinesh Chinari618027a2017-06-26 23:26:50 -050065 log<level::ERR>(
66 "Failed to open file device: ",
67 entry("PATHNAME=%s", pathname.c_str()));
68 elog<InternalFailure>();
Brandon Wymance822442017-04-10 17:48:02 -050069 }
70 }
71
Brandon Wymanfef02952017-03-31 18:13:21 -050072 bool is_open()
73 {
74 return fd != -1;
75 }
76
77 private:
78 int fd = -1;
79
80};
81
Brandon Wyman5914f652017-03-16 18:17:07 -050082/**
Matthew Barth51dd1852017-11-16 15:21:13 -060083 * @brief Get the object map for creating or updating an object property
84 *
85 * @param[in] path - The dbus object path name
86 * @param[in] intf - The dbus interface
87 * @param[in] prop - The dbus property
88 * @param[in] value - The property value
89 *
90 * @return - The full object path containing the property value
91 */
92template <typename T>
93auto getObjMap(const std::string& path,
94 const std::string& intf,
95 const std::string& prop,
96 const T& value)
97{
98 using Property = std::string;
99 using Value = sdbusplus::message::variant<T>;
100 using PropertyMap = std::map<Property, Value>;
101
102 using Interface = std::string;
103 using InterfaceMap = std::map<Interface, PropertyMap>;
104
105 using Object = sdbusplus::message::object_path;
106 using ObjectMap = std::map<Object, InterfaceMap>;
107
108 ObjectMap objectMap;
109 InterfaceMap interfaceMap;
110 PropertyMap propertyMap;
111
112 propertyMap.emplace(prop, value);
113 interfaceMap.emplace(intf, std::move(propertyMap));
114 objectMap.emplace(path, std::move(interfaceMap));
115
116 return objectMap;
117}
118
Brandon Wyman5914f652017-03-16 18:17:07 -0500119}
120}
121}