Module: wine Branch: master Commit: 52f3d5beadf201e4293f09b90be5bef1f607faca URL: http://source.winehq.org/git/wine.git/?a=commit;h=52f3d5beadf201e4293f09b90b...
Author: Hans Leidekker hans@codeweavers.com Date: Mon Apr 23 15:46:50 2012 +0200
msi: Remove child folders first in the RemoveFolders action.
---
dlls/msi/action.c | 17 +++++++++++++++-- 1 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c index eb755be..aa2cfca 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -884,6 +884,20 @@ static UINT ACTION_CreateFolders(MSIPACKAGE *package) return rc; }
+static void remove_persistent_folder( MSIFOLDER *folder ) +{ + FolderList *fl; + + LIST_FOR_EACH_ENTRY( fl, &folder->children, FolderList, entry ) + { + remove_persistent_folder( fl->folder ); + } + if (folder->persistent && folder->State != FOLDER_STATE_REMOVED) + { + if (RemoveDirectoryW( folder->ResolvedTarget )) folder->State = FOLDER_STATE_REMOVED; + } +} + static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param ) { MSIPACKAGE *package = param; @@ -927,9 +941,8 @@ static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param ) msi_ui_actiondata( package, szRemoveFolders, uirow ); msiobj_release( &uirow->hdr );
- RemoveDirectoryW( full_path ); folder = msi_get_loaded_folder( package, dir ); - folder->State = FOLDER_STATE_REMOVED; + remove_persistent_folder( folder ); return ERROR_SUCCESS; }