* Sync up to trunk head (r64716).
[reactos.git] / base / applications / rapps / loaddlg.c
index 382d3ea..0b58019 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#define COBJMACROS
-#define WIN32_NO_STATUS
-
 #include "rapps.h"
+#include <wininet.h>
+#include <shellapi.h>
 
 static PAPPLICATION_INFO AppInfo;
 static HICON hIcon = NULL;
@@ -206,16 +205,21 @@ static
 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'/');
@@ -230,12 +234,16 @@ ThreadFunc(LPVOID Context)
             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;
@@ -246,30 +254,55 @@ ThreadFunc(LPVOID Context)
             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 */
-    ZeroMemory(&si, 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))
@@ -356,7 +389,12 @@ DownloadApplicationsDB(LPWSTR lpUrl)
     APPLICATION_INFO IntInfo;
 
     ZeroMemory(&IntInfo, sizeof(APPLICATION_INFO));
-    wcscpy(IntInfo.szUrlDownload, lpUrl);
+    if (FAILED(StringCbCopyW(IntInfo.szUrlDownload,
+                             sizeof(IntInfo.szUrlDownload),
+                             lpUrl)))
+    {
+        return;
+    }
 
     AppInfo = &IntInfo;