-
Notifications
You must be signed in to change notification settings - Fork 4
/
filedownloader.cpp
110 lines (100 loc) · 2.71 KB
/
filedownloader.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <QNetworkReply>
#include <QImage>
#include <QFileInfo>
#include <QList>
#include <QSslError>
#include "filedownloader.h"
#include <imageitem.h>
DownloadManager::DownloadManager()
{
connect(&m_manager, SIGNAL(finished(QNetworkReply*)),
SLOT(downloadFinished(QNetworkReply*)));
m_checked = false;
}
void DownloadManager::downloadJSON(const QUrl &url)
{
if (!checkSSLSupport())
return;
QNetworkRequest request(url);
QNetworkReply *reply = m_manager.get(request);
#ifndef QT_NO_SSL
connect(reply, SIGNAL(sslErrors(QList<QSslError>)), SLOT(sslErrors(QList<QSslError>)));
#endif
m_currentDownloads.append(reply);
}
void DownloadManager::downloadImage(const ImageItem item)
{
if (!checkSSLSupport())
return;
QNetworkRequest request(item.url());
QNetworkReply *reply = m_manager.get(request);
#ifndef QT_NO_SSL
connect(reply, SIGNAL(sslErrors(QList<QSslError>)), SLOT(sslErrors(QList<QSslError>)));
#endif
m_pendingImages.insert(item.url(), item);
}
void DownloadManager::sslErrors(const QList<QSslError> &sslErrors)
{
#ifndef QT_NO_SSL
foreach (const QSslError &error, sslErrors)
fprintf(stderr, "SSL error: %s\n", qPrintable(error.errorString()));
#else
Q_UNUSED(sslErrors);
#endif
}
void DownloadManager::downloadFinished(QNetworkReply *reply)
{
QString url = reply->url().toString();
if (reply->error())
{
qDebug() << "Download failed: " << url;
}
else
{
if (m_pendingImages.contains(url))
{
ImageItem item = m_pendingImages[url];
QByteArray pic = reply->readAll();
QImage img = QImage::fromData(pic);
item.setImage(img);
m_pendingImages.remove(url);
emit imageDownloaded(item);
}
else
{
for (int i = 0; i < m_currentDownloads.size(); i++)
{
if (m_currentDownloads[i]->url().toString() == reply->url().toString())
{
QByteArray data = reply->readAll();
m_currentDownloads.removeAt(i);
emit jsonDownloaded(QString(data));
break;
}
}
}
}
reply->deleteLater();
if (m_currentDownloads.size() == 0)
emit downloadsFinished();
}
bool DownloadManager::checkSSLSupport(void)
{
if (m_checked)
return true;
m_checked = true;
if (QSslSocket::supportsSsl())
{
long version = QSslSocket::sslLibraryVersionNumber();
qDebug() << QSslSocket::sslLibraryVersionString()
<< QString::number(version, 16);
if (MINOPENSSLVERSIONNUMBER > version)
{
emit SSL_not_supported();
return false;
}
else return true;
}
emit SSL_not_supported();
return false;
}