aboutsummaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2022-12-29 21:39:25 +0100
committerLinus Jahn <lnj@kaidan.im>2022-12-29 21:39:25 +0100
commit1b5c7c466d0ca2df80cdec5009cac541afa735c7 (patch)
tree4a8e1bdee594ac47d3566697aa1b1b47261b5047 /src/base
parentbc23e5f27d9656823fe90f81be764f1eeb47110b (diff)
downloadqxmpp-1b5c7c466d0ca2df80cdec5009cac541afa735c7.tar.gz
Stanza: Make error optional
Closes #512.
Diffstat (limited to 'src/base')
-rw-r--r--src/base/QXmppStanza.cpp48
-rw-r--r--src/base/QXmppStanza.h7
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);