From 0405e9d2d438878ab52bf6c0c52f522410163f0b Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Sun, 3 Sep 2006 20:13:46 -0700 Subject: [PATCH] msi: Store the CustomActionData for deferred custom actions. --- dlls/msi/custom.c | 48 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c index 4c824bf1209..dad67a22824 100644 --- a/dlls/msi/custom.c +++ b/dlls/msi/custom.c @@ -117,6 +117,31 @@ static BOOL check_execution_scheduling_options(MSIPACKAGE *package, LPCWSTR acti return TRUE; } +/* stores the CustomActionData before the action: + * [CustomActionData]Action + */ +LPWSTR msi_get_deferred_action(LPCWSTR action, LPWSTR actiondata) +{ + LPWSTR deferred; + DWORD len; + + static const WCHAR begin[] = {'[',0}; + static const WCHAR end[] = {']',0}; + + if (!actiondata) + return strdupW(action); + + len = lstrlenW(action) + lstrlenW(actiondata) + 3; + deferred = msi_alloc(len * sizeof(WCHAR)); + + lstrcpyW(deferred, begin); + lstrcatW(deferred, actiondata); + lstrcatW(deferred, end); + lstrcatW(deferred, action); + + return deferred; +} + UINT ACTION_CustomAction(MSIPACKAGE *package,LPCWSTR action, BOOL execute) { UINT rc = ERROR_SUCCESS; @@ -128,8 +153,18 @@ UINT ACTION_CustomAction(MSIPACKAGE *package,LPCWSTR action, BOOL execute) '=',' ','\'','%','s','\'',0}; UINT type; LPCWSTR source, target; + LPWSTR ptr, deferred_data = NULL; + LPWSTR action_copy = strdupW(action); WCHAR *deformated=NULL; + /* deferred action: [CustomActionData]Action */ + if ((ptr = strchrW(action_copy, ']'))) + { + deferred_data = action_copy + 1; + *ptr = '\0'; + action = ptr + 1; + } + row = MSI_QueryGetRecord( package->db, ExecSeqQuery, action ); if (!row) return ERROR_CALL_NOT_IMPLEMENTED; @@ -160,18 +195,22 @@ UINT ACTION_CustomAction(MSIPACKAGE *package,LPCWSTR action, BOOL execute) } if (!execute) { + LPWSTR actiondata = msi_dup_property(package, action); + LPWSTR deferred = msi_get_deferred_action(action, actiondata); + if (type & msidbCustomActionTypeCommit) { TRACE("Deferring Commit Action!\n"); - schedule_action(package, COMMIT_SCRIPT, action); + schedule_action(package, COMMIT_SCRIPT, deferred); } else { TRACE("Deferring Action!\n"); - schedule_action(package, INSTALL_SCRIPT, action); + schedule_action(package, INSTALL_SCRIPT, deferred); } rc = ERROR_SUCCESS; + msi_free(deferred); goto end; } else @@ -182,7 +221,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *package,LPCWSTR action, BOOL execute) 'C','u','s','t','o','m','A','c','t','i','o','n','D','a','t','a',0}; static const WCHAR szBlank[] = {0}; LPWSTR actiondata = msi_dup_property( package, action ); - if (actiondata) + if (deferred_data) + MSI_SetPropertyW(package,szActionData,deferred_data); + else if (actiondata) MSI_SetPropertyW(package,szActionData,actiondata); else MSI_SetPropertyW(package,szActionData,szBlank); @@ -235,6 +276,7 @@ UINT ACTION_CustomAction(MSIPACKAGE *package,LPCWSTR action, BOOL execute) } end: + msi_free(action_copy); msiobj_release(&row->hdr); return rc; }