#ifndef DBUS_{{ model.guard }}_HH
#define DBUS_{{ model.guard }}_HH

#include "dbus/DBusBindingGio.hh"

{% for imp in model.imports %}
{% if imp.condition != '' %}
#if {{ imp.condition }}
{% endif %}
{% for include, condition in imp.includes %}
{% if condition != '' %}
#if {{ condition }}
{% endif %}
#include "{{ include }}"
{% if condition != '' %}
#endif // {{ condition }}
{% endif %}
{% endfor %}

{% for ns, condition in imp.namespaces %}
{% if condition != '' %}
#if {{ condition }}
{% endif %}
using namespace {{ ns }};
{% if condition != '' %}
#endif // {{ condition }}
{% endif %}
{% endfor %}

{% if imp.condition != '' %}
#endif // {{ imp.condition }}
{% endif %}
{% endfor %}


{% for interface in model.interfaces %}

{% if interface.condition != '' %}
#if {{ interface.condition }}
{% endif %}

{% for ns in interface.namespace_list %}
namespace {{ ns }} // interface {{ interface.name }} namespace
{
{% endfor %}

class {{ interface.qname }}
{
public:
  virtual ~{{ interface.qname }}() {}

  static {{ interface.qname }} *instance(const ::workrave::dbus::IDBus::Ptr dbus);

{% for m in interface.signals %}
 virtual void {{ m.qname }}(const std::string &path
  {% for p in m.params %}
    {% if p.hint == [] %}
      , {{ interface.get_type(p.type).symbol() }} {{ p.name }}
    {% elif 'ptr' in p.hint %}
      , {{ interface.get_type(p.type).symbol() }} *{{ p.name }}
    {% elif 'ref' in p.hint %}
      , {{ interface.get_type(p.type).symbol() }} & {{ p.name }}
    {% endif %}
  {% endfor %}
  ) = 0;
{% endfor %}
};

{% for ns in interface.namespace_list|reverse %}
} // namespace {{ ns }}
{% endfor %}

{% if interface.condition != '' %}
#endif // {{ interface.condition }}
{% endif %}

{% endfor %}

#endif // DBUS_{{ model.guard }}_HH
