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