blob: b9e252157f95a6063417ca0f3c40f2c80d11924a [file] [log] [blame]
Brad Bishopfa51da72017-01-19 11:06:51 -05001/**
2 * Copyright © 2017 IBM 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 */
Brad Bishopc1f47982017-02-09 01:27:38 -050016#include "functor.hpp"
Brad Bishopfa51da72017-01-19 11:06:51 -050017#include <sdbusplus/bus.hpp>
18
19namespace phosphor
20{
21namespace inventory
22{
23namespace manager
24{
Brad Bishopc1f47982017-02-09 01:27:38 -050025namespace functor
Brad Bishopfa51da72017-01-19 11:06:51 -050026{
Brad Bishop615b2a82018-03-29 10:32:41 -040027bool PropertyConditionBase::operator()(sdbusplus::bus::bus& bus,
28 sdbusplus::message::message&,
29 Manager& mgr) const
Brad Bishopd0f48ad2017-01-30 08:52:26 -050030{
31 std::string path(_path);
32 return (*this)(path, bus, mgr);
33}
34
Brad Bishop615b2a82018-03-29 10:32:41 -040035bool PropertyConditionBase::operator()(const std::string& path,
36 sdbusplus::bus::bus& bus, Manager&) const
Brad Bishopfa51da72017-01-19 11:06:51 -050037{
38 std::string host;
39
40 if (_service)
41 {
42 host.assign(_service);
43 }
44 else
45 {
46 auto mapperCall = bus.new_method_call(
Brad Bishop615b2a82018-03-29 10:32:41 -040047 "xyz.openbmc_project.ObjectMapper",
48 "/xyz/openbmc_project/object_mapper",
49 "xyz.openbmc_project.ObjectMapper", "GetObject");
Brad Bishopd0f48ad2017-01-30 08:52:26 -050050 mapperCall.append(path);
Brad Bishopfa51da72017-01-19 11:06:51 -050051 mapperCall.append(std::vector<std::string>({_iface}));
52
53 auto mapperResponseMsg = bus.call(mapperCall);
54 if (mapperResponseMsg.is_method_error())
55 {
56 return false;
57 }
58
59 std::map<std::string, std::vector<std::string>> mapperResponse;
60 mapperResponseMsg.read(mapperResponse);
61
Patrick Williams8ed114b2017-03-09 15:28:43 -060062 if (mapperResponse.empty())
Brad Bishopfa51da72017-01-19 11:06:51 -050063 {
64 return false;
65 }
66
67 host = mapperResponse.begin()->first;
68
69 if (host == bus.get_unique_name())
70 {
71 // TODO I can't call myself here.
72 return false;
73 }
74 }
75 auto hostCall = bus.new_method_call(
Brad Bishop615b2a82018-03-29 10:32:41 -040076 host.c_str(), path.c_str(), "org.freedesktop.DBus.Properties", "Get");
Brad Bishopfa51da72017-01-19 11:06:51 -050077 hostCall.append(_iface);
78 hostCall.append(_property);
79
80 auto hostResponseMsg = bus.call(hostCall);
81 if (hostResponseMsg.is_method_error())
82 {
83 return false;
84 }
85
86 return eval(hostResponseMsg);
87}
88
Brad Bishopc1f47982017-02-09 01:27:38 -050089} // namespace functor
Brad Bishopfa51da72017-01-19 11:06:51 -050090} // namespace manager
91} // namespace inventory
92} // namespace phosphor
93
94// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4