diff options
| author | Jonah BrĂ¼chert <jbb@kaidan.im> | 2022-09-09 23:15:10 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-09-29 23:46:36 +0200 |
| commit | 68f167995e7ba71a6f2e556a7a0eab3d234e2d1a (patch) | |
| tree | de645b606d96f01da7ea6db63e90224519a89de3 /src/base | |
| parent | 7b02df3ef42ccb2d8c40eea901c5c6dd4b140204 (diff) | |
| download | qxmpp-68f167995e7ba71a6f2e556a7a0eab3d234e2d1a.tar.gz | |
Implement XEP-0448: Stateless File Sharing
This adds a file sharing manager that is capable of using multiple back
ends. Currently implemented are a normal HTTP File Upload backend and an
encrypted HTTP File Upload. Jingle File Transfer could be implemented
later.
Co-authored-by: Linus Jahn <lnj@kaidan.im>
Diffstat (limited to 'src/base')
| -rw-r--r-- | src/base/QXmppFileShare.cpp | 23 | ||||
| -rw-r--r-- | src/base/QXmppFileShare.h | 10 | ||||
| -rw-r--r-- | src/base/QXmppUtils.cpp | 11 | ||||
| -rw-r--r-- | src/base/QXmppUtils_p.h | 1 |
4 files changed, 45 insertions, 0 deletions
diff --git a/src/base/QXmppFileShare.cpp b/src/base/QXmppFileShare.cpp index 9dd4b686..28276b0c 100644 --- a/src/base/QXmppFileShare.cpp +++ b/src/base/QXmppFileShare.cpp @@ -125,6 +125,29 @@ void QXmppFileShare::setEncryptedSourecs(const QVector<QXmppEncryptedFileSource> } /// \cond +void QXmppFileShare::visitSources(std::function<bool(const std::any &)> &&visitor) const +{ + for (const auto &httpSource : d->httpSources) { + if (visitor(httpSource)) { + return; + } + } + for (const auto &encryptedSource : d->encryptedSources) { + if (visitor(encryptedSource)) { + return; + } + } +} + +void QXmppFileShare::addSource(const std::any &source) +{ + if (source.type() == typeid(QXmppHttpFileSource)) { + d->httpSources.push_back(std::any_cast<QXmppHttpFileSource>(source)); + } else if (source.type() == typeid(QXmppEncryptedFileSource)) { + d->encryptedSources.push_back(std::any_cast<QXmppEncryptedFileSource>(source)); + } +} + bool QXmppFileShare::parse(const QDomElement &el) { if (el.tagName() == "file-sharing" && el.namespaceURI() == ns_sfs) { diff --git a/src/base/QXmppFileShare.h b/src/base/QXmppFileShare.h index b0d48bd3..b8506836 100644 --- a/src/base/QXmppFileShare.h +++ b/src/base/QXmppFileShare.h @@ -7,6 +7,9 @@ #include "QXmppGlobal.h" +#include <any> +#include <functional> + #include <QSharedDataPointer> class QDomElement; @@ -43,6 +46,13 @@ public: /// \cond bool parse(const QDomElement &el); void toXml(QXmlStreamWriter *writer) const; + +protected: + friend class QXmppFileSharingManager; + + // Private, internally used API: + void visitSources(std::function<bool(const std::any &)> &&visitor) const; + void addSource(const std::any &source); /// \endcond private: diff --git a/src/base/QXmppUtils.cpp b/src/base/QXmppUtils.cpp index 7ae74ba3..e0225d77 100644 --- a/src/base/QXmppUtils.cpp +++ b/src/base/QXmppUtils.cpp @@ -403,4 +403,15 @@ void QXmpp::Private::generateRandomBytes(uint8_t *bytes, uint32_t byteCount) #endif } +float QXmpp::Private::calculateProgress(qint64 transferred, qint64 total) +{ + if (total > 0) { + if (transferred > total) { + return 1; + } + return float(transferred) / total; + } + + return 0; +} /// \endcond diff --git a/src/base/QXmppUtils_p.h b/src/base/QXmppUtils_p.h index 9a7b6103..17a24634 100644 --- a/src/base/QXmppUtils_p.h +++ b/src/base/QXmppUtils_p.h @@ -16,6 +16,7 @@ namespace QXmpp::Private { QXMPP_EXPORT QByteArray generateRandomBytes(uint32_t minimumByteCount, uint32_t maximumByteCount); QXMPP_EXPORT void generateRandomBytes(uint8_t *bytes, uint32_t byteCount); +float calculateProgress(qint64 transferred, qint64 total); } // namespace QXmpp::Private |
