Hans Leidekker : msi: Add support for uninstalling global assemblies.
Alexandre Julliard
julliard at winehq.org
Mon Apr 30 14:13:08 CDT 2012
Module: wine
Branch: master
Commit: 605e0b7b4176bf5e5cf5888073103016e56b8a2f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=605e0b7b4176bf5e5cf5888073103016e56b8a2f
Author: Hans Leidekker <hans at codeweavers.com>
Date: Mon Apr 30 09:35:25 2012 +0200
msi: Add support for uninstalling global assemblies.
---
dlls/msi/assembly.c | 39 +++++++++++++++++++++++++++++++++++++++
dlls/msi/files.c | 16 ++++++++++------
dlls/msi/msipriv.h | 1 +
3 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/dlls/msi/assembly.c b/dlls/msi/assembly.c
index af23c4a..712bb23 100644
--- a/dlls/msi/assembly.c
+++ b/dlls/msi/assembly.c
@@ -425,6 +425,45 @@ UINT msi_install_assembly( MSIPACKAGE *package, MSICOMPONENT *comp )
return ERROR_SUCCESS;
}
+UINT msi_uninstall_assembly( MSIPACKAGE *package, MSICOMPONENT *comp )
+{
+ HRESULT hr;
+ IAssemblyCache *cache;
+ MSIASSEMBLY *assembly = comp->assembly;
+ MSIFEATURE *feature = NULL;
+
+ if (comp->assembly->feature)
+ feature = msi_get_loaded_feature( package, comp->assembly->feature );
+
+ if (assembly->application)
+ {
+ if (feature) feature->Action = INSTALLSTATE_ABSENT;
+ return ERROR_SUCCESS;
+ }
+ TRACE("removing %s\n", debugstr_w(assembly->display_name));
+
+ if (assembly->attributes == msidbAssemblyAttributesWin32)
+ {
+ cache = package->cache_sxs;
+ hr = IAssemblyCache_UninstallAssembly( cache, 0, assembly->display_name, NULL, NULL );
+ if (FAILED( hr )) WARN("failed to uninstall assembly 0x%08x\n", hr);
+ }
+ else
+ {
+ unsigned int i;
+ for (i = 0; i < CLR_VERSION_MAX; i++)
+ {
+ if (!assembly->clr_version[i]) continue;
+ cache = package->cache_net[i];
+ hr = IAssemblyCache_UninstallAssembly( cache, 0, assembly->display_name, NULL, NULL );
+ if (FAILED( hr )) WARN("failed to uninstall assembly 0x%08x\n", hr);
+ }
+ }
+ if (feature) feature->Action = INSTALLSTATE_ABSENT;
+ assembly->installed = FALSE;
+ return ERROR_SUCCESS;
+}
+
static WCHAR *build_local_assembly_path( const WCHAR *filename )
{
UINT i;
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 6edf781..fe72c24 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -1308,22 +1308,26 @@ UINT ACTION_RemoveFiles( MSIPACKAGE *package )
msi_ui_actiondata( package, szRemoveFiles, uirow );
msiobj_release( &uirow->hdr );
}
+
+ msi_init_assembly_caches( package );
LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
{
- MSIFOLDER *folder;
-
comp->Action = msi_get_component_action( package, comp );
if (comp->Action != INSTALLSTATE_ABSENT) continue;
- if (comp->assembly && !comp->assembly->application) continue;
-
if (comp->Attributes & msidbComponentAttributesPermanent)
{
TRACE("permanent component, not removing directory\n");
continue;
}
- folder = msi_get_loaded_folder( package, comp->Directory );
- remove_folder( folder );
+ if (comp->assembly && !comp->assembly->application)
+ msi_uninstall_assembly( package, comp );
+ else
+ {
+ MSIFOLDER *folder = msi_get_loaded_folder( package, comp->Directory );
+ remove_folder( folder );
+ }
}
+ msi_destroy_assembly_caches( package );
return ERROR_SUCCESS;
}
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index bdce06b..80f5414 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -1027,6 +1027,7 @@ extern UINT msi_create_empty_local_file(LPWSTR path, LPCWSTR suffix) DECLSPEC_HI
extern UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace) DECLSPEC_HIDDEN;
extern MSIASSEMBLY *msi_load_assembly(MSIPACKAGE *, MSICOMPONENT *) DECLSPEC_HIDDEN;
extern UINT msi_install_assembly(MSIPACKAGE *, MSICOMPONENT *) DECLSPEC_HIDDEN;
+extern UINT msi_uninstall_assembly(MSIPACKAGE *, MSICOMPONENT *) DECLSPEC_HIDDEN;
extern BOOL msi_init_assembly_caches(MSIPACKAGE *) DECLSPEC_HIDDEN;
extern void msi_destroy_assembly_caches(MSIPACKAGE *) DECLSPEC_HIDDEN;
extern WCHAR *msi_font_version_from_file(const WCHAR *) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list