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