HINTERNET Fetcher::openUrl(const std::wstring& uri) const { DEBUG("Calling InternetOpenUrl: " << wchars_to_utf8chars(uri.c_str())); return check("InternetOpenUrl", InternetOpenUrl(mInet, uri.c_str(), NULL, 0, INTERNET_FLAG_NEED_FILE, NULL)); }
int WINAPI get_url_into_file(WCHAR *uri, char *path, int *cancelled) { int success = FALSE; *cancelled = FALSE; HINTERNET hinet, hdownload; char data[BUFSIZE]; /* Flawfinder: ignore */ unsigned long bytes_read; #if _DEBUG fprintf(logfile,"Opening '%s'\n",path); fflush(logfile); #endif FILE* fp = fopen(path, "wb"); /* Flawfinder: ignore */ if (!fp) { #if _DEBUG fprintf(logfile,"Failed to open '%s'\n",path); fflush(logfile); #endif return success; } #if _DEBUG fprintf(logfile,"Calling InternetOpen\n"); fflush(logfile); #endif // Init wininet subsystem hinet = InternetOpen(L"LindenUpdater", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if (hinet == NULL) { return success; } #if _DEBUG fprintf(logfile,"Calling InternetOpenUrl: %s\n",wchars_to_utf8chars(uri)); fflush(logfile); #endif hdownload = InternetOpenUrl(hinet, uri, NULL, 0, INTERNET_FLAG_NEED_FILE, NULL); if (hdownload == NULL) { #if _DEBUG DWORD err = GetLastError(); fprintf(logfile,"InternetOpenUrl Failed: %d\n",err); fflush(logfile); #endif return success; } DWORD sizeof_total_bytes = sizeof(gTotalBytes); HttpQueryInfo(hdownload, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &gTotalBytes, &sizeof_total_bytes, NULL); DWORD total_bytes = 0; success = InternetQueryDataAvailable(hdownload, &total_bytes, 0, 0); if (success == FALSE) { #if _DEBUG DWORD err = GetLastError(); fprintf(logfile,"InternetQueryDataAvailable Failed: %d bytes Err:%d\n",total_bytes,err); fflush(logfile); #endif return success; } success = FALSE; while(!success && !(*cancelled)) { MSG msg; #if _DEBUG fprintf(logfile,"Calling InternetReadFile\n"); fflush(logfile); #endif if (!InternetReadFile(hdownload, data, BUFSIZE, &bytes_read)) { #if _DEBUG fprintf(logfile,"InternetReadFile Failed.\n"); fflush(logfile); #endif // ...an error occurred return FALSE; } #if _DEBUG if (!bytes_read) { fprintf(logfile,"InternetReadFile Read 0 bytes.\n"); fflush(logfile); } #endif #if _DEBUG fprintf(logfile,"Reading Data, bytes_read = %d\n",bytes_read); fflush(logfile); #endif if (bytes_read == 0) { // If InternetFileRead returns TRUE AND bytes_read == 0 // we've successfully downloaded the entire file wsprintf(gProgress, L"Download complete."); success = TRUE; } else { // write what we've got, then continue fwrite(data, sizeof(char), bytes_read, fp); gTotalBytesRead += int(bytes_read); if (gTotalBytes != -1) wsprintf(gProgress, L"Downloaded: %d%%", 100 * gTotalBytesRead / gTotalBytes); else wsprintf(gProgress, L"Downloaded: %dK", gTotalBytesRead / 1024); } #if _DEBUG fprintf(logfile,"Calling InvalidateRect\n"); fflush(logfile); #endif // Mark the window as needing redraw (of the whole thing) InvalidateRect(gWindow, NULL, TRUE); // Do the redraw #if _DEBUG fprintf(logfile,"Calling UpdateWindow\n"); fflush(logfile); #endif UpdateWindow(gWindow); #if _DEBUG fprintf(logfile,"Calling PeekMessage\n"); fflush(logfile); #endif while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); if (msg.message == WM_QUIT) { // bail out, user cancelled *cancelled = TRUE; } } } #if _DEBUG fprintf(logfile,"Calling InternetCloseHandle\n"); fclose(logfile); #endif fclose(fp); InternetCloseHandle(hdownload); InternetCloseHandle(hinet); return success; }