Add propertyIs filter
The existing property match filter tests a property
in the PropertiesChanged signal payload.
Add a match filter that tests any arbitrary property on
any object.
Change-Id: I1c238c03a3ccbf45f7b338693a4342fbd4f670c2
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/events.cpp b/events.cpp
new file mode 100644
index 0000000..41a6e5f
--- /dev/null
+++ b/events.cpp
@@ -0,0 +1,99 @@
+/**
+ * Copyright © 2017 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "events.hpp"
+#include <sdbusplus/bus.hpp>
+
+namespace phosphor
+{
+namespace inventory
+{
+namespace manager
+{
+namespace filters
+{
+namespace details
+{
+namespace property_condition
+{
+
+bool PropertyConditionBase::operator()(
+ sdbusplus::bus::bus& bus,
+ sdbusplus::message::message&,
+ Manager&) const
+{
+ std::string host;
+
+ if (_service)
+ {
+ host.assign(_service);
+ }
+ else
+ {
+ auto mapperCall = bus.new_method_call(
+ "xyz.openbmc_project.ObjectMapper",
+ "/xyz/openbmc_project/ObjectMapper",
+ "xyz.openbmc_project.ObjectMapper",
+ "GetObject");
+ mapperCall.append(_path);
+ mapperCall.append(std::vector<std::string>({_iface}));
+
+ auto mapperResponseMsg = bus.call(mapperCall);
+ if (mapperResponseMsg.is_method_error())
+ {
+ return false;
+ }
+
+ std::map<std::string, std::vector<std::string>> mapperResponse;
+ mapperResponseMsg.read(mapperResponse);
+
+ if (mapperResponse.begin() == mapperResponse.end())
+ {
+ return false;
+ }
+
+ host = mapperResponse.begin()->first;
+
+ if (host == bus.get_unique_name())
+ {
+ // TODO I can't call myself here.
+ return false;
+ }
+ }
+ auto hostCall = bus.new_method_call(
+ host.c_str(),
+ _path.c_str(),
+ "org.freedesktop.DBus.Properties",
+ "Get");
+ hostCall.append(_iface);
+ hostCall.append(_property);
+
+ auto hostResponseMsg = bus.call(hostCall);
+ if (hostResponseMsg.is_method_error())
+ {
+ return false;
+ }
+
+ return eval(hostResponseMsg);
+}
+
+} // namespace property_condition
+} // namespace details
+} // namespace filters
+} // namespace manager
+} // namespace inventory
+} // namespace phosphor
+
+// vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4