diff --git a/src/TransferCache.cpp b/src/TransferCache.cpp index ecb892e..7bd042a 100644 --- a/src/TransferCache.cpp +++ b/src/TransferCache.cpp @@ -1,135 +1,135 @@ /* * Kaidan - A user-friendly XMPP client for every device! * - * Copyright (C) 2016-2018 Kaidan developers and contributors + * Copyright (C) 2016-2020 Kaidan developers and contributors * (see the LICENSE file for a full list of copyright authors) * * Kaidan is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * In addition, as a special exception, the author of Kaidan gives * permission to link the code of its release with the OpenSSL * project's "OpenSSL" library (or with modified versions of it that * use the same license as the "OpenSSL" library), and distribute the * linked executables. You must obey the GNU General Public License in * all respects for all of the code used other than "OpenSSL". If you * modify this file, you may extend this exception to your version of * the file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. * * Kaidan is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Kaidan. If not, see . */ #include "TransferCache.h" #include "qxmpp-exts/QXmppUploadManager.h" #include TransferJob::TransferJob(qint64 bytesTotal) : progress(0.0), bytesSent(0), bytesTotal(bytesTotal) { } void TransferJob::setProgress(qreal progress) { if (this->progress == progress) return; this->progress = progress; emit progressChanged(); } void TransferJob::setBytesSent(qint64 bytesSent) { if (this->bytesSent == bytesSent) return; this->bytesSent = bytesSent; emit bytesSentChanged(); if (bytesTotal != 0) setProgress(qreal(bytesSent) / qreal(bytesTotal)); } void TransferJob::setBytesTotal(qint64 bytesTotal) { if (this->bytesTotal == bytesTotal) return; this->bytesTotal = bytesTotal; emit bytesTotalChanged(); if (bytesTotal != 0) setProgress(qreal(bytesSent) / qreal(bytesTotal)); } TransferCache::TransferCache(QObject *parent) : QObject(parent) { connect(this, &TransferCache::addJobRequested, this, &TransferCache::addJob); connect(this, &TransferCache::removeJobRequested, this, &TransferCache::removeJob); connect(this, &TransferCache::setJobBytesSentRequested, this, &TransferCache::setJobBytesSent); connect(this, &TransferCache::setJobProgressRequested, this, &TransferCache::setJobBytesSent); } TransferCache::~TransferCache() { // wait for other threads to finish QMutexLocker locker(&mutex); } void TransferCache::addJob(const QString& msgId, qint64 bytesTotal) { QMutexLocker locker(&mutex); uploads.insert(msgId, new TransferJob(bytesTotal)); locker.unlock(); emit jobsChanged(); } void TransferCache::removeJob(const QString& msgId) { QMutexLocker locker(&mutex); delete uploads[msgId]; uploads.remove(msgId); locker.unlock(); emit jobsChanged(); } bool TransferCache::hasUpload(QString msgId) const { QMutexLocker locker(&mutex); return uploads.contains(msgId); } TransferJob* TransferCache::jobByMessageId(QString msgId) const { QMutexLocker locker(&mutex); TransferJob* job = uploads.value(msgId); if (job == nullptr) return emptyJob; return job; } void TransferCache::setJobProgress(const QString &msgId, qint64 bytesSent, qint64 bytesTotal) { TransferJob* job = jobByMessageId(msgId); QMutexLocker locker(&mutex); job->setBytesTotal(bytesTotal); job->setBytesSent(bytesSent); } void TransferCache::setJobBytesSent(const QString &msgId, qint64 bytesSent) { TransferJob* job = jobByMessageId(msgId); QMutexLocker locker(&mutex); job->setBytesSent(bytesSent); } diff --git a/src/TransferCache.h b/src/TransferCache.h index 1c261f3..025b470 100644 --- a/src/TransferCache.h +++ b/src/TransferCache.h @@ -1,115 +1,115 @@ /* * Kaidan - A user-friendly XMPP client for every device! * - * Copyright (C) 2016-2018 Kaidan developers and contributors + * Copyright (C) 2016-2020 Kaidan developers and contributors * (see the LICENSE file for a full list of copyright authors) * * Kaidan is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * In addition, as a special exception, the author of Kaidan gives * permission to link the code of its release with the OpenSSL * project's "OpenSSL" library (or with modified versions of it that * use the same license as the "OpenSSL" library), and distribute the * linked executables. You must obey the GNU General Public License in * all respects for all of the code used other than "OpenSSL". If you * modify this file, you may extend this exception to your version of * the file, but you are not obligated to do so. If you do not wish to * do so, delete this exception statement from your version. * * Kaidan is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Kaidan. If not, see . */ #ifndef TRANSFERCACHE_H #define TRANSFERCACHE_H #include #include #include /** * @class TransferJob Upload/download progress information */ class TransferJob : public QObject { Q_OBJECT Q_PROPERTY(qreal progress MEMBER progress NOTIFY progressChanged) Q_PROPERTY(qint64 bytesSent MEMBER bytesSent NOTIFY bytesSentChanged) Q_PROPERTY(qint64 bytesTotal MEMBER bytesTotal NOTIFY bytesTotalChanged) public: TransferJob(qint64 bytesTotal); Q_INVOKABLE void setProgress(qreal progress); Q_INVOKABLE void setBytesSent(qint64 bytesSent); Q_INVOKABLE void setBytesTotal(qint64 bytesTotal); signals: void progressChanged(); void bytesSentChanged(); void bytesTotalChanged(); private: qreal progress; qint64 bytesSent; qint64 bytesTotal; }; /** * @class TransferCache Caching upload and download meta. * * This class is thread-safe. */ class TransferCache : public QObject { Q_OBJECT public: TransferCache(QObject *parent = nullptr); ~TransferCache(); /** * Returns true if the cache contains an upload for the specified message id. */ Q_INVOKABLE bool hasUpload(QString msgId) const; /** * Returns the upload associated with the message id (used for progress) */ Q_INVOKABLE TransferJob* jobByMessageId(QString msgId) const; public slots: Q_INVOKABLE void addJob(const QString &msgId, qint64 bytesTotal); Q_INVOKABLE void removeJob(const QString& msgId); Q_INVOKABLE void setJobBytesSent(const QString& msgId, qint64 bytesSent); Q_INVOKABLE void setJobProgress(const QString& msgId, qint64 bytesSent, qint64 bytesTotal); signals: /** * @brief Emitted when a job was added or removed; useful for getting notified * about changes of hasUpload(). */ void jobsChanged(); void addJobRequested(const QString& msgId, qint64 bytesTotal); void removeJobRequested(const QString& msgId); void setJobBytesSentRequested(const QString& msgId, qint64 bytesSent); void setJobProgressRequested(const QString& msgId, qint64 bytesSent, qint64 bytesTotal); private: QMap uploads; TransferJob* emptyJob; mutable QMutex mutex; }; #endif // TRANSFERCACHE_H