interface: enable property-changed signals
Change-Id: I5a46fe2d948ddc6c1b86dd6f898b814767802054
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/sdbusplus/server/interface.hpp b/sdbusplus/server/interface.hpp
index e3a2059..db956e8 100644
--- a/sdbusplus/server/interface.hpp
+++ b/sdbusplus/server/interface.hpp
@@ -80,6 +80,16 @@
return _bus.new_signal(_path.c_str(), _interf.c_str(), member);
}
+ /** @brief Broadcast a property changed signal.
+ *
+ * @param[in] property - The property which changed.
+ */
+ void property_changed(const char* property)
+ {
+ sd_bus_emit_properties_changed(_bus.get(), _path.c_str(),
+ _interf.c_str(), property, nullptr);
+ }
+
bus::bus& bus() { return _bus; }
const std::string& path() { return _path; }
diff --git a/tools/templates/interface.mako.server.cpp b/tools/templates/interface.mako.server.cpp
index cb4ca29..2a5c497 100644
--- a/tools/templates/interface.mako.server.cpp
+++ b/tools/templates/interface.mako.server.cpp
@@ -3,6 +3,9 @@
<%
namespaces = interface.name.split('.')
classname = namespaces.pop()
+
+ def interface_instance():
+ return "_".join(interface.name.split('.') + ['interface'])
%>
namespace sdbusplus
{
@@ -14,7 +17,7 @@
% endfor
${classname}::${classname}(bus::bus& bus, const char* path)
- : _${"_".join(interface.name.split('.'))}_interface(
+ : _${interface_instance()}(
bus, path, _interface, _vtable, this)
{
}
@@ -48,7 +51,11 @@
${p.typeName} ${classname}::${p.camelCase}(${p.typeName} value)
{
- _${p.camelCase} = value;
+ if (_${p.camelCase} != value)
+ {
+ _${p.camelCase} = value;
+ _${interface_instance()}.property_changed("${p.name}");
+ }
return _${p.camelCase};
}
@@ -93,7 +100,8 @@
details::${classname}::_property_${p.name}
.data(),
_callback_get_${p.name},
- _callback_set_${p.name}),
+ _callback_set_${p.name},
+ vtable::property_::emits_change),
% endfor
vtable::end()
};