summaryrefslogtreecommitdiffstats
path: root/src/dbus/qdbuserror.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dbus/qdbuserror.cpp')
-rw-r--r--src/dbus/qdbuserror.cpp368
1 files changed, 368 insertions, 0 deletions
diff --git a/src/dbus/qdbuserror.cpp b/src/dbus/qdbuserror.cpp
new file mode 100644
index 0000000000..7b314fd661
--- /dev/null
+++ b/src/dbus/qdbuserror.cpp
@@ -0,0 +1,368 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 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"
+
+#ifndef QT_NO_DBUS
+
+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
+
+#endif // QT_NO_DBUS