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
qdbusargument.h
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#ifndef QDBUSARGUMENT_H
5#define QDBUSARGUMENT_H
6
7#include <QtDBus/qtdbusglobal.h>
8#include <QtCore/qbytearray.h>
9#include <QtCore/qhash.h>
10#include <QtCore/qglobal.h>
11#include <QtCore/qlist.h>
12#include <QtCore/qmap.h>
13#include <QtCore/qstring.h>
14#include <QtCore/qstringlist.h>
15#include <QtCore/qvariant.h>
16#include <QtDBus/qdbusextratypes.h>
17
18#ifndef QT_NO_DBUS
19
21
22
24
27class QDBusMarshaller;
28class Q_DBUS_EXPORT QDBusArgument
29{
30public:
40
43 QDBusArgument(QDBusArgument &&other) noexcept : d(other.d) { other.d = nullptr; }
44 QDBusArgument &operator=(QDBusArgument &&other) noexcept { swap(other); return *this; }
45 QDBusArgument &operator=(const QDBusArgument &other);
47
48 void swap(QDBusArgument &other) noexcept { qt_ptr_swap(d, other.d); }
49
50 // used for marshalling (Qt -> D-Bus)
67
68 void beginStructure();
69 void endStructure();
70 void beginArray(int elementMetaTypeId)
71 { beginArray(QMetaType(elementMetaTypeId)); }
72 void beginArray(QMetaType elementMetaType);
73 void endArray();
74 void beginMap(int keyMetaTypeId, int valueMetaTypeId)
75 { beginMap(QMetaType(keyMetaTypeId), QMetaType(valueMetaTypeId)); }
76 void beginMap(QMetaType keyMetaType, QMetaType valueMetaType);
77 void endMap();
78 void beginMapEntry();
79 void endMapEntry();
80
81 void appendVariant(const QVariant &v);
82
83 // used for de-marshalling (D-Bus -> Qt)
84 QString currentSignature() const;
85 ElementType currentType() const;
86
87 const QDBusArgument &operator>>(uchar &arg) const;
88 const QDBusArgument &operator>>(bool &arg) const;
89 const QDBusArgument &operator>>(short &arg) const;
90 const QDBusArgument &operator>>(ushort &arg) const;
91 const QDBusArgument &operator>>(int &arg) const;
92 const QDBusArgument &operator>>(uint &arg) const;
95 const QDBusArgument &operator>>(double &arg) const;
96 const QDBusArgument &operator>>(QString &arg) const;
102 const QDBusArgument &operator>>(QByteArray &arg) const;
103
104 void beginStructure() const;
105 void endStructure() const;
106 void beginArray() const;
107 void endArray() const;
108 void beginMap() const;
109 void endMap() const;
110 void beginMapEntry() const;
111 void endMapEntry() const;
112 bool atEnd() const;
113
114 QVariant asVariant() const;
115
116protected:
120};
121Q_DECLARE_SHARED(QDBusArgument)
122
126
127template<typename T> inline T qdbus_cast(const QDBusArgument &arg)
128{
129 T item;
130 arg >> item;
131 return item;
132}
133
134template<typename T> inline T qdbus_cast(const QVariant &v)
135{
136 if (v.metaType() == QMetaType::fromType<QDBusArgument>())
137 return qdbus_cast<T>(qvariant_cast<QDBusArgument>(v));
138 else
139 return qvariant_cast<T>(v);
140}
141
142// specialize for QVariant, allowing it to be used in place of QDBusVariant
144{
146 arg >> item;
147 return item.variant();
148}
149template<> inline QVariant qdbus_cast<QVariant>(const QVariant &v)
150{
151 return qdbus_cast<QDBusVariant>(v).variant();
152}
153
154Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QVariant &v);
155
156// QVariant types
157#ifndef QDBUS_NO_SPECIALTYPES
158
159Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QDate &date);
160Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QDate &date);
161
162Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QTime &time);
163Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QTime &time);
164
165Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QDateTime &dt);
166Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QDateTime &dt);
167
168Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QRect &rect);
169Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QRect &rect);
170
171Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QRectF &rect);
172Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QRectF &rect);
173
174Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QSize &size);
175Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QSize &size);
176
177Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QSizeF &size);
178Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QSizeF &size);
179
180Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QPoint &pt);
181Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QPoint &pt);
182
183Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QPointF &pt);
184Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QPointF &pt);
185
186Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QLine &line);
187Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QLine &line);
188
189Q_DBUS_EXPORT const QDBusArgument &operator>>(const QDBusArgument &a, QLineF &line);
190Q_DBUS_EXPORT QDBusArgument &operator<<(QDBusArgument &a, const QLineF &line);
191#endif
192
193template<template <typename> class Container, typename T,
194 typename = typename Container<T>::iterator>
195inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<T> &list)
196{
197 arg.beginArray(QMetaType::fromType<T>());
198 typename Container<T>::const_iterator it = list.begin();
199 typename Container<T>::const_iterator end = list.end();
200 for ( ; it != end; ++it)
201 arg << *it;
202 arg.endArray();
203 return arg;
204}
205
206template<template <typename> class Container, typename T,
207 typename = typename Container<T>::iterator>
208inline const QDBusArgument &operator>>(const QDBusArgument &arg, Container<T> &list)
209{
210 arg.beginArray();
211 list.clear();
212 while (!arg.atEnd()) {
213 T item;
214 arg >> item;
216 }
217
218 arg.endArray();
219 return arg;
220}
221
223{
224 arg.beginArray(QMetaType::fromType<QDBusVariant>());
225 for (const QVariant &value : list)
227 arg.endArray();
228 return arg;
229}
230
231// Specializations for associative containers
232template <template <typename, typename> class Container, typename Key, typename T,
234inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<Key, T> &map)
235{
236 arg.beginMap(QMetaType::fromType<Key>(), QMetaType::fromType<T>());
237 auto it = map.begin();
238 auto end = map.end();
239 for ( ; it != end; ++it) {
240 arg.beginMapEntry();
241 arg << it.key() << it.value();
242 arg.endMapEntry();
243 }
244 arg.endMap();
245 return arg;
246}
247
248template <template <typename, typename> class Container, typename Key, typename T,
250inline QDBusArgument &operator<<(QDBusArgument &arg, const Container<Key, T> &map)
251{
252 arg.beginMap(QMetaType::fromType<Key>(), QMetaType::fromType<T>());
253 auto it = map.begin();
254 auto end = map.end();
255 for ( ; it != end; ++it) {
256 arg.beginMapEntry();
257 arg << it->first << it->second;
258 arg.endMapEntry();
259 }
260 arg.endMap();
261 return arg;
262}
263
264template <template <typename, typename> class Container, typename Key, typename T,
266inline const QDBusArgument &operator>>(const QDBusArgument &arg, Container<Key, T> &map)
267{
268 arg.beginMap();
269 map.clear();
270 while (!arg.atEnd()) {
271 Key key;
272 T value;
273 arg.beginMapEntry();
274 arg >> key >> value;
276 arg.endMapEntry();
277 }
278 arg.endMap();
279 return arg;
280}
281
283{
284 arg.beginMap(QMetaType::fromType<QString>(), QMetaType::fromType<QDBusVariant>());
285 for (const auto &[key, value] : map.asKeyValueRange()) {
286 arg.beginMapEntry();
287 arg << key << QDBusVariant(value);
288 arg.endMapEntry();
289 }
290 arg.endMap();
291 return arg;
292}
293
295{
296 arg.beginMap(QMetaType::fromType<QString>(), QMetaType::fromType<QDBusVariant>());
297 for (const auto &[key, value] : map.asKeyValueRange()) {
298 arg.beginMapEntry();
299 arg << key << QDBusVariant(value);
300 arg.endMapEntry();
301 }
302 arg.endMap();
303 return arg;
304}
305
306template <typename T1, typename T2>
307inline QDBusArgument &operator<<(QDBusArgument &arg, const std::pair<T1, T2> &pair)
308{
309 arg.beginStructure();
310 arg << pair.first << pair.second;
311 arg.endStructure();
312 return arg;
313}
314
315template <typename T1, typename T2>
316inline const QDBusArgument &operator>>(const QDBusArgument &arg, std::pair<T1, T2> &pair)
317{
318 arg.beginStructure();
319 arg >> pair.first >> pair.second;
320 arg.endStructure();
321 return arg;
322}
323
325
326#endif // QT_NO_DBUS
327#endif
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtDBus
QDBusArgument & operator=(QDBusArgument &&other) noexcept
QDBusArgumentPrivate * d
void swap(QDBusArgument &other) noexcept
Swaps this QDBusArgument instance with other.
void beginArray(int elementMetaTypeId)
QDBusArgument(QDBusArgument &&other) noexcept
void beginMap(int keyMetaTypeId, int valueMetaTypeId)
\inmodule QtDBus
\inmodule QtDBus
\inmodule QtDBus
\inmodule QtCore\reentrant
Definition qdatetime.h:283
\inmodule QtCore \reentrant
Definition qdatetime.h:29
\inmodule QtCore\compares equality \compareswith equality QLine \endcompareswith
Definition qline.h:192
\inmodule QtCore\compares equality \compareswith equality QLineF \endcompareswith
Definition qline.h:18
void push_back(parameter_type t)
Definition qlist.h:675
iterator end()
Definition qlist.h:626
iterator begin()
Definition qlist.h:625
void clear()
Definition qlist.h:434
iterator insert(const Key &key, const T &value)
Definition qmap.h:688
auto asKeyValueRange() &
Definition qmap.h:614
void clear()
Definition qmap.h:289
iterator begin()
Definition qmap.h:598
iterator end()
Definition qmap.h:602
\inmodule QtCore
Definition qmetatype.h:341
\inmodule QtCore\reentrant
Definition qpoint.h:217
\inmodule QtCore\reentrant
Definition qpoint.h:25
\inmodule QtCore\reentrant
Definition qrect.h:484
\inmodule QtCore\reentrant
Definition qrect.h:30
\inmodule QtCore
Definition qsize.h:208
\inmodule QtCore
Definition qsize.h:25
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore \reentrant
Definition qdatetime.h:215
\inmodule QtCore
Definition qvariant.h:65
QMap< QString, QString > map
[6]
QDate date
[1]
QSet< QString >::iterator it
rect
[4]
Combined button and popup list for selecting options.
std::enable_if_t< std::conjunction_v< std::negation< qxp::is_detected< KeyAndValueTest, Iterator > >, qxp::is_detected< FirstAndSecondTest, Iterator > >, bool > IfAssociativeIteratorHasFirstAndSecond
std::enable_if_t< qxp::is_detected_v< KeyAndValueTest, Iterator >, bool > IfAssociativeIteratorHasKeyAndValue
QVariant qdbus_cast< QVariant >(const QDBusArgument &arg)
QT_END_NAMESPACE QT_BEGIN_NAMESPACE T qdbus_cast(const QDBusArgument &arg)
Q_DBUS_EXPORT QDBusArgument & operator<<(QDBusArgument &a, const QDate &date)
Q_DBUS_EXPORT const QDBusArgument & operator>>(const QDBusArgument &a, QVariant &v)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
static void appendVariant(QCborContainerPrivate *d, const QVariant &variant)
#define QT_DECL_METATYPE_EXTERN(TYPE, EXPORT)
Definition qmetatype.h:1388
GLsizei const GLfloat * v
[13]
GLuint64 key
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint GLuint end
SSL_CTX int void * arg
constexpr void qt_ptr_swap(T *&lhs, T *&rhs) noexcept
Definition qswap.h:29
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]
settings endArray()
QDataStream & operator<<(QDataStream &out, const MyClass &myObj)
[4]
QDataStream & operator>>(QDataStream &in, MyClass &myObj)
writer endMap()
QSharedPointer< T > other(t)
[5]
this swap(other)
QGraphicsItem * item