Mercurial > trustbridge
annotate ui/downloader.cpp @ 633:6c090638b2b4
Use static buffer for module file name.
According to the msdn examle the return value of getmodulefilename
should be used to indicate success and not the size. And according
to comments on that function on Windows 8.1 it does not return
the needed size. So better be more robust and just use max_path
as a limit.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Mon, 23 Jun 2014 15:29:48 +0200 |
parents | cb044efdaf0d |
children | 13cf42dbe9bd |
rev | line source |
---|---|
404 | 1 /* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik |
2 * Software engineering by Intevation GmbH | |
3 * | |
4 * This file is Free Software under the GNU GPL (v>=2) | |
5 * and comes with ABSOLUTELY NO WARRANTY! | |
6 * See LICENSE.txt for details. | |
7 */ | |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
8 #include "downloader.h" |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
9 |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
10 #ifndef DOWNLOAD_SERVER |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
11 #define DOWNLOAD_SERVER "https://www.intevation.de" |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
12 #endif |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
13 |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
14 #include <QFile> |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
15 #include <QDir> |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
16 #include <QDebug> |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
17 #include <QStandardPaths> |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
18 #include <QLocale> |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
19 #include <QSaveFile> |
27
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 #include <polarssl/net.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
22 #include <polarssl/ssl.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
23 #include <polarssl/entropy.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
24 #include <polarssl/ctr_drbg.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
25 #include <polarssl/error.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
26 #include <polarssl/certs.h> |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
27 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
28 #define MAX_SW_SIZE 10485760 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
29 #define MAX_LIST_SIZE 1048576 |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
30 |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
31 |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
32 Downloader::Downloader(QObject* parent, const QString& url, |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
33 const QByteArray& certificate, |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
34 const QDateTime& newestSW, |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
35 const QDateTime& newestList, |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
36 const QString& resourceSW, |
460
f8bed9008362
Added switch to download new available software.
Raimund Renkert <rrenkert@intevation.de>
parents:
459
diff
changeset
|
37 const QString& resourceList, |
f8bed9008362
Added switch to download new available software.
Raimund Renkert <rrenkert@intevation.de>
parents:
459
diff
changeset
|
38 bool downloadSW): |
12
9121eea6d93f
Fix constructor usage. Too much Java.
Andre Heinecke <aheinecke@intevation.de>
parents:
11
diff
changeset
|
39 QThread(parent), |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
40 mLastModSW(newestSW), |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
41 mLastModList(newestList), |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
42 mResourceSW(resourceSW), |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
43 mResourceList(resourceList), |
460
f8bed9008362
Added switch to download new available software.
Raimund Renkert <rrenkert@intevation.de>
parents:
459
diff
changeset
|
44 mDownloadSW(downloadSW), |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
45 mSSLConnection(url, certificate) |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
46 { |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
47 } |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
48 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
49 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
50 Downloader::~Downloader() { |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
51 } |
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
52 |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
53 QString Downloader::getDataDirectory() |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
54 { |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
55 QString candidate = |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
56 QStandardPaths::writableLocation(QStandardPaths::DataLocation); |
12
9121eea6d93f
Fix constructor usage. Too much Java.
Andre Heinecke <aheinecke@intevation.de>
parents:
11
diff
changeset
|
57 |
15
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
58 if (candidate.isEmpty()) { |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
59 qDebug() << "Could not find writeable locaction for me"; |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
60 return QString(); |
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 |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
63 QDir cDir(candidate); |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
64 |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
65 if (!cDir.exists()) { |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
66 if (!cDir.mkpath(candidate)) { |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
67 qDebug() << "Could not create path to: " << candidate; |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
68 return QString(); |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
69 } |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
70 } |
95e1b6edf2fc
Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents:
12
diff
changeset
|
71 return cDir.absolutePath(); |
10
fe39d93f1261
Start on Downloader component
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
72 } |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
73 |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
74 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
|
75 { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
76 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
|
77 QMap<QString, QString> retval; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
78 QByteArray headers; |
76
63b79d135631
Remove QTextStream usage. The QTextStream usage in this way
Andre Heinecke <aheinecke@intevation.de>
parents:
72
diff
changeset
|
79 QString response(*data); |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
80 if (bodyStart == -1) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
81 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
|
82 emit error(tr("Invalid response"), |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
83 SSLConnection::InvalidResponse); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
84 return retval; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
85 } |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
86 |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
87 /* 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
|
88 headers = data->left(bodyStart + 2); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
89 /* Chop off the head */ |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
90 |
76
63b79d135631
Remove QTextStream usage. The QTextStream usage in this way
Andre Heinecke <aheinecke@intevation.de>
parents:
72
diff
changeset
|
91 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
|
92 int sepPos = -1; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
93 sepPos = line.indexOf(": "); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
94 if (sepPos == -1) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
95 continue; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
96 } |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
97 QString key = line.left(sepPos); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
98 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
|
99 |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
100 retval.insert(key, value); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
101 } |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
102 |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
103 *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
|
104 return retval; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
105 } |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
106 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
107 QDateTime Downloader::getLastModifiedHeader(const QString &resource) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
108 int ret = -1; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
109 QByteArray response; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
110 QLocale cLocale = QLocale::c(); |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
111 QMap<QString, QString> headers; |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
112 QString headRequest = |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
113 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
|
114 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
115 ret = mSSLConnection.write(headRequest.toUtf8()); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
116 if (ret != 0) { |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
117 emit error (tr("Connection lost"), SSLConnection::ConnectionLost); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
118 return QDateTime(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
119 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
120 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
121 response = mSSLConnection.read(1024); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
122 |
553
cb044efdaf0d
Debugging: Always log the complete response
Andre Heinecke <aheinecke@intevation.de>
parents:
485
diff
changeset
|
123 qDebug() << "Response from server was: " << response; |
cb044efdaf0d
Debugging: Always log the complete response
Andre Heinecke <aheinecke@intevation.de>
parents:
485
diff
changeset
|
124 |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
125 if (response.isNull()) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
126 qDebug() << "No response"; |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
127 emit error (tr("Connection lost"), SSLConnection::ConnectionLost); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
128 return QDateTime(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
129 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
130 |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
131 headers = parseHeaders(&response); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
132 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
|
133 if (!lastModified.isEmpty()) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
134 QDateTime candidate = cLocale.toDateTime(lastModified, |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
135 "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
|
136 if (candidate.isValid()) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
137 return candidate; |
32
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 } |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
140 emit error (tr("Invalid response from the server"), SSLConnection::InvalidResponse); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
141 return QDateTime(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
142 } |
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 bool Downloader::downloadFile(const QString &resource, |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
145 const QString &fileName, |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
146 size_t maxSize) |
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 int ret = -1; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
149 size_t bytesRead = 0; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
150 QString getRequest = |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
151 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
|
152 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
153 QSaveFile outputFile(fileName); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
154 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
155 ret = mSSLConnection.write(getRequest.toUtf8()); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
156 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
157 // Open / Create the file to write to. |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
158 if (!outputFile.open(QIODevice::WriteOnly)) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
159 qDebug() << "Failed to open file"; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
160 return false; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
161 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
162 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
163 if (ret != 0) { |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
164 emit error(tr("Connection lost"), SSLConnection::ConnectionLost); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
165 return false; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
166 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
167 |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
168 bool inBody = false; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
169 QMap <QString, QString> headers; |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
170 do { |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
171 /* 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
|
172 int responseSize = 0; |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
173 QByteArray response = mSSLConnection.read(8192); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
174 if (response.isNull()) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
175 qDebug() << "Error reading response"; |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
176 emit error(tr("Connection lost"), SSLConnection::ConnectionLost); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
177 return false; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
178 } |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
179 responseSize = response.size(); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
180 if (!inBody) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
181 headers = parseHeaders(&response); |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
182 inBody = true; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
183 } |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
184 outputFile.write(response); |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
185 bytesRead += responseSize; |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
186 if (responseSize < 8192) { |
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
187 /* Nothing more to read */ |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
188 break; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
189 } |
54
09cd242d8443
Split out Header parsing into it's own function
Andre Heinecke <aheinecke@intevation.de>
parents:
46
diff
changeset
|
190 /* TODO Emit progress */ |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
191 } while (bytesRead < maxSize); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
192 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
193 return outputFile.commit(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
194 } |
27
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 void Downloader::run() { |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
197 int ret; |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
198 QDateTime remoteModList; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
199 QDateTime remoteModSW; |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
200 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
201 if (!mSSLConnection.initialized()) { |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
202 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
|
203 return; |
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 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
206 ret = mSSLConnection.connect(); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
207 |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
208 if (ret != 0) { |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
209 emit error(tr("Failed to connect."), |
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
210 mSSLConnection.getLastError()); |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
211 return; |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
212 } |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
213 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
214 emit progress(tr("Connected"), 1, -1); |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
215 |
45
c6125d73faf4
Move SSLConnection into it's own class
Andre Heinecke <aheinecke@intevation.de>
parents:
35
diff
changeset
|
216 remoteModSW = getLastModifiedHeader(mResourceSW); |
485
5834b340c54c
Emit a signal for last modified date in downloader.
Raimund Renkert <rrenkert@intevation.de>
parents:
460
diff
changeset
|
217 emit lastModifiedDate(remoteModSW); |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
218 |
459
34cc448409ec
Fix error handling
Andre Heinecke <aheinecke@intevation.de>
parents:
458
diff
changeset
|
219 if (!remoteModSW.isValid()) { |
34cc448409ec
Fix error handling
Andre Heinecke <aheinecke@intevation.de>
parents:
458
diff
changeset
|
220 qDebug() << "Could not parse headers for Software"; |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
221 return; |
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 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
224 if (!mLastModSW.isValid() || remoteModSW > mLastModSW) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
225 QString dataDirectory = getDataDirectory(); |
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 if (dataDirectory.isEmpty()) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
228 qDebug() << "Failed to get data directory"; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
229 return; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
230 } |
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 QString fileName = dataDirectory.append("/SW-") |
442
d2f4e28b5a13
Fix date format for file names
Andre Heinecke <aheinecke@intevation.de>
parents:
404
diff
changeset
|
233 .append(remoteModSW.toString("yyyyMMddHHmmss")) |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
234 .append(".exe"); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
235 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
236 qDebug() << "fileName: " << fileName; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
237 |
460
f8bed9008362
Added switch to download new available software.
Raimund Renkert <rrenkert@intevation.de>
parents:
459
diff
changeset
|
238 if (mDownloadSW) { |
f8bed9008362
Added switch to download new available software.
Raimund Renkert <rrenkert@intevation.de>
parents:
459
diff
changeset
|
239 if (!downloadFile(mResourceSW, fileName, MAX_SW_SIZE)) { |
f8bed9008362
Added switch to download new available software.
Raimund Renkert <rrenkert@intevation.de>
parents:
459
diff
changeset
|
240 return; |
f8bed9008362
Added switch to download new available software.
Raimund Renkert <rrenkert@intevation.de>
parents:
459
diff
changeset
|
241 } |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
242 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
243 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
244 emit newSoftwareAvailable(fileName, remoteModSW); |
458
6fac87cadbd8
Only check for list if now sw is available
Andre Heinecke <aheinecke@intevation.de>
parents:
443
diff
changeset
|
245 return; |
6fac87cadbd8
Only check for list if now sw is available
Andre Heinecke <aheinecke@intevation.de>
parents:
443
diff
changeset
|
246 } |
6fac87cadbd8
Only check for list if now sw is available
Andre Heinecke <aheinecke@intevation.de>
parents:
443
diff
changeset
|
247 |
6fac87cadbd8
Only check for list if now sw is available
Andre Heinecke <aheinecke@intevation.de>
parents:
443
diff
changeset
|
248 remoteModList = getLastModifiedHeader(mResourceList); |
459
34cc448409ec
Fix error handling
Andre Heinecke <aheinecke@intevation.de>
parents:
458
diff
changeset
|
249 if (!remoteModList.isValid()) { |
34cc448409ec
Fix error handling
Andre Heinecke <aheinecke@intevation.de>
parents:
458
diff
changeset
|
250 qDebug() << "Could not parse headers for List"; |
34cc448409ec
Fix error handling
Andre Heinecke <aheinecke@intevation.de>
parents:
458
diff
changeset
|
251 return; |
34cc448409ec
Fix error handling
Andre Heinecke <aheinecke@intevation.de>
parents:
458
diff
changeset
|
252 } |
458
6fac87cadbd8
Only check for list if now sw is available
Andre Heinecke <aheinecke@intevation.de>
parents:
443
diff
changeset
|
253 |
6fac87cadbd8
Only check for list if now sw is available
Andre Heinecke <aheinecke@intevation.de>
parents:
443
diff
changeset
|
254 if (!mLastModList.isValid() || remoteModList > mLastModList) { |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
255 QString dataDirectory = getDataDirectory(); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
256 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
257 if (dataDirectory.isEmpty()) { |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
258 qDebug() << "Failed to get data directory"; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
259 return; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
260 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
261 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
262 QString fileName = dataDirectory.append("/list-") |
443
20f539866fa8
Fixed certificate list file name.
Raimund Renkert <rrenkert@intevation.de>
parents:
442
diff
changeset
|
263 .append(remoteModList.toString("yyyyMMddHHmmss")) |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
264 .append(".txt"); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
265 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
266 qDebug() << "fileName: " << fileName; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
267 |
46
d28e2624c1d5
Reset connection before the next request.
Andre Heinecke <aheinecke@intevation.de>
parents:
45
diff
changeset
|
268 if (!downloadFile(mResourceList, fileName, MAX_LIST_SIZE)) { |
32
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
269 return; |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
270 } |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
271 |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
272 emit newListAvailable(fileName, remoteModList); |
d8e93fa1fc93
Downloader logic
Andre Heinecke <andre.heinecke@intevation.de>
parents:
27
diff
changeset
|
273 } |
27
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
274 |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
275 emit progress(tr("Closing"), 1, -1); |
62cd56cea09b
Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
18
diff
changeset
|
276 } |