annotate ui/downloader_win.cpp @ 289:9ad00a3255f4

Change cinst from stdin input to use arguments. As we have to execute this process on Windows over the shell a stdin / stdout communication is not really possible without some major hacks. So you now have to supply an instructions file and the path to the certificatelist as arguments when this process is called
author Andre Heinecke <aheinecke@intevation.de>
date Wed, 02 Apr 2014 13:52:02 +0000
parents 62cd56cea09b
children 17e1c8f37d72
rev   line source
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
1 /**
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
2 * @file downloader_win.cpp
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
3 * @brief Downloader implementation for Windows
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
4 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
5 * We use Windows API here instead of Qt because we want to avoid
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
6 * QtNetworks SSL stack which is based on OpenSSL and so
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
7 * we might be incompatible with GPL code. Also using the
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
8 * native API means that the security of the SSL implementation
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
9 * is tied to the security of the system.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
10 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
11 */
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
12 #include "downloader.h"
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
13 #ifdef Q_OS_WIN
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
14 #ifndef MYVERSION
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
15 #define MYVERSION "1"
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
16 #endif
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
17
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
18 #include <windows.h>
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
19 #include <winhttp.h>
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
20
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
21 #include <QDebug>
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
22 #include <QDateTime>
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
23 #include <QSaveFile>
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
24 #include <QFileInfo>
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
25
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
26 #define DEBUG if (1) qDebug() << __PRETTY_FUNCTION__
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
27
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
28 #define MAX_SW_SIZE 10485760
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
29 #define MAX_LIST_SIZE 1048576
27
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
30 /** @brief Download a file from the Internet
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
31 *
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
32 * @param[in] HSession the session to work in.
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
33 * @param[in] HConnect the connection to use.
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
34 * @param[in] resource the resource to download.
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
35 * @param[in] filename where the file should be saved.
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
36 * @param[in] maxSize maximum amount of bytes to download
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
37 *
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
38 * @returns True if the download was successful.
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
39 */
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
40 bool downloadFile(HINTERNET hSession, HINTERNET hConnect,
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
41 LPCWSTR resource, const QString &filename, DWORD maxSize);
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
42
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
43 /** @brief get the last modified header of a resource.
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
44 *
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
45 * On error call getLastError to get extended error information.
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
46 * This function still does not do any networking but only initializes
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
47 * it.
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
48 *
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
49 * @param[in] HSession the session to work in.
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
50 * @param[in] HConnect the connection to use.
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
51 * @param[in] resource the resource to check the last-modified date on
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
52 *
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
53 * @returns the last modified date or a null datetime in case of errors
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
54 */
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
55 QDateTime getLastModifiedHeader(HINTERNET hSession,
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
56 HINTERNET hConnect, LPCWSTR resource);
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
57
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
58 /** @brief verify that the certificate of the request matches
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
59 *
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
60 * Validates the certificate against the member variable certificate
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
61 *
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
62 * @param[in] hRequest: The request from which to get the certificate
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
63 *
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
64 * @returns True if the certificate exactly matches the one in hRequest
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
65 */
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
66
62cd56cea09b Start on polarssl Downloader.
Andre Heinecke <andre.heinecke@intevation.de>
parents: 23
diff changeset
67 bool verifyCertificate(HINTERNET hRequest);
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
68
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
69
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
70 #define LIST_RESOURCE "/incoming/aheinecke/test"
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
71 #define SW_RESOURCE "/incoming/aheinecke/test"
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
72
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
73 /** @brief A wrapper around a HINTERNET structure that handles closing
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
74 *
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
75 * Holds a HINTERNET structure and closes it if necessary on destruction.
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
76 *
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
77 */
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
78 class SmartHINTERNET {
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
79 public:
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
80 SmartHINTERNET() : handle(NULL) {}
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
81
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
82 ~SmartHINTERNET() {
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
83 if (handle) {
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
84 WinHttpCloseHandle(handle);
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
85 }
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
86 }
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
87
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
88 HINTERNET handle;
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
89 };
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
90
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
91 /** @brief Qt wrapper around FormatMessage
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
92 *
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
93 * @returns The error message of the error that occurred
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
94 */
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
95 const QString getLastErrorMsg() {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
96 LPWSTR bufPtr = NULL;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
97 DWORD err = GetLastError();
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
98 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
99 FORMAT_MESSAGE_FROM_SYSTEM |
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
100 FORMAT_MESSAGE_IGNORE_INSERTS,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
101 NULL, err, 0, (LPWSTR)&bufPtr, 0, NULL);
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
102 if (!bufPtr) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
103 HMODULE hWinhttp = GetModuleHandleW(L"winhttp");
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
104 if (hWinhttp) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
105 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
106 FORMAT_MESSAGE_FROM_HMODULE |
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
107 FORMAT_MESSAGE_IGNORE_INSERTS,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
108 hWinhttp, HRESULT_CODE(err), 0,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
109 (LPWSTR)&bufPtr, 0, NULL);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
110 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
111 }
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
112 const QString result =
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
113 (bufPtr) ? QString::fromUtf16((const ushort*)bufPtr).trimmed() :
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
114 QString("Unknown Error %1").arg(err);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
115 LocalFree(bufPtr);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
116 return result;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
117 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
118
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
119
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
120 /** @brief open a session with appropriate proxy settings
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
121 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
122 * @param[inout] *pHSession pointer to a HInternet structure
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
123 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
124 * On error call getLastError to get extended error information.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
125 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
126 * @returns True on success, false on error.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
127 */
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
128
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
129
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
130 bool openSession(HINTERNET *pHSession)
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
131 {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
132 WINHTTP_CURRENT_USER_IE_PROXY_CONFIG proxyConfig;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
133
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
134 DEBUG;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
135 if (!pHSession) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
136 SetLastError(ERROR_INVALID_PARAMETER);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
137 return false;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
138 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
139
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
140 memset(&proxyConfig, 0, sizeof (WINHTTP_CURRENT_USER_IE_PROXY_CONFIG));
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
141
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
142 if (WinHttpGetIEProxyConfigForCurrentUser(&proxyConfig)) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
143 if (proxyConfig.fAutoDetect) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
144 // TODO Handle this
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
145 qDebug() << "Autodetect is set";
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
146 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
147
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
148 if (proxyConfig.lpszProxy || proxyConfig.lpszProxyBypass) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
149 DEBUG << "Using proxies.";
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
150 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
151
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
152 if (proxyConfig.lpszProxy) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
153 *pHSession = WinHttpOpen(L"M13 "MYVERSION,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
154 WINHTTP_ACCESS_TYPE_NAMED_PROXY,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
155 proxyConfig.lpszProxy,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
156 proxyConfig.lpszProxyBypass, 0);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
157 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
158 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
159
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
160 if (!*pHSession) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
161 DEBUG << "No IE Proxy falling back to default proxy";
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
162 *pHSession = WinHttpOpen(L"M13 "MYVERSION,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
163 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
164 WINHTTP_NO_PROXY_NAME,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
165 WINHTTP_NO_PROXY_BYPASS, 0);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
166 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
167 // Cleanup
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
168 if (proxyConfig.lpszAutoConfigUrl) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
169 GlobalFree(proxyConfig.lpszAutoConfigUrl);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
170 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
171
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
172 if (proxyConfig.lpszProxy) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
173 GlobalFree(proxyConfig.lpszProxy);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
174 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
175
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
176 if (proxyConfig.lpszProxyBypass) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
177 GlobalFree(proxyConfig.lpszProxyBypass);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
178 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
179 return *pHSession;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
180 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
181
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
182
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
183 /** @brief initialize a connection in the session
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
184 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
185 * @param[in] HSession the session to work in.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
186 * @param[inout] *pHConnect pointer to the connection.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
187 * @param[in] url pointer to the URL in wchar representation.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
188 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
189 * On error call getLastError to get extended error information.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
190 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
191 * @returns True on success, false on error.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
192 */
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
193 bool initializeConnection(HINTERNET hSession, HINTERNET *pHConnect,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
194 LPCWSTR url)
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
195 {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
196 DEBUG;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
197 if (!hSession || !pHConnect) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
198 SetLastError(ERROR_INVALID_PARAMETER);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
199 return false;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
200 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
201 // Initialize connection. No request is done here.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
202 *pHConnect = WinHttpConnect(hSession, url,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
203 INTERNET_DEFAULT_HTTPS_PORT, 0);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
204
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
205 return *pHConnect;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
206 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
207
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
208 /** @brief Create a request
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
209 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
210 * @param[in] HSession the session to work in.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
211 * @param[in] HConnect the connection to use.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
212 * @param[inout] *pHRequest pointer to the request structure to be filled.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
213 * @param[in] requestType the HTTP request to be made default is GET
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
214 * @param[in] resource pointer to the resource to request in wchar
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
215 * representation.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
216 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
217 * On error call getLastError to get extended error information.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
218 * This function still does not do any networking but only initializes
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
219 * it.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
220 *
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
221 * @returns True on success, false on error.
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
222 */
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
223
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
224 bool createRequest(HINTERNET hSession, HINTERNET hConnect,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
225 HINTERNET *pHRequest, LPCWSTR requestType, LPCWSTR resource)
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
226 {
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
227 DWORD dwSSLFlag;
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
228 DEBUG;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
229 if (!hSession || !hConnect || !pHRequest) {
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
230 SetLastError(ERROR_INVALID_PARAMETER);
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
231 return false;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
232 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
233
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
234 *pHRequest = WinHttpOpenRequest(hConnect, requestType, resource,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
235 NULL, WINHTTP_NO_REFERER,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
236 WINHTTP_DEFAULT_ACCEPT_TYPES,
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
237 WINHTTP_FLAG_SECURE);
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
238
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
239 dwSSLFlag = SECURITY_FLAG_IGNORE_UNKNOWN_CA;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
240 dwSSLFlag |= SECURITY_FLAG_IGNORE_CERT_DATE_INVALID;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
241 dwSSLFlag |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
242 dwSSLFlag |= SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
243
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
244 WinHttpSetOption(*pHRequest, WINHTTP_OPTION_SECURITY_FLAGS,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
245 &dwSSLFlag, sizeof(dwSSLFlag));
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
246
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
247 return *pHRequest;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
248 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
249
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
250 bool Downloader::verifyCertificate(HINTERNET hRequest)
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
251 {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
252 CERT_CONTEXT *certContext = NULL;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
253 DWORD certContextLen = sizeof(CERT_CONTEXT);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
254 bool retval = false;
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
255
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
256 if (!WinHttpQueryOption(hRequest,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
257 WINHTTP_OPTION_SERVER_CERT_CONTEXT,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
258 &certContext,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
259 &certContextLen)) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
260 DEBUG << "Unable to get server certificate";
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
261 return false;
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
262 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
263
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
264 QByteArray serverCert ((const char *) certContext->pbCertEncoded,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
265 certContext->cbCertEncoded);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
266
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
267 retval = (serverCert == mCert);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
268
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
269 if (!retval) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
270 DEBUG << "Certificate is not the same as the pinned one!"
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
271 << "Base64 cert: " << serverCert.toBase64();
18
f4f957c58e0a Move listuitol and add cert pinning with a test certificate
Andre Heinecke <aheinecke@intevation.de>
parents: 17
diff changeset
272 emit error("Invalid certificate", InvalidCertificate);
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
273 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
274
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
275 CertFreeCertificateContext(certContext);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
276 return retval;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
277 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
278
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
279 QDateTime Downloader::getLastModifiedHeader(HINTERNET hSession,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
280 HINTERNET hConnect, LPCWSTR resource)
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
281 {
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
282 SmartHINTERNET sHRequest;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
283 SYSTEMTIME lMod;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
284 DWORD sizeOfSystemtime = sizeof (SYSTEMTIME);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
285 QDateTime retval;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
286
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
287 memset(&lMod, 0, sizeof (SYSTEMTIME));
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
288
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
289 if (!hSession || !hConnect || !resource) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
290 SetLastError(ERROR_INVALID_PARAMETER);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
291 return retval;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
292 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
293
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
294 if (!createRequest(hSession, hConnect, &sHRequest.handle, L"HEAD",
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
295 resource)) {
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
296 return retval;
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
297 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
298
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
299 if (!WinHttpSendRequest(sHRequest.handle,
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
300 WINHTTP_NO_ADDITIONAL_HEADERS,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
301 0, WINHTTP_NO_REQUEST_DATA, 0,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
302 0, 0)) {
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
303 return retval;
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
304 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
305
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
306
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
307 if (!WinHttpReceiveResponse(sHRequest.handle, NULL)) {
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
308 return retval;
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
309 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
310
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
311 if (!verifyCertificate(sHRequest.handle)) {
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
312 DEBUG << "Certificate verification failed";
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
313 return retval;
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
314 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
315
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
316 if (!(WinHttpQueryHeaders(sHRequest.handle,
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
317 WINHTTP_QUERY_LAST_MODIFIED |
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
318 WINHTTP_QUERY_FLAG_SYSTEMTIME,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
319 NULL,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
320 &lMod,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
321 &sizeOfSystemtime,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
322 WINHTTP_NO_HEADER_INDEX))) {
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
323 return retval;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
324 }
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
325
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
326 retval = QDateTime(QDate(lMod.wYear, lMod.wMonth, lMod.wDay),
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
327 QTime(lMod.wHour, lMod.wMinute, lMod.wSecond,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
328 lMod.wMilliseconds),
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
329 Qt::UTC);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
330 return retval;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
331 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
332
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
333 bool Downloader::downloadFile(HINTERNET hSession, HINTERNET hConnect,
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
334 LPCWSTR resource, const QString &fileName, DWORD maxSize)
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
335 {
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
336 SmartHINTERNET sHRequest;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
337 bool retval = false;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
338 DWORD bytesAvailable = 0,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
339 bytesRead = 0,
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
340 totalDownloaded = 0,
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
341 contentLength = 0,
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
342 sizeOfDWORD = sizeof (DWORD);
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
343
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
344 QSaveFile outputFile(fileName);
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
345
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
346 if (!hSession || !hConnect || !resource) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
347 SetLastError(ERROR_INVALID_PARAMETER);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
348 return retval;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
349 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
350
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
351 if (!createRequest(hSession, hConnect, &sHRequest.handle, L"GET",
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
352 resource)) {
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
353 return retval;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
354 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
355
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
356 if (!WinHttpSendRequest(sHRequest.handle,
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
357 WINHTTP_NO_ADDITIONAL_HEADERS,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
358 0, WINHTTP_NO_REQUEST_DATA, 0,
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
359 0, 0)) {
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
360 return retval;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
361 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
362
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
363
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
364 if (!WinHttpReceiveResponse(sHRequest.handle, NULL)) {
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
365 return retval;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
366 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
367
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
368 if (!verifyCertificate(sHRequest.handle)) {
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
369 DEBUG << "Certificate verification failed";
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
370 return retval;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
371 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
372
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
373
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
374 if (!(WinHttpQueryHeaders(sHRequest.handle,
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
375 WINHTTP_QUERY_CONTENT_LENGTH |
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
376 WINHTTP_QUERY_FLAG_NUMBER,
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
377 NULL,
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
378 &contentLength,
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
379 &sizeOfDWORD,
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
380 WINHTTP_NO_HEADER_INDEX))) {
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
381 // Continue anyway as we later really check how
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
382 // much we download.
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
383 DEBUG << "No content-length";
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
384 }
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
385
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
386 if (contentLength > maxSize) {
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
387 return retval;
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
388 }
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
389
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
390 if (contentLength) {
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
391 QFileInfo finf(fileName);
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
392 if (finf.exists() && finf.isReadable() &&
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
393 finf.size() == contentLength) {
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
394 // We already have data of the same size
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
395 // No need to waste bandwidth.
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
396 DEBUG << "Skipping download because file exists";
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
397 retval = true;
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
398 return retval;
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
399 }
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
400 }
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
401
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
402 // Open / Create the file to write to.
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
403 if (!outputFile.open(QIODevice::WriteOnly)) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
404 DEBUG << "Failed to open file";
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
405 return retval;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
406 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
407
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
408 DEBUG << "output file size: " << outputFile.size();
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
409 do
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
410 {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
411 char outBuf[8192]; // 8KB is the internal buffer size of winhttp
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
412 memset(outBuf, 0, sizeof(outBuf));
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
413 bytesRead = 0;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
414
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
415 if (!WinHttpQueryDataAvailable(sHRequest.handle, &bytesAvailable)) {
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
416 DEBUG << "Querying for available data failed";
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
417 retval = false;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
418 break;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
419 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
420
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
421 if (!bytesAvailable) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
422 // Might indicate that we are done.
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
423 break;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
424 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
425
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
426 if (bytesAvailable > maxSize) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
427 DEBUG << "File to large";
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
428 retval = false;
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
429 SetLastError(ERROR_INVALID_DATA);
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
430 break;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
431 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
432
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
433 if (!WinHttpReadData(sHRequest.handle, (LPVOID)outBuf,
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
434 sizeof(outBuf), &bytesRead)) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
435 DEBUG << "Error reading data";
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
436 break;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
437 } else {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
438 if (bytesRead) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
439 // Write data to file.
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
440 if (outputFile.write(outBuf, bytesRead) !=
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
441 bytesRead) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
442 DEBUG << "Error writing to file.";
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
443 retval = false;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
444 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
445 // Completed a read / write cycle. If not error follows
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
446 // the download was successful.
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
447 retval = true;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
448 } else {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
449 // Should not happen as we queried for available
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
450 // bytes before and the function did not return an
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
451 // error.
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
452 DEBUG << "Unable to read available data";
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
453 retval = false;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
454 break;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
455 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
456 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
457 totalDownloaded += bytesRead;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
458
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
459 if (totalDownloaded > maxSize) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
460 DEBUG << "Downloaded too much data. Breaking.";
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
461 retval = false;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
462 break;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
463 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
464 } while (bytesAvailable > 0);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
465
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
466 if (retval && outputFile.isOpen()) {
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
467 // Actually save the file to disk / move to homedir
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
468 retval = outputFile.commit();
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
469 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
470
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
471 return retval;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
472 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
473
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
474 void Downloader::run() {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
475 bool results = false;
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
476 SmartHINTERNET sHSession;
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
477 SmartHINTERNET sHConnect;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
478 wchar_t wUrl[mUrl.size() + 1];
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
479 QDateTime lastModifiedSoftware;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
480 QDateTime lastModifiedList;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
481
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
482 int rc = 0;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
483
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
484 memset(wUrl, 0, sizeof (wchar_t) * (mUrl.size() + 1));
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
485
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
486 rc = mUrl.toWCharArray(wUrl);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
487
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
488 if (rc != mUrl.size()) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
489 DEBUG << "Problem converting to wchar array";
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
490 return;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
491 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
492
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
493 // Should not be necessary because we initialized the memory
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
494 wUrl[rc] = '\0';
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
495
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
496 // Initialize connection
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
497 if (!openSession(&sHConnect.handle)) {
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
498 DEBUG << "Failed to open session: " << getLastErrorMsg();
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
499 return;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
500 }
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
501 if (!initializeConnection(sHConnect.handle, &sHConnect.handle, wUrl)) {
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
502 DEBUG << "Failed to initialize connection: " << getLastErrorMsg();
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
503 return;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
504 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
505
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
506
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
507 lastModifiedSoftware = getLastModifiedHeader(sHConnect.handle, sHConnect.handle,
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
508 L""SW_RESOURCE);
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
509
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
510 lastModifiedList = getLastModifiedHeader(sHConnect.handle, sHConnect.handle,
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
511 L""LIST_RESOURCE);
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
512
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
513 if (!lastModifiedList.isValid() || !lastModifiedSoftware.isValid()) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
514 DEBUG << "Could not read headers: " << getLastErrorMsg();
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
515 return;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
516 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
517
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
518 if (!mLastModSW.isValid() || lastModifiedSoftware > mLastModSW) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
519 QString dataDirectory = getDataDirectory();
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
520
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
521 if (dataDirectory.isEmpty()) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
522 DEBUG << "Failed to get data directory";
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
523 return;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
524 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
525
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
526 QString fileName = dataDirectory.append("/SW-")
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
527 .append(lastModifiedSoftware.toString("yyyymmddHHmmss"))
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
528 .append(".exe");
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
529
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
530 DEBUG << "fileName: " << fileName;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
531
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
532 if (!downloadFile(sHConnect.handle, sHConnect.handle, L""SW_RESOURCE,
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
533 fileName, MAX_SW_SIZE)) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
534 DEBUG << "Error downloading File: " << getLastErrorMsg();
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
535 return;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
536 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
537
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
538 emit newSoftwareAvailable(fileName, lastModifiedSoftware);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
539 } else if (!mLastModList.isValid() || lastModifiedList > mLastModList) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
540 QString dataDirectory = getDataDirectory();
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
541
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
542 if (dataDirectory.isEmpty()) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
543 DEBUG << "Failed to get data directory";
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
544 return;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
545 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
546
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
547 QString fileName = dataDirectory.append("/list-")
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
548 .append(lastModifiedSoftware.toString("yyyymmddHHmmss"))
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
549 .append(".txt");
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
550
17
c12825a651ed Read out content-length and use this to skip existing files
Andre Heinecke <aheinecke@intevation.de>
parents: 15
diff changeset
551 DEBUG << "fileName: " << fileName;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
552
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
553 if (!downloadFile(sHConnect.handle, sHConnect.handle, L""LIST_RESOURCE,
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
554 fileName, MAX_LIST_SIZE)) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
555 DEBUG << "Error downloading File: " << getLastErrorMsg();
23
7d07d261b003 Wrap HINTERNET handles in a class to take advantage of scoping
Andre Heinecke <aheinecke@intevation.de>
parents: 20
diff changeset
556 return;
15
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
557 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
558
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
559 emit newListAvailable(fileName, lastModifiedList);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
560 }
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
561
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
562 DEBUG << "SW date: " << lastModifiedSoftware;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
563 DEBUG << "List date: " << lastModifiedList;
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
564
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
565 if (!results) {
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
566 // Report any errors.
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
567 DEBUG << "Error" << GetLastError();
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
568 emit error(tr("Unknown Problem when connecting"), ErrUnknown);
95e1b6edf2fc Implement more downloader functionality for Windows
Andre Heinecke <aheinecke@intevation.de>
parents: 11
diff changeset
569 }
20
fec1a610d43f Mark usage of goto with TODOs to remove them
Andre Heinecke <aheinecke@intevation.de>
parents: 18
diff changeset
570
11
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
571 return;
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
572 }
7e2f14c7aba2 Split up downloader component and further implement it
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
573 #endif

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