Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qdbusdemarshaller.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
4#include "qdbusargument_p.h"
5#include "qdbusconnection.h"
6
7#include <memory>
8
9#include <stdlib.h>
10
12
13template <typename T>
14static inline T qIterGet(DBusMessageIter *it)
15{
16 // Use a union of expected and largest type q_dbus_message_iter_get_basic
17 // will return to ensure reading the wrong basic type does not result in
18 // stack overwrite
19 union {
20 // The value to be extracted
21 T t;
22 // Largest type that q_dbus_message_iter_get_basic will return
23 // according to dbus_message_iter_get_basic API documentation
25 // A pointer to ensure no stack overwrite in case there is a platform
26 // where sizeof(void*) > sizeof(dbus_uint64_t)
27 void* ptr;
28 } value;
29
30 // Initialize the value in case a narrower type is extracted to it.
31 // Note that the result of extracting a narrower type in place of a wider
32 // one and vice-versa will be platform-dependent.
33 value.t = T();
34
35 q_dbus_message_iter_get_basic(it, &value);
36 q_dbus_message_iter_next(it);
37 return value.t;
38}
39
43
45{
46 char *sig = q_dbus_message_iter_get_signature(&iterator);
47 QString retval = QString::fromUtf8(sig);
48 q_dbus_free(sig);
49
50 return retval;
51}
52
54{
55 return qIterGet<uchar>(&iterator);
56}
57
59{
60 return bool(qIterGet<dbus_bool_t>(&iterator));
61}
62
64{
65 return qIterGet<dbus_uint16_t>(&iterator);
66}
67
69{
70 return qIterGet<dbus_int16_t>(&iterator);
71}
72
74{
75 return qIterGet<dbus_int32_t>(&iterator);
76}
77
79{
80 return qIterGet<dbus_uint32_t>(&iterator);
81}
82
84{
85 return qIterGet<qlonglong>(&iterator);
86}
87
89{
90 return qIterGet<qulonglong>(&iterator);
91}
92
94{
95 return qIterGet<double>(&iterator);
96}
97
98inline QString QDBusDemarshaller::toStringUnchecked()
99{
100 return QString::fromUtf8(qIterGet<char *>(&iterator));
101}
102
104{
106 return toStringUnchecked();
107 else
108 return QString();
109}
110
111inline QDBusObjectPath QDBusDemarshaller::toObjectPathUnchecked()
112 {
113 return QDBusObjectPath(QString::fromUtf8(qIterGet<char *>(&iterator)));
114 }
115
117{
119 return toObjectPathUnchecked();
120 else
121 return QDBusObjectPath();
122}
123
124inline QDBusSignature QDBusDemarshaller::toSignatureUnchecked()
125 {
126 return QDBusSignature(QString::fromUtf8(qIterGet<char *>(&iterator)));
127 }
128
130{
132 return toSignatureUnchecked();
133 else
134 return QDBusSignature();
135}
136
143
145{
147 sub.message = q_dbus_message_ref(message);
148 q_dbus_message_iter_recurse(&iterator, &sub.iterator);
149 q_dbus_message_iter_next(&iterator);
150
151 return QDBusVariant( sub.toVariantInternal() );
152}
153
155{
156 switch (q_dbus_message_iter_get_arg_type(&iterator)) {
157 case DBUS_TYPE_BYTE:
158 case DBUS_TYPE_INT16:
159 case DBUS_TYPE_UINT16:
160 case DBUS_TYPE_INT32:
161 case DBUS_TYPE_UINT32:
162 case DBUS_TYPE_INT64:
163 case DBUS_TYPE_UINT64:
165 case DBUS_TYPE_DOUBLE:
166 case DBUS_TYPE_STRING:
170
173
174 case DBUS_TYPE_ARRAY:
175 switch (q_dbus_message_iter_get_element_type(&iterator)) {
176 case DBUS_TYPE_BYTE:
177 case DBUS_TYPE_STRING:
178 // QByteArray and QStringList
182 default:
184 }
185
186 case DBUS_TYPE_STRUCT:
190
194
197
198// default:
199// qWarning("QDBusDemarshaller: Found unknown D-Bus type %d '%c'",
200// q_dbus_message_iter_get_arg_type(&iterator),
201// q_dbus_message_iter_get_arg_type(&iterator));
202 }
204}
205
207{
208 switch (q_dbus_message_iter_get_arg_type(&iterator)) {
209 case DBUS_TYPE_BYTE:
210 return QVariant::fromValue(toByte());
211 case DBUS_TYPE_INT16:
213 case DBUS_TYPE_UINT16:
215 case DBUS_TYPE_INT32:
216 return toInt();
217 case DBUS_TYPE_UINT32:
218 return toUInt();
219 case DBUS_TYPE_DOUBLE:
220 return toDouble();
222 return toBool();
223 case DBUS_TYPE_INT64:
224 return toLongLong();
225 case DBUS_TYPE_UINT64:
226 return toULongLong();
227 case DBUS_TYPE_STRING:
228 return toStringUnchecked();
230 return QVariant::fromValue(toObjectPathUnchecked());
232 return QVariant::fromValue(toSignatureUnchecked());
235
236 case DBUS_TYPE_ARRAY:
237 switch (q_dbus_message_iter_get_element_type(&iterator)) {
238 case DBUS_TYPE_BYTE:
239 // QByteArray
240 return toByteArrayUnchecked();
241 case DBUS_TYPE_STRING:
242 return toStringListUnchecked();
245
246 default:
248 }
249
250 case DBUS_TYPE_STRUCT:
252
257
258 default:
259// qWarning("QDBusDemarshaller: Found unknown D-Bus type %d '%c'",
260// q_dbus_message_iter_get_arg_type(&iterator),
261// q_dbus_message_iter_get_arg_type(&iterator));
262 char *ptr = nullptr;
263 ptr += q_dbus_message_iter_get_arg_type(&iterator);
264 q_dbus_message_iter_next(&iterator);
265
266 // I hope you never dereference this pointer!
267 return QVariant::fromValue<void *>(ptr);
268 };
269}
270
272{
273 const int type = q_dbus_message_iter_get_arg_type(&iterator);
274 switch (type) {
275 case DBUS_TYPE_STRING: //FALLTHROUGH
276 case DBUS_TYPE_OBJECT_PATH: //FALLTHROUGH
278 return true;
279 default:
280 return false;
281 }
282}
283
284QStringList QDBusDemarshaller::toStringListUnchecked()
285{
287
289 q_dbus_message_iter_recurse(&iterator, &sub.iterator);
290 q_dbus_message_iter_next(&iterator);
291 while (!sub.atEnd())
292 list.append(sub.toStringUnchecked());
293
294 return list;
295}
296
298{
299 if (q_dbus_message_iter_get_arg_type(&iterator) == DBUS_TYPE_ARRAY
300 && q_dbus_message_iter_get_element_type(&iterator) == DBUS_TYPE_STRING)
301 return toStringListUnchecked();
302 else
303 return QStringList();
304}
305
306QByteArray QDBusDemarshaller::toByteArrayUnchecked()
307{
309 q_dbus_message_iter_recurse(&iterator, &sub);
310 q_dbus_message_iter_next(&iterator);
311 int len;
312 char* data;
313 q_dbus_message_iter_get_fixed_array(&sub,&data,&len);
314 return QByteArray(data,len);
315}
316
318{
319 if (q_dbus_message_iter_get_arg_type(&iterator) == DBUS_TYPE_ARRAY
320 && q_dbus_message_iter_get_element_type(&iterator) == DBUS_TYPE_BYTE) {
321 return toByteArrayUnchecked();
322 }
323 return QByteArray();
324}
325
327{
328 // dbus_message_iter_has_next is broken if the list has one single element
329 return q_dbus_message_iter_get_arg_type(&iterator) == DBUS_TYPE_INVALID;
330}
331
336
341
346
351
353{
355 d->parent = this;
356 d->message = q_dbus_message_ref(message);
357
358 // recurse
359 q_dbus_message_iter_recurse(&iterator, &d->iterator);
360 q_dbus_message_iter_next(&iterator);
361 return d;
362}
363
368
373
375{
376 return endCommon();
377}
378
383
385{
386 QDBusDemarshaller *retval = parent;
387 delete this;
388 return retval;
389}
390
392{
393 std::unique_ptr<QDBusDemarshaller> d(new QDBusDemarshaller(capabilities));
394 d->iterator = iterator;
395 d->message = q_dbus_message_ref(message);
396
397 q_dbus_message_iter_next(&iterator);
398 return QDBusArgumentPrivate::create(d.release());
399}
400
\inmodule QtCore
Definition qbytearray.h:57
static QDBusArgument create(QDBusArgumentPrivate *d)
QDBusConnection::ConnectionCapabilities capabilities
\inmodule QtDBus
QDBusDemarshaller * beginArray()
QDBusArgument duplicate()
QDBusDemarshaller * endArray()
QDBusDemarshaller * endStructure()
QDBusDemarshaller * endMapEntry()
QDBusSignature toSignature()
QDBusUnixFileDescriptor toUnixFileDescriptor()
QDBusObjectPath toObjectPath()
QDBusDemarshaller * beginStructure()
QDBusDemarshaller * endCommon()
QDBusDemarshaller * beginMapEntry()
QDBusDemarshaller(QDBusConnection::ConnectionCapabilities flags={})
QDBusDemarshaller * beginCommon()
DBusMessageIter iterator
QDBusDemarshaller * endMap()
QDBusDemarshaller * beginMap()
QDBusDemarshaller * parent
QDBusArgument::ElementType currentType()
\inmodule QtDBus
\inmodule QtDBus
void giveFileDescriptor(int fileDescriptor)
\inmodule QtDBus
void append(parameter_type t)
Definition qlist.h:458
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:6018
\inmodule QtCore
Definition qvariant.h:65
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
Definition qvariant.h:536
#define DBUS_TYPE_SIGNATURE
#define DBUS_TYPE_OBJECT_PATH
#define DBUS_TYPE_BYTE
#define DBUS_TYPE_INT16
#define DBUS_TYPE_VARIANT
#define DBUS_TYPE_INT32
#define DBUS_TYPE_UNIX_FD
#define DBUS_TYPE_BOOLEAN
#define DBUS_TYPE_STRING
#define DBUS_TYPE_ARRAY
#define DBUS_TYPE_INVALID
#define DBUS_TYPE_INT64
#define DBUS_TYPE_DOUBLE
#define DBUS_TYPE_UINT64
#define DBUS_TYPE_DICT_ENTRY
#define DBUS_TYPE_UINT16
#define DBUS_TYPE_STRUCT
#define DBUS_TYPE_UINT32
quint64 dbus_uint64_t
QSet< QString >::iterator it
Combined button and popup list for selecting options.
#define Q_FALLTHROUGH()
QList< QString > QStringList
Constructs a string list that contains the given string, str.
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 * sub
static QT_BEGIN_NAMESPACE T qIterGet(DBusMessageIter *it)
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static ControlElement< T > * ptr(QWidget *widget)
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum type
GLuint GLsizei const GLchar * message
GLuint64 GLenum GLint fd
GLdouble GLdouble t
Definition qopenglext.h:243
GLenum GLsizei len
unsigned char uchar
Definition qtypes.h:32
quint64 qulonglong
Definition qtypes.h:64
unsigned int uint
Definition qtypes.h:34
unsigned short ushort
Definition qtypes.h:33
qint64 qlonglong
Definition qtypes.h:63
QList< int > list
[14]