aheinecke@10: #include "downloader.h" aheinecke@10: aheinecke@10: #ifndef MYVERSION aheinecke@10: #define MYVERSION "1" aheinecke@10: #endif aheinecke@10: aheinecke@10: #ifndef DOWNLOAD_SERVER aheinecke@10: #define DOWNLOAD_SERVER "https://www.intevation.de" aheinecke@10: #endif aheinecke@10: aheinecke@10: #ifdef Q_OS_WIN aheinecke@10: #include aheinecke@10: #include aheinecke@10: #endif aheinecke@10: aheinecke@10: #include aheinecke@10: #include aheinecke@10: aheinecke@10: Downloader::Downloader(QObject* parent, const QString& url) aheinecke@10: { aheinecke@10: Downloader (parent, url, QFile(":Certificates/https").readAll()); aheinecke@10: } aheinecke@10: aheinecke@10: Downloader::Downloader(QObject* parent, const QString& url, aheinecke@10: const QByteArray& certificate) : aheinecke@10: mUrl(url), aheinecke@10: mCert(certificate), aheinecke@10: QThread(parent) aheinecke@10: { aheinecke@10: } aheinecke@10: aheinecke@10: void Downloader::run() { aheinecke@10: #ifdef Q_OS_WIN aheinecke@10: // We use WinAPI here instead of Qt because we want to avoid aheinecke@10: // QtNetworks SSL stack which is based on OpenSSL and so aheinecke@10: // we might be incompatible with GPL code. Also using the aheinecke@10: // native API means that the security of the SSL implementation aheinecke@10: // is tied to the security of the system. aheinecke@10: BOOL bResults = FALSE; aheinecke@10: HINTERNET hSession = NULL, aheinecke@10: hConnect = NULL, aheinecke@10: hRequest = NULL; aheinecke@10: SYSTEMTIME lastModified; aheinecke@10: DWORD sizeOfSystemtime = sizeof (SYSTEMTIME); aheinecke@10: aheinecke@10: // Get a syncronous session handle aheinecke@10: hSession = WinHttpOpen(L"M13 "MYVERSION, aheinecke@10: WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, aheinecke@10: WINHTTP_NO_PROXY_NAME, aheinecke@10: WINHTTP_NO_PROXY_BYPASS, 0); aheinecke@10: aheinecke@10: if (hSession) { aheinecke@10: // Initialize connection. No request is done here. aheinecke@10: hConnect = WinHttpConnect(hSession, L""DOWNLOAD_SERVER, aheinecke@10: INTERNET_DEFAULT_HTTPS_PORT, 0); aheinecke@10: aheinecke@10: } aheinecke@10: aheinecke@10: if (hConnect) { aheinecke@10: // Make a head request aheinecke@10: hRequest = WinHttpOpenRequest(hConnect, L"HEAD", aheinecke@10: L"/index.html", aheinecke@10: NULL, WINHTTP_NO_REFERER, aheinecke@10: WINHTTP_DEFAULT_ACCEPT_TYPES, aheinecke@10: 0); aheinecke@10: } aheinecke@10: aheinecke@10: if (hRequest) { aheinecke@10: bResults = WinHttpSendRequest(hRequest, aheinecke@10: WINHTTP_NO_ADDITIONAL_HEADERS, aheinecke@10: 0, WINHTTP_NO_REQUEST_DATA, 0, aheinecke@10: 0, 0); aheinecke@10: } aheinecke@10: aheinecke@10: if (bResults) { aheinecke@10: bResults = WinHttpReceiveResponse(hRequest, NULL); aheinecke@10: } aheinecke@10: aheinecke@10: aheinecke@10: aheinecke@10: if (bResults) { aheinecke@10: bResults = WinHttpQueryHeaders(hRequest, aheinecke@10: WINHTTP_QUERY_LAST_MODIFIED | aheinecke@10: WINHTTP_QUERY_FLAG_SYSTEMTIME, aheinecke@10: NULL, aheinecke@10: &lastModified, aheinecke@10: &sizeOfSystemtime, aheinecke@10: WINHTTP_NO_HEADER_INDEX ); aheinecke@10: } aheinecke@10: aheinecke@10: qDebug() << "Last modified year: " << lastModified.wYear; aheinecke@10: aheinecke@10: aheinecke@10: if (!bResults) { aheinecke@10: // Report any errors. aheinecke@10: qDebug() << "Error" << GetLastError(); aheinecke@10: emit error(tr("Unknown Problem when connecting"), Unknown); aheinecke@10: } aheinecke@10: aheinecke@10: // Cleanup aheinecke@10: if (hRequest) { aheinecke@10: WinHttpCloseHandle(hRequest); aheinecke@10: } aheinecke@10: aheinecke@10: if (hConnect) { aheinecke@10: WinHttpCloseHandle(hConnect); aheinecke@10: aheinecke@10: } aheinecke@10: aheinecke@10: if (hSession) { aheinecke@10: WinHttpCloseHandle(hSession); aheinecke@10: } aheinecke@10: #endif aheinecke@10: aheinecke@10: for (int i=0; i< 10; i++) { aheinecke@10: qDebug("Going to sleep\n"); aheinecke@10: sleep(10); aheinecke@10: } aheinecke@10: }