Mercurial > trustbridge
annotate ui/downloader.cpp @ 98:6090e673c707
Add some error handling. Change process path for testing
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Fri, 21 Mar 2014 10:50:01 +0000 |
parents | 63b79d135631 |
children | 17e1c8f37d72 |
rev | line source |
---|---|
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
1 #include "downloader.h" |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
2 |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
3 #ifndef DOWNLOAD_SERVER |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
4 #define DOWNLOAD_SERVER "https://www.intevation.de" |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
5 #endif |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
6 |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
7 #include <QFile> |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
8 #include <QDir> |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
9 #include <QDebug> |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
10 #include <QStandardPaths> |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
11 #include <QLocale> |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
12 #include <QSaveFile> |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
13 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
14 #include <polarssl/net.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
15 #include <polarssl/ssl.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
16 #include <polarssl/entropy.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
17 #include <polarssl/ctr_drbg.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
18 #include <polarssl/error.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
19 #include <polarssl/certs.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
20 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
21 #define MAX_SW_SIZE 10485760 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
22 #define MAX_LIST_SIZE 1048576 |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
23 |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
24 |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
25 Downloader::Downloader(QObject* parent, const QString& url, |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
26 const QByteArray& certificate, |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
27 const QDateTime& newestSW, |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
28 const QDateTime& newestList, |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
29 const QString& resourceSW, |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
30 const QString& resourceList): |
12
9121eea6d93f
Fix constructor usage. Too much Java.
Andre Heinecke <aheinecke@intevation.de>
parents:
11
diff
changeset
|
31 QThread(parent), |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
32 mLastModSW(newestSW), |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
33 mLastModList(newestList), |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
34 mResourceSW(resourceSW), |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
35 mResourceList(resourceList), |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
36 mSSLConnection(url, certificate) |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
37 { |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
38 } |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
39 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
40 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
41 Downloader::~Downloader() { |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
42 } |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
43 |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
44 QString Downloader::getDataDirectory() |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
45 { |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
46 QString candidate = |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
47 QStandardPaths::writableLocation(QStandardPaths::DataLocation); |
12
9121eea6d93f
Fix constructor usage. Too much Java.
Andre Heinecke <aheinecke@intevation.de>
parents:
11
diff
changeset
|
48 |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
49 if (candidate.isEmpty()) { |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
50 qDebug() << "Could not find writeable locaction for me"; |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
51 return QString(); |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
52 } |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
53 |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
54 QDir cDir(candidate); |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
55 |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
56 if (!cDir.exists()) { |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
57 if (!cDir.mkpath(candidate)) { |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
58 qDebug() << "Could not create path to: " << candidate; |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
59 return QString(); |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
60 } |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
61 } |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
62 return cDir.absolutePath(); |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
63 } |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
64 |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
65 QMap<QString, QString> Downloader::parseHeaders(QByteArray *data) |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
66 { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
67 int bodyStart = data->indexOf("\r\n\r\n"); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
68 QMap<QString, QString> retval; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
69 QByteArray headers; |
76
63b79d135631
Remove QTextStream usage. The QTextStream usage in this way
Andre Heinecke <aheinecke@intevation.de>
parents:
72
diff
changeset
|
70 QString response(*data); |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
71 if (bodyStart == -1) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
72 qDebug() << "Could not find header end."; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
73 emit error(tr("Invalid response"), |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
74 SSLConnection::InvalidResponse); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
75 return retval; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
76 } |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
77 |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
78 /* Take the headers with one additional line break */ |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
79 headers = data->left(bodyStart + 2); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
80 /* Chop off the head */ |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
81 |
76
63b79d135631
Remove QTextStream usage. The QTextStream usage in this way
Andre Heinecke <aheinecke@intevation.de>
parents:
72
diff
changeset
|
82 foreach (const QString& line, response.split("\r\n")) { |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
83 int sepPos = -1; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
84 sepPos = line.indexOf(": "); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
85 if (sepPos == -1) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
86 continue; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
87 } |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
88 QString key = line.left(sepPos); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
89 QString value = line.right(line.size() - sepPos - 2); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
90 |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
91 retval.insert(key, value); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
92 } |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
93 |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
94 *data = data->right(data->size() - bodyStart - 4); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
95 return retval; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
96 } |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
97 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
98 QDateTime Downloader::getLastModifiedHeader(const QString &resource) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
99 int ret = -1; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
100 QByteArray response; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
101 QLocale cLocale = QLocale::c(); |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
102 QMap<QString, QString> headers; |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
103 QString headRequest = |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
104 QString::fromLatin1("HEAD %1 HTTP/1.0\r\n\r\n").arg(resource); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
105 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
106 ret = mSSLConnection.write(headRequest.toUtf8()); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
107 if (ret != 0) { |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
108 emit error (tr("Connection lost"), SSLConnection::ConnectionLost); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
109 return QDateTime(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
110 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
111 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
112 response = mSSLConnection.read(1024); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
113 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
114 if (response.isNull()) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
115 qDebug() << "No response"; |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
116 emit error (tr("Connection lost"), SSLConnection::ConnectionLost); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
117 return QDateTime(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
118 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
119 |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
120 headers = parseHeaders(&response); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
121 const QString lastModified = headers.value("Last-Modified"); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
122 qDebug() << "Headers: " << headers; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
123 if (!lastModified.isEmpty()) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
124 QDateTime candidate = cLocale.toDateTime(lastModified, |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
125 "ddd, dd MMM yyyy HH:mm:ss' GMT'"); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
126 if (candidate.isValid()) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
127 return candidate; |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
128 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
129 } |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
130 emit error (tr("Invalid response from the server"), SSLConnection::InvalidResponse); |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
131 qDebug() << "Response from server was: " << response; |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
132 return QDateTime(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
133 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
134 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
135 bool Downloader::downloadFile(const QString &resource, |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
136 const QString &fileName, |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
137 size_t maxSize) |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
138 { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
139 int ret = -1; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
140 size_t bytesRead = 0; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
141 QString getRequest = |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
142 QString::fromLatin1("GET %1 HTTP/1.0\r\n\r\n").arg(resource); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
143 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
144 QSaveFile outputFile(fileName); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
145 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
146 ret = mSSLConnection.write(getRequest.toUtf8()); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
147 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
148 // Open / Create the file to write to. |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
149 if (!outputFile.open(QIODevice::WriteOnly)) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
150 qDebug() << "Failed to open file"; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
151 return false; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
152 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
153 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
154 if (ret != 0) { |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
155 emit error(tr("Connection lost"), SSLConnection::ConnectionLost); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
156 return false; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
157 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
158 |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
159 bool inBody = false; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
160 QMap <QString, QString> headers; |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
161 do { |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
162 /* Read the response in 8KiB chunks */ |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
163 int responseSize = 0; |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
164 QByteArray response = mSSLConnection.read(8192); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
165 if (response.isNull()) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
166 qDebug() << "Error reading response"; |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
167 emit error(tr("Connection lost"), SSLConnection::ConnectionLost); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
168 return false; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
169 } |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
170 responseSize = response.size(); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
171 if (!inBody) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
172 headers = parseHeaders(&response); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
173 inBody = true; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
174 } |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
175 outputFile.write(response); |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
176 bytesRead += responseSize; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
177 if (responseSize < 8192) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
178 /* Nothing more to read */ |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
179 break; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
180 } |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
181 /* TODO Emit progress */ |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
182 } while (bytesRead < maxSize); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
183 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
184 return outputFile.commit(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
185 } |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
186 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
187 void Downloader::run() { |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
188 int ret; |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
189 QDateTime remoteModList; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
190 QDateTime remoteModSW; |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
191 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
192 if (!mSSLConnection.initialized()) { |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
193 emit error(tr("Failed to initialize SSL Module."), SSLConnection::ErrUnknown); |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
194 return; |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
195 } |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
196 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
197 ret = mSSLConnection.connect(); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
198 |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
199 if (ret != 0) { |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
200 emit error(tr("Failed to connect."), |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
201 mSSLConnection.getLastError()); |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
202 return; |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
203 } |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
204 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
205 emit progress(tr("Connected"), 1, -1); |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
206 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
207 remoteModSW = getLastModifiedHeader(mResourceSW); |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
208 remoteModList = getLastModifiedHeader(mResourceList); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
209 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
210 if (!remoteModSW.isValid() || !remoteModList.isValid()) { |
72
7e304573ebd1
Add some testing hacks for interactive testing
Andre Heinecke <aheinecke@intevation.de>
parents:
54
diff
changeset
|
211 qDebug() << "Could not parse headers"; |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
212 return; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
213 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
214 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
215 if (!mLastModSW.isValid() || remoteModSW > mLastModSW) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
216 QString dataDirectory = getDataDirectory(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
217 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
218 if (dataDirectory.isEmpty()) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
219 qDebug() << "Failed to get data directory"; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
220 return; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
221 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
222 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
223 QString fileName = dataDirectory.append("/SW-") |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
224 .append(remoteModSW.toString("yyyymmddHHmmss")) |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
225 .append(".exe"); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
226 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
227 qDebug() << "fileName: " << fileName; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
228 |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
229 if (!downloadFile(mResourceSW, fileName, MAX_SW_SIZE)) { |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
230 return; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
231 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
232 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
233 emit newSoftwareAvailable(fileName, remoteModSW); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
234 } else if (!mLastModList.isValid() || remoteModList > mLastModList) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
235 QString dataDirectory = getDataDirectory(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
236 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
237 if (dataDirectory.isEmpty()) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
238 qDebug() << "Failed to get data directory"; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
239 return; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
240 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
241 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
242 QString fileName = dataDirectory.append("/list-") |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
243 .append(remoteModSW.toString("yyyymmddHHmmss")) |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
244 .append(".txt"); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
245 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
246 qDebug() << "fileName: " << fileName; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
247 |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
248 if (!downloadFile(mResourceList, fileName, MAX_LIST_SIZE)) { |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
249 return; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
250 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
251 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
252 emit newListAvailable(fileName, remoteModList); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
253 } |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
254 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
255 emit progress(tr("Closing"), 1, -1); |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
256 } |