msi [9/11]: Factor out download_remote_cabinet and reuse extract_cabinet_file to extract a remote cabinet

James Hawkins truiken at gmail.com
Tue Nov 7 17:14:20 CST 2006


Hi,

Changelog:
* Factor out download_remote_cabinet and reuse extract_cabinet_file to
extract a remote cabinet.

 dlls/msi/files.c |   89 ++++++++++++++++++++++--------------------------------
 1 files changed, 37 insertions(+), 52 deletions(-)

-- 
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 1195116..8833079 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -354,52 +354,6 @@ static void free_media_info( struct medi
     msi_free( mi );
 }
 
-/* downloads a remote cabinet and extracts it if it exists */
-static UINT msi_extract_remote_cabinet( MSIPACKAGE *package, struct media_info *mi )
-{
-    FDICABINETINFO cabinfo;
-    WCHAR temppath[MAX_PATH];
-    WCHAR src[MAX_PATH];
-    LPSTR cabpath;
-    LPCWSTR file;
-    LPWSTR ptr;
-    HFDI hfdi;
-    ERF erf;
-    int hf;
-
-    /* the URL is the path prefix of the package URL and the filename
-     * of the file to download
-     */
-    ptr = strrchrW(package->PackagePath, '/');
-    lstrcpynW(src, package->PackagePath, ptr - package->PackagePath + 2);
-    ptr = strrchrW(mi->source, '\\');
-    lstrcatW(src, ptr + 1);
-
-    file = msi_download_file( src, temppath );
-    lstrcpyW(mi->source, file);
-
-    /* check if the remote cabinet still exists, ignore if it doesn't */
-    hfdi = FDICreate(cabinet_alloc, cabinet_free, cabinet_open, cabinet_read,
-                     cabinet_write, cabinet_close, cabinet_seek, 0, &erf);
-    if (!hfdi)
-    {
-        ERR("FDICreate failed\n");
-        return ERROR_FUNCTION_FAILED;
-    }
-
-    cabpath = strdupWtoA(mi->source);
-    hf = cabinet_open(cabpath, _O_RDONLY, 0);
-    if (!FDIIsCabinet(hfdi, hf, &cabinfo))
-    {
-        WARN("Remote cabinet %s does not exist.\n", debugstr_w(mi->source));
-        msi_free(cabpath);
-        return ERROR_SUCCESS;
-    }
-
-    msi_free(cabpath);
-    return !extract_cabinet_file(package, mi);
-}
-
 static UINT msi_change_media( MSIPACKAGE *package, struct media_info *mi, LPCWSTR prompt )
 {
     LPWSTR error, error_dialog;
@@ -423,6 +377,34 @@ static UINT msi_change_media( MSIPACKAGE
     return r;
 }
 
+static UINT download_remote_cabinet(MSIPACKAGE *package, struct media_info *mi)
+{
+    WCHAR temppath[MAX_PATH];
+    LPWSTR src, ptr;
+    LPCWSTR cab;
+
+    src = strdupW(package->BaseURL);
+    if (!src)
+        return ERROR_OUTOFMEMORY;
+
+    ptr = strrchrW(src, '/');
+    if (!ptr)
+    {
+        msi_free(src);
+        return ERROR_FUNCTION_FAILED;
+    }
+
+    *(ptr + 1) = '\0';
+    ptr = strrchrW(mi->source, '\\');
+    lstrcatW(src, ptr + 1);
+
+    cab = msi_download_file(src, temppath);
+    lstrcpyW(mi->source, cab);
+
+    msi_free(src);
+    return ERROR_SUCCESS;
+}
+
 static UINT ready_media_for_file( MSIPACKAGE *package, struct media_info *mi,
                                   MSIFILE *file )
 {
@@ -531,15 +513,18 @@ static UINT ready_media_for_file( MSIPAC
         }
 
         /* only download the remote cabinet file if a local copy does not exist */
-        if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES &&
+        if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES &&
             UrlIsW(package->BaseURL, URLIS_URL))
         {
-            rc = msi_extract_remote_cabinet(package, mi);
-        }
-        else
-        {
-            rc = !extract_cabinet_file(package, mi);
+            rc = download_remote_cabinet(package, mi);
+            if (rc != ERROR_SUCCESS ||
+                GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
+            {
+                goto done;
+            }
         }
+
+        rc = !extract_cabinet_file(package, mi);
     }
     else
     {
-- 
1.4.2.4


More information about the wine-patches mailing list