[APPWIZ] Enable the 'Cancel' button while downloading. Patch by Jared Smudde and...
[reactos.git] / reactos / dll / cpl / appwiz / addons.c
index 2e86442..beec6a7 100644 (file)
@@ -16,8 +16,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include <config.h>
-#include <wine/port.h>
+#include "appwiz.h"
 
 #include <stdio.h>
 
 # include <unistd.h>
 #endif
 
-#define COBJMACROS
-#define NONAMELESSUNION
-#define NONAMELESSSTRUCT
-
-#include <windef.h>
-#include <winbase.h>
 #include <msi.h>
 
-#include "appwiz.h"
-
-#include <wine/debug.h>
-
-WINE_DEFAULT_DEBUG_CHANNEL(appwiz);
-
-#define GECKO_VERSION "2.21"
+#define GECKO_VERSION "2.40"
 
 #ifdef __i386__
 #define ARCH_STRING "x86"
-#define GECKO_SHA "a514fc4d53783a586c7880a676c415695fe934a3"
+#define GECKO_SHA "8a3adedf3707973d1ed4ac3b2e791486abf814bd"
 #else
 #define ARCH_STRING ""
 #define GECKO_SHA "???"
@@ -72,8 +59,9 @@ static const addon_info_t addons_info[] = {
 static const addon_info_t *addon;
 
 static HWND install_dialog = NULL;
+static IBinding *download_binding;
 
-static WCHAR GeckoUrl[] = L"http://dl.dropboxusercontent.com/u/743491/ReactOS/wine_gecko-2.21-x86.msi";
+static WCHAR GeckoUrl[] = L"https://svn.reactos.org/amine/wine_gecko-2.40-x86.msi";
 
 /* SHA definitions are copied from advapi32. They aren't available in headers. */
 
@@ -227,6 +215,18 @@ static enum install_res install_from_registered_dir(void)
         return INSTALL_FAILED;
     }
 
+    if (type == REG_EXPAND_SZ)
+    {
+        size = ExpandEnvironmentStringsA(package_dir, NULL, 0);
+        if (size)
+        {
+            char* buf = heap_alloc(size + sizeof(addon->file_name));
+            ExpandEnvironmentStringsA(package_dir, buf, size);
+            heap_free(package_dir);
+            package_dir = buf;
+        }
+    }
+
     TRACE("Trying %s/%s\n", debugstr_a(package_dir), debugstr_a(addon->file_name));
 
     ret = install_from_unix_file(package_dir, "", addon->file_name);
@@ -260,6 +260,9 @@ static HRESULT WINAPI InstallCallback_OnStartBinding(IBindStatusCallback *iface,
         DWORD dwReserved, IBinding *pib)
 {
     set_status(IDS_DOWNLOADING);
+    IBinding_AddRef(pib);
+    download_binding = pib;
+
     return S_OK;
 }
 
@@ -291,8 +294,16 @@ static HRESULT WINAPI InstallCallback_OnProgress(IBindStatusCallback *iface, ULO
 static HRESULT WINAPI InstallCallback_OnStopBinding(IBindStatusCallback *iface,
         HRESULT hresult, LPCWSTR szError)
 {
+    if(download_binding) {
+        IBinding_Release(download_binding);
+        download_binding = NULL;
+    }
+
     if(FAILED(hresult)) {
-        ERR("Binding failed %08x\n", hresult);
+        if(hresult == E_ABORT)
+            TRACE("Binding aborted\n");
+        else
+            ERR("Binding failed %08x\n", hresult);
         return S_OK;
     }
 
@@ -351,16 +362,15 @@ static DWORD WINAPI download_proc(PVOID arg)
     hres = URLDownloadToFileW(NULL, GeckoUrl, tmp_file, 0, &InstallCallback);
     if(FAILED(hres)) {
         ERR("URLDownloadToFile failed: %08x\n", hres);
-        return 0;
-    }
-
-    if(sha_check(tmp_file)) {
-        install_file(tmp_file);
-    }else {
-        WCHAR message[256];
-
-        if(LoadStringW(hApplet, IDS_INVALID_SHA, message, sizeof(message)/sizeof(WCHAR))) {
-            MessageBoxW(NULL, message, NULL, MB_ICONERROR);
+    } else {
+        if(sha_check(tmp_file)) {
+            install_file(tmp_file);
+        }else {
+            WCHAR message[256];
+
+            if(LoadStringW(hApplet, IDS_INVALID_SHA, message, sizeof(message)/sizeof(WCHAR))) {
+                MessageBoxW(NULL, message, NULL, MB_ICONERROR);
+            }
         }
     }
 
@@ -383,13 +393,17 @@ static INT_PTR CALLBACK installer_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARA
     case WM_COMMAND:
         switch(wParam) {
         case IDCANCEL:
-            EndDialog(hwnd, 0);
+            if(download_binding) {
+                IBinding_Abort(download_binding);
+            }
+            else {
+                EndDialog(hwnd, 0);
+            }
             return FALSE;
 
         case ID_DWL_INSTALL:
             ShowWindow(GetDlgItem(hwnd, ID_DWL_PROGRESS), SW_SHOW);
             EnableWindow(GetDlgItem(hwnd, ID_DWL_INSTALL), 0);
-            EnableWindow(GetDlgItem(hwnd, IDCANCEL), 0); /* FIXME */
             CloseHandle( CreateThread(NULL, 0, download_proc, NULL, 0, NULL));
             return FALSE;
         }
@@ -398,7 +412,7 @@ static INT_PTR CALLBACK installer_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARA
     return FALSE;
 }
 
-BOOL install_addon(addon_t addon_type)
+BOOL install_addon(addon_t addon_type, HWND hwnd_parent)
 {
 
     if(!*ARCH_STRING)
@@ -412,7 +426,7 @@ BOOL install_addon(addon_t addon_type)
      * - download the package
      */
     if (install_from_registered_dir() == INSTALL_NEXT)
-        DialogBoxW(hApplet, addon->dialog_template, 0, installer_proc);
+        DialogBoxW(hApplet, addon->dialog_template, hwnd_parent, installer_proc);
 
     return TRUE;
 }