property: Move property template to its own file
Move the template that generates the property-related code
to its own file out of the interface.mako file so that it's
easier/cleaner to add additional features to the property
template such as error handling.
Tested: Verified the generated code for the example
Calculator remained the same.
Change-Id: Idee37d4b1db6701ffc22de84a7a7ea07a2006d61
Signed-off-by: Adriana Kobylak <anoo@us.ibm.com>
diff --git a/configure.ac b/configure.ac
index aedae42..9ca9f77 100644
--- a/configure.ac
+++ b/configure.ac
@@ -92,4 +92,5 @@
AC_CONFIG_FILES([sdbusplus/server.hpp])
AC_CONFIG_FILES([tools/sdbusplus/templates/interface.mako.server.cpp])
AC_CONFIG_FILES([tools/sdbusplus/templates/method.mako.prototype.hpp])
+AC_CONFIG_FILES([tools/sdbusplus/templates/property.mako.prototype.hpp])
AC_OUTPUT
diff --git a/tools/sdbusplus/property.py b/tools/sdbusplus/property.py
index 7ed53ed..c6444c8 100644
--- a/tools/sdbusplus/property.py
+++ b/tools/sdbusplus/property.py
@@ -164,3 +164,7 @@
def markdown(self, loader):
return self.render(loader, "property.mako.md", property=self,
post=str.strip)
+
+ def cpp_prototype(self, loader, interface, ptype):
+ return self.render(loader, "property.mako.prototype.hpp", property=self,
+ interface=interface, ptype=ptype, post=str.rstrip)
diff --git a/tools/sdbusplus/templates/interface.mako.server.cpp.in b/tools/sdbusplus/templates/interface.mako.server.cpp.in
index d519c26..4b46711 100644
--- a/tools/sdbusplus/templates/interface.mako.server.cpp.in
+++ b/tools/sdbusplus/templates/interface.mako.server.cpp.in
@@ -49,105 +49,7 @@
% endfor
% for p in interface.properties:
-auto ${classname}::${p.camelCase}() const ->
- ${p.cppTypeParam(interface.name)}
-{
- return _${p.camelCase};
-}
-
-int ${classname}::_callback_get_${p.name}(
- sd_bus* bus, const char* path, const char* interface,
- const char* property, sd_bus_message* reply, void* context,
- sd_bus_error* error)
-{
- using sdbusplus::server::binding::details::convertForMessage;
-
- // TODO(venture): Can this except? I wouldn't think so.
- auto o = static_cast<${classname}*>(context);
-
- try
- {
- auto m = message::message(reply, o->_intf);
-
-#if @WANT_TRANSACTION@
- {
- auto tbus = m.get_bus();
- sdbusplus::server::transaction::Transaction t(tbus, m);
- sdbusplus::server::transaction::set_id
- (std::hash<sdbusplus::server::transaction::Transaction>{}(t));
- }
-#endif
-
- m.append(convertForMessage(o->${p.camelCase}()));
- }
- catch(sdbusplus::internal_exception_t& e)
- {
- o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
- return -EINVAL;
- }
-
- return true;
-}
-
-auto ${classname}::${p.camelCase}(${p.cppTypeParam(interface.name)} value) ->
- ${p.cppTypeParam(interface.name)}
-{
- if (_${p.camelCase} != value)
- {
- _${p.camelCase} = value;
- _${interface_instance()}.property_changed("${p.name}");
- }
-
- return _${p.camelCase};
-}
-
-int ${classname}::_callback_set_${p.name}(
- sd_bus* bus, const char* path, const char* interface,
- const char* property, sd_bus_message* value, void* context,
- sd_bus_error* error)
-{
- auto o = static_cast<${classname}*>(context);
-
- try
- {
- auto m = message::message(value, o->_intf);
-
-#if @WANT_TRANSACTION@
- {
- auto tbus = m.get_bus();
- sdbusplus::server::transaction::Transaction t(tbus, m);
- sdbusplus::server::transaction::set_id
- (std::hash<sdbusplus::server::transaction::Transaction>{}(t));
- }
-#endif
-
- ${p.cppTypeMessage(interface.name)} v{};
- m.read(v);
- % if p.is_enum():
- o->${p.camelCase}(${p.enum_namespace(interface.name)}\
-convert${p.enum_name(interface.name)}FromString(v));
- % else:
- o->${p.camelCase}(v);
- % endif
- }
- catch(sdbusplus::internal_exception_t& e)
- {
- o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
- return -EINVAL;
- }
-
- return true;
-}
-
-namespace details
-{
-namespace ${classname}
-{
-static const auto _property_${p.name} =
- utility::tuple_to_array(message::types::type_id<
- ${p.cppTypeMessage(interface.name)}>());
-}
-}
+${ p.cpp_prototype(loader, interface=interface, ptype='callback-cpp') }
% endfor
% if interface.properties:
diff --git a/tools/sdbusplus/templates/property.mako.prototype.hpp.in b/tools/sdbusplus/templates/property.mako.prototype.hpp.in
new file mode 100644
index 0000000..fd4a28e
--- /dev/null
+++ b/tools/sdbusplus/templates/property.mako.prototype.hpp.in
@@ -0,0 +1,106 @@
+<%
+ namespaces = interface.name.split('.')
+ classname = namespaces.pop()
+
+ def interface_instance():
+ return "_".join(interface.name.split('.') + ['interface'])
+%>
+auto ${classname}::${property.camelCase}() const ->
+ ${property.cppTypeParam(interface.name)}
+{
+ return _${property.camelCase};
+}
+
+int ${classname}::_callback_get_${property.name}(
+ sd_bus* bus, const char* path, const char* interface,
+ const char* property, sd_bus_message* reply, void* context,
+ sd_bus_error* error)
+{
+ using sdbusplus::server::binding::details::convertForMessage;
+
+ // TODO(venture): Can this except? I wouldn't think so.
+ auto o = static_cast<${classname}*>(context);
+
+ try
+ {
+ auto m = message::message(reply, o->_intf);
+
+#if @WANT_TRANSACTION@
+ {
+ auto tbus = m.get_bus();
+ sdbusplus::server::transaction::Transaction t(tbus, m);
+ sdbusplus::server::transaction::set_id
+ (std::hash<sdbusplus::server::transaction::Transaction>{}(t));
+ }
+#endif
+
+ m.append(convertForMessage(o->${property.camelCase}()));
+ }
+ catch(sdbusplus::internal_exception_t& e)
+ {
+ o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
+ return -EINVAL;
+ }
+
+ return true;
+}
+
+auto ${classname}::${property.camelCase}(${property.cppTypeParam(interface.name)} value) ->
+ ${property.cppTypeParam(interface.name)}
+{
+ if (_${property.camelCase} != value)
+ {
+ _${property.camelCase} = value;
+ _${interface_instance()}.property_changed("${property.name}");
+ }
+
+ return _${property.camelCase};
+}
+
+int ${classname}::_callback_set_${property.name}(
+ sd_bus* bus, const char* path, const char* interface,
+ const char* property, sd_bus_message* value, void* context,
+ sd_bus_error* error)
+{
+ auto o = static_cast<${classname}*>(context);
+
+ try
+ {
+ auto m = message::message(value, o->_intf);
+
+#if @WANT_TRANSACTION@
+ {
+ auto tbus = m.get_bus();
+ sdbusplus::server::transaction::Transaction t(tbus, m);
+ sdbusplus::server::transaction::set_id
+ (std::hash<sdbusplus::server::transaction::Transaction>{}(t));
+ }
+#endif
+
+ ${property.cppTypeMessage(interface.name)} v{};
+ m.read(v);
+ % if property.is_enum():
+ o->${property.camelCase}(${property.enum_namespace(interface.name)}\
+convert${property.enum_name(interface.name)}FromString(v));
+ % else:
+ o->${property.camelCase}(v);
+ % endif
+ }
+ catch(sdbusplus::internal_exception_t& e)
+ {
+ o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
+ return -EINVAL;
+ }
+
+ return true;
+}
+
+namespace details
+{
+namespace ${classname}
+{
+static const auto _property_${property.name} =
+ utility::tuple_to_array(message::types::type_id<
+ ${property.cppTypeMessage(interface.name)}>());
+}
+}