Module: wine Branch: master Commit: ae18c2dc7f7e337b0eb7f3a15f04d35a56355586 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ae18c2dc7f7e337b0eb7f3a15f... Author: James Hawkins <truiken(a)gmail.com> Date: Tue Nov 7 15:13:47 2006 -0800 msi: Store the base URL of the MSI package if it is downloaded. --- dlls/msi/files.c | 2 +- dlls/msi/helpers.c | 1 + dlls/msi/msipriv.h | 3 ++- dlls/msi/package.c | 16 ++++++++++++++-- dlls/msi/preview.c | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/dlls/msi/files.c b/dlls/msi/files.c index 4bede98..1195116 100644 --- a/dlls/msi/files.c +++ b/dlls/msi/files.c @@ -532,7 +532,7 @@ 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 && - UrlIsW(package->PackagePath, URLIS_URL)) + UrlIsW(package->BaseURL, URLIS_URL)) { rc = msi_extract_remote_cabinet(package, mi); } diff --git a/dlls/msi/helpers.c b/dlls/msi/helpers.c index acb0f77..490e181 100644 --- a/dlls/msi/helpers.c +++ b/dlls/msi/helpers.c @@ -591,6 +591,7 @@ void ACTION_free_package_structures( MSI msi_free(package->script); } + msi_free(package->BaseURL); msi_free(package->PackagePath); msi_free(package->ProductCode); msi_free(package->ActionFormat); diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 8fe25d6..44e9170 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -228,6 +228,7 @@ typedef struct tagMSIPACKAGE struct list RunningActions; + LPWSTR BaseURL; LPWSTR PackagePath; LPWSTR ProductCode; @@ -620,7 +621,7 @@ extern UINT VIEW_find_column( MSIVIEW *, extern UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel ); /* package internals */ -extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE * ); +extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *, LPWSTR ); extern UINT MSI_OpenPackageW( LPCWSTR szPackage, MSIPACKAGE ** ); extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR ); extern UINT MSI_SetPropertyW( MSIPACKAGE *, LPCWSTR, LPCWSTR ); diff --git a/dlls/msi/package.c b/dlls/msi/package.c index 3aaad69..1455c6d 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -428,7 +428,7 @@ static UINT msi_get_word_count( MSIPACKA return word_count; } -MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db ) +MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPWSTR base_url ) { static const WCHAR szLevel[] = { 'U','I','L','e','v','e','l',0 }; static const WCHAR szpi[] = {'%','i',0}; @@ -466,6 +466,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABA package->WordCount = msi_get_word_count( package ); package->PackagePath = strdupW( db->path ); + package->BaseURL = strdupW( base_url ); /* OK, here is where we do a slew of things to the database to * prep for all that is to come as a package */ @@ -550,6 +551,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIDATABASE *db = NULL; MSIPACKAGE *package; MSIHANDLE handle; + LPWSTR ptr, base_url = NULL; UINT r; static const WCHAR OriginalDatabase[] = @@ -571,7 +573,16 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, LPCWSTR file; if ( UrlIsW( szPackage, URLIS_URL ) ) + { file = msi_download_file( szPackage, temppath ); + + base_url = strdupW( szPackage ); + if ( !base_url ) + return ERROR_OUTOFMEMORY; + + ptr = strrchrW( base_url, '/' ); + if (ptr) *(ptr + 1) = '\0'; + } else file = copy_package_to_temp( szPackage, temppath ); @@ -589,7 +600,8 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, } } - package = MSI_CreatePackage( db ); + package = MSI_CreatePackage( db, base_url ); + msi_free( base_url ); msiobj_release( &db->hdr ); if( !package ) return ERROR_FUNCTION_FAILED; diff --git a/dlls/msi/preview.c b/dlls/msi/preview.c index 4f4cc5c..ddf0a7a 100644 --- a/dlls/msi/preview.c +++ b/dlls/msi/preview.c @@ -43,7 +43,7 @@ MSIPREVIEW *MSI_EnableUIPreview( MSIDATA MSIPREVIEW *preview = NULL; MSIPACKAGE *package; - package = MSI_CreatePackage( db ); + package = MSI_CreatePackage( db, NULL ); if( package ) { preview = alloc_msiobject( MSIHANDLETYPE_PREVIEW, sizeof (MSIPREVIEW),