1
/****************************************************************************
3
** Copyright (C) 2016 The Qt Company Ltd.
4
** Contact: https://www.qt.io/licensing/
6
** This file is part of the QtDBus module of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
9
** Commercial License Usage
10
** Licensees holding valid commercial Qt licenses may use this file in
11
** accordance with the commercial license agreement provided with the
12
** Software or, alternatively, in accordance with the terms contained in
13
** a written agreement between you and The Qt Company. For licensing terms
14
** and conditions see https://www.qt.io/terms-conditions. For further
15
** information use the contact form at https://www.qt.io/contact-us.
17
** GNU Lesser General Public License Usage
18
** Alternatively, this file may be used under the terms of the GNU Lesser
19
** General Public License version 3 as published by the Free Software
20
** Foundation and appearing in the file LICENSE.LGPL3 included in the
21
** packaging of this file. Please review the following information to
22
** ensure the GNU Lesser General Public License version 3 requirements
23
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
25
** GNU General Public License Usage
26
** Alternatively, this file may be used under the terms of the GNU
27
** General Public License version 2.0 or (at your option) the GNU General
28
** Public license version 3 or any later version approved by the KDE Free
29
** Qt Foundation. The licenses are as published by the Free Software
30
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31
** included in the packaging of this file. Please review the following
32
** information to ensure the GNU General Public License requirements will
33
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34
** https://www.gnu.org/licenses/gpl-3.0.html.
38
****************************************************************************/
40
#include "qdbuserror.h"
43
#include <qvarlengtharray.h>
45
#ifndef QT_BOOTSTRAPPED
46
#include "qdbus_symbols_p.h"
47
#include "qdbusmessage.h"
48
#include "qdbusmessage_p.h"
56
* Use the following Perl script to generate the error string index list:
57
===== PERL SCRIPT ====
58
print "static const char errorMessages_string[] =\n";
64
$sizes[$i++] = $counter;
65
$counter += 1 + length $_;
67
print " \"\\0\";\n\nstatic const int errorMessages_indices[] = {\n ";
68
for ($j = 0; $j < $i; ++$j) {
69
printf "$sizes[$j], ";
72
===== PERL SCRIPT ====
74
* The input data is as follows:
76
org.freedesktop.DBus.Error.Failed
77
org.freedesktop.DBus.Error.NoMemory
78
org.freedesktop.DBus.Error.ServiceUnknown
79
org.freedesktop.DBus.Error.NoReply
80
org.freedesktop.DBus.Error.BadAddress
81
org.freedesktop.DBus.Error.NotSupported
82
org.freedesktop.DBus.Error.LimitsExceeded
83
org.freedesktop.DBus.Error.AccessDenied
84
org.freedesktop.DBus.Error.NoServer
85
org.freedesktop.DBus.Error.Timeout
86
org.freedesktop.DBus.Error.NoNetwork
87
org.freedesktop.DBus.Error.AddressInUse
88
org.freedesktop.DBus.Error.Disconnected
89
org.freedesktop.DBus.Error.InvalidArgs
90
org.freedesktop.DBus.Error.UnknownMethod
91
org.freedesktop.DBus.Error.TimedOut
92
org.freedesktop.DBus.Error.InvalidSignature
93
org.freedesktop.DBus.Error.UnknownInterface
94
org.freedesktop.DBus.Error.UnknownObject
95
org.freedesktop.DBus.Error.UnknownProperty
96
org.freedesktop.DBus.Error.PropertyReadOnly
97
org.qtproject.QtDBus.Error.InternalError
98
org.qtproject.QtDBus.Error.InvalidService
99
org.qtproject.QtDBus.Error.InvalidObjectPath
100
org.qtproject.QtDBus.Error.InvalidInterface
101
org.qtproject.QtDBus.Error.InvalidMember
104
// in the same order as KnownErrors!
105
static const char errorMessages_string[] =
107
"org.freedesktop.DBus.Error.Failed\0"
108
"org.freedesktop.DBus.Error.NoMemory\0"
109
"org.freedesktop.DBus.Error.ServiceUnknown\0"
110
"org.freedesktop.DBus.Error.NoReply\0"
111
"org.freedesktop.DBus.Error.BadAddress\0"
112
"org.freedesktop.DBus.Error.NotSupported\0"
113
"org.freedesktop.DBus.Error.LimitsExceeded\0"
114
"org.freedesktop.DBus.Error.AccessDenied\0"
115
"org.freedesktop.DBus.Error.NoServer\0"
116
"org.freedesktop.DBus.Error.Timeout\0"
117
"org.freedesktop.DBus.Error.NoNetwork\0"
118
"org.freedesktop.DBus.Error.AddressInUse\0"
119
"org.freedesktop.DBus.Error.Disconnected\0"
120
"org.freedesktop.DBus.Error.InvalidArgs\0"
121
"org.freedesktop.DBus.Error.UnknownMethod\0"
122
"org.freedesktop.DBus.Error.TimedOut\0"
123
"org.freedesktop.DBus.Error.InvalidSignature\0"
124
"org.freedesktop.DBus.Error.UnknownInterface\0"
125
"org.freedesktop.DBus.Error.UnknownObject\0"
126
"org.freedesktop.DBus.Error.UnknownProperty\0"
127
"org.freedesktop.DBus.Error.PropertyReadOnly\0"
128
"org.qtproject.QtDBus.Error.InternalError\0"
129
"org.qtproject.QtDBus.Error.InvalidService\0"
130
"org.qtproject.QtDBus.Error.InvalidObjectPath\0"
131
"org.qtproject.QtDBus.Error.InvalidInterface\0"
132
"org.qtproject.QtDBus.Error.InvalidMember\0"
135
static const int errorMessages_indices[] = {
136
0, 6, 40, 76, 118, 153, 191, 231,
137
273, 313, 349, 384, 421, 461, 501, 540,
138
581, 617, 661, 705, 746, 789, 833, 874,
142
static const int errorMessages_count = sizeof errorMessages_indices /
143
sizeof errorMessages_indices[0];
145
static inline const char *get(QDBusError::ErrorType code)
147
int intcode = qBound(0, int(code) - int(QDBusError::Other), errorMessages_count);
148
return errorMessages_string + errorMessages_indices[intcode];
151
#ifndef QT_BOOTSTRAPPED
152
static inline QDBusError::ErrorType get(const char *name)
155
return QDBusError::NoError;
156
for (int i = 0; i < errorMessages_count; ++i)
157
if (strcmp(name, errorMessages_string + errorMessages_indices[i]) == 0)
158
return QDBusError::ErrorType(i + int(QDBusError::Other));
159
return QDBusError::Other;
168
\brief The QDBusError class represents an error received from the
169
D-Bus bus or from remote applications found in the bus.
171
When dealing with the D-Bus bus service or with remote
172
applications over D-Bus, a number of error conditions can
173
happen. This error conditions are sometimes signalled by a
174
returned error value or by a QDBusError.
176
C++ and Java exceptions are a valid analogy for D-Bus errors:
177
instead of returning normally with a return value, remote
178
applications and the bus may decide to throw an error
179
condition. However, the Qt D-Bus implementation does not use the C++
180
exception-throwing mechanism, so you will receive QDBusErrors in
181
the return reply (see QDBusReply::error()).
183
QDBusError objects are used to inspect the error name and message
184
as received from the bus and remote applications. You should not
185
create such objects yourself to signal error conditions when
186
called from D-Bus: instead, use QDBusMessage::createError() and
187
QDBusConnection::send().
189
\sa QDBusConnection::send(), QDBusMessage, QDBusReply
193
\enum QDBusError::ErrorType
195
In order to facilitate verification of the most common D-Bus errors generated by the D-Bus
196
implementation and by the bus daemon itself, QDBusError can be compared to a set of pre-defined
199
\value NoError QDBusError is invalid (i.e., the call succeeded)
200
\value Other QDBusError contains an error that is one of the well-known ones
201
\value Failed The call failed (\c org.freedesktop.DBus.Error.Failed)
202
\value NoMemory Out of memory (\c org.freedesktop.DBus.Error.NoMemory)
203
\value ServiceUnknown The called service is not known
204
(\c org.freedesktop.DBus.Error.ServiceUnknown)
205
\value NoReply The called method did not reply within the specified timeout
206
(\c org.freedesktop.DBus.Error.NoReply)
207
\value BadAddress The address given is not valid
208
(\c org.freedesktop.DBus.Error.BadAddress)
209
\value NotSupported The call/operation is not supported
210
(\c org.freedesktop.DBus.Error.NotSupported)
211
\value LimitsExceeded The limits allocated to this process/call/connection exceeded the
212
pre-defined values (\c org.freedesktop.DBus.Error.LimitsExceeded)
213
\value AccessDenied The call/operation tried to access a resource it isn't allowed to
214
(\c org.freedesktop.DBus.Error.AccessDenied)
215
\value NoServer \e {Documentation doesn't say what this is for}
216
(\c org.freedesktop.DBus.Error.NoServer)
217
\value Timeout \e {Documentation doesn't say what this is for or how it's used}
218
(\c org.freedesktop.DBus.Error.Timeout)
219
\value NoNetwork \e {Documentation doesn't say what this is for}
220
(\c org.freedesktop.DBus.Error.NoNetwork)
221
\value AddressInUse QDBusServer tried to bind to an address that is already in use
222
(\c org.freedesktop.DBus.Error.AddressInUse)
223
\value Disconnected The call/process/message was sent after QDBusConnection disconnected
224
(\c org.freedesktop.DBus.Error.Disconnected)
225
\value InvalidArgs The arguments passed to this call/operation are not valid
226
(\c org.freedesktop.DBus.Error.InvalidArgs)
227
\value UnknownMethod The method called was not found in this object/interface with the
228
given parameters (\c org.freedesktop.DBus.Error.UnknownMethod)
229
\value TimedOut \e {Documentation doesn't say...}
230
(\c org.freedesktop.DBus.Error.TimedOut)
231
\value InvalidSignature The type signature is not valid or compatible
232
(\c org.freedesktop.DBus.Error.InvalidSignature)
233
\value UnknownInterface The interface is not known in this object
234
(\c org.freedesktop.DBus.Error.UnknownInterface)
235
\value UnknownObject The object path points to an object that does not exist
236
(\c org.freedesktop.DBus.Error.UnknownObject)
237
\value UnknownProperty The property does not exist in this interface
238
(\c org.freedesktop.DBus.Error.UnknownProperty)
239
\value PropertyReadOnly The property set failed because the property is read-only
240
(\c org.freedesktop.DBus.Error.PropertyReadOnly)
242
\value InternalError An internal error occurred
244
\value InvalidObjectPath The object path provided is invalid.
246
\value InvalidService The service requested is invalid.
248
\value InvalidMember The member is invalid.
250
\value InvalidInterface The interface is invalid.
255
Constructs a QDBusError that represents no error.
257
QDBusError::QDBusError()
260
// ### This class has an implicit (therefore inline) destructor
261
// so the following field cannot be used.
265
#ifndef QT_BOOTSTRAPPED
268
Constructs a QDBusError from a DBusError structure.
270
QDBusError::QDBusError(const DBusError *error)
273
if (!error || !q_dbus_error_is_set(error))
276
code = ::get(error->name);
277
msg = QString::fromUtf8(error->message);
278
nm = QString::fromUtf8(error->name);
283
Constructs a QDBusError from a QDBusMessage.
285
QDBusError::QDBusError(const QDBusMessage &qdmsg)
288
if (qdmsg.type() != QDBusMessage::ErrorMessage)
291
code = ::get(qdmsg.errorName().toUtf8().constData());
292
nm = qdmsg.errorName();
293
msg = qdmsg.errorMessage();
299
Constructs a QDBusError from a well-known error code
301
QDBusError::QDBusError(ErrorType error, const QString &mess)
304
nm = QLatin1String(::get(error));
310
Constructs a QDBusError from another QDBusError object
312
QDBusError::QDBusError(const QDBusError &other)
313
: code(other.code), msg(other.msg), nm(other.nm)
322
QDBusError &QDBusError::operator=(const QDBusError &other)
330
#ifndef QT_BOOTSTRAPPED
333
Assignment operator from a QDBusMessage
335
QDBusError &QDBusError::operator=(const QDBusMessage &qdmsg)
337
if (qdmsg.type() == QDBusMessage::ErrorMessage) {
338
code = ::get(qdmsg.errorName().toUtf8().constData());
339
nm = qdmsg.errorName();
340
msg = qdmsg.errorMessage();
351
Returns this error's ErrorType.
356
QDBusError::ErrorType QDBusError::type() const
362
Returns this error's name. Error names are similar to D-Bus Interface names, like
363
\c org.freedesktop.DBus.InvalidArgs.
368
QString QDBusError::name() const
374
Returns the message that the callee associated with this error. Error messages are
375
implementation defined and usually contain a human-readable error code, though this does not
376
mean it is suitable for your end-users.
379
QString QDBusError::message() const
385
Returns \c true if this is a valid error condition (i.e., if there was an error),
389
bool QDBusError::isValid() const
391
return (code != NoError);
396
Returns the error name associated with error condition \a error.
398
QString QDBusError::errorString(ErrorType error)
400
return QLatin1String(::get(error));
403
#ifndef QT_NO_DEBUG_STREAM
404
QDebug operator<<(QDebug dbg, const QDBusError &msg)
406
QDebugStateSaver saver(dbg);
407
dbg.nospace() << "QDBusError(" << msg.name() << ", " << msg.message() << ')';