src/dbus/qdbuserror.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
--- /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 <qdebug.h>
+#include <qvarlengtharray.h>
+
+#include <qdbus_symbols_p.h>
+#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 (<STDIN>) {
+    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
+
+