Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qdbusmarshaller.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:critical reason:data-parser
4
8#include "qdbusutil_p.h"
9
10#ifndef QT_NO_DBUS
11
13
14using namespace Qt::StringLiterals;
15
16static void qIterAppend(DBusMessageIter *it, QByteArray *ba, int type, const void *arg)
17{
18 if (ba)
19 *ba += char(type);
20 else
22}
23
24QDBusMarshaller::~QDBusMarshaller()
25{
26 close();
27}
28
29void QDBusMarshaller::unregisteredTypeError(QMetaType id)
30{
31 const char *name = id.name();
32 qWarning("QDBusMarshaller: type '%s' (%d) is not registered with D-Bus. "
33 "Use qDBusRegisterMetaType to register it",
34 name ? name : "", id.id());
35 error("Unregistered type %1 passed in arguments"_L1
36 .arg(QLatin1StringView(id.name())));
37}
38
39inline QString QDBusMarshaller::currentSignature()
40{
41 if (message)
42 return QString::fromUtf8(q_dbus_message_get_signature(message));
43 return QString();
44}
45
46inline void QDBusMarshaller::append(uchar arg)
47{
48 if (!skipSignature)
49 qIterAppend(&iterator, ba, DBUS_TYPE_BYTE, &arg);
50}
51
52inline void QDBusMarshaller::append(bool arg)
53{
54 dbus_bool_t cast = arg;
55 if (!skipSignature)
56 qIterAppend(&iterator, ba, DBUS_TYPE_BOOLEAN, &cast);
57}
58
59inline void QDBusMarshaller::append(short arg)
60{
61 if (!skipSignature)
62 qIterAppend(&iterator, ba, DBUS_TYPE_INT16, &arg);
63}
64
65inline void QDBusMarshaller::append(ushort arg)
66{
67 if (!skipSignature)
68 qIterAppend(&iterator, ba, DBUS_TYPE_UINT16, &arg);
69}
70
71inline void QDBusMarshaller::append(int arg)
72{
73 if (!skipSignature)
74 qIterAppend(&iterator, ba, DBUS_TYPE_INT32, &arg);
75}
76
77inline void QDBusMarshaller::append(uint arg)
78{
79 if (!skipSignature)
80 qIterAppend(&iterator, ba, DBUS_TYPE_UINT32, &arg);
81}
82
83inline void QDBusMarshaller::append(qlonglong arg)
84{
85 if (!skipSignature)
86 qIterAppend(&iterator, ba, DBUS_TYPE_INT64, &arg);
87}
88
89inline void QDBusMarshaller::append(qulonglong arg)
90{
91 if (!skipSignature)
92 qIterAppend(&iterator, ba, DBUS_TYPE_UINT64, &arg);
93}
94
95inline void QDBusMarshaller::append(double arg)
96{
97 if (!skipSignature)
98 qIterAppend(&iterator, ba, DBUS_TYPE_DOUBLE, &arg);
99}
100
101void QDBusMarshaller::append(const QString &arg)
102{
103 QByteArray data = arg.toUtf8();
104 const char *cdata = data.constData();
105 if (!skipSignature)
106 qIterAppend(&iterator, ba, DBUS_TYPE_STRING, &cdata);
107}
108
109inline void QDBusMarshaller::append(const QDBusObjectPath &arg)
110{
111 QByteArray data = arg.path().toUtf8();
112 if (!ba && data.isEmpty()) {
113 error("Invalid object path passed in arguments"_L1);
114 } else {
115 const char *cdata = data.constData();
116 if (!skipSignature)
117 qIterAppend(&iterator, ba, DBUS_TYPE_OBJECT_PATH, &cdata);
118 }
119}
120
121inline void QDBusMarshaller::append(const QDBusSignature &arg)
122{
123 QByteArray data = arg.signature().toUtf8();
124 if (!ba && data.isNull()) {
125 error("Invalid signature passed in arguments"_L1);
126 } else {
127 const char *cdata = data.constData();
128 if (!skipSignature)
129 qIterAppend(&iterator, ba, DBUS_TYPE_SIGNATURE, &cdata);
130 }
131}
132
133inline void QDBusMarshaller::append(const QDBusUnixFileDescriptor &arg)
134{
135 int fd = arg.fileDescriptor();
136 if (!ba && fd == -1) {
137 error("Invalid file descriptor passed in arguments"_L1);
138 } else {
139 if (!skipSignature)
140 qIterAppend(&iterator, ba, DBUS_TYPE_UNIX_FD, &fd);
141 }
142}
143
144inline void QDBusMarshaller::append(const QByteArray &arg)
145{
146 if (ba) {
147 if (!skipSignature)
149 return;
150 }
151
152 const char* cdata = arg.constData();
153 DBusMessageIter subiterator;
154 q_dbus_message_iter_open_container(&iterator, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE_AS_STRING,
155 &subiterator);
156 q_dbus_message_iter_append_fixed_array(&subiterator, DBUS_TYPE_BYTE, &cdata, arg.size());
158}
159
160inline bool QDBusMarshaller::append(const QDBusVariant &arg)
161{
162 if (ba) {
163 if (!skipSignature)
165 return true;
166 }
167
168 const QVariant &value = arg.variant();
169 QMetaType id = value.metaType();
170 if (!id.isValid()) {
171 qWarning("QDBusMarshaller: cannot add a null QDBusVariant");
172 error("Invalid QVariant passed in arguments"_L1);
173 return false;
174 }
175
176 QByteArray tmpSignature;
177 const char *signature = nullptr;
178 if (id == QDBusMetaTypeId::argument()) {
179 // take the signature from the QDBusArgument object we're marshalling
180 tmpSignature =
181 qvariant_cast<QDBusArgument>(value).currentSignature().toLatin1();
182 signature = tmpSignature.constData();
183 } else {
184 // take the signatuer from the metatype we're marshalling
185 signature = QDBusMetaType::typeToSignature(id);
186 }
187 if (!signature) {
188 unregisteredTypeError(id);
189 return false;
190 }
191
192 QDBusMarshaller sub(capabilities);
193 open(sub, DBUS_TYPE_VARIANT, signature);
194 bool isOk = sub.appendVariantInternal(value);
195 // don't call sub.close(): it auto-closes
196
197 return isOk;
198}
199
200inline void QDBusMarshaller::append(const QStringList &arg)
201{
202 if (ba) {
203 if (!skipSignature)
205 return;
206 }
207
208 QDBusMarshaller sub(capabilities);
210 for (const QString &s : arg)
211 sub.append(s);
212 // don't call sub.close(): it auto-closes
213}
214
215inline QDBusMarshaller *QDBusMarshaller::beginStructure()
216{
217 return beginCommon(DBUS_TYPE_STRUCT, nullptr);
218}
219
220inline QDBusMarshaller *QDBusMarshaller::beginArray(QMetaType id)
221{
222 const char *signature = QDBusMetaType::typeToSignature(id);
223 if (!signature) {
224 unregisteredTypeError(id);
225 return this;
226 }
227
228 return beginCommon(DBUS_TYPE_ARRAY, signature);
229}
230
231inline QDBusMarshaller *QDBusMarshaller::beginMap(QMetaType kid, QMetaType vid)
232{
233 const char *ksignature = QDBusMetaType::typeToSignature(kid);
234 if (!ksignature) {
235 unregisteredTypeError(kid);
236 return this;
237 }
238 if (ksignature[1] != 0 || !QDBusUtil::isValidBasicType(*ksignature)) {
239QT_WARNING_PUSH
240QT_WARNING_DISABLE_GCC("-Wformat-overflow")
241 qWarning("QDBusMarshaller: type '%s' (%d) cannot be used as the key type in a D-Bus map.",
242 kid.name(), kid.id());
243QT_WARNING_POP
244 error("Type %1 passed in arguments cannot be used as a key in a map"_L1
245 .arg(QLatin1StringView(kid.name())));
246 return this;
247 }
248
249 const char *vsignature = QDBusMetaType::typeToSignature(vid);
250 if (!vsignature) {
251 unregisteredTypeError(vid);
252 return this;
253 }
254
255 QByteArray signature;
257 signature += ksignature;
258 signature += vsignature;
260 return beginCommon(DBUS_TYPE_ARRAY, signature);
261}
262
263inline QDBusMarshaller *QDBusMarshaller::beginMapEntry()
264{
266}
267
268void QDBusMarshaller::open(QDBusMarshaller &sub, int code, const char *signature)
269{
270 sub.parent = this;
271 sub.ba = ba;
272 sub.ok = true;
273 sub.capabilities = capabilities;
275
276 if (ba) {
277 if (!skipSignature) {
278 switch (code) {
279 case DBUS_TYPE_ARRAY:
280 *ba += char(code);
281 *ba += signature;
282 Q_FALLTHROUGH();
283
285 sub.closeCode = 0;
286 sub.skipSignature = true;
287 break;
288
289 case DBUS_TYPE_STRUCT:
292 break;
293 }
294 }
295 } else {
296 q_dbus_message_iter_open_container(&iterator, code, signature, &sub.iterator);
297 }
298}
299
300QDBusMarshaller *QDBusMarshaller::beginCommon(int code, const char *signature)
301{
302 QDBusMarshaller *d = new QDBusMarshaller(capabilities);
303 open(*d, code, signature);
304 return d;
305}
306
307inline QDBusMarshaller *QDBusMarshaller::endStructure()
308{ return endCommon(); }
309
310inline QDBusMarshaller *QDBusMarshaller::endArray()
311{ return endCommon(); }
312
313inline QDBusMarshaller *QDBusMarshaller::endMap()
314{ return endCommon(); }
315
316inline QDBusMarshaller *QDBusMarshaller::endMapEntry()
317{ return endCommon(); }
318
319QDBusMarshaller *QDBusMarshaller::endCommon()
320{
321 QDBusMarshaller *retval = parent;
322 delete this;
323 return retval;
324}
325
326void QDBusMarshaller::close()
327{
328 if (ba) {
329 if (!skipSignature && closeCode)
330 *ba += closeCode;
331 } else if (parent && ok) {
332 // On error the whole message is discarded anyway (see toDBusMessage);
333 // closing a partially-written container would make libdbus abort.
335 }
336}
337
338void QDBusMarshaller::error(const QString &msg)
339{
340 ok = false;
341 if (parent)
342 parent->error(msg);
343 else
344 errorString = msg;
345}
346
347bool QDBusMarshaller::appendVariantInternal(const QVariant &arg)
348{
349 QMetaType id = arg.metaType();
350 if (!id.isValid()) {
351 qWarning("QDBusMarshaller: cannot add an invalid QVariant");
352 error("Invalid QVariant passed in arguments"_L1);
353 return false;
354 }
355
356 // intercept QDBusArgument parameters here
357 if (id == QDBusMetaTypeId::argument()) {
358 QDBusArgument dbusargument = qvariant_cast<QDBusArgument>(arg);
359 QDBusArgumentPrivate *d = QDBusArgumentPrivate::d(dbusargument);
360 if (!d->message)
361 return false; // can't append this one...
362
363 QDBusDemarshaller demarshaller(capabilities);
364 demarshaller.message = q_dbus_message_ref(d->message);
365
366 if (d->direction == Direction::Demarshalling) {
367 // it's demarshalling; just copy
368 demarshaller.iterator = static_cast<QDBusDemarshaller *>(d)->iterator;
369 } else {
370 // it's marshalling; start over
371 if (!q_dbus_message_iter_init(demarshaller.message, &demarshaller.iterator))
372 return false; // error!
373 }
374
375 bool ok = appendCrossMarshalling(&demarshaller);
376 if (!ok)
377 error("Failed to cross-marshal argument"_L1);
378 return ok;
379 }
380
381 const char *signature = QDBusMetaType::typeToSignature(id);
382 if (!signature) {
383 unregisteredTypeError(id);
384 return false;
385 }
386
387 switch (*signature) {
388#ifdef __OPTIMIZE__
389 case DBUS_TYPE_BYTE:
390 case DBUS_TYPE_INT16:
391 case DBUS_TYPE_UINT16:
392 case DBUS_TYPE_INT32:
393 case DBUS_TYPE_UINT32:
394 case DBUS_TYPE_INT64:
395 case DBUS_TYPE_UINT64:
396 case DBUS_TYPE_DOUBLE:
397 qIterAppend(&iterator, ba, *signature, arg.constData());
398 return true;
399 case DBUS_TYPE_BOOLEAN:
400 append( arg.toBool() );
401 return true;
402#else
403 case DBUS_TYPE_BYTE:
404 append( qvariant_cast<uchar>(arg) );
405 return true;
407 append( arg.toBool() );
408 return true;
409 case DBUS_TYPE_INT16:
410 append( qvariant_cast<short>(arg) );
411 return true;
412 case DBUS_TYPE_UINT16:
413 append( qvariant_cast<ushort>(arg) );
414 return true;
415 case DBUS_TYPE_INT32:
416 append( static_cast<dbus_int32_t>(arg.toInt()) );
417 return true;
418 case DBUS_TYPE_UINT32:
419 append( static_cast<dbus_uint32_t>(arg.toUInt()) );
420 return true;
421 case DBUS_TYPE_INT64:
422 append( arg.toLongLong() );
423 return true;
424 case DBUS_TYPE_UINT64:
425 append( arg.toULongLong() );
426 return true;
427 case DBUS_TYPE_DOUBLE:
428 append( arg.toDouble() );
429 return true;
430#endif
431
432 case DBUS_TYPE_STRING:
433 append( arg.toString() );
434 return true;
436 append( qvariant_cast<QDBusObjectPath>(arg) );
437 return true;
439 append( qvariant_cast<QDBusSignature>(arg) );
440 return true;
441
442 // compound types:
444 // nested QVariant
445 return append( qvariant_cast<QDBusVariant>(arg) );
446
447 case DBUS_TYPE_ARRAY:
448 // could be many things
449 // find out what kind of array it is
450 switch (arg.metaType().id()) {
451 case QMetaType::QStringList:
452 append( arg.toStringList() );
453 return true;
454
455 case QMetaType::QByteArray:
456 append( arg.toByteArray() );
457 return true;
458
459 default:
460 ;
461 }
462 Q_FALLTHROUGH();
463
464 case DBUS_TYPE_STRUCT:
466 return appendRegisteredType( arg );
467
470 qFatal("QDBusMarshaller::appendVariantInternal got a DICT_ENTRY!");
471 return false;
472
474 if (capabilities & QDBusConnection::UnixFileDescriptorPassing || ba) {
475 append(qvariant_cast<QDBusUnixFileDescriptor>(arg));
476 return true;
477 }
478 Q_FALLTHROUGH();
479
480 default:
481 qWarning("QDBusMarshaller::appendVariantInternal: Found unknown D-Bus type '%s'",
482 signature);
483 return false;
484 }
485
486 return true;
487}
488
489bool QDBusMarshaller::appendRegisteredType(const QVariant &arg)
490{
491 ref.ref(); // reference up
492 QDBusArgument self(QDBusArgumentPrivate::create(this));
493 return QDBusMetaType::marshall(self, arg.metaType(), arg.constData());
494}
495
496bool QDBusMarshaller::appendCrossMarshalling(QDBusDemarshaller *demarshaller)
497{
498 int code = q_dbus_message_iter_get_arg_type(&demarshaller->iterator);
499 if (QDBusUtil::isValidBasicType(code)) {
500 // easy: just append
501 // do exactly like the D-Bus docs suggest
502 // (see apidocs for q_dbus_message_iter_get_basic)
503
504 qlonglong value;
505 q_dbus_message_iter_get_basic(&demarshaller->iterator, &value);
507
508 if (code == DBUS_TYPE_UNIX_FD) {
509 // An fd is not a plain value: libdbus dups() it and can fail for
510 // a stale descriptor, leaving the writer without its typecode.
511 // Propagate the failure instead of crashing later in close().
512 int fd = int(value);
514 qWarning("QDBusMarshaller: cannot append unix file descriptor %d "
515 "while cross-marshalling; discarding the message", fd);
516 error("Failed to append unix file descriptor"_L1);
517 return false;
518 }
519 } else {
520 q_dbus_message_iter_append_basic(&iterator, code, &value);
521 }
522 return true;
523 }
524
525 if (code == DBUS_TYPE_ARRAY) {
526 int element = q_dbus_message_iter_get_element_type(&demarshaller->iterator);
527 if (QDBusUtil::isValidFixedType(element) && element != DBUS_TYPE_UNIX_FD) {
528 // another optimization: fixed size arrays
529 // code is exactly like QDBusDemarshaller::toByteArray
530 DBusMessageIter sub;
533 int len;
534 void* data;
536
537 char signature[2] = { char(element), 0 };
538 q_dbus_message_iter_open_container(&iterator, DBUS_TYPE_ARRAY, signature, &sub);
539 q_dbus_message_iter_append_fixed_array(&sub, element, &data, len);
541
542 return true;
543 }
544 }
545
546 // We have to recurse
547 QDBusDemarshaller *drecursed = demarshaller->beginCommon();
548
549 QDBusMarshaller mrecursed(capabilities); // create on the stack makes it autoclose
550 QByteArray subSignature;
551 const char *sig = nullptr;
552 if (code == DBUS_TYPE_VARIANT || code == DBUS_TYPE_ARRAY) {
553 subSignature = drecursed->currentSignature().toLatin1();
554 if (!subSignature.isEmpty())
555 sig = subSignature.constData();
556 }
557 open(mrecursed, code, sig);
558
559 while (!drecursed->atEnd()) {
560 if (!mrecursed.appendCrossMarshalling(drecursed)) {
561 delete drecursed;
562 return false;
563 }
564 }
565
566 delete drecursed;
567 return true;
568}
569
570QT_END_NAMESPACE
571
572#endif // QT_NO_DBUS
\inmodule QtDBus
QDBusDemarshaller * beginCommon()
DBusMessageIter iterator
QDBusArgument::ElementType currentType()
void append(const QString &arg)
void append(uchar arg)
QDBusMarshaller * parent
void append(short arg)
QDBusMarshaller * endMapEntry()
void append(double arg)
QDBusMarshaller * endCommon()
QDBusMarshaller * endStructure()
void append(bool arg)
void open(QDBusMarshaller &sub, int code, const char *signature)
QString currentSignature()
bool appendVariantInternal(const QVariant &arg)
QDBusMarshaller * beginMap(QMetaType kid, QMetaType vid)
QDBusMarshaller * endMap()
QDBusMarshaller * beginCommon(int code, const char *signature)
void append(const QDBusUnixFileDescriptor &arg)
QDBusMarshaller * beginMapEntry()
bool appendRegisteredType(const QVariant &arg)
void error(const QString &message)
QDBusMarshaller * beginStructure()
QDBusMarshaller * beginArray(QMetaType id)
bool appendCrossMarshalling(QDBusDemarshaller *arg)
DBusMessageIter iterator
QDBusMarshaller * endArray()
\inmodule QtDBus
\inmodule QtDBus
\inmodule QtDBus
quint32 dbus_uint32_t
#define DBUS_TYPE_SIGNATURE
#define DBUS_TYPE_BYTE_AS_STRING
#define DBUS_TYPE_OBJECT_PATH
#define DBUS_TYPE_BYTE
#define DBUS_TYPE_INT16
#define DBUS_TYPE_VARIANT
#define DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
#define DBUS_TYPE_INT32
#define DBUS_TYPE_UNIX_FD
#define DBUS_TYPE_BOOLEAN
#define DBUS_STRUCT_BEGIN_CHAR
dbus_uint32_t dbus_bool_t
#define DBUS_TYPE_STRING
qint32 dbus_int32_t
#define DBUS_TYPE_ARRAY
#define DBUS_TYPE_ARRAY_AS_STRING
#define DBUS_TYPE_STRING_AS_STRING
#define DBUS_TYPE_INT64
#define DBUS_TYPE_DOUBLE
#define DBUS_TYPE_UINT64
#define DBUS_TYPE_VARIANT_AS_STRING
#define DBUS_TYPE_DICT_ENTRY
#define DBUS_DICT_ENTRY_BEGIN_CHAR
#define DBUS_TYPE_UINT16
#define DBUS_DICT_ENTRY_END_CHAR_AS_STRING
#define DBUS_TYPE_STRUCT
#define DBUS_STRUCT_END_CHAR
#define DBUS_TYPE_UINT32
\inmodule QtDBus
Definition qdbusutil_p.h:33
Q_DBUS_EXPORT bool isValidFixedType(int c)
Returns true if c is a valid, fixed D-Bus type.
Q_DBUS_EXPORT bool isValidBasicType(int c)
Returns true if c is a valid, basic D-Bus type.
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return dbus_message_iter_recurse
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return dbus_message_iter_close_container
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return dbus_message_iter_append_basic
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void dbus_message_iter_get_fixed_array
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return dbus_message_ref
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return dbus_message_iter_next