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
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 76
diff changeset
1 /* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 76
diff changeset
2 * Software engineering by Intevation GmbH
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 76
diff changeset
3 *
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 76
diff changeset
4 * This file is Free Software under the GNU GPL (v>=2)
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 76
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY!
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 76
diff changeset
6 * See LICENSE.txt for details.
17e1c8f37d72 Add License
Andre Heinecke <aheinecke@intevation.de>
parents: 76
diff changeset
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 }

http://wald.intevation.org/projects/trustbridge/