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 
18 #include <sdbusplus/bus.hpp>
19 
20 namespace phosphor
21 {
22 namespace inventory
23 {
24 namespace manager
25 {
26 namespace functor
27 {
28 bool PropertyConditionBase::operator()(sdbusplus::bus::bus& bus,
29                                        sdbusplus::message::message&,
30                                        Manager& mgr) const
31 {
32     std::string path(_path);
33     return (*this)(path, bus, mgr);
34 }
35 
36 bool PropertyConditionBase::operator()(const std::string& path,
37                                        sdbusplus::bus::bus& bus, Manager&) const
38 {
39     std::string host;
40 
41     if (_service)
42     {
43         host.assign(_service);
44     }
45     else
46     {
47         auto mapperCall = bus.new_method_call(
48             "xyz.openbmc_project.ObjectMapper",
49             "/xyz/openbmc_project/object_mapper",
50             "xyz.openbmc_project.ObjectMapper", "GetObject");
51         mapperCall.append(path);
52         mapperCall.append(std::vector<std::string>({_iface}));
53 
54         auto mapperResponseMsg = bus.call(mapperCall);
55         if (mapperResponseMsg.is_method_error())
56         {
57             return false;
58         }
59 
60         std::map<std::string, std::vector<std::string>> mapperResponse;
61         mapperResponseMsg.read(mapperResponse);
62 
63         if (mapperResponse.empty())
64         {
65             return false;
66         }
67 
68         host = mapperResponse.begin()->first;
69 
70         if (host == bus.get_unique_name())
71         {
72             // TODO I can't call myself here.
73             return false;
74         }
75     }
76     auto hostCall = bus.new_method_call(
77         host.c_str(), path.c_str(), "org.freedesktop.DBus.Properties", "Get");
78     hostCall.append(_iface);
79     hostCall.append(_property);
80 
81     auto hostResponseMsg = bus.call(hostCall);
82     if (hostResponseMsg.is_method_error())
83     {
84         return false;
85     }
86 
87     return eval(hostResponseMsg);
88 }
89 
90 } // namespace functor
91 } // namespace manager
92 } // namespace inventory
93 } // namespace phosphor
94 
95 // vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
96