msi [10/11]: Clean up ACTION_InstallFiles

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


Hi,

I tried to separate these changes as much as possible, but ready_media
was a huge mess and these two pieces were too intertwined to take
apart individually.

Changelog:
* Factor load_media_info out of ready_media.
* Pull cab extraction out of ready_media into ACTION_InstallFiles
where it belongs.

 dlls/msi/files.c |  228 +++++++++++++++++++++---------------------------------
 1 files changed, 87 insertions(+), 141 deletions(-)

-- 
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 8833079..4ba53fa 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -354,7 +354,7 @@ static void free_media_info( struct medi
     msi_free( mi );
 }
 
-static UINT msi_change_media( MSIPACKAGE *package, struct media_info *mi, LPCWSTR prompt )
+static UINT msi_change_media( MSIPACKAGE *package, struct media_info *mi )
 {
     LPWSTR error, error_dialog;
     UINT r = ERROR_SUCCESS;
@@ -365,7 +365,7 @@ static UINT msi_change_media( MSIPACKAGE
     if ( msi_get_property_int(package, szUILevel, 0) == INSTALLUILEVEL_NONE )
         return ERROR_SUCCESS;
 
-    error = generate_error_string( package, 1302, 1, prompt );
+    error = generate_error_string( package, 1302, 1, mi->disk_prompt );
     error_dialog = msi_dup_property( package, error_prop );
 
     while ( r == ERROR_SUCCESS && GetFileAttributesW( mi->source ) == INVALID_FILE_ATTRIBUTES )
@@ -405,148 +405,97 @@ static UINT download_remote_cabinet(MSIP
     return ERROR_SUCCESS;
 }
 
-static UINT ready_media_for_file( MSIPACKAGE *package, struct media_info *mi,
-                                  MSIFILE *file )
+static UINT load_media_info(MSIPACKAGE *package, MSIFILE *file, struct media_info *mi)
 {
-    UINT rc = ERROR_SUCCESS;
-    MSIRECORD * row = 0;
-    static const WCHAR ExecSeqQuery[] =
-        {'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
-         '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ',
-         '`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ','>','=',
-         ' ','%', 'i',' ','O','R','D','E','R',' ','B','Y',' ',
-         '`','D','i','s','k','I','d','`',0};
-    LPCWSTR cab, volume;
+    MSIRECORD *row;
     LPWSTR source_dir;
-    DWORD sz;
-    INT seq;
-    LPCWSTR prompt;
+    UINT r;
 
-    if (file->Sequence <= mi->last_sequence)
-    {
-        set_file_source(package, file, mi->source);
-        TRACE("Media already ready (%u, %u)\n",file->Sequence,mi->last_sequence);
-        return ERROR_SUCCESS;
-    }
+    static const WCHAR query[] = {
+        'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
+        '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ',
+        '`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ','>','=',
+        ' ','%','i',' ','A','N','D',' ','`','D','i','s','k','I','d','`',' ','>','=',
+        ' ','%','i',' ','O','R','D','E','R',' ','B','Y',' ',
+        '`','D','i','s','k','I','d','`',0
+    };
 
-    row = MSI_QueryGetRecord(package->db, ExecSeqQuery, file->Sequence);
+    row = MSI_QueryGetRecord(package->db, query, file->Sequence, mi->disk_id);
     if (!row)
     {
         TRACE("Unable to query row\n");
         return ERROR_FUNCTION_FAILED;
     }
 
-    volume = MSI_RecordGetString(row, 5);
-    prompt = MSI_RecordGetString(row, 3);
+    mi->disk_id = MSI_RecordGetInteger(row, 1);
+    mi->last_sequence = MSI_RecordGetInteger(row, 2);
+    mi->disk_prompt = strdupW(MSI_RecordGetString(row, 3));
+    mi->cabinet = strdupW(MSI_RecordGetString(row, 4));
+    mi->volume_label = strdupW(MSI_RecordGetString(row, 5));
+    msiobj_release(&row->hdr);
 
     source_dir = msi_dup_property(package, cszSourceDir);
 
-    if (!file->IsCompressed)
+    if (mi->cabinet && mi->cabinet[0] == '#')
     {
-        lstrcpyW(mi->source, source_dir);
-        set_file_source(package, file, mi->source);
-
-        MsiSourceListAddMediaDiskW(package->ProductCode, NULL, 
-            MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id, volume,
-            prompt);
-
-        MsiSourceListSetInfoW(package->ProductCode, NULL, 
-                MSIINSTALLCONTEXT_USERMANAGED, 
-                MSICODE_PRODUCT|MSISOURCETYPE_MEDIA,
-                INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
-        msiobj_release(&row->hdr);
-        return rc;
+        r = writeout_cabinet_stream(package, &mi->cabinet[1], mi->source);
+        if (r != ERROR_SUCCESS)
+        {
+            ERR("Failed to extract cabinet stream\n");
+            return ERROR_FUNCTION_FAILED;
+        }
     }
-
-    seq = MSI_RecordGetInteger(row,2);
-    mi->last_sequence = seq;
-
-    cab = MSI_RecordGetString(row,4);
-    if (cab)
+    else
     {
-        TRACE("Source is CAB %s\n",debugstr_w(cab));
-        /* the stream does not contain the # character */
-        if (cab[0]=='#')
-        {
-            LPWSTR path;
-
-            rc = writeout_cabinet_stream(package,&cab[1],mi->source);
-            if (rc != ERROR_SUCCESS)
-                return rc;
+        lstrcpyW(mi->source, source_dir);
 
-            path = msi_dup_property( package, cszSourceDir );
+        if (mi->cabinet)
+            lstrcatW(mi->source, mi->cabinet);
+    }
 
-            MsiSourceListAddMediaDiskW(package->ProductCode, NULL, 
-                MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id,
-                volume, prompt);
+    MsiSourceListAddMediaDiskW(package->ProductCode, NULL, 
+        MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT,
+        mi->disk_id, mi->volume_label, mi->disk_prompt);
 
-            MsiSourceListSetInfoW(package->ProductCode, NULL,
-                MSIINSTALLCONTEXT_USERMANAGED,
-                MSICODE_PRODUCT|MSISOURCETYPE_NETWORK,
-                INSTALLPROPERTY_LASTUSEDSOURCEW, path);
+    MsiSourceListSetInfoW(package->ProductCode, NULL,
+        MSIINSTALLCONTEXT_USERMANAGED,
+        MSICODE_PRODUCT | MSISOURCETYPE_MEDIA,
+        INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
 
-            msi_free(path);
-        }
-        else
-        {
-            sz = MAX_PATH;
-            if (MSI_GetPropertyW(package, cszSourceDir, mi->source, &sz))
-            {
-                ERR("No Source dir defined\n");
-                rc = ERROR_FUNCTION_FAILED;
-            }
-            else
-            {
-                strcatW(mi->source,cab);
-
-                if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
-                    rc = msi_change_media(package, mi, prompt);
+    msi_free(source_dir);
+    return ERROR_SUCCESS;
+}
 
-                if ( rc != ERROR_SUCCESS )
-                    goto done;
+static UINT ready_media(MSIPACKAGE *package, MSIFILE *file, struct media_info *mi)
+{
+    UINT r = ERROR_SUCCESS;
+    BOOL found = FALSE;
 
-                MsiSourceListSetInfoW(package->ProductCode, NULL,
-                            MSIINSTALLCONTEXT_USERMANAGED,
-                            MSICODE_PRODUCT|MSISOURCETYPE_MEDIA,
-                            INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
-            }
-        }
+    r = load_media_info(package, file, mi);
+    if (r != ERROR_SUCCESS)
+    {
+        ERR("Unable to load media info\n");
+        return ERROR_FUNCTION_FAILED;
+    }
 
-        /* only download the remote cabinet file if a local copy does not exist */
-        if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES && 
-            UrlIsW(package->BaseURL, URLIS_URL))
+    if (file->IsCompressed &&
+        GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
+    {
+        if (package->BaseURL && UrlIsW(package->BaseURL, URLIS_URL))
         {
-            rc = download_remote_cabinet(package, mi);
-            if (rc != ERROR_SUCCESS ||
-                GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
+            r = download_remote_cabinet(package, mi);
+            if (r == ERROR_SUCCESS &&
+                GetFileAttributesW(mi->source) != INVALID_FILE_ATTRIBUTES)
             {
-                goto done;
+                found = TRUE;
             }
         }
 
-        rc = !extract_cabinet_file(package, mi);
-    }
-    else
-    {
-        sz = MAX_PATH;
-        MSI_GetPropertyW(package,cszSourceDir,mi->source,&sz);
-
-        MsiSourceListSetInfoW(package->ProductCode, NULL,
-                    MSIINSTALLCONTEXT_USERMANAGED,
-                    MSICODE_PRODUCT|MSISOURCETYPE_MEDIA,
-                    INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
+        if (!found)
+            r = msi_change_media(package, mi);
     }
-    set_file_source(package, file, mi->source);
-
-    MsiSourceListAddMediaDiskW(package->ProductCode, NULL,
-            MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id, volume,
-            prompt);
-
-done:
-    msi_free(source_dir);
-    msiobj_release(&row->hdr);
 
-    return rc;
+    return r;
 }
 
 static UINT get_file_target(MSIPACKAGE *package, LPCWSTR file_key, 
@@ -639,7 +588,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *pac
     ptr = strrchrW(package->PackagePath,'\\');
     if (ptr)
     {
-        ptr ++;
+        ptr++;
         MsiSourceListSetInfoW(package->ProductCode, NULL,
                 MSIINSTALLCONTEXT_USERMANAGED,
                 MSICODE_PRODUCT,
@@ -658,53 +607,50 @@ UINT ACTION_InstallFiles(MSIPACKAGE *pac
 
     mi = msi_alloc_zero( sizeof(struct media_info) );
 
-    /* Pass 2 */
     LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
     {
         if (file->state != msifs_missing && file->state != msifs_overwrite)
             continue;
 
-        TRACE("Pass 2: %s\n",debugstr_w(file->File));
-
-        rc = ready_media_for_file( package, mi, file );
-        if (rc != ERROR_SUCCESS)
+        if (file->Sequence > mi->last_sequence || mi->is_continuous)
         {
-            ERR("Unable to ready media\n");
-            rc = ERROR_FUNCTION_FAILED;
-            break;
-        }
+            rc = ready_media(package, file, mi);
+            if (rc != ERROR_SUCCESS)
+            {
+                ERR("Failed to ready media\n");
+                rc = ERROR_FUNCTION_FAILED;
+                break;
+            }
 
-        TRACE("file paths %s to %s\n",debugstr_w(file->SourcePath),
-              debugstr_w(file->TargetPath));
+            if (file->IsCompressed && !extract_cabinet_file(package, mi))
+            {
+                ERR("Failed to extract cabinet\n");
+                rc = ERROR_FUNCTION_FAILED;
+                break;
+            }
+        }
 
-        if (file->state != msifs_missing && file->state != msifs_overwrite)
-            continue;
+        set_file_source(package, file, mi->source);
 
-        /* compressed files are extracted in ready_media_for_file */
-        if (file->IsCompressed)
+        if (!file->IsCompressed)
         {
-            if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW(file->TargetPath))
+            rc = copy_install_file(file);
+            if (rc != ERROR_SUCCESS)
             {
-                ERR("compressed file wasn't extracted (%s)\n",
-                    debugstr_w(file->TargetPath));
+                ERR("Failed to copy %s to %s (%d)\n", debugstr_w(file->SourcePath),
+                    debugstr_w(file->TargetPath), rc);
                 rc = ERROR_INSTALL_FAILURE;
                 break;
             }
-
-            continue;
         }
-
-        rc = copy_install_file(file);
-        if (rc != ERROR_SUCCESS)
+        else if (file->state != msifs_installed)
         {
-            ERR("Failed to copy %s to %s (%d)\n", debugstr_w(file->SourcePath),
-                debugstr_w(file->TargetPath), rc);
+            ERR("compressed file wasn't extracted (%s)\n", debugstr_w(file->TargetPath));
             rc = ERROR_INSTALL_FAILURE;
             break;
         }
     }
 
-    /* cleanup */
     free_media_info( mi );
     return rc;
 }
-- 
1.4.2.4


More information about the wine-patches mailing list