James Hawkins : msi: Store the CustomActionData for deferred custom
actions .
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Sep 7 09:20:20 CDT 2006
Module: wine
Branch: master
Commit: 0405e9d2d438878ab52bf6c0c52f522410163f0b
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=0405e9d2d438878ab52bf6c0c52f522410163f0b
Author: James Hawkins <truiken at gmail.com>
Date: Sun Sep 3 20:13:46 2006 -0700
msi: Store the CustomActionData for deferred custom actions.
---
dlls/msi/custom.c | 48 +++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 45 insertions(+), 3 deletions(-)
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index 4c824bf..dad67a2 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -117,6 +117,31 @@ static BOOL check_execution_scheduling_o
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 *pac
'=',' ','\'','%','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 *pac
}
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 *pac
'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 *pac
}
end:
+ msi_free(action_copy);
msiobj_release(&row->hdr);
return rc;
}
More information about the wine-cvs
mailing list