185
187
* Append a varying number of parameters as result to the
186
* message. Types can be anything that has a dbus_traits, including
188
* message, using AppendRetvals(msg) << res1 << res2 << ...;
190
* Types can be anything that has a dbus_traits, including
187
191
* types which are normally recognized as input parameters in D-Bus
190
template <class A1, class A2, class A3, class A4, class A5,
191
class A6, class A7, class A8, class A9, class A10>
192
void append_retvals(DBusMessagePtr &msg,
204
DBusMessageIter iter;
205
dbus_message_iter_init_append(msg.get(), &iter);
206
dbus_traits<A1>::append_retval(iter, a1);
207
dbus_traits<A2>::append_retval(iter, a2);
208
dbus_traits<A3>::append_retval(iter, a3);
209
dbus_traits<A4>::append_retval(iter, a4);
210
dbus_traits<A5>::append_retval(iter, a5);
211
dbus_traits<A6>::append_retval(iter, a6);
212
dbus_traits<A7>::append_retval(iter, a7);
213
dbus_traits<A8>::append_retval(iter, a8);
214
dbus_traits<A9>::append_retval(iter, a9);
215
dbus_traits<A10>::append_retval(iter, a10);
218
template <class A1, class A2, class A3, class A4, class A5,
219
class A6, class A7, class A8, class A9>
220
void append_retvals(DBusMessagePtr &msg,
231
DBusMessageIter iter;
232
dbus_message_iter_init_append(msg.get(), &iter);
233
dbus_traits<A1>::append_retval(iter, a1);
234
dbus_traits<A2>::append_retval(iter, a2);
235
dbus_traits<A3>::append_retval(iter, a3);
236
dbus_traits<A4>::append_retval(iter, a4);
237
dbus_traits<A5>::append_retval(iter, a5);
238
dbus_traits<A6>::append_retval(iter, a6);
239
dbus_traits<A7>::append_retval(iter, a7);
240
dbus_traits<A8>::append_retval(iter, a8);
241
dbus_traits<A9>::append_retval(iter, a9);
244
template <class A1, class A2, class A3, class A4, class A5,
245
class A6, class A7, class A8>
246
void append_retvals(DBusMessagePtr &msg,
256
DBusMessageIter iter;
257
dbus_message_iter_init_append(msg.get(), &iter);
258
dbus_traits<A1>::append_retval(iter, a1);
259
dbus_traits<A2>::append_retval(iter, a2);
260
dbus_traits<A3>::append_retval(iter, a3);
261
dbus_traits<A4>::append_retval(iter, a4);
262
dbus_traits<A5>::append_retval(iter, a5);
263
dbus_traits<A6>::append_retval(iter, a6);
264
dbus_traits<A7>::append_retval(iter, a7);
265
dbus_traits<A8>::append_retval(iter, a8);
268
template <class A1, class A2, class A3, class A4, class A5,
270
void append_retvals(DBusMessagePtr &msg,
279
DBusMessageIter iter;
280
dbus_message_iter_init_append(msg.get(), &iter);
281
dbus_traits<A1>::append_retval(iter, a1);
282
dbus_traits<A2>::append_retval(iter, a2);
283
dbus_traits<A3>::append_retval(iter, a3);
284
dbus_traits<A4>::append_retval(iter, a4);
285
dbus_traits<A5>::append_retval(iter, a5);
286
dbus_traits<A6>::append_retval(iter, a6);
287
dbus_traits<A7>::append_retval(iter, a7);
290
template <class A1, class A2, class A3, class A4, class A5,
292
void append_retvals(DBusMessagePtr &msg,
300
DBusMessageIter iter;
301
dbus_message_iter_init_append(msg.get(), &iter);
302
dbus_traits<A1>::append_retval(iter, a1);
303
dbus_traits<A2>::append_retval(iter, a2);
304
dbus_traits<A3>::append_retval(iter, a3);
305
dbus_traits<A4>::append_retval(iter, a4);
306
dbus_traits<A5>::append_retval(iter, a5);
307
dbus_traits<A6>::append_retval(iter, a6);
310
template <class A1, class A2, class A3, class A4, class A5>
311
void append_retvals(DBusMessagePtr &msg,
318
DBusMessageIter iter;
319
dbus_message_iter_init_append(msg.get(), &iter);
320
dbus_traits<A1>::append_retval(iter, a1);
321
dbus_traits<A2>::append_retval(iter, a2);
322
dbus_traits<A3>::append_retval(iter, a3);
323
dbus_traits<A4>::append_retval(iter, a4);
324
dbus_traits<A5>::append_retval(iter, a5);
327
template <class A1, class A2, class A3, class A4>
328
void append_retvals(DBusMessagePtr &msg,
334
DBusMessageIter iter;
335
dbus_message_iter_init_append(msg.get(), &iter);
336
dbus_traits<A1>::append_retval(iter, a1);
337
dbus_traits<A2>::append_retval(iter, a2);
338
dbus_traits<A3>::append_retval(iter, a3);
339
dbus_traits<A4>::append_retval(iter, a4);
342
template <class A1, class A2, class A3>
343
void append_retvals(DBusMessagePtr &msg,
348
DBusMessageIter iter;
349
dbus_message_iter_init_append(msg.get(), &iter);
350
dbus_traits<A1>::append_retval(iter, a1);
351
dbus_traits<A2>::append_retval(iter, a2);
352
dbus_traits<A3>::append_retval(iter, a3);
355
template <class A1, class A2>
356
void append_retvals(DBusMessagePtr &msg,
360
DBusMessageIter iter;
361
dbus_message_iter_init_append(msg.get(), &iter);
362
dbus_traits<A1>::append_retval(iter, a1);
363
dbus_traits<A2>::append_retval(iter, a2);
367
void append_retvals(DBusMessagePtr &msg,
370
DBusMessageIter iter;
371
dbus_message_iter_init_append(msg.get(), &iter);
372
dbus_traits<A1>::append_retval(iter, a1);
194
class AppendRetvals {
195
DBusMessageIter m_iter;
198
AppendRetvals(DBusMessagePtr &msg) {
199
dbus_message_iter_init_append(msg.get(), &m_iter);
202
template<class A> AppendRetvals & operator << (const A &a) {
203
dbus_traits<A>::append(m_iter, a);
209
* Append a varying number of method parameters as result to the reply
210
* message, using AppendArgs(msg) << Set<A1>(res1) << Set<A2>(res2) << ...;
213
DBusMessageIter m_iter;
215
AppendArgs(DBusMessage *msg) {
216
dbus_message_iter_init_append(msg, &m_iter);
219
/** syntactic sugar: redirect << into Set instance */
220
template<class A> AppendArgs & operator << (const A &a) {
225
* Always append argument, including those types which
226
* would be recognized by << as parameters and thus get
229
template<class A> AppendArgs & operator + (const A &a) {
230
dbus_traits<A>::append(m_iter, a);
235
/** default: skip it, not a result of the method */
236
template<class A> struct Set
239
AppendArgs &set(AppendArgs &context) const {
244
/** same for const reference */
245
template<class A> struct Set <const A &>
248
AppendArgs &set(AppendArgs &context) const {
253
/** specialization for reference: marshal result */
254
template<class A> struct Set <A &>
257
Set(A &a) : m_a(a) {}
258
AppendArgs &set(AppendArgs &context) const {
259
dbus_traits<A>::append(context.m_iter, m_a);
265
* Extract values from a message, using ExtractArgs(conn, msg) >> Get<A1>(val1) >> Get<A2>(val2) >> ...;
267
* This complements AppendArgs: it skips over those method arguments
268
* which are results of the method. Which values are skipped and
269
* which are marshalled depends on the specialization of Get and thus
270
* ultimately on the prototype of the method.
273
DBusConnection *m_conn;
275
DBusMessageIter m_iter;
278
ExtractArgs(DBusConnection *conn, DBusMessage *msg) {
281
dbus_message_iter_init(msg, &m_iter);
284
/** syntactic sugar: redirect >> into Get instance */
285
template<class A> ExtractArgs & operator >> (const A &a) {
290
/** default: extract data from message */
291
template<class A> struct Get
294
Get(A &a) : m_a(a) {}
295
ExtractArgs &get(ExtractArgs &context) const {
296
dbus_traits<A>::get(context.m_conn, context.m_msg, context.m_iter, m_a);
301
/** same for const reference */
302
template<class A> struct Get <const A &>
305
Get(A &a) : m_a(a) {}
306
ExtractArgs &get(ExtractArgs &context) const {
307
dbus_traits<A>::get(context.m_conn, context.m_msg, context.m_iter, m_a);
312
/** specialization for reference: skip it, not an input parameter */
313
template<class A> struct Get <A &>
316
ExtractArgs &get(ExtractArgs &context) const {
376
322
* interface expected by EmitSignal