Module: wine Branch: master Commit: ae18c2dc7f7e337b0eb7f3a15f04d35a56355586 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ae18c2dc7f7e337b0eb7f3a15f...
Author: James Hawkins truiken@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),