diff options
| author | Linus Jahn <lnj@kaidan.im> | 2022-12-29 21:39:25 +0100 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-12-29 21:39:25 +0100 |
| commit | 1b5c7c466d0ca2df80cdec5009cac541afa735c7 (patch) | |
| tree | 4a8e1bdee594ac47d3566697aa1b1b47261b5047 /src/base | |
| parent | bc23e5f27d9656823fe90f81be764f1eeb47110b (diff) | |
| download | qxmpp-1b5c7c466d0ca2df80cdec5009cac541afa735c7.tar.gz | |
Stanza: Make error optional
Closes #512.
Diffstat (limited to 'src/base')
| -rw-r--r-- | src/base/QXmppStanza.cpp | 48 | ||||
| -rw-r--r-- | src/base/QXmppStanza.h | 7 |
2 files changed, 51 insertions, 4 deletions
diff --git a/src/base/QXmppStanza.cpp b/src/base/QXmppStanza.cpp index fa170740..2d851f09 100644 --- a/src/base/QXmppStanza.cpp +++ b/src/base/QXmppStanza.cpp @@ -354,6 +354,13 @@ QXmppStanza::Error::Error(const QString &type, const QString &cond, d->condition = conditionFromString(cond); } +/// \cond +QXmppStanza::Error::Error(QSharedDataPointer<QXmppStanzaErrorPrivate> d) + : d(std::move(d)) +{ +} +/// \endcond + /// Default destructor QXmppStanza::Error::~Error() = default; /// Copy operator @@ -850,7 +857,7 @@ public: QString from; QString id; QString lang; - QXmppStanza::Error error; + QSharedDataPointer<QXmppStanzaErrorPrivate> error; QXmppElementList extensions; QList<QXmppExtendedAddress> extendedAddresses; QSharedDataPointer<QXmppE2eeMetadataPrivate> e2eeMetadata; @@ -955,9 +962,24 @@ void QXmppStanza::setLang(const QString &lang) /// /// Returns the stanza's error. /// +/// If the stanza has no error a default constructed QXmppStanza::Error is returned. +/// QXmppStanza::Error QXmppStanza::error() const { - return d->error; + return d->error ? Error { d->error } : Error(); +} + +/// +/// Returns the stanza's error. +/// +/// \since QXmpp 1.5 +/// +std::optional<QXmppStanza::Error> QXmppStanza::errorOptional() const +{ + if (d->error) { + return Error { d->error }; + } + return {}; } /// @@ -967,7 +989,23 @@ QXmppStanza::Error QXmppStanza::error() const /// void QXmppStanza::setError(const QXmppStanza::Error &error) { - d->error = error; + d->error = error.d; +} + +/// +/// Sets the stanza's error. +/// +/// If you set an empty optional, this will remove the error. +/// +/// \since QXmpp 1.5 +/// +void QXmppStanza::setError(const std::optional<Error> &error) +{ + if (error) { + d->error = error->d; + } else { + d->error = nullptr; + } } /// @@ -1052,7 +1090,9 @@ void QXmppStanza::parse(const QDomElement &element) QDomElement errorElement = element.firstChildElement("error"); if (!errorElement.isNull()) { - d->error.parse(errorElement); + Error error; + error.parse(errorElement); + d->error = error.d; } // XEP-0033: Extended Stanza Addressing diff --git a/src/base/QXmppStanza.h b/src/base/QXmppStanza.h index 320bab26..90ef6907 100644 --- a/src/base/QXmppStanza.h +++ b/src/base/QXmppStanza.h @@ -143,6 +143,9 @@ public: Error(Error &&); Error(Type type, Condition cond, const QString &text = QString()); Error(const QString &type, const QString &cond, const QString &text = QString()); + /// \cond + Error(QSharedDataPointer<QXmppStanzaErrorPrivate> d); + /// \endcond ~Error(); Error &operator=(const Error &); @@ -186,6 +189,8 @@ public: /// \endcond private: + friend class QXmppStanza; + QSharedDataPointer<QXmppStanzaErrorPrivate> d; }; @@ -210,7 +215,9 @@ public: void setLang(const QString &); QXmppStanza::Error error() const; + std::optional<Error> errorOptional() const; void setError(const QXmppStanza::Error &error); + void setError(const std::optional<Error> &error); QXmppElementList extensions() const; void setExtensions(const QXmppElementList &elements); |
