1 /**
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  */
16 #include "functor.hpp"
17 #include <sdbusplus/bus.hpp>
18 
19 namespace phosphor
20 {
21 namespace inventory
22 {
23 namespace manager
24 {
25 namespace functor
26 {
27 bool PropertyConditionBase::operator()(sdbusplus::bus::bus& bus,
28                                        sdbusplus::message::message&,
29                                        Manager& mgr) const
30 {
31     std::string path(_path);
32     return (*this)(path, bus, mgr);
33 }
34 
35 bool PropertyConditionBase::operator()(const std::string& path,
36                                        sdbusplus::bus::bus& bus, Manager&) const
37 {
38     std::string host;
39 
40     if (_service)
41     {
42         host.assign(_service);
43     }
44     else
45     {
46         auto mapperCall = bus.new_method_call(
47             "xyz.openbmc_project.ObjectMapper",
48             "/xyz/openbmc_project/object_mapper",
49             "xyz.openbmc_project.ObjectMapper", "GetObject");
50         mapperCall.append(path);
51         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 
62         if (mapperResponse.empty())
63         {
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(
76         host.c_str(), path.c_str(), "org.freedesktop.DBus.Properties", "Get");
77     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 
89 } // namespace functor
90 } // namespace manager
91 } // namespace inventory
92 } // namespace phosphor
93 
94 // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
95