1
/****************************************************************************
3
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/legal
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 Digia. For licensing terms and
14
** conditions see http://qt.digia.com/licensing. For further information
15
** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
20
** Foundation and appearing in the file LICENSE.LGPL included in the
21
** packaging of this file. Please review the following information to
22
** ensure the GNU Lesser General Public License version 2.1 requirements
23
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25
** In addition, as a special exception, Digia gives you certain additional
26
** rights. These rights are described in the Digia Qt LGPL Exception
27
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29
** GNU General Public License Usage
30
** Alternatively, this file may be used under the terms of the GNU
31
** General Public License version 3.0 as published by the Free Software
32
** Foundation and appearing in the file LICENSE.GPL included in the
33
** packaging of this file. Please review the following information to
34
** ensure the GNU General Public License version 3.0 requirements will be
35
** met: http://www.gnu.org/copyleft/gpl.html.
40
****************************************************************************/
42
#include "qdbuserror.h"
45
#include <qvarlengtharray.h>
47
#ifndef QT_BOOTSTRAPPED
48
#include "qdbus_symbols_p.h"
49
#include "qdbusmessage.h"
50
#include "qdbusmessage_p.h"
58
* Use the following Perl script to generate the error string index list:
59
===== PERL SCRIPT ====
60
print "static const char errorMessages_string[] =\n";
66
$sizes[$i++] = $counter;
67
$counter += 1 + length $_;
69
print " \"\\0\";\n\nstatic const int errorMessages_indices[] = {\n ";
70
for ($j = 0; $j < $i; ++$j) {
71
printf "$sizes[$j], ";
74
===== PERL SCRIPT ====
76
* The input data is as follows:
78
org.freedesktop.DBus.Error.Failed
79
org.freedesktop.DBus.Error.NoMemory
80
org.freedesktop.DBus.Error.ServiceUnknown
81
org.freedesktop.DBus.Error.NoReply
82
org.freedesktop.DBus.Error.BadAddress
83
org.freedesktop.DBus.Error.NotSupported
84
org.freedesktop.DBus.Error.LimitsExceeded
85
org.freedesktop.DBus.Error.AccessDenied
86
org.freedesktop.DBus.Error.NoServer
87
org.freedesktop.DBus.Error.Timeout
88
org.freedesktop.DBus.Error.NoNetwork
89
org.freedesktop.DBus.Error.AddressInUse
90
org.freedesktop.DBus.Error.Disconnected
91
org.freedesktop.DBus.Error.InvalidArgs
92
org.freedesktop.DBus.Error.UnknownMethod
93
org.freedesktop.DBus.Error.TimedOut
94
org.freedesktop.DBus.Error.InvalidSignature
95
org.freedesktop.DBus.Error.UnknownInterface
96
org.freedesktop.DBus.Error.UnknownObject
97
org.freedesktop.DBus.Error.UnknownProperty
98
org.freedesktop.DBus.Error.PropertyReadOnly
99
org.qtproject.QtDBus.Error.InternalError
100
org.qtproject.QtDBus.Error.InvalidService
101
org.qtproject.QtDBus.Error.InvalidObjectPath
102
org.qtproject.QtDBus.Error.InvalidInterface
103
org.qtproject.QtDBus.Error.InvalidMember
106
// in the same order as KnownErrors!
107
static const char errorMessages_string[] =
109
"org.freedesktop.DBus.Error.Failed\0"
110
"org.freedesktop.DBus.Error.NoMemory\0"
111
"org.freedesktop.DBus.Error.ServiceUnknown\0"
112
"org.freedesktop.DBus.Error.NoReply\0"
113
"org.freedesktop.DBus.Error.BadAddress\0"
114
"org.freedesktop.DBus.Error.NotSupported\0"
115
"org.freedesktop.DBus.Error.LimitsExceeded\0"
116
"org.freedesktop.DBus.Error.AccessDenied\0"
117
"org.freedesktop.DBus.Error.NoServer\0"
118
"org.freedesktop.DBus.Error.Timeout\0"
119
"org.freedesktop.DBus.Error.NoNetwork\0"
120
"org.freedesktop.DBus.Error.AddressInUse\0"
121
"org.freedesktop.DBus.Error.Disconnected\0"
122
"org.freedesktop.DBus.Error.InvalidArgs\0"
123
"org.freedesktop.DBus.Error.UnknownMethod\0"
124
"org.freedesktop.DBus.Error.TimedOut\0"
125
"org.freedesktop.DBus.Error.InvalidSignature\0"
126
"org.freedesktop.DBus.Error.UnknownInterface\0"
127
"org.freedesktop.DBus.Error.UnknownObject\0"
128
"org.freedesktop.DBus.Error.UnknownProperty\0"
129
"org.freedesktop.DBus.Error.PropertyReadOnly\0"
130
"org.qtproject.QtDBus.Error.InternalError\0"
131
"org.qtproject.QtDBus.Error.InvalidService\0"
132
"org.qtproject.QtDBus.Error.InvalidObjectPath\0"
133
"org.qtproject.QtDBus.Error.InvalidInterface\0"
134
"org.qtproject.QtDBus.Error.InvalidMember\0"
137
static const int errorMessages_indices[] = {
138
0, 6, 40, 76, 118, 153, 191, 231,
139
273, 313, 349, 384, 421, 461, 501, 540,
140
581, 617, 661, 705, 746, 789, 833, 874,
144
static const int errorMessages_count = sizeof errorMessages_indices /
145
sizeof errorMessages_indices[0] - 1;
147
static inline const char *get(QDBusError::ErrorType code)
149
int intcode = qBound(0, int(code) - int(QDBusError::Other), errorMessages_count);
150
return errorMessages_string + errorMessages_indices[intcode];
153
static inline QDBusError::ErrorType get(const char *name)
156
return QDBusError::NoError;
157
for (int i = 0; i < errorMessages_count; ++i)
158
if (strcmp(name, errorMessages_string + errorMessages_indices[i]) == 0)
159
return QDBusError::ErrorType(i + int(QDBusError::Other));
160
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 QtDBus 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()
263
#ifndef QT_BOOTSTRAPPED
266
Constructs a QDBusError from a DBusError structure.
268
QDBusError::QDBusError(const DBusError *error)
271
if (!error || !q_dbus_error_is_set(error))
274
code = ::get(error->name);
275
msg = QString::fromUtf8(error->message);
276
nm = QString::fromUtf8(error->name);
281
Constructs a QDBusError from a QDBusMessage.
283
QDBusError::QDBusError(const QDBusMessage &qdmsg)
286
if (qdmsg.type() != QDBusMessage::ErrorMessage)
289
code = ::get(qdmsg.errorName().toUtf8().constData());
290
nm = qdmsg.errorName();
291
msg = qdmsg.errorMessage();
297
Constructs a QDBusError from a well-known error code
299
QDBusError::QDBusError(ErrorType error, const QString &mess)
302
nm = QLatin1String(::get(error));
308
Constructs a QDBusError from another QDBusError object
310
QDBusError::QDBusError(const QDBusError &other)
311
: code(other.code), msg(other.msg), nm(other.nm)
320
QDBusError &QDBusError::operator=(const QDBusError &other)
328
#ifndef QT_BOOTSTRAPPED
331
Assignment operator from a QDBusMessage
333
QDBusError &QDBusError::operator=(const QDBusMessage &qdmsg)
335
if (qdmsg.type() == QDBusMessage::ErrorMessage) {
336
code = ::get(qdmsg.errorName().toUtf8().constData());
337
nm = qdmsg.errorName();
338
msg = qdmsg.errorMessage();
349
Returns this error's ErrorType.
354
QDBusError::ErrorType QDBusError::type() const
360
Returns this error's name. Error names are similar to D-Bus Interface names, like
361
\c org.freedesktop.DBus.InvalidArgs.
366
QString QDBusError::name() const
372
Returns the message that the callee associated with this error. Error messages are
373
implementation defined and usually contain a human-readable error code, though this does not
374
mean it is suitable for your end-users.
377
QString QDBusError::message() const
383
Returns true if this is a valid error condition (i.e., if there was an error),
387
bool QDBusError::isValid() const
389
return (code != NoError);
394
Returns the error name associated with error condition \a error.
396
QString QDBusError::errorString(ErrorType error)
398
return QLatin1String(::get(error));
401
#ifndef QT_NO_DEBUG_STREAM
402
QDebug operator<<(QDebug dbg, const QDBusError &msg)
404
dbg.nospace() << "QDBusError(" << msg.name() << ", " << msg.message() << ')';