blob: 163f6e9127ef610c9275f58fbf15f985eb104170 [file] [log] [blame]
<%
namespaces = interface.name.split('.')
classname = namespaces.pop()
def interface_instance():
return "_".join(interface.name.split('.') + ['interface'])
def error_namespace(e):
n = e.split('.');
n.pop(); # Remove error name.
n = map((lambda x: interface.name if x == "self" else x), n);
return '::'.join('.'.join(n).split('.'));
def error_name(e):
return e.split('.').pop();
def error_include(e):
l = error_namespace(e).split('::')
l.pop() # Remove "Error"
return '/'.join(l) + '/error.hpp';
%>
% if ptype == 'callback-cpp':
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;
}
% for e in property.errors:
catch(sdbusplus::${error_namespace(e)}::${error_name(e)}& e)
{
o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
return -EINVAL;
}
% endfor
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;
}
% for e in property.errors:
catch(sdbusplus::${error_namespace(e)}::${error_name(e)}& e)
{
o->_intf->sd_bus_error_set_const(error, e.name(), e.description());
return -EINVAL;
}
% endfor
return true;
}
namespace details
{
namespace ${classname}
{
static const auto _property_${property.name} =
utility::tuple_to_array(message::types::type_id<
${property.cppTypeMessage(interface.name)}>());
}
}
% elif ptype == 'callback-cpp-includes':
% for e in property.errors:
#include <${error_include(e)}>
% endfor
% endif