~ubuntu-branches/ubuntu/wily/qtbase-opensource-src/wily

« back to all changes in this revision

Viewing changes to src/dbus/qdbuserror.cpp

  • Committer: Package Import Robot
  • Author(s): Timo Jyrinki
  • Date: 2013-02-05 12:46:17 UTC
  • Revision ID: package-import@ubuntu.com-20130205124617-c8jouts182j002fx
Tags: upstream-5.0.1+dfsg
ImportĀ upstreamĀ versionĀ 5.0.1+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/****************************************************************************
 
2
**
 
3
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
 
4
** Contact: http://www.qt-project.org/legal
 
5
**
 
6
** This file is part of the QtDBus module of the Qt Toolkit.
 
7
**
 
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.
 
16
**
 
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.
 
24
**
 
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.
 
28
**
 
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.
 
36
**
 
37
**
 
38
** $QT_END_LICENSE$
 
39
**
 
40
****************************************************************************/
 
41
 
 
42
#include "qdbuserror.h"
 
43
 
 
44
#include <qdebug.h>
 
45
#include <qvarlengtharray.h>
 
46
 
 
47
#ifndef QT_BOOTSTRAPPED
 
48
#include "qdbus_symbols_p.h"
 
49
#include "qdbusmessage.h"
 
50
#include "qdbusmessage_p.h"
 
51
#endif
 
52
 
 
53
#ifndef QT_NO_DBUS
 
54
 
 
55
QT_BEGIN_NAMESPACE
 
56
 
 
57
/*
 
58
 * Use the following Perl script to generate the error string index list:
 
59
===== PERL SCRIPT ====
 
60
print "static const char errorMessages_string[] =\n";
 
61
$counter = 0;
 
62
$i = 0;
 
63
while (<STDIN>) {
 
64
    chomp;
 
65
    print "    \"$_\\0\"\n";
 
66
    $sizes[$i++] = $counter;
 
67
    $counter += 1 + length $_;
 
68
}
 
69
print "    \"\\0\";\n\nstatic const int errorMessages_indices[] = {\n    ";
 
70
for ($j = 0; $j < $i; ++$j) {
 
71
    printf "$sizes[$j], ";
 
72
}
 
73
print "0\n};\n";
 
74
===== PERL SCRIPT ====
 
75
 
 
76
 * The input data is as follows:
 
77
other
 
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
 
104
*/
 
105
 
 
106
// in the same order as KnownErrors!
 
107
static const char errorMessages_string[] =
 
108
    "other\0"
 
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"
 
135
    "\0";
 
136
 
 
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,
 
141
    916,  961, 1005,   -1
 
142
};
 
143
 
 
144
static const int errorMessages_count = sizeof errorMessages_indices /
 
145
                                       sizeof errorMessages_indices[0] - 1;
 
146
 
 
147
static inline const char *get(QDBusError::ErrorType code)
 
148
{
 
149
    int intcode = qBound(0, int(code) - int(QDBusError::Other), errorMessages_count);
 
150
    return errorMessages_string + errorMessages_indices[intcode];
 
151
}
 
152
 
 
153
static inline QDBusError::ErrorType get(const char *name)
 
154
{
 
155
    if (!name || !*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;
 
161
}
 
162
 
 
163
/*!
 
164
    \class QDBusError
 
165
    \inmodule QtDBus
 
166
    \since 4.2
 
167
 
 
168
    \brief The QDBusError class represents an error received from the
 
169
    D-Bus bus or from remote applications found in the bus.
 
170
 
 
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.
 
175
 
 
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()).
 
182
 
 
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().
 
188
 
 
189
    \sa QDBusConnection::send(), QDBusMessage, QDBusReply
 
190
*/
 
191
 
 
192
/*!
 
193
    \enum QDBusError::ErrorType
 
194
 
 
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
 
197
    values:
 
198
 
 
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)
 
241
 
 
242
    \value InternalError        An internal error occurred
 
243
 
 
244
    \value InvalidObjectPath    The object path provided is invalid.
 
245
 
 
246
    \value InvalidService       The service requested is invalid.
 
247
 
 
248
    \value InvalidMember        The member is invalid.
 
249
 
 
250
    \value InvalidInterface     The interface is invalid.
 
251
*/
 
252
 
 
253
/*!
 
254
    \internal
 
255
    Constructs a QDBusError that represents no error.
 
256
*/
 
257
QDBusError::QDBusError()
 
258
    : code(NoError)
 
259
{
 
260
 
 
261
}
 
262
 
 
263
#ifndef QT_BOOTSTRAPPED
 
264
/*!
 
265
    \internal
 
266
    Constructs a QDBusError from a DBusError structure.
 
267
*/
 
268
QDBusError::QDBusError(const DBusError *error)
 
269
    : code(NoError)
 
270
{
 
271
    if (!error || !q_dbus_error_is_set(error))
 
272
        return;
 
273
 
 
274
    code = ::get(error->name);
 
275
    msg = QString::fromUtf8(error->message);
 
276
    nm = QString::fromUtf8(error->name);
 
277
}
 
278
 
 
279
/*!
 
280
    \internal
 
281
    Constructs a QDBusError from a QDBusMessage.
 
282
*/
 
283
QDBusError::QDBusError(const QDBusMessage &qdmsg)
 
284
    : code(NoError)
 
285
{
 
286
    if (qdmsg.type() != QDBusMessage::ErrorMessage)
 
287
        return;
 
288
 
 
289
    code = ::get(qdmsg.errorName().toUtf8().constData());
 
290
    nm = qdmsg.errorName();
 
291
    msg = qdmsg.errorMessage();
 
292
}
 
293
#endif
 
294
 
 
295
/*!
 
296
    \internal
 
297
    Constructs a QDBusError from a well-known error code
 
298
*/
 
299
QDBusError::QDBusError(ErrorType error, const QString &mess)
 
300
    : code(error)
 
301
{
 
302
    nm = QLatin1String(::get(error));
 
303
    msg = mess;
 
304
}
 
305
 
 
306
/*!
 
307
    \internal
 
308
    Constructs a QDBusError from another QDBusError object
 
309
*/
 
310
QDBusError::QDBusError(const QDBusError &other)
 
311
        : code(other.code), msg(other.msg), nm(other.nm)
 
312
{
 
313
}
 
314
 
 
315
/*!
 
316
  \internal
 
317
  Assignment operator
 
318
*/
 
319
 
 
320
QDBusError &QDBusError::operator=(const QDBusError &other)
 
321
{
 
322
    code = other.code;
 
323
    msg = other.msg;
 
324
    nm = other.nm;
 
325
    return *this;
 
326
}
 
327
 
 
328
#ifndef QT_BOOTSTRAPPED
 
329
/*!
 
330
  \internal
 
331
  Assignment operator from a QDBusMessage
 
332
*/
 
333
QDBusError &QDBusError::operator=(const QDBusMessage &qdmsg)
 
334
{
 
335
    if (qdmsg.type() == QDBusMessage::ErrorMessage) {
 
336
        code = ::get(qdmsg.errorName().toUtf8().constData());
 
337
        nm = qdmsg.errorName();
 
338
        msg = qdmsg.errorMessage();
 
339
    } else {
 
340
        code =NoError;
 
341
        nm.clear();
 
342
        msg.clear();
 
343
    }
 
344
    return *this;
 
345
}
 
346
#endif
 
347
 
 
348
/*!
 
349
    Returns this error's ErrorType.
 
350
 
 
351
    \sa ErrorType
 
352
*/
 
353
 
 
354
QDBusError::ErrorType QDBusError::type() const
 
355
{
 
356
    return code;
 
357
}
 
358
 
 
359
/*!
 
360
    Returns this error's name. Error names are similar to D-Bus Interface names, like
 
361
    \c org.freedesktop.DBus.InvalidArgs.
 
362
 
 
363
    \sa type()
 
364
*/
 
365
 
 
366
QString QDBusError::name() const
 
367
{
 
368
    return nm;
 
369
}
 
370
 
 
371
/*!
 
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.
 
375
*/
 
376
 
 
377
QString QDBusError::message() const
 
378
{
 
379
    return msg;
 
380
}
 
381
 
 
382
/*!
 
383
    Returns true if this is a valid error condition (i.e., if there was an error),
 
384
    otherwise false.
 
385
*/
 
386
 
 
387
bool QDBusError::isValid() const
 
388
{
 
389
    return (code != NoError);
 
390
}
 
391
 
 
392
/*!
 
393
    \since 4.3
 
394
    Returns the error name associated with error condition \a error.
 
395
*/
 
396
QString QDBusError::errorString(ErrorType error)
 
397
{
 
398
    return QLatin1String(::get(error));
 
399
}
 
400
 
 
401
#ifndef QT_NO_DEBUG_STREAM
 
402
QDebug operator<<(QDebug dbg, const QDBusError &msg)
 
403
{
 
404
    dbg.nospace() << "QDBusError(" << msg.name() << ", " << msg.message() << ')';
 
405
    return dbg.space();
 
406
}
 
407
#endif
 
408
 
 
409
QT_END_NAMESPACE
 
410
 
 
411
#endif // QT_NO_DBUS