1
// DBus-template.hh --- DBUS template
3
// Copyright (C) 2007, 2008, 2009 Rob Caelers <robc@krandor.nl>
4
// All rights reserved.
6
// This program is free software: you can redistribute it and/or modify
7
// it under the terms of the GNU General Public License as published by
8
// the Free Software Foundation, either version 3 of the License, or
9
// (at your option) any later version.
11
// This program is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
// GNU General Public License for more details.
16
// You should have received a copy of the GNU General Public License
17
// along with this program. If not, see <http://www.gnu.org/licenses/>.
30
\#include "DBusBinding.hh"
31
\#include "DBusException.hh"
32
\#include "${model.include_filename}"
36
#for interface in $model.interfaces
38
#if interface.condition != ''
39
\#if $interface.condition
42
#for imp in interface.imports
43
#for ns in imp.namespaces
48
#for imp in interface.imports
49
#for include in imp.includes
50
\#include "${include}"
54
class ${interface.qname}_Stub : public DBusBindingBase, public ${interface.qname}
57
typedef DBusMessage * (${interface.qname}_Stub::*DBusMethod)(void *object, DBusMessage *message);
59
virtual DBusMessage *call(int method_num, void *object, DBusMessage *message);
61
virtual DBusIntrospect *get_method_introspect()
63
return method_introspect;
66
virtual DBusIntrospect *get_signal_introspect()
68
return signal_introspect;
72
${interface.qname}_Stub(DBus *dbus);
73
~${interface.qname}_Stub();
75
#for $m in interface.signals
76
void ${m.qname}(const string &path, #slurp
79
$comma $interface.type2csymbol(p.type) $p.name#slurp
87
#for $m in interface.methods
88
DBusMessage *${m.qname}(void *object, DBusMessage *message);
91
#for enum in $interface.enums
92
void get_${enum.qname}(DBusMessageIter *reader, ${enum.csymbol} *result);
93
void put_${enum.qname}(DBusMessageIter *writer, const ${enum.csymbol} *result);
96
#for struct in $interface.structs
97
void get_${struct.qname}(DBusMessageIter *reader, ${struct.csymbol} *result);
98
void put_${struct.qname}(DBusMessageIter *writer, const ${struct.csymbol} *result);
101
#for seq in $interface.sequences
102
void get_${seq.qname}(DBusMessageIter *reader, ${seq.csymbol} *result);
103
void put_${seq.qname}(DBusMessageIter *writer, const ${seq.csymbol} *result);
106
#for dict in $interface.dictionaries
107
void get_${dict.qname}(DBusMessageIter *reader, ${dict.csymbol} *result);
108
void put_${dict.qname}(DBusMessageIter *writer, const ${dict.csymbol} *result);
111
static DBusMethod method_table[];
112
static DBusIntrospect method_introspect[];
113
static DBusIntrospect signal_introspect[];
117
${interface.qname} *${interface.qname}::instance(const DBus *dbus)
119
${interface.qname}_Stub *iface = NULL;
120
DBusBindingBase *binding = dbus->find_binding("${interface.name}");
124
iface = dynamic_cast<${interface.qname}_Stub *>(binding);
130
${interface.qname}_Stub::${interface.qname}_Stub(DBus *dbus)
131
: DBusBindingBase(dbus)
136
${interface.qname}_Stub::~${interface.qname}_Stub()
141
${interface.qname}_Stub::call(int method_num, void *object, DBusMessage *message)
143
DBusMessage *ret = NULL;
145
if (method_num >=0 && method_num < $len(interface.methods) )
147
DBusMethod m = method_table[method_num];
150
ret = (this->*m)(object, message);
157
#for enum in $interface.enums
160
${interface.qname}_Stub::get_${enum.qname}(DBusMessageIter *reader, ${enum.csymbol} *result)
163
int argtype = dbus_message_iter_get_arg_type(reader);
165
if (argtype != DBUS_TYPE_STRING)
166
throw DBusTypeException("Type mismatch. Excepted string");
168
get_string(reader, &value);
171
#for e in enum.values
172
$ifs ("$e.name" == value)
174
*result = $e.csymbol;
176
#set $ifs = 'else if'
180
throw DBusTypeException("Illegal enum value");
185
${interface.qname}_Stub::put_${enum.qname}(DBusMessageIter *writer, const ${enum.csymbol} *result)
190
#for e in enum.values
196
throw DBusTypeException("Illegal enum value");
199
put_string(writer, &value);
204
#for struct in $interface.structs
207
${interface.qname}_Stub::get_${struct.qname}(DBusMessageIter *reader, ${struct.csymbol} *result)
210
dbus_message_iter_recurse(reader, &it);
212
#for p in struct.fields
213
#if p.type != p.ext_type
214
$interface.type2csymbol(p.ext_type) _${p.name};
218
#for p in struct.fields
219
#if p.type != p.ext_type
220
get_${p.ext_type}(&it, &_${p.name});
222
get_${p.ext_type}(&it, ($interface.type2csymbol(p.ext_type) *) &(result->${p.name}));
226
#for p in struct.fields
227
#if p.type != p.ext_type
228
result->${p.name} = ($interface.type2csymbol(p.type)) _${p.name};
232
dbus_message_iter_next(reader);
236
${interface.qname}_Stub::put_${struct.qname}(DBusMessageIter *writer, const ${struct.csymbol} *result)
241
ok = dbus_message_iter_open_container(writer, DBUS_TYPE_STRUCT, NULL, &it);
244
throw DBusSystemException("Internal error");
247
#for p in struct.fields
248
#if p.type != p.ext_type
249
$interface.type2csymbol(p.ext_type) _${p.name} = ($interface.type2csymbol(p.ext_type))result->${p.name};
253
#for p in struct.fields
254
#if p.type != p.ext_type
255
put_${p.ext_type}(&it, &_${p.name});
257
put_${p.ext_type}(&it, ($interface.type2csymbol(p.type) *) &(result->${p.name}));
261
ok = dbus_message_iter_close_container(writer, &it);
264
throw DBusSystemException("Internal error");
270
#for seq in $interface.sequences
273
${interface.qname}_Stub::get_${seq.qname}(DBusMessageIter *reader, ${seq.csymbol} *result)
277
dbus_message_iter_recurse(reader, &it);
278
while (dbus_message_iter_has_next(&it))
280
$interface.type2csymbol(seq.data_type) tmp;
281
get_${seq.data_type}(&it, &tmp);
282
result->push_back(tmp);
285
dbus_message_iter_next(reader);
289
${interface.qname}_Stub::put_${seq.qname}(DBusMessageIter *writer, const ${seq.csymbol} *result)
292
${seq.csymbol}::const_iterator it;
295
ok = dbus_message_iter_open_container(writer, DBUS_TYPE_ARRAY, "$interface.type2sig(seq.data_type)", &arr);
298
throw DBusSystemException("Internal error");
301
for(it = result->begin(); it != result->end(); it++)
303
put_${seq.data_type}(&arr, &(*it));
306
ok = dbus_message_iter_close_container(writer, &arr);
309
throw DBusSystemException("Internal error");
315
#for dict in $interface.dictionaries
318
${interface.qname}_Stub::get_${dict.qname}(DBusMessageIter *reader, ${dict.csymbol} *result)
320
DBusMessageIter arr_it;
321
DBusMessageIter dict_it;
323
dbus_message_iter_recurse(reader, &arr_it);
324
while (dbus_message_iter_has_next(&arr_it))
326
$interface.type2csymbol(dict.key_type) key;
327
$interface.type2csymbol(dict.value_type) value;
329
dbus_message_iter_recurse(&arr_it, &dict_it);
331
get_${dict.key_type}(&dict_it, &key);
332
get_${dict.value_type}(&dict_it, &value);
334
(*result)[key] = value;
336
dbus_message_iter_next(&arr_it);
339
dbus_message_iter_next(reader);
344
${interface.qname}_Stub::put_${dict.qname}(DBusMessageIter *writer, const ${dict.csymbol} *result)
346
DBusMessageIter arr_it;
347
DBusMessageIter dict_it;
348
${dict.csymbol}::const_iterator it;
351
ok = dbus_message_iter_open_container(writer, DBUS_TYPE_ARRAY,
352
"$interface.type2sig(dict.value_type)", &arr_it);
355
throw DBusSystemException("Internal error");
358
for (it = result->begin(); it != result->end(); it++)
360
ok = dbus_message_iter_open_container(&arr_it, DBUS_TYPE_DICT_ENTRY, NULL, &dict_it);
363
throw DBusSystemException("Internal error");
366
put_${dict.key_type}(&dict_it, &(it->first));
367
put_${dict.value_type}(&dict_it, &(it->second));
369
ok = dbus_message_iter_close_container(&arr_it, &dict_it);
372
throw DBusSystemException("Internal error");
376
ok = dbus_message_iter_close_container(writer, &arr_it);
379
throw DBusSystemException("Internal error");
386
#for method in $interface.methods
389
${interface.qname}_Stub::${method.name}(void *object, DBusMessage *message)
391
DBusMessage *reply = NULL;
393
#if method.condition != ''
394
\#if $method.condition
396
DBusMessageIter reader;
397
DBusMessageIter writer;
402
#if method.csymbol != ""
403
${interface.csymbol} *dbus_object = (${interface.csymbol} *) object;
408
#set have_in_args = False
409
#for p in method.params
410
#if p.direction == 'in'
411
#set have_in_args = True
413
#if 'ptrptr' in p.hint
414
$interface.type2csymbol(p.type) *${p.name} #slurp
416
$interface.type2csymbol(p.type) ${p.name} #slurp
418
#if p.direction == 'bind'
424
ok = dbus_message_iter_init(message, &reader);
428
throw DBusSystemException("No parameters");
432
#for arg in method.params:
433
#if $arg.direction == 'in'
434
get_${arg.type}(&reader, &${arg.name});
438
#if method.csymbol != ""
439
#if method.return_type() != 'void'
440
$method.return_name() = dbus_object->${method.csymbol}( #slurp
442
dbus_object->${method.csymbol}( #slurp
445
#for p in method.params
446
#if p.hint == [] or 'ref' in p.hint
448
#else if 'ptr' in p.hint
449
$comma &$p.name#slurp
450
#else if 'ptrptr' in p.hint
451
$comma &$p.name#slurp
458
reply = dbus_message_new_method_return(message);
461
throw DBusSystemException("Internal error");
464
dbus_message_iter_init_append(reply, &writer);
466
#for arg in method.params:
467
#if arg.direction == 'out'
468
#if 'ptrptr' in p.hint
469
put_${arg.type}(&writer, ${arg.name});
471
put_${arg.type}(&writer, &${arg.name});
476
catch (DBusException)
480
dbus_message_unref(reply);
486
#if method.condition != ''
490
reply = dbus_message_new_error(message,
491
"org.workrave.NotImplemented",
492
"This method is unavailable in current configuration");
502
#for signal in interface.signals
503
void ${interface.qname}_Stub::${signal.qname}(const string &path, #slurp
505
#for p in signal.params
506
$comma $interface.type2csymbol(p.type) $p.name#slurp
511
DBusMessage *msg = NULL;
512
DBusMessageIter writer;
514
msg = dbus_message_new_signal(path.c_str(),
519
throw DBusSystemException("Unable to send signal");
522
dbus_message_iter_init_append(msg, &writer);
526
#for arg in signal.params:
527
put_${arg.type}(&writer, &${arg.name});
530
catch (DBusException &e)
532
dbus_message_unref(msg);
541
${interface.qname}_Stub::DBusMethod ${interface.qname}_Stub::method_table[] = {
542
#for method in $interface.methods
543
&${interface.qname}_Stub::$method.qname,
547
DBusIntrospect ${interface.qname}_Stub::method_introspect[] = {
548
#for method in $interface.methods
558
DBusIntrospect ${interface.qname}_Stub::signal_introspect[] = {
559
#for signal in $interface.signals
569
#if interface.condition != ''
570
\#endif // $interface.condition
575
void init_${model.name}(DBus *dbus)
577
#for interface in $model.interfaces
578
#if interface.condition != ''
579
\#if $interface.condition
581
dbus->register_binding("$interface.name", new ${interface.qname}_Stub(dbus));
582
#if interface.condition != ''
583
\#endif // $interface.condition