~gabriel1984sibiu/minitube/qt5.6

« back to all changes in this revision

Viewing changes to src/dbus/qdbuserror.cpp

  • Committer: Grevutiu Gabriel
  • Date: 2017-06-13 08:43:17 UTC
  • Revision ID: gabriel1984sibiu@gmail.com-20170613084317-ek0zqe0u9g3ocvi8
OriginalĀ upstreamĀ code

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/****************************************************************************
 
2
**
 
3
** Copyright (C) 2016 The Qt Company Ltd.
 
4
** Contact: https://www.qt.io/licensing/
 
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 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.
 
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 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.
 
24
**
 
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.
 
35
**
 
36
** $QT_END_LICENSE$
 
37
**
 
38
****************************************************************************/
 
39
 
 
40
#include "qdbuserror.h"
 
41
 
 
42
#include <qdebug.h>
 
43
#include <qvarlengtharray.h>
 
44
 
 
45
#ifndef QT_BOOTSTRAPPED
 
46
#include "qdbus_symbols_p.h"
 
47
#include "qdbusmessage.h"
 
48
#include "qdbusmessage_p.h"
 
49
#endif
 
50
 
 
51
#ifndef QT_NO_DBUS
 
52
 
 
53
QT_BEGIN_NAMESPACE
 
54
 
 
55
/*
 
56
 * Use the following Perl script to generate the error string index list:
 
57
===== PERL SCRIPT ====
 
58
print "static const char errorMessages_string[] =\n";
 
59
$counter = 0;
 
60
$i = 0;
 
61
while (<STDIN>) {
 
62
    chomp;
 
63
    print "    \"$_\\0\"\n";
 
64
    $sizes[$i++] = $counter;
 
65
    $counter += 1 + length $_;
 
66
}
 
67
print "    \"\\0\";\n\nstatic const int errorMessages_indices[] = {\n    ";
 
68
for ($j = 0; $j < $i; ++$j) {
 
69
    printf "$sizes[$j], ";
 
70
}
 
71
print "0\n};\n";
 
72
===== PERL SCRIPT ====
 
73
 
 
74
 * The input data is as follows:
 
75
other
 
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
 
102
*/
 
103
 
 
104
// in the same order as KnownErrors!
 
105
static const char errorMessages_string[] =
 
106
    "other\0"
 
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"
 
133
    "\0";
 
134
 
 
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,
 
139
    916,  961, 1005
 
140
};
 
141
 
 
142
static const int errorMessages_count = sizeof errorMessages_indices /
 
143
                                       sizeof errorMessages_indices[0];
 
144
 
 
145
static inline const char *get(QDBusError::ErrorType code)
 
146
{
 
147
    int intcode = qBound(0, int(code) - int(QDBusError::Other), errorMessages_count);
 
148
    return errorMessages_string + errorMessages_indices[intcode];
 
149
}
 
150
 
 
151
#ifndef QT_BOOTSTRAPPED
 
152
static inline QDBusError::ErrorType get(const char *name)
 
153
{
 
154
    if (!name || !*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;
 
160
}
 
161
#endif
 
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 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()).
 
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
    // ### This class has an implicit (therefore inline) destructor
 
261
    // so the following field cannot be used.
 
262
    Q_UNUSED(unused);
 
263
}
 
264
 
 
265
#ifndef QT_BOOTSTRAPPED
 
266
/*!
 
267
    \internal
 
268
    Constructs a QDBusError from a DBusError structure.
 
269
*/
 
270
QDBusError::QDBusError(const DBusError *error)
 
271
    : code(NoError)
 
272
{
 
273
    if (!error || !q_dbus_error_is_set(error))
 
274
        return;
 
275
 
 
276
    code = ::get(error->name);
 
277
    msg = QString::fromUtf8(error->message);
 
278
    nm = QString::fromUtf8(error->name);
 
279
}
 
280
 
 
281
/*!
 
282
    \internal
 
283
    Constructs a QDBusError from a QDBusMessage.
 
284
*/
 
285
QDBusError::QDBusError(const QDBusMessage &qdmsg)
 
286
    : code(NoError)
 
287
{
 
288
    if (qdmsg.type() != QDBusMessage::ErrorMessage)
 
289
        return;
 
290
 
 
291
    code = ::get(qdmsg.errorName().toUtf8().constData());
 
292
    nm = qdmsg.errorName();
 
293
    msg = qdmsg.errorMessage();
 
294
}
 
295
#endif
 
296
 
 
297
/*!
 
298
    \internal
 
299
    Constructs a QDBusError from a well-known error code
 
300
*/
 
301
QDBusError::QDBusError(ErrorType error, const QString &mess)
 
302
    : code(error)
 
303
{
 
304
    nm = QLatin1String(::get(error));
 
305
    msg = mess;
 
306
}
 
307
 
 
308
/*!
 
309
    \internal
 
310
    Constructs a QDBusError from another QDBusError object
 
311
*/
 
312
QDBusError::QDBusError(const QDBusError &other)
 
313
        : code(other.code), msg(other.msg), nm(other.nm)
 
314
{
 
315
}
 
316
 
 
317
/*!
 
318
  \internal
 
319
  Assignment operator
 
320
*/
 
321
 
 
322
QDBusError &QDBusError::operator=(const QDBusError &other)
 
323
{
 
324
    code = other.code;
 
325
    msg = other.msg;
 
326
    nm = other.nm;
 
327
    return *this;
 
328
}
 
329
 
 
330
#ifndef QT_BOOTSTRAPPED
 
331
/*!
 
332
  \internal
 
333
  Assignment operator from a QDBusMessage
 
334
*/
 
335
QDBusError &QDBusError::operator=(const QDBusMessage &qdmsg)
 
336
{
 
337
    if (qdmsg.type() == QDBusMessage::ErrorMessage) {
 
338
        code = ::get(qdmsg.errorName().toUtf8().constData());
 
339
        nm = qdmsg.errorName();
 
340
        msg = qdmsg.errorMessage();
 
341
    } else {
 
342
        code =NoError;
 
343
        nm.clear();
 
344
        msg.clear();
 
345
    }
 
346
    return *this;
 
347
}
 
348
#endif
 
349
 
 
350
/*!
 
351
    Returns this error's ErrorType.
 
352
 
 
353
    \sa ErrorType
 
354
*/
 
355
 
 
356
QDBusError::ErrorType QDBusError::type() const
 
357
{
 
358
    return code;
 
359
}
 
360
 
 
361
/*!
 
362
    Returns this error's name. Error names are similar to D-Bus Interface names, like
 
363
    \c org.freedesktop.DBus.InvalidArgs.
 
364
 
 
365
    \sa type()
 
366
*/
 
367
 
 
368
QString QDBusError::name() const
 
369
{
 
370
    return nm;
 
371
}
 
372
 
 
373
/*!
 
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.
 
377
*/
 
378
 
 
379
QString QDBusError::message() const
 
380
{
 
381
    return msg;
 
382
}
 
383
 
 
384
/*!
 
385
    Returns \c true if this is a valid error condition (i.e., if there was an error),
 
386
    otherwise false.
 
387
*/
 
388
 
 
389
bool QDBusError::isValid() const
 
390
{
 
391
    return (code != NoError);
 
392
}
 
393
 
 
394
/*!
 
395
    \since 4.3
 
396
    Returns the error name associated with error condition \a error.
 
397
*/
 
398
QString QDBusError::errorString(ErrorType error)
 
399
{
 
400
    return QLatin1String(::get(error));
 
401
}
 
402
 
 
403
#ifndef QT_NO_DEBUG_STREAM
 
404
QDebug operator<<(QDebug dbg, const QDBusError &msg)
 
405
{
 
406
    QDebugStateSaver saver(dbg);
 
407
    dbg.nospace() << "QDBusError(" << msg.name() << ", " << msg.message() << ')';
 
408
    return dbg;
 
409
}
 
410
#endif
 
411
 
 
412
QT_END_NAMESPACE
 
413
 
 
414
#endif // QT_NO_DBUS