A simple Qt based browser with no bullshit that supports PKCS#11 tokens (such as the SuisseID).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
3.0 KiB

/*! @file
@id $Id$
*/
// 1 2 3 4 5 6 7 8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890
#include <QtNetwork/QNetworkReply>
#include <map>
#include <cassert>
#include <QtCore/QDebug>
#ifndef LOG
#define LOG qDebug()<<__PRETTY_FUNCTION__
#endif
class DownloadManager: public QObject {
Q_OBJECT;
public:
DownloadManager& operator+=(QNetworkReply* reply) {
LOG;
add(reply);
return *this;
}
Q_SIGNALS:
void progress(qint64 done, qint64 total);
void started();
void finished();
public Q_SLOTS:
void add(QNetworkReply* reply) {
LOG<<reply->url().toString();
_downloads[reply] = Progress(0, 0);
assert(connect(reply, SIGNAL(downloadProgress(qint64, qint64)),
SLOT(downloadProgress(qint64, qint64))));
assert(connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
SLOT(error(QNetworkReply::NetworkError))));
assert(connect(reply, SIGNAL(finished()),
SLOT(slotFinished())));
assert(connect(reply, SIGNAL(metaDataChanged()),
SLOT(metaDataChanged())));
assert(connect(reply, SIGNAL(sslErrors(const QList<QSslError>&)),
SLOT(sslErrors(const QList<QSslError>&))));
assert(connect(reply, SIGNAL(uploadProgress(qint64, qint64)),
SLOT(uploadProgress(qint64, qint64))));
if (_downloads.size()==1) started();
}
void abort() {
while (_downloads.size()) _downloads.begin()->first->abort();
}
private:
void calcProgress() {
//LOG;
qint64 done(0);
qint64 total(0);
for (Downloads::iterator it(_downloads.begin());
it!=_downloads.end(); ++it) {
done += it->second.first;
total += it->second.second;
}
progress(done, total);
}
private Q_SLOTS:
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal) {
//LOG<<bytesReceived<<bytesTotal;
_downloads[qobject_cast<QNetworkReply*>(sender())].first = bytesReceived;
_downloads[qobject_cast<QNetworkReply*>(sender())].second = bytesTotal;
calcProgress();
}
void error(QNetworkReply::NetworkError code) {
LOG;
}
void slotFinished() {
LOG;
_downloads.erase(qobject_cast<QNetworkReply*>(sender()));
if (_downloads.size()==0) finished();
}
void metaDataChanged() {
LOG;
}
void sslErrors(const QList<QSslError> & errors) {
LOG;
}
void uploadProgress(qint64 bytesSent, qint64 bytesTotal) {
//LOG<<bytesSent<<bytesTotal;
_downloads[qobject_cast<QNetworkReply*>(sender())].first = bytesSent;
_downloads[qobject_cast<QNetworkReply*>(sender())].second = bytesTotal;
calcProgress();
}
private:
typedef std::pair<qint64, qint64> Progress;
typedef std::map<QNetworkReply*, Progress> Downloads;
Downloads _downloads;
};