| 8613 | |
| 8614 | |
| 8615 | ResultType Line::URLDownloadToFile(char *aURL, char *aFilespec) |
| 8616 | // This has been adapted from the AutoIt3 source. |
| 8617 | { |
| 8618 | // Check that we have IE3 and access to wininet.dll |
| 8619 | HINSTANCE hinstLib = LoadLibrary("wininet.dll"); |
| 8620 | if (!hinstLib) |
| 8621 | return g_ErrorLevel->Assign(ERRORLEVEL_ERROR); |
| 8622 | |
| 8623 | typedef HINTERNET (WINAPI *MyInternetOpen)(LPCTSTR, DWORD, LPCTSTR, LPCTSTR, DWORD dwFlags); |
| 8624 | typedef HINTERNET (WINAPI *MyInternetOpenUrl)(HINTERNET hInternet, LPCTSTR, LPCTSTR, DWORD, DWORD, LPDWORD); |
| 8625 | typedef BOOL (WINAPI *MyInternetCloseHandle)(HINTERNET); |
| 8626 | typedef BOOL (WINAPI *MyInternetReadFileEx)(HINTERNET, LPINTERNET_BUFFERS, DWORD, DWORD); |
| 8627 | |
| 8628 | #ifndef INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY |
| 8629 | #define INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY 4 |
| 8630 | #endif |
| 8631 | |
| 8632 | // Get the address of all the functions we require. It's done this way in case the system |
| 8633 | // lacks MSIE v3.0+, in which case the app would probably refuse to launch at all: |
| 8634 | MyInternetOpen lpfnInternetOpen = (MyInternetOpen)GetProcAddress(hinstLib, "InternetOpenA"); |
| 8635 | MyInternetOpenUrl lpfnInternetOpenUrl = (MyInternetOpenUrl)GetProcAddress(hinstLib, "InternetOpenUrlA"); |
| 8636 | MyInternetCloseHandle lpfnInternetCloseHandle = (MyInternetCloseHandle)GetProcAddress(hinstLib, "InternetCloseHandle"); |
| 8637 | MyInternetReadFileEx lpfnInternetReadFileEx = (MyInternetReadFileEx)GetProcAddress(hinstLib, "InternetReadFileExA"); |
| 8638 | if (!lpfnInternetOpen || !lpfnInternetOpenUrl || !lpfnInternetCloseHandle || !lpfnInternetReadFileEx) |
| 8639 | return g_ErrorLevel->Assign(ERRORLEVEL_ERROR); |
| 8640 | |
| 8641 | // Open the internet session |
| 8642 | HINTERNET hInet = lpfnInternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0); |
| 8643 | if (!hInet) |
| 8644 | { |
| 8645 | FreeLibrary(hinstLib); |
| 8646 | return g_ErrorLevel->Assign(ERRORLEVEL_ERROR); |
| 8647 | } |
| 8648 | |
| 8649 | // Open the required URL |
| 8650 | HINTERNET hFile = lpfnInternetOpenUrl(hInet, aURL, NULL, 0, 0, 0); |
| 8651 | if (!hFile) |
| 8652 | { |
| 8653 | lpfnInternetCloseHandle(hInet); |
| 8654 | FreeLibrary(hinstLib); |
| 8655 | return g_ErrorLevel->Assign(ERRORLEVEL_ERROR); |
| 8656 | } |
| 8657 | |
| 8658 | // Open our output file |
| 8659 | FILE *fptr = fopen(aFilespec, "wb"); // Open in binary write/destroy mode |
| 8660 | if (!fptr) |
| 8661 | { |
| 8662 | lpfnInternetCloseHandle(hFile); |
| 8663 | lpfnInternetCloseHandle(hInet); |
| 8664 | FreeLibrary(hinstLib); |
| 8665 | return g_ErrorLevel->Assign(ERRORLEVEL_ERROR); |
| 8666 | } |
| 8667 | |
| 8668 | BYTE bufData[1024 * 8]; |
| 8669 | INTERNET_BUFFERS buffers = {0}; |
| 8670 | buffers.dwStructSize = sizeof(INTERNET_BUFFERS); |
| 8671 | buffers.lpvBuffer = bufData; |
| 8672 | buffers.dwBufferLength = sizeof(bufData); |