* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#define COBJMACROS
-#define WIN32_NO_STATUS
-
#include "rapps.h"
-#include "resource.h"
-
-#include <commctrl.h>
-#include <shlobj.h>
-#include <shlwapi.h>
-#include <urlmon.h>
+#include <wininet.h>
+#include <shellapi.h>
static PAPPLICATION_INFO AppInfo;
static HICON hIcon = NULL;
DWORD WINAPI
ThreadFunc(LPVOID Context)
{
- IBindStatusCallback *dl;
+ IBindStatusCallback *dl = NULL;
WCHAR path[MAX_PATH];
LPWSTR p;
- STARTUPINFOW si;
- PROCESS_INFORMATION pi;
HWND Dlg = (HWND) Context;
- DWORD r, len;
+ DWORD len, dwContentLen, dwBytesWritten, dwBytesRead;
+ DWORD dwCurrentBytesRead = 0;
+ DWORD dwBufLen = sizeof(dwContentLen);
BOOL bCancelled = FALSE;
BOOL bTempfile = FALSE;
BOOL bCab = FALSE;
+ HINTERNET hOpen = NULL;
+ HINTERNET hFile = NULL;
+ HANDLE hOut = INVALID_HANDLE_VALUE;
+ unsigned char lpBuffer[4096];
+ const LPWSTR lpszAgent = L"RApps/1.0";
/* built the path for the download */
p = wcsrchr(AppInfo->szUrlDownload, L'/');
AppInfo->szUrlDownload[len - 1] == 'b')
{
bCab = TRUE;
- if (!GetCurrentDirectoryW(MAX_PATH, path))
+ if (!GetStorageDirectory(path, sizeof(path) / sizeof(path[0])))
goto end;
}
else
{
- wcscpy(path, SettingsInfo.szDownloadDir);
+ if (FAILED(StringCbCopyW(path, sizeof(path),
+ SettingsInfo.szDownloadDir)))
+ {
+ goto end;
+ }
}
}
else goto end;
goto end;
}
- wcscat(path, L"\\");
- wcscat(path, p + 1);
+ if (FAILED(StringCbCatW(path, sizeof(path), L"\\")))
+ goto end;
+ if (FAILED(StringCbCatW(path, sizeof(path), p + 1)))
+ goto end;
/* download it */
bTempfile = TRUE;
dl = CreateDl(Context, &bCancelled);
- r = URLDownloadToFileW(NULL, AppInfo->szUrlDownload, path, 0, dl);
- if (dl) IBindStatusCallback_Release(dl);
- if (S_OK != r) goto end;
- else if (bCancelled) goto end;
+ if (dl == NULL) goto end;
+
+ hOpen = InternetOpenW(lpszAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
+ if (!hOpen) goto end;
+
+ hFile = InternetOpenUrlW(hOpen, AppInfo->szUrlDownload, NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION, 0);
+ if(!hFile) goto end;
+
+ hOut = CreateFileW(path, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
+ if (hOut == INVALID_HANDLE_VALUE) goto end;
+
+ HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwContentLen, &dwBufLen, 0);
+
+ do
+ {
+ if (!InternetReadFile(hFile, lpBuffer, _countof(lpBuffer), &dwBytesRead)) goto end;
+ if (!WriteFile(hOut, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL)) goto end;
+ dwCurrentBytesRead += dwBytesRead;
+ IBindStatusCallback_OnProgress(dl, dwCurrentBytesRead, dwContentLen, 0, AppInfo->szUrlDownload);
+ }
+ while (dwBytesRead);
+
+ CloseHandle(hOut);
+ hOut = INVALID_HANDLE_VALUE;
+
+ if (bCancelled) goto end;
ShowWindow(Dlg, SW_HIDE);
/* run it */
- memset(&si, 0, sizeof(si));
- si.cb = sizeof(si);
- r = CreateProcessW(path, NULL, NULL, NULL, 0, 0, NULL, NULL, &si, &pi);
- if (0 == r) goto end;
+ if (!bCab)
+ {
+ ShellExecuteW( NULL, L"open", path, NULL, NULL, SW_SHOWNORMAL );
+ }
+end:
+ if (hOut != INVALID_HANDLE_VALUE) CloseHandle(hOut);
+ InternetCloseHandle(hFile);
+ InternetCloseHandle(hOpen);
- CloseHandle(pi.hThread);
- WaitForSingleObject(pi.hProcess, INFINITE);
- CloseHandle(pi.hProcess);
+ if (dl) IBindStatusCallback_Release(dl);
-end:
if (bTempfile)
{
if (bCancelled || (SettingsInfo.bDelInstaller && !bCab))
APPLICATION_INFO IntInfo;
ZeroMemory(&IntInfo, sizeof(APPLICATION_INFO));
- wcscpy(IntInfo.szUrlDownload, lpUrl);
+ if (FAILED(StringCbCopyW(IntInfo.szUrlDownload,
+ sizeof(IntInfo.szUrlDownload),
+ lpUrl)))
+ {
+ return;
+ }
AppInfo = &IntInfo;