diff options
| author | Linus Jahn <lnj@kaidan.im> | 2023-01-22 18:06:09 +0100 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2023-01-22 18:10:44 +0100 |
| commit | 46f3831fd238b4c1fb10d44e4531d9e59d574c97 (patch) | |
| tree | f21c85c98502ef3821d52ee4964060a2c49885d2 /src/client | |
| parent | df37c35aa443e6ca7e3baad5f1bbeb379063df55 (diff) | |
| download | qxmpp-46f3831fd238b4c1fb10d44e4531d9e59d574c97.tar.gz | |
Use QXmppError in all IQ results instead of StanzaError
This allows us to report different error types with more information and
makes it possible to distinguish stanza errors and errors generated
locally.
Part of #501.
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/QXmppClient.h | 2 | ||||
| -rw-r--r-- | src/client/QXmppDiscoveryManager.h | 6 | ||||
| -rw-r--r-- | src/client/QXmppEntityTimeManager.h | 4 | ||||
| -rw-r--r-- | src/client/QXmppHttpUploadManager.cpp | 4 | ||||
| -rw-r--r-- | src/client/QXmppPep_p.h | 9 | ||||
| -rw-r--r-- | src/client/QXmppPubSubManager.cpp | 13 | ||||
| -rw-r--r-- | src/client/QXmppPubSubManager.h | 29 | ||||
| -rw-r--r-- | src/client/QXmppRosterManager.cpp | 7 | ||||
| -rw-r--r-- | src/client/QXmppRosterManager.h | 4 | ||||
| -rw-r--r-- | src/client/QXmppUploadRequestManager.cpp | 5 | ||||
| -rw-r--r-- | src/client/QXmppUploadRequestManager.h | 8 | ||||
| -rw-r--r-- | src/client/QXmppUserLocationManager.h | 5 | ||||
| -rw-r--r-- | src/client/QXmppUserTuneManager.h | 5 |
13 files changed, 50 insertions, 51 deletions
diff --git a/src/client/QXmppClient.h b/src/client/QXmppClient.h index 5cef5fe3..ca33afb6 100644 --- a/src/client/QXmppClient.h +++ b/src/client/QXmppClient.h @@ -91,7 +91,7 @@ class QXMPP_EXPORT QXmppClient : public QXmppLoggable public: using IqResult = std::variant<QDomElement, QXmppError>; - using EmptyResult = std::variant<QXmpp::Success, QXmppStanza::Error>; + using EmptyResult = std::variant<QXmpp::Success, QXmppError>; /// An enumeration for type of error. /// Error could come due a TCP socket or XML stream or due to various stanzas. diff --git a/src/client/QXmppDiscoveryManager.h b/src/client/QXmppDiscoveryManager.h index 56f6dfc4..10744a0d 100644 --- a/src/client/QXmppDiscoveryManager.h +++ b/src/client/QXmppDiscoveryManager.h @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: 2010 Manjeet Dahiya <manjeetdahiya@gmail.com> +// SPDX-FileCopyrightText: 2021 Linus Jahn <lnj@kaidan.im> // // SPDX-License-Identifier: LGPL-2.1-or-later @@ -14,6 +15,7 @@ class QXmppTask; class QXmppDataForm; class QXmppDiscoveryIq; class QXmppDiscoveryManagerPrivate; +class QXmppError; /// \brief The QXmppDiscoveryManager class makes it possible to discover information /// about other entities as defined by \xep{0030}: Service Discovery. @@ -33,8 +35,8 @@ public: QString requestInfo(const QString &jid, const QString &node = QString()); QString requestItems(const QString &jid, const QString &node = QString()); - using InfoResult = std::variant<QXmppDiscoveryIq, QXmppStanza::Error>; - using ItemsResult = std::variant<QList<QXmppDiscoveryIq::Item>, QXmppStanza::Error>; + using InfoResult = std::variant<QXmppDiscoveryIq, QXmppError>; + using ItemsResult = std::variant<QList<QXmppDiscoveryIq::Item>, QXmppError>; QXmppTask<InfoResult> requestDiscoInfo(const QString &jid, const QString &node = {}); QXmppTask<ItemsResult> requestDiscoItems(const QString &jid, const QString &node = {}); diff --git a/src/client/QXmppEntityTimeManager.h b/src/client/QXmppEntityTimeManager.h index 81c6fb45..3b090feb 100644 --- a/src/client/QXmppEntityTimeManager.h +++ b/src/client/QXmppEntityTimeManager.h @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: 2010 Manjeet Dahiya <manjeetdahiya@gmail.com> +// SPDX-FileCopyrightText: 2022 Linus Jahn <lnj@kaidan.im> // // SPDX-License-Identifier: LGPL-2.1-or-later @@ -12,6 +13,7 @@ template<class T> class QXmppTask; class QXmppEntityTimeIq; +class QXmppError; /// /// \brief The QXmppEntityTimeManager class provided the functionality to get @@ -26,7 +28,7 @@ class QXMPP_EXPORT QXmppEntityTimeManager : public QXmppClientExtension public: QString requestTime(const QString &jid); - using EntityTimeResult = std::variant<QXmppEntityTimeIq, QXmppStanza::Error>; + using EntityTimeResult = std::variant<QXmppEntityTimeIq, QXmppError>; QXmppTask<EntityTimeResult> requestEntityTime(const QString &jid); /// \cond diff --git a/src/client/QXmppHttpUploadManager.cpp b/src/client/QXmppHttpUploadManager.cpp index 35eedf80..c5b3fe89 100644 --- a/src/client/QXmppHttpUploadManager.cpp +++ b/src/client/QXmppHttpUploadManager.cpp @@ -307,8 +307,8 @@ std::shared_ptr<QXmppHttpUpload> QXmppHttpUploadManager::uploadFile(std::unique_ return; } - if (std::holds_alternative<QXmppStanza::Error>(result)) { - upload->d->reportError(std::get<QXmppStanza::Error>(std::move(result))); + if (std::holds_alternative<QXmppError>(result)) { + upload->d->reportError(std::get<QXmppError>(std::move(result))); upload->d->reportFinished(); } else { auto slot = std::get<QXmppHttpUploadSlotIq>(std::move(result)); diff --git a/src/client/QXmppPep_p.h b/src/client/QXmppPep_p.h index aafc6520..ea7f0440 100644 --- a/src/client/QXmppPep_p.h +++ b/src/client/QXmppPep_p.h @@ -8,23 +8,22 @@ namespace QXmpp::Private::Pep { template<typename T> -using GetResult = std::variant<T, QXmppStanza::Error>; -using PublishResult = std::variant<QString, QXmppStanza::Error>; +using GetResult = std::variant<T, QXmppError>; +using PublishResult = std::variant<QString, QXmppError>; template<typename ItemT> inline QXmppTask<GetResult<ItemT>> request(QXmppPubSubManager *pubSub, const QString &jid, const QString &nodeName, QObject *parent) { using PubSub = QXmppPubSubManager; - using Error = QXmppStanza::Error; auto process = [](PubSub::ItemsResult<ItemT> &&result) -> GetResult<ItemT> { if (const auto itemsResult = std::get_if<PubSub::Items<ItemT>>(&result)) { if (!itemsResult->items.isEmpty()) { return itemsResult->items.takeFirst(); } - return Error(Error::Cancel, Error::ItemNotFound, QStringLiteral("User has no published items.")); + return QXmppError { QStringLiteral("User has no published items."), {} }; } else { - return std::get<Error>(result); + return std::get<QXmppError>(std::move(result)); } }; return chain<GetResult<ItemT>>(pubSub->requestItems<ItemT>(jid, nodeName), parent, process); diff --git a/src/client/QXmppPubSubManager.cpp b/src/client/QXmppPubSubManager.cpp index a10fc25b..18ad9d7a 100644 --- a/src/client/QXmppPubSubManager.cpp +++ b/src/client/QXmppPubSubManager.cpp @@ -596,12 +596,7 @@ QXmppTask<QXmppPubSubManager::OptionsResult> QXmppPubSubManager::requestSubscrib return *options; } } - - // "real" stanza errors are already handled - using Error = QXmppStanza::Error; - return Error(Error::Cancel, - Error::Condition::InternalServerError, - QStringLiteral("Server returned invalid data form.")); + return QXmppError { QStringLiteral("Server returned invalid data form."), {} }; }); } @@ -655,8 +650,6 @@ QXmppTask<QXmppPubSubManager::Result> QXmppPubSubManager::setSubscribeOptions(co /// QXmppTask<QXmppPubSubManager::NodeConfigResult> QXmppPubSubManager::requestNodeConfiguration(const QString &service, const QString &nodeName) { - using Error = QXmppStanza::Error; - PubSubIq request; request.setType(QXmppIq::Get); request.setTo(service); @@ -669,9 +662,9 @@ QXmppTask<QXmppPubSubManager::NodeConfigResult> QXmppPubSubManager::requestNodeC if (const auto config = QXmppPubSubNodeConfig::fromDataForm(*dataForm)) { return *config; } - return Error(Error::Cancel, Error::UndefinedCondition, QStringLiteral("Server returned invalid data form.")); + return QXmppError { QStringLiteral("Server returned invalid data form."), {} }; } - return Error(Error::Cancel, Error::UndefinedCondition, QStringLiteral("Server returned no data form.")); + return QXmppError { QStringLiteral("Server returned no data form."), {} }; }); } diff --git a/src/client/QXmppPubSubManager.h b/src/client/QXmppPubSubManager.h index 4e5ab9f8..73a5b4d4 100644 --- a/src/client/QXmppPubSubManager.h +++ b/src/client/QXmppPubSubManager.h @@ -52,21 +52,21 @@ public: std::optional<QXmppResultSetReply> continuation; }; - using Result = std::variant<QXmpp::Success, QXmppStanza::Error>; - using FeaturesResult = std::variant<QVector<QString>, InvalidServiceType, QXmppStanza::Error>; - using NodesResult = std::variant<QVector<QString>, QXmppStanza::Error>; - using InstantNodeResult = std::variant<QString, QXmppStanza::Error>; + using Result = std::variant<QXmpp::Success, QXmppError>; + using FeaturesResult = std::variant<QVector<QString>, InvalidServiceType, QXmppError>; + using NodesResult = std::variant<QVector<QString>, QXmppError>; + using InstantNodeResult = std::variant<QString, QXmppError>; template<typename T> - using ItemResult = std::variant<T, QXmppStanza::Error>; + using ItemResult = std::variant<T, QXmppError>; template<typename T> - using ItemsResult = std::variant<Items<T>, QXmppStanza::Error>; - using ItemIdsResult = std::variant<QVector<QString>, QXmppStanza::Error>; - using PublishItemResult = std::variant<QString, QXmppStanza::Error>; - using PublishItemsResult = std::variant<QVector<QString>, QXmppStanza::Error>; - using SubscriptionsResult = std::variant<QVector<QXmppPubSubSubscription>, QXmppStanza::Error>; - using AffiliationsResult = std::variant<QVector<QXmppPubSubAffiliation>, QXmppStanza::Error>; - using OptionsResult = std::variant<QXmppPubSubSubscribeOptions, QXmppStanza::Error>; - using NodeConfigResult = std::variant<QXmppPubSubNodeConfig, QXmppStanza::Error>; + using ItemsResult = std::variant<Items<T>, QXmppError>; + using ItemIdsResult = std::variant<QVector<QString>, QXmppError>; + using PublishItemResult = std::variant<QString, QXmppError>; + using PublishItemsResult = std::variant<QVector<QString>, QXmppError>; + using SubscriptionsResult = std::variant<QVector<QXmppPubSubSubscription>, QXmppError>; + using AffiliationsResult = std::variant<QVector<QXmppPubSubAffiliation>, QXmppError>; + using OptionsResult = std::variant<QXmppPubSubSubscribeOptions, QXmppError>; + using NodeConfigResult = std::variant<QXmppPubSubNodeConfig, QXmppError>; QXmppPubSubManager(); ~QXmppPubSubManager(); @@ -175,13 +175,12 @@ QXmppTask<QXmppPubSubManager::ItemResult<T>> QXmppPubSubManager::requestItem(con const QString &itemId) { using namespace QXmpp::Private; - using Error = QXmppStanza::Error; return chainIq(client()->sendIq(requestItemsIq(jid, nodeName, { itemId })), this, [](PubSubIq<T> &&iq) -> ItemResult<T> { if (!iq.items().isEmpty()) { return iq.items().constFirst(); } - return Error(Error::Cancel, Error::ItemNotFound, QStringLiteral("No such item has been found.")); + return QXmppError { QStringLiteral("No such item has been found."), {} }; }); } diff --git a/src/client/QXmppRosterManager.cpp b/src/client/QXmppRosterManager.cpp index 87ebbd26..d3efadb4 100644 --- a/src/client/QXmppRosterManager.cpp +++ b/src/client/QXmppRosterManager.cpp @@ -14,6 +14,8 @@ #include <QDomElement> +using namespace QXmpp::Private; + /// /// \fn QXmppRosterManager::subscriptionRequestReceived /// @@ -307,9 +309,8 @@ QXmppTask<QXmppRosterManager::Result> QXmppRosterManager::renameRosterItem(const { using Error = QXmppStanza::Error; if (!d->entries.contains(bareJid)) { - return QXmpp::Private::makeReadyTask<Result>( - Error(Error::Modify, Error::ItemNotFound, - QStringLiteral("The roster doesn't contain this user."))); + return makeReadyTask<Result>( + QXmppError { QStringLiteral("The roster doesn't contain this user."), {} }); } auto item = d->entries.value(bareJid); diff --git a/src/client/QXmppRosterManager.h b/src/client/QXmppRosterManager.h index f3629342..654de6eb 100644 --- a/src/client/QXmppRosterManager.h +++ b/src/client/QXmppRosterManager.h @@ -57,8 +57,8 @@ class QXMPP_EXPORT QXmppRosterManager : public QXmppClientExtension Q_OBJECT public: - /// Empty result containing QXmpp::Success or a QXmppStanza::Error - using Result = std::variant<QXmpp::Success, QXmppStanza::Error>; + /// Empty result containing QXmpp::Success or a QXmppError + using Result = std::variant<QXmpp::Success, QXmppError>; QXmppRosterManager(QXmppClient *stream); ~QXmppRosterManager() override; diff --git a/src/client/QXmppUploadRequestManager.cpp b/src/client/QXmppUploadRequestManager.cpp index 4a45d86b..0e20a81c 100644 --- a/src/client/QXmppUploadRequestManager.cpp +++ b/src/client/QXmppUploadRequestManager.cpp @@ -236,9 +236,8 @@ auto QXmppUploadRequestManager::requestSlot(const QString &fileName, const QString &uploadService) -> QXmppTask<SlotResult> { if (!serviceFound() && uploadService.isEmpty()) { - using Error = QXmppStanza::Error; - const auto errorMessage = QStringLiteral("Couldn't request upload slot: No service found."); - return makeReadyTask(SlotResult(Error(Error::Cancel, Error::FeatureNotImplemented, errorMessage))); + return makeReadyTask(SlotResult(QXmppError { + QStringLiteral("Couldn't request upload slot: No service found."), {} })); } QXmppHttpUploadRequestIq iq; diff --git a/src/client/QXmppUploadRequestManager.h b/src/client/QXmppUploadRequestManager.h index e5ed752c..0cda7a55 100644 --- a/src/client/QXmppUploadRequestManager.h +++ b/src/client/QXmppUploadRequestManager.h @@ -5,7 +5,8 @@ #ifndef QXMPPUPLOADREQUESTMANAGER_H #define QXMPPUPLOADREQUESTMANAGER_H -#include <QXmppClientExtension.h> +#include "QXmppError.h" +#include "QXmppClientExtension.h" #include <variant> @@ -20,10 +21,11 @@ class QXmppHttpUploadSlotIq; class QXmppUploadServicePrivate; class QXmppUploadRequestManagerPrivate; +/// /// \brief QXmppUploadService represents an HTTP File Upload service. /// /// It is used to store the JID and maximum file size for uploads. - +/// class QXMPP_EXPORT QXmppUploadService { public: @@ -97,7 +99,7 @@ public: const QMimeType &mimeType, const QString &uploadService = QString()); - using SlotResult = std::variant<QXmppHttpUploadSlotIq, QXmppStanza::Error>; + using SlotResult = std::variant<QXmppHttpUploadSlotIq, QXmppError>; QXmppTask<SlotResult> requestSlot(const QFileInfo &file, const QString &uploadService = {}); QXmppTask<SlotResult> requestSlot(const QFileInfo &file, diff --git a/src/client/QXmppUserLocationManager.h b/src/client/QXmppUserLocationManager.h index f9db4bc1..6d96e170 100644 --- a/src/client/QXmppUserLocationManager.h +++ b/src/client/QXmppUserLocationManager.h @@ -7,6 +7,7 @@ #define QXMPPUSERLOCATIONMANAGER_H #include "QXmppClientExtension.h" +#include "QXmppError.h" #include "QXmppPubSubEventHandler.h" #include <variant> @@ -21,8 +22,8 @@ class QXMPP_EXPORT QXmppUserLocationManager : public QXmppClientExtension, publi public: using Item = QXmppGeolocItem; - using GetResult = std::variant<Item, QXmppStanza::Error>; - using PublishResult = std::variant<QString, QXmppStanza::Error>; + using GetResult = std::variant<Item, QXmppError>; + using PublishResult = std::variant<QString, QXmppError>; QXmppUserLocationManager(); diff --git a/src/client/QXmppUserTuneManager.h b/src/client/QXmppUserTuneManager.h index 90bc2d25..c1cbc795 100644 --- a/src/client/QXmppUserTuneManager.h +++ b/src/client/QXmppUserTuneManager.h @@ -6,6 +6,7 @@ #define QXMPPUSERTUNEMANAGER_H #include "QXmppClientExtension.h" +#include "QXmppError.h" #include "QXmppPubSubEventHandler.h" #include <variant> @@ -20,8 +21,8 @@ class QXMPP_EXPORT QXmppUserTuneManager : public QXmppClientExtension, public QX public: using Item = QXmppTuneItem; - using GetResult = std::variant<Item, QXmppStanza::Error>; - using PublishResult = std::variant<QString, QXmppStanza::Error>; + using GetResult = std::variant<Item, QXmppError>; + using PublishResult = std::variant<QString, QXmppError>; QXmppUserTuneManager(); |
