diff -r 000000000000 -r 1918ee327afb src/dbus/qdbuserror.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dbus/qdbuserror.cpp Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,366 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDBus module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qdbuserror.h" + +#include +#include + +#include +#include "qdbusmessage.h" +#include "qdbusmessage_p.h" + +QT_BEGIN_NAMESPACE + +/* + * Use the following Perl script to generate the error string index list: +===== PERL SCRIPT ==== +print "static const char errorMessages_string[] =\n"; +$counter = 0; +$i = 0; +while () { + chomp; + print " \"$_\\0\"\n"; + $sizes[$i++] = $counter; + $counter += 1 + length $_; +} +print " \"\\0\";\n\nstatic const int errorMessages_indices[] = {\n "; +for ($j = 0; $j < $i; ++$j) { + printf "$sizes[$j], "; +} +print "0\n};\n"; +===== PERL SCRIPT ==== + + * The input data is as follows: +other +org.freedesktop.DBus.Error.Failed +org.freedesktop.DBus.Error.NoMemory +org.freedesktop.DBus.Error.ServiceUnknown +org.freedesktop.DBus.Error.NoReply +org.freedesktop.DBus.Error.BadAddress +org.freedesktop.DBus.Error.NotSupported +org.freedesktop.DBus.Error.LimitsExceeded +org.freedesktop.DBus.Error.AccessDenied +org.freedesktop.DBus.Error.NoServer +org.freedesktop.DBus.Error.Timeout +org.freedesktop.DBus.Error.NoNetwork +org.freedesktop.DBus.Error.AddressInUse +org.freedesktop.DBus.Error.Disconnected +org.freedesktop.DBus.Error.InvalidArgs +org.freedesktop.DBus.Error.UnknownMethod +org.freedesktop.DBus.Error.TimedOut +org.freedesktop.DBus.Error.InvalidSignature +org.freedesktop.DBus.Error.UnknownInterface +com.trolltech.QtDBus.Error.InternalError +org.freedesktop.DBus.Error.UnknownObject +com.trolltech.QtDBus.Error.InvalidService +com.trolltech.QtDBus.Error.InvalidObjectPath +com.trolltech.QtDBus.Error.InvalidInterface +com.trolltech.QtDBus.Error.InvalidMember +*/ + +// in the same order as KnownErrors! +static const char errorMessages_string[] = + "other\0" + "org.freedesktop.DBus.Error.Failed\0" + "org.freedesktop.DBus.Error.NoMemory\0" + "org.freedesktop.DBus.Error.ServiceUnknown\0" + "org.freedesktop.DBus.Error.NoReply\0" + "org.freedesktop.DBus.Error.BadAddress\0" + "org.freedesktop.DBus.Error.NotSupported\0" + "org.freedesktop.DBus.Error.LimitsExceeded\0" + "org.freedesktop.DBus.Error.AccessDenied\0" + "org.freedesktop.DBus.Error.NoServer\0" + "org.freedesktop.DBus.Error.Timeout\0" + "org.freedesktop.DBus.Error.NoNetwork\0" + "org.freedesktop.DBus.Error.AddressInUse\0" + "org.freedesktop.DBus.Error.Disconnected\0" + "org.freedesktop.DBus.Error.InvalidArgs\0" + "org.freedesktop.DBus.Error.UnknownMethod\0" + "org.freedesktop.DBus.Error.TimedOut\0" + "org.freedesktop.DBus.Error.InvalidSignature\0" + "org.freedesktop.DBus.Error.UnknownInterface\0" + "com.trolltech.QtDBus.Error.InternalError\0" + "org.freedesktop.DBus.Error.UnknownObject\0" + "com.trolltech.QtDBus.Error.InvalidService\0" + "com.trolltech.QtDBus.Error.InvalidObjectPath\0" + "com.trolltech.QtDBus.Error.InvalidInterface\0" + "com.trolltech.QtDBus.Error.InvalidMember\0" + "\0"; + +static const int errorMessages_indices[] = { + 0, 6, 40, 76, 118, 153, 191, 231, + 273, 313, 349, 384, 421, 461, 501, 540, + 581, 617, 661, 705, 746, 787, 829, 874, + 918, 0 +}; + +static const int errorMessages_count = sizeof errorMessages_indices / + sizeof errorMessages_indices[0]; + +static inline const char *get(QDBusError::ErrorType code) +{ + int intcode = qBound(0, int(code) - int(QDBusError::Other), errorMessages_count); + return errorMessages_string + errorMessages_indices[intcode]; +} + +static inline QDBusError::ErrorType get(const char *name) +{ + if (!name || !*name) + return QDBusError::NoError; + for (int i = 0; i < errorMessages_count; ++i) + if (strcmp(name, errorMessages_string + errorMessages_indices[i]) == 0) + return QDBusError::ErrorType(i + int(QDBusError::Other)); + return QDBusError::Other; +} + +/*! + \class QDBusError + \inmodule QtDBus + \since 4.2 + + \brief The QDBusError class represents an error received from the + D-Bus bus or from remote applications found in the bus. + + When dealing with the D-Bus bus service or with remote + applications over D-Bus, a number of error conditions can + happen. This error conditions are sometimes signalled by a + returned error value or by a QDBusError. + + C++ and Java exceptions are a valid analogy for D-Bus errors: + instead of returning normally with a return value, remote + applications and the bus may decide to throw an error + condition. However, the QtDBus implementation does not use the C++ + exception-throwing mechanism, so you will receive QDBusErrors in + the return reply (see QDBusReply::error()). + + QDBusError objects are used to inspect the error name and message + as received from the bus and remote applications. You should not + create such objects yourself to signal error conditions when + called from D-Bus: instead, use QDBusMessage::createError() and + QDBusConnection::send(). + + \sa QDBusConnection::send(), QDBusMessage, QDBusReply +*/ + +/*! + \enum QDBusError::ErrorType + + In order to facilitate verification of the most common D-Bus errors generated by the D-Bus + implementation and by the bus daemon itself, QDBusError can be compared to a set of pre-defined + values: + + \value NoError QDBusError is invalid (i.e., the call succeeded) + \value Other QDBusError contains an error that is one of the well-known ones + \value Failed The call failed (\c org.freedesktop.DBus.Error.Failed) + \value NoMemory Out of memory (\c org.freedesktop.DBus.Error.NoMemory) + \value ServiceUnknown The called service is not known + (\c org.freedesktop.DBus.Error.ServiceUnknown) + \value NoReply The called method did not reply within the specified timeout + (\c org.freedesktop.DBus.Error.NoReply) + \value BadAddress The address given is not valid + (\c org.freedesktop.DBus.Error.BadAddress) + \value NotSupported The call/operation is not supported + (\c org.freedesktop.DBus.Error.NotSupported) + \value LimitsExceeded The limits allocated to this process/call/connection exceeded the + pre-defined values (\c org.freedesktop.DBus.Error.LimitsExceeded) + \value AccessDenied The call/operation tried to access a resource it isn't allowed to + (\c org.freedesktop.DBus.Error.AccessDenied) + \value NoServer \e {Documentation doesn't say what this is for} + (\c org.freedesktop.DBus.Error.NoServer) + \value Timeout \e {Documentation doesn't say what this is for or how it's used} + (\c org.freedesktop.DBus.Error.Timeout) + \value NoNetwork \e {Documentation doesn't say what this is for} + (\c org.freedesktop.DBus.Error.NoNetwork) + \value AddressInUse QDBusServer tried to bind to an address that is already in use + (\c org.freedesktop.DBus.Error.AddressInUse) + \value Disconnected The call/process/message was sent after QDBusConnection disconnected + (\c org.freedesktop.DBus.Error.Disconnected) + \value InvalidArgs The arguments passed to this call/operation are not valid + (\c org.freedesktop.DBus.Error.InvalidArgs) + \value UnknownMethod The method called was not found in this object/interface with the + given parameters (\c org.freedesktop.DBus.Error.UnknownMethod) + \value TimedOut \e {Documentation doesn't say...} + (\c org.freedesktop.DBus.Error.TimedOut) + \value InvalidSignature The type signature is not valid or compatible + (\c org.freedesktop.DBus.Error.InvalidSignature) + \value UnknownInterface The interface is not known + \value InternalError An internal error occurred + (\c com.trolltech.QtDBus.Error.InternalError) + + \value InvalidObjectPath The object path provided is invalid. + + \value InvalidService The service requested is invalid. + + \value InvalidMember The member is invalid. + + \value InvalidInterface The interface is invalid. + + \value UnknownObject The remote object could not be found. +*/ + +/*! + \internal + Constructs a QDBusError from a DBusError structure. +*/ +QDBusError::QDBusError(const DBusError *error) + : code(NoError) +{ + if (!error || !q_dbus_error_is_set(error)) + return; + + code = ::get(error->name); + msg = QString::fromUtf8(error->message); + nm = QString::fromUtf8(error->name); +} + +/*! + \internal + Constructs a QDBusError from a QDBusMessage. +*/ +QDBusError::QDBusError(const QDBusMessage &qdmsg) + : code(NoError) +{ + if (qdmsg.type() != QDBusMessage::ErrorMessage) + return; + + code = ::get(qdmsg.errorName().toUtf8().constData()); + nm = qdmsg.errorName(); + msg = qdmsg.errorMessage(); +} + +/*! + \internal + Constructs a QDBusError from a well-known error code +*/ +QDBusError::QDBusError(ErrorType error, const QString &mess) + : code(error) +{ + nm = QLatin1String(::get(error)); + msg = mess; +} + +/*! + \internal + Constructs a QDBusError from another QDBusError object +*/ +QDBusError::QDBusError(const QDBusError &other) + : code(other.code), msg(other.msg), nm(other.nm) +{ +} + +/*! + \internal + Assignment operator +*/ + +QDBusError &QDBusError::operator=(const QDBusError &other) +{ + code = other.code; + msg = other.msg; + nm = other.nm; + return *this; +} + +/*! + Returns this error's ErrorType. + + \sa ErrorType +*/ + +QDBusError::ErrorType QDBusError::type() const +{ + return code; +} + +/*! + Returns this error's name. Error names are similar to D-Bus Interface names, like + \c org.freedesktop.DBus.InvalidArgs. + + \sa type() +*/ + +QString QDBusError::name() const +{ + return nm; +} + +/*! + Returns the message that the callee associated with this error. Error messages are + implementation defined and usually contain a human-readable error code, though this does not + mean it is suitable for your end-users. +*/ + +QString QDBusError::message() const +{ + return msg; +} + +/*! + Returns true if this is a valid error condition (i.e., if there was an error), + otherwise false. +*/ + +bool QDBusError::isValid() const +{ + return (code != NoError); +} + +/*! + \since 4.3 + Returns the error name associated with error condition \a error. +*/ +QString QDBusError::errorString(ErrorType error) +{ + return QLatin1String(::get(error)); +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug dbg, const QDBusError &msg) +{ + dbg.nospace() << "QDBusError(" << msg.name() << ", " << msg.message() << ')'; + return dbg.space(); +} +#endif + +QT_END_NAMESPACE + +