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:significant reason:default
4
5#ifndef QDBUSREPLY_H
6#define QDBUSREPLY_H
7
8#include <QtDBus/qtdbusglobal.h>
9#include <QtCore/qvariant.h>
10
11#include <QtDBus/qdbusmessage.h>
12#include <QtDBus/qdbuserror.h>
13#include <QtDBus/qdbusextratypes.h>
14#include <QtDBus/qdbuspendingreply.h>
15
16#ifndef QT_NO_DBUS
17
18QT_BEGIN_NAMESPACE
19
20
21Q_DBUS_EXPORT void qDBusReplyFill(const QDBusMessage &reply, QDBusError &error, QVariant &data);
22
23template<typename T>
24class QDBusReply
25{
26 typedef T Type;
27public:
28 inline QDBusReply(const QDBusMessage &reply)
29 {
30 *this = reply;
31 }
32 inline QDBusReply(const QDBusReply &) = default;
33 inline QDBusReply& operator=(const QDBusMessage &reply)
34 {
35 QVariant data(QMetaType::fromType<Type>());
36 qDBusReplyFill(reply, error&: m_error, data);
37 m_data = qvariant_cast<Type>(data);
38 return *this;
39 }
40
41 inline QDBusReply(const QDBusPendingCall &pcall)
42 {
43 *this = pcall;
44 }
45 inline QDBusReply &operator=(const QDBusPendingCall &pcall)
46 {
47 QDBusPendingCall other(pcall);
48 other.waitForFinished();
49 return *this = other.reply();
50 }
51 inline QDBusReply(const QDBusPendingReply<T> &reply)
52 {
53 *this = static_cast<QDBusPendingCall>(reply);
54 }
55
56 inline QDBusReply(const QDBusError &dbusError = QDBusError())
57 : m_error(dbusError), m_data(Type())
58 {
59 }
60 inline QDBusReply& operator=(const QDBusError& dbusError)
61 {
62 m_error = dbusError;
63 m_data = Type();
64 return *this;
65 }
66
67 inline QDBusReply& operator=(const QDBusReply& other)
68 {
69 m_error = other.m_error;
70 m_data = other.m_data;
71 return *this;
72 }
73
74 inline bool isValid() const { return !m_error.isValid(); }
75
76 inline const QDBusError& error() { return m_error; }
77 inline const QDBusError& error() const { return m_error; }
78
79 inline Type value() const
80 {
81 return m_data;
82 }
83
84 inline operator Type () const
85 {
86 return m_data;
87 }
88
89private:
90 QDBusError m_error;
91 Type m_data;
92};
93
94# ifndef Q_QDOC
95// specialize for QVariant:
96template<> inline QDBusReply<QVariant>&
97QDBusReply<QVariant>::operator=(const QDBusMessage &reply)
98{
99 QVariant data(QMetaType::fromType<QDBusVariant>());
100 qDBusReplyFill(reply, error&: m_error, data);
101 m_data = qvariant_cast<QDBusVariant>(v: data).variant();
102 return *this;
103}
104
105// specialize for void:
106template<>
107class QDBusReply<void>
108{
109public:
110 inline QDBusReply(const QDBusMessage &reply)
111 : m_error(reply)
112 {
113 }
114 inline QDBusReply& operator=(const QDBusMessage &reply)
115 {
116 m_error = QDBusError(reply);
117 return *this;
118 }
119 inline QDBusReply(const QDBusError &dbusError = QDBusError())
120 : m_error(dbusError)
121 {
122 }
123 inline QDBusReply(const QDBusPendingCall &pcall)
124 {
125 *this = pcall;
126 }
127 inline QDBusReply &operator=(const QDBusPendingCall &pcall)
128 {
129 QDBusPendingCall other(pcall);
130 other.waitForFinished();
131 return *this = other.reply();
132 }
133 inline QDBusReply& operator=(const QDBusError& dbusError)
134 {
135 m_error = dbusError;
136 return *this;
137 }
138
139 inline QDBusReply(const QDBusReply &) = default;
140
141 inline QDBusReply& operator=(const QDBusReply& other)
142 {
143 m_error = other.m_error;
144 return *this;
145 }
146
147 inline bool isValid() const { return !m_error.isValid(); }
148
149 inline const QDBusError& error() { return m_error; }
150 inline const QDBusError& error() const { return m_error; }
151
152private:
153 QDBusError m_error;
154};
155# endif
156
157QT_END_NAMESPACE
158
159#endif // QT_NO_DBUS
160#endif
161

source code of qtbase/src/dbus/qdbusreply.h