[08/10] msi: Get rid of forward declarations for custom action handlers.
Hans Leidekker
hans at codeweavers.com
Tue Jun 7 03:35:20 CDT 2011
---
dlls/msi/custom.c | 383 +++++++++++++++++++++++++----------------------------
1 files changed, 179 insertions(+), 204 deletions(-)
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index 54adf02..1feaec5 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -50,31 +50,6 @@ typedef struct tagMSIRUNNINGACTION
LPWSTR name;
} MSIRUNNINGACTION;
-static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType2(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType18(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType19(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType23(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType50(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType34(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType37_38(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType5_6(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType21_22(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-static UINT HANDLE_CustomType53_54(MSIPACKAGE *package, LPCWSTR source,
- LPCWSTR target, const INT type, LPCWSTR action);
-
typedef UINT (WINAPI *MsiCustomActionEntryPoint)( MSIHANDLE );
static CRITICAL_SECTION msi_custom_action_cs;
@@ -230,185 +205,6 @@ static void set_deferred_action_props(MSIPACKAGE *package, LPWSTR deferred_data)
msi_set_property(package->db, szProductCode, beg);
}
-UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL execute)
-{
- UINT rc = ERROR_SUCCESS;
- MSIRECORD * row = 0;
- static const WCHAR ExecSeqQuery[] =
- {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
- '`','C','u','s','t','o' ,'m','A','c','t','i','o','n','`',
- ' ','W','H','E','R','E',' ','`','A','c','t','i' ,'o','n','`',' ',
- '=',' ','\'','%','s','\'',0};
- UINT type;
- LPCWSTR source, target;
- LPWSTR ptr, deferred_data = NULL;
- LPWSTR action_copy = strdupW(action);
- WCHAR *deformated=NULL;
-
- /* deferred action: [properties]Action */
- if ((ptr = strrchrW(action_copy, ']')))
- {
- deferred_data = action_copy;
- action = ptr + 1;
- }
-
- row = MSI_QueryGetRecord( package->db, ExecSeqQuery, action );
- if (!row)
- {
- msi_free(action_copy);
- return ERROR_CALL_NOT_IMPLEMENTED;
- }
-
- type = MSI_RecordGetInteger(row,2);
-
- source = MSI_RecordGetString(row,3);
- target = MSI_RecordGetString(row,4);
-
- TRACE("Handling custom action %s (%x %s %s)\n",debugstr_w(action),type,
- debugstr_w(source), debugstr_w(target));
-
- /* handle some of the deferred actions */
- if (type & msidbCustomActionTypeTSAware)
- FIXME("msidbCustomActionTypeTSAware not handled\n");
-
- if (type & msidbCustomActionTypeInScript)
- {
- if (type & msidbCustomActionTypeNoImpersonate)
- WARN("msidbCustomActionTypeNoImpersonate not handled\n");
-
- if (!execute)
- {
- LPWSTR actiondata = msi_dup_property(package->db, action);
- LPWSTR usersid = msi_dup_property(package->db, szUserSID);
- LPWSTR prodcode = msi_dup_property(package->db, szProductCode);
- LPWSTR deferred = msi_get_deferred_action(action, actiondata, usersid, prodcode);
-
- if (type & msidbCustomActionTypeCommit)
- {
- TRACE("Deferring commit action\n");
- msi_schedule_action(package, COMMIT_SCRIPT, deferred);
- }
- else if (type & msidbCustomActionTypeRollback)
- {
- TRACE("Deferring rollback action\n");
- msi_schedule_action(package, ROLLBACK_SCRIPT, deferred);
- }
- else
- {
- TRACE("Deferring action\n");
- msi_schedule_action(package, INSTALL_SCRIPT, deferred);
- }
-
- rc = ERROR_SUCCESS;
- msi_free(actiondata);
- msi_free(usersid);
- msi_free(prodcode);
- msi_free(deferred);
- goto end;
- }
- else
- {
- LPWSTR actiondata = msi_dup_property( package->db, action );
-
- if (type & msidbCustomActionTypeInScript)
- package->scheduled_action_running = TRUE;
-
- if (type & msidbCustomActionTypeCommit)
- package->commit_action_running = TRUE;
-
- if (type & msidbCustomActionTypeRollback)
- package->rollback_action_running = TRUE;
-
- if (deferred_data)
- set_deferred_action_props(package, deferred_data);
- else if (actiondata)
- msi_set_property(package->db, szCustomActionData, actiondata);
- else
- msi_set_property(package->db, szCustomActionData, szEmpty);
-
- msi_free(actiondata);
- }
- }
- else if (!check_execution_scheduling_options(package,action,type))
- {
- rc = ERROR_SUCCESS;
- goto end;
- }
-
- switch (type & CUSTOM_ACTION_TYPE_MASK)
- {
- case 1: /* DLL file stored in a Binary table stream */
- rc = HANDLE_CustomType1(package,source,target,type,action);
- break;
- case 2: /* EXE file stored in a Binary table stream */
- rc = HANDLE_CustomType2(package,source,target,type,action);
- break;
- case 18: /*EXE file installed with package */
- rc = HANDLE_CustomType18(package,source,target,type,action);
- break;
- case 19: /* Error that halts install */
- rc = HANDLE_CustomType19(package,source,target,type,action);
- break;
- case 17:
- rc = HANDLE_CustomType17(package,source,target,type,action);
- break;
- case 23: /* installs another package in the source tree */
- deformat_string(package,target,&deformated);
- rc = HANDLE_CustomType23(package,source,deformated,type,action);
- msi_free(deformated);
- break;
- case 50: /*EXE file specified by a property value */
- rc = HANDLE_CustomType50(package,source,target,type,action);
- break;
- case 34: /*EXE to be run in specified directory */
- rc = HANDLE_CustomType34(package,source,target,type,action);
- break;
- case 35: /* Directory set with formatted text. */
- deformat_string(package,target,&deformated);
- MSI_SetTargetPathW(package, source, deformated);
- msi_free(deformated);
- break;
- case 51: /* Property set with formatted text. */
- if (!source)
- break;
-
- deformat_string(package,target,&deformated);
- rc = msi_set_property( package->db, source, deformated );
- if (rc == ERROR_SUCCESS && !strcmpW( source, szSourceDir ))
- msi_reset_folders( package, TRUE );
- msi_free(deformated);
- break;
- case 37: /* JScript/VBScript text stored in target column. */
- case 38:
- rc = HANDLE_CustomType37_38(package,source,target,type,action);
- break;
- case 5:
- case 6: /* JScript/VBScript file stored in a Binary table stream. */
- rc = HANDLE_CustomType5_6(package,source,target,type,action);
- break;
- case 21: /* JScript/VBScript file installed with the product. */
- case 22:
- rc = HANDLE_CustomType21_22(package,source,target,type,action);
- break;
- case 53: /* JScript/VBScript text specified by a property value. */
- case 54:
- rc = HANDLE_CustomType53_54(package,source,target,type,action);
- break;
- default:
- FIXME("UNHANDLED ACTION TYPE %i (%s %s)\n",
- type & CUSTOM_ACTION_TYPE_MASK, debugstr_w(source),
- debugstr_w(target));
- }
-
-end:
- package->scheduled_action_running = FALSE;
- package->commit_action_running = FALSE;
- package->rollback_action_running = FALSE;
- msi_free(action_copy);
- msiobj_release(&row->hdr);
- return rc;
-}
-
static MSIBINARY *create_temp_binary( MSIPACKAGE *package, LPCWSTR source, BOOL dll )
{
static const WCHAR query[] = {
@@ -1345,6 +1141,185 @@ static UINT HANDLE_CustomType53_54(MSIPACKAGE *package, LPCWSTR source,
return r;
}
+UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL execute)
+{
+ UINT rc = ERROR_SUCCESS;
+ MSIRECORD * row = 0;
+ static const WCHAR ExecSeqQuery[] =
+ {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
+ '`','C','u','s','t','o' ,'m','A','c','t','i','o','n','`',
+ ' ','W','H','E','R','E',' ','`','A','c','t','i' ,'o','n','`',' ',
+ '=',' ','\'','%','s','\'',0};
+ UINT type;
+ LPCWSTR source, target;
+ LPWSTR ptr, deferred_data = NULL;
+ LPWSTR action_copy = strdupW(action);
+ WCHAR *deformated=NULL;
+
+ /* deferred action: [properties]Action */
+ if ((ptr = strrchrW(action_copy, ']')))
+ {
+ deferred_data = action_copy;
+ action = ptr + 1;
+ }
+
+ row = MSI_QueryGetRecord( package->db, ExecSeqQuery, action );
+ if (!row)
+ {
+ msi_free(action_copy);
+ return ERROR_CALL_NOT_IMPLEMENTED;
+ }
+
+ type = MSI_RecordGetInteger(row,2);
+
+ source = MSI_RecordGetString(row,3);
+ target = MSI_RecordGetString(row,4);
+
+ TRACE("Handling custom action %s (%x %s %s)\n",debugstr_w(action),type,
+ debugstr_w(source), debugstr_w(target));
+
+ /* handle some of the deferred actions */
+ if (type & msidbCustomActionTypeTSAware)
+ FIXME("msidbCustomActionTypeTSAware not handled\n");
+
+ if (type & msidbCustomActionTypeInScript)
+ {
+ if (type & msidbCustomActionTypeNoImpersonate)
+ WARN("msidbCustomActionTypeNoImpersonate not handled\n");
+
+ if (!execute)
+ {
+ LPWSTR actiondata = msi_dup_property(package->db, action);
+ LPWSTR usersid = msi_dup_property(package->db, szUserSID);
+ LPWSTR prodcode = msi_dup_property(package->db, szProductCode);
+ LPWSTR deferred = msi_get_deferred_action(action, actiondata, usersid, prodcode);
+
+ if (type & msidbCustomActionTypeCommit)
+ {
+ TRACE("Deferring commit action\n");
+ msi_schedule_action(package, COMMIT_SCRIPT, deferred);
+ }
+ else if (type & msidbCustomActionTypeRollback)
+ {
+ TRACE("Deferring rollback action\n");
+ msi_schedule_action(package, ROLLBACK_SCRIPT, deferred);
+ }
+ else
+ {
+ TRACE("Deferring action\n");
+ msi_schedule_action(package, INSTALL_SCRIPT, deferred);
+ }
+
+ rc = ERROR_SUCCESS;
+ msi_free(actiondata);
+ msi_free(usersid);
+ msi_free(prodcode);
+ msi_free(deferred);
+ goto end;
+ }
+ else
+ {
+ LPWSTR actiondata = msi_dup_property( package->db, action );
+
+ if (type & msidbCustomActionTypeInScript)
+ package->scheduled_action_running = TRUE;
+
+ if (type & msidbCustomActionTypeCommit)
+ package->commit_action_running = TRUE;
+
+ if (type & msidbCustomActionTypeRollback)
+ package->rollback_action_running = TRUE;
+
+ if (deferred_data)
+ set_deferred_action_props(package, deferred_data);
+ else if (actiondata)
+ msi_set_property(package->db, szCustomActionData, actiondata);
+ else
+ msi_set_property(package->db, szCustomActionData, szEmpty);
+
+ msi_free(actiondata);
+ }
+ }
+ else if (!check_execution_scheduling_options(package,action,type))
+ {
+ rc = ERROR_SUCCESS;
+ goto end;
+ }
+
+ switch (type & CUSTOM_ACTION_TYPE_MASK)
+ {
+ case 1: /* DLL file stored in a Binary table stream */
+ rc = HANDLE_CustomType1(package,source,target,type,action);
+ break;
+ case 2: /* EXE file stored in a Binary table stream */
+ rc = HANDLE_CustomType2(package,source,target,type,action);
+ break;
+ case 18: /*EXE file installed with package */
+ rc = HANDLE_CustomType18(package,source,target,type,action);
+ break;
+ case 19: /* Error that halts install */
+ rc = HANDLE_CustomType19(package,source,target,type,action);
+ break;
+ case 17:
+ rc = HANDLE_CustomType17(package,source,target,type,action);
+ break;
+ case 23: /* installs another package in the source tree */
+ deformat_string(package,target,&deformated);
+ rc = HANDLE_CustomType23(package,source,deformated,type,action);
+ msi_free(deformated);
+ break;
+ case 50: /*EXE file specified by a property value */
+ rc = HANDLE_CustomType50(package,source,target,type,action);
+ break;
+ case 34: /*EXE to be run in specified directory */
+ rc = HANDLE_CustomType34(package,source,target,type,action);
+ break;
+ case 35: /* Directory set with formatted text. */
+ deformat_string(package,target,&deformated);
+ MSI_SetTargetPathW(package, source, deformated);
+ msi_free(deformated);
+ break;
+ case 51: /* Property set with formatted text. */
+ if (!source)
+ break;
+
+ deformat_string(package,target,&deformated);
+ rc = msi_set_property( package->db, source, deformated );
+ if (rc == ERROR_SUCCESS && !strcmpW( source, szSourceDir ))
+ msi_reset_folders( package, TRUE );
+ msi_free(deformated);
+ break;
+ case 37: /* JScript/VBScript text stored in target column. */
+ case 38:
+ rc = HANDLE_CustomType37_38(package,source,target,type,action);
+ break;
+ case 5:
+ case 6: /* JScript/VBScript file stored in a Binary table stream. */
+ rc = HANDLE_CustomType5_6(package,source,target,type,action);
+ break;
+ case 21: /* JScript/VBScript file installed with the product. */
+ case 22:
+ rc = HANDLE_CustomType21_22(package,source,target,type,action);
+ break;
+ case 53: /* JScript/VBScript text specified by a property value. */
+ case 54:
+ rc = HANDLE_CustomType53_54(package,source,target,type,action);
+ break;
+ default:
+ FIXME("UNHANDLED ACTION TYPE %i (%s %s)\n",
+ type & CUSTOM_ACTION_TYPE_MASK, debugstr_w(source),
+ debugstr_w(target));
+ }
+
+end:
+ package->scheduled_action_running = FALSE;
+ package->commit_action_running = FALSE;
+ package->rollback_action_running = FALSE;
+ msi_free(action_copy);
+ msiobj_release(&row->hdr);
+ return rc;
+}
+
void ACTION_FinishCustomActions(const MSIPACKAGE* package)
{
struct list *item;
--
1.7.4.1
More information about the wine-patches
mailing list