sdbus++: generate server bindings for properties

Change-Id: Iabfefd94d1a261355d547c8c1cfbcf27cce825b7
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/tools/templates/interface.mako.server.hpp b/tools/templates/interface.mako.server.hpp
index 73aff6b..ca78cec 100644
--- a/tools/templates/interface.mako.server.hpp
+++ b/tools/templates/interface.mako.server.hpp
@@ -47,15 +47,42 @@
 ${ s.cpp_prototype(loader, interface=interface, ptype='header') }
     % endfor
 
+    % for p in interface.properties:
+        /** Get value of ${p.name} */
+        virtual ${p.typeName} ${p.camelCase}() const;
+        /** Set value of ${p.name} */
+        virtual ${p.typeName} ${p.camelCase}(${p.typeName} value);
+    % endfor
+
     private:
     % for m in interface.methods:
 ${ m.cpp_prototype(loader, interface=interface, ptype='callback-header') }
     % endfor
 
+    % for p in interface.properties:
+        /** @brief sd-bus callback for get-property '${p.name}' */
+        static int _callback_get_${p.name}(
+            sd_bus*, const char*, const char*, const char*,
+            sd_bus_message*, void*, sd_bus_error*);
+        /** @brief sd-bus callback for set-property '${p.name}' */
+        static int _callback_set_${p.name}(
+            sd_bus*, const char*, const char*, const char*,
+            sd_bus_message*, void*, sd_bus_error*);
+
+    % endfor
+
         static constexpr auto _interface = "${interface.name}";
         static const vtable::vtable_t _vtable[];
         interface::interface _${"_".join(interface.name.split('.'))}_interface;
 
+    % for p in interface.properties:
+        % if p.defaultValue:
+        ${p.typeName} _${p.camelCase} = ${p.defaultValue};
+        % else:
+        ${p.typeName} _${p.camelCase}{};
+        % endif
+    % endfor
+
 };
 
     % for s in namespaces: