Commit 70e37907 authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

msi: Remove local patch packages when the product is removed.

parent 621b0405
...@@ -4938,6 +4938,11 @@ static UINT msi_unpublish_product( MSIPACKAGE *package, const WCHAR *remove ) ...@@ -4938,6 +4938,11 @@ static UINT msi_unpublish_product( MSIPACKAGE *package, const WCHAR *remove )
LIST_FOR_EACH_ENTRY(patch, &package->patches, MSIPATCHINFO, entry) LIST_FOR_EACH_ENTRY(patch, &package->patches, MSIPATCHINFO, entry)
{ {
MSIREG_DeleteUserDataPatchKey(patch->patchcode, package->Context); MSIREG_DeleteUserDataPatchKey(patch->patchcode, package->Context);
if (!strcmpW( package->ProductCode, patch->products ))
{
TRACE("removing local patch package %s\n", debugstr_w(patch->localfile));
patch->delete_on_close = TRUE;
}
/* FIXME: remove local patch package if this is the last product */ /* FIXME: remove local patch package if this is the last product */
} }
TRACE("removing local package %s\n", debugstr_w(package->localfile)); TRACE("removing local package %s\n", debugstr_w(package->localfile));
......
...@@ -170,10 +170,12 @@ typedef struct tagMSIPATCHINFO ...@@ -170,10 +170,12 @@ typedef struct tagMSIPATCHINFO
{ {
struct list entry; struct list entry;
LPWSTR patchcode; LPWSTR patchcode;
LPWSTR products;
LPWSTR transforms; LPWSTR transforms;
LPWSTR filename; LPWSTR filename;
LPWSTR localfile; LPWSTR localfile;
MSIPATCHSTATE state; MSIPATCHSTATE state;
BOOL delete_on_close;
} MSIPATCHINFO; } MSIPATCHINFO;
typedef struct tagMSIBINARY typedef struct tagMSIBINARY
...@@ -770,6 +772,7 @@ extern UINT msi_apply_transforms( MSIPACKAGE *package ) DECLSPEC_HIDDEN; ...@@ -770,6 +772,7 @@ extern UINT msi_apply_transforms( MSIPACKAGE *package ) DECLSPEC_HIDDEN;
extern UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si ) DECLSPEC_HIDDEN; extern UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si ) DECLSPEC_HIDDEN;
extern UINT msi_apply_patches( MSIPACKAGE *package ) DECLSPEC_HIDDEN; extern UINT msi_apply_patches( MSIPACKAGE *package ) DECLSPEC_HIDDEN;
extern UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code ) DECLSPEC_HIDDEN; extern UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code ) DECLSPEC_HIDDEN;
extern void msi_free_patchinfo( MSIPATCHINFO *patch ) DECLSPEC_HIDDEN;
/* action internals */ /* action internals */
extern UINT MSI_InstallPackage( MSIPACKAGE *, LPCWSTR, LPCWSTR ) DECLSPEC_HIDDEN; extern UINT MSI_InstallPackage( MSIPACKAGE *, LPCWSTR, LPCWSTR ) DECLSPEC_HIDDEN;
......
...@@ -293,18 +293,6 @@ static void free_package_structures( MSIPACKAGE *package ) ...@@ -293,18 +293,6 @@ static void free_package_structures( MSIPACKAGE *package )
msi_free( package->script ); msi_free( package->script );
} }
LIST_FOR_EACH_SAFE( item, cursor, &package->patches )
{
MSIPATCHINFO *patch = LIST_ENTRY( item, MSIPATCHINFO, entry );
list_remove( &patch->entry );
msi_free( patch->patchcode );
msi_free( patch->transforms );
msi_free( patch->localfile );
msi_free( patch->filename );
msi_free( patch );
}
LIST_FOR_EACH_SAFE( item, cursor, &package->binaries ) LIST_FOR_EACH_SAFE( item, cursor, &package->binaries )
{ {
MSIBINARY *binary = LIST_ENTRY( item, MSIBINARY, entry ); MSIBINARY *binary = LIST_ENTRY( item, MSIBINARY, entry );
...@@ -329,6 +317,18 @@ static void free_package_structures( MSIPACKAGE *package ) ...@@ -329,6 +317,18 @@ static void free_package_structures( MSIPACKAGE *package )
msi_free( cab ); msi_free( cab );
} }
LIST_FOR_EACH_SAFE( item, cursor, &package->patches )
{
MSIPATCHINFO *patch = LIST_ENTRY( item, MSIPATCHINFO, entry );
list_remove( &patch->entry );
if (patch->delete_on_close && !DeleteFileW( patch->localfile ))
{
ERR("failed to delete %s (%u)\n", debugstr_w(patch->localfile), GetLastError());
}
msi_free_patchinfo( patch );
}
msi_free( package->BaseURL ); msi_free( package->BaseURL );
msi_free( package->PackagePath ); msi_free( package->PackagePath );
msi_free( package->ProductCode ); msi_free( package->ProductCode );
......
...@@ -184,10 +184,16 @@ static UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch ) ...@@ -184,10 +184,16 @@ static UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch )
p[1] = 0; p[1] = 0;
} }
TRACE("patch code %s\n", debugstr_w(pi->patchcode)); TRACE("patch code %s\n", debugstr_w(pi->patchcode));
if (!(pi->products = msi_suminfo_dup_string( si, PID_TEMPLATE )))
{
msi_free( pi->patchcode );
msi_free( pi );
return ERROR_OUTOFMEMORY;
}
if (!(pi->transforms = msi_suminfo_dup_string( si, PID_LASTAUTHOR ))) if (!(pi->transforms = msi_suminfo_dup_string( si, PID_LASTAUTHOR )))
{ {
msi_free( pi->patchcode ); msi_free( pi->patchcode );
msi_free( pi->products );
msi_free( pi ); msi_free( pi );
return ERROR_OUTOFMEMORY; return ERROR_OUTOFMEMORY;
} }
...@@ -597,6 +603,16 @@ static UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIP ...@@ -597,6 +603,16 @@ static UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIP
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
void msi_free_patchinfo( MSIPATCHINFO *patch )
{
msi_free( patch->patchcode );
msi_free( patch->products );
msi_free( patch->transforms );
msi_free( patch->filename );
msi_free( patch->localfile );
msi_free( patch );
}
static UINT msi_apply_patch_package( MSIPACKAGE *package, const WCHAR *file ) static UINT msi_apply_patch_package( MSIPACKAGE *package, const WCHAR *file )
{ {
static const WCHAR dotmsp[] = {'.','m','s','p',0}; static const WCHAR dotmsp[] = {'.','m','s','p',0};
...@@ -646,11 +662,8 @@ done: ...@@ -646,11 +662,8 @@ done:
msiobj_release( &patch_db->hdr ); msiobj_release( &patch_db->hdr );
if (patch && r != ERROR_SUCCESS) if (patch && r != ERROR_SUCCESS)
{ {
msi_free( patch->patchcode ); DeleteFileW( patch->localfile );
msi_free( patch->transforms ); msi_free_patchinfo( patch );
msi_free( patch->filename );
msi_free( patch->localfile );
msi_free( patch );
} }
return r; return r;
} }
...@@ -756,6 +769,7 @@ UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code ) ...@@ -756,6 +769,7 @@ UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code )
if (!patch_info->localfile) if (!patch_info->localfile)
{ {
msiobj_release( &patch_db->hdr ); msiobj_release( &patch_db->hdr );
msi_free_patchinfo( patch_info );
return ERROR_OUTOFMEMORY; return ERROR_OUTOFMEMORY;
} }
r = msi_apply_patch_db( package, patch_db, patch_info ); r = msi_apply_patch_db( package, patch_db, patch_info );
...@@ -763,10 +777,7 @@ UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code ) ...@@ -763,10 +777,7 @@ UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code )
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
{ {
ERR("failed to apply patch %u\n", r); ERR("failed to apply patch %u\n", r);
msi_free( patch_info->patchcode ); msi_free_patchinfo( patch_info );
msi_free( patch_info->transforms );
msi_free( patch_info->localfile );
msi_free( patch_info );
} }
return r; return r;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment