Module: wine Branch: master Commit: 6ef6512938d1162114735a482572755f9dd4d099 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6ef6512938d1162114735a4825...
Author: James Hawkins truiken@gmail.com Date: Wed Nov 8 14:03:36 2006 -0800
msi: Factor out load_media_info from ready_media_for_file.
---
dlls/msi/files.c | 171 ++++++++++++++++++++++++------------------------------ 1 files changed, 75 insertions(+), 96 deletions(-)
diff --git a/dlls/msi/files.c b/dlls/msi/files.c index 553b9da..dd5fa63 100644 --- a/dlls/msi/files.c +++ b/dlls/msi/files.c @@ -405,111 +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; + 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); + 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] == '#') + { + 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; + } + } + else { lstrcpyW(mi->source, source_dir); - set_file_source(package, file, mi->source);
- MsiSourceListAddMediaDiskW(package->ProductCode, NULL, - MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id, volume, - mi->disk_prompt);
- MsiSourceListSetInfoW(package->ProductCode, NULL, - MSIINSTALLCONTEXT_USERMANAGED, - MSICODE_PRODUCT|MSISOURCETYPE_MEDIA, - INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source); - msiobj_release(&row->hdr); - return rc; + if (mi->cabinet) + lstrcatW(mi->source, mi->cabinet); }
- seq = MSI_RecordGetInteger(row,2); - mi->last_sequence = seq; - - cab = MSI_RecordGetString(row,4); - if (cab) - { - 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; + MsiSourceListAddMediaDiskW(package->ProductCode, NULL, + MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, + mi->disk_id, mi->volume_label, mi->disk_prompt);
- path = msi_dup_property( package, cszSourceDir ); + MsiSourceListSetInfoW(package->ProductCode, NULL, + MSIINSTALLCONTEXT_USERMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_MEDIA, + INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
- MsiSourceListAddMediaDiskW(package->ProductCode, NULL, - MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id, - volume, mi->disk_prompt); + msi_free(source_dir); + return ERROR_SUCCESS; +}
- MsiSourceListSetInfoW(package->ProductCode, NULL, - MSIINSTALLCONTEXT_USERMANAGED, - MSICODE_PRODUCT|MSISOURCETYPE_NETWORK, - INSTALLPROPERTY_LASTUSEDSOURCEW, path); +static UINT ready_media_for_file( MSIPACKAGE *package, struct media_info *mi, + MSIFILE *file ) +{ + UINT rc = ERROR_SUCCESS; + BOOL found = FALSE;
- 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 (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; + }
- if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES) - rc = msi_change_media(package, mi); + rc = load_media_info(package, file, mi); + if (rc != ERROR_SUCCESS) + { + ERR("Unable to load media info\n"); + return ERROR_FUNCTION_FAILED; + }
- if ( rc != ERROR_SUCCESS ) - goto done; + if (!file->IsCompressed) + { + set_file_source(package, file, mi->source); + return rc; + }
- MsiSourceListSetInfoW(package->ProductCode, NULL, - MSIINSTALLCONTEXT_USERMANAGED, - MSICODE_PRODUCT|MSISOURCETYPE_MEDIA, - INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source); - } - } + if (mi->cabinet) + { + TRACE("Source is CAB %s\n", debugstr_w(mi->cabinet));
/* only download the remote cabinet file if a local copy does not exist */ if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES && @@ -519,32 +505,25 @@ static UINT ready_media_for_file( MSIPAC if (rc != ERROR_SUCCESS || GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES) { - goto done; + found = FALSE; + } + } + + if (!found) + { + rc = msi_change_media(package, mi); + if (rc != ERROR_SUCCESS) + { + ERR("Cabinet not found: %s\n", debugstr_w(mi->cabinet)); + return ERROR_FUNCTION_FAILED; } }
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); - } set_file_source(package, file, mi->source);
- MsiSourceListAddMediaDiskW(package->ProductCode, NULL, - MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id, volume, - mi->disk_prompt); - -done: - msi_free(source_dir); - msiobj_release(&row->hdr); - return rc; }