Allow for end of install actions.
This commit is contained in:
parent
8cc14a93a1
commit
09d35c3c91
|
@ -133,6 +133,7 @@ typedef struct tagMSIFILE
|
||||||
static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package, BOOL UIran);
|
static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package, BOOL UIran);
|
||||||
static UINT ACTION_ProcessUISequence(MSIPACKAGE *package);
|
static UINT ACTION_ProcessUISequence(MSIPACKAGE *package);
|
||||||
|
|
||||||
|
static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq);
|
||||||
UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action);
|
UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action);
|
||||||
|
|
||||||
static UINT ACTION_LaunchConditions(MSIPACKAGE *package);
|
static UINT ACTION_LaunchConditions(MSIPACKAGE *package);
|
||||||
|
@ -807,9 +808,92 @@ UINT ACTION_DoTopLevelINSTALL(MSIPACKAGE *package, LPCWSTR szPackagePath,
|
||||||
else
|
else
|
||||||
rc = ACTION_ProcessExecSequence(package,FALSE);
|
rc = ACTION_ProcessExecSequence(package,FALSE);
|
||||||
|
|
||||||
|
/* process the ending type action */
|
||||||
|
if (rc == ERROR_SUCCESS)
|
||||||
|
rc = ACTION_PerformActionSequence(package,-1);
|
||||||
|
else if (rc == ERROR_FUNCTION_FAILED)
|
||||||
|
rc = ACTION_PerformActionSequence(package,-3);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq)
|
||||||
|
{
|
||||||
|
MSIQUERY * view;
|
||||||
|
UINT rc;
|
||||||
|
WCHAR buffer[0x100];
|
||||||
|
DWORD sz = 0x100;
|
||||||
|
MSIRECORD * row = 0;
|
||||||
|
static const WCHAR ExecSeqQuery[] = {
|
||||||
|
's','e','l','e','c','t',' ','*',' ',
|
||||||
|
'f','r','o','m',' ',
|
||||||
|
'I','n','s','t','a','l','l','E','x','e','c','u','t','e',
|
||||||
|
'S','e','q','u','e','n','c','e',' ',
|
||||||
|
'w','h','e','r','e',' ','S','e','q','u','e','n','c','e',' ',
|
||||||
|
'=',' ','%','i',0};
|
||||||
|
|
||||||
|
rc = ACTION_OpenQuery(package->db, &view, ExecSeqQuery, -1);
|
||||||
|
|
||||||
|
if (rc == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
rc = MSI_ViewExecute(view, 0);
|
||||||
|
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
MSI_ViewClose(view);
|
||||||
|
msiobj_release(&view->hdr);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("Running the actions\n");
|
||||||
|
|
||||||
|
rc = MSI_ViewFetch(view,&row);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
rc = ERROR_SUCCESS;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check conditions */
|
||||||
|
if (!MSI_RecordIsNull(row,2))
|
||||||
|
{
|
||||||
|
LPWSTR cond = NULL;
|
||||||
|
cond = load_dynamic_stringW(row,2);
|
||||||
|
|
||||||
|
if (cond)
|
||||||
|
{
|
||||||
|
/* this is a hack to skip errors in the condition code */
|
||||||
|
if (MSI_EvaluateConditionW(package, cond) == MSICONDITION_FALSE)
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(),0,cond);
|
||||||
|
msiobj_release(&row->hdr);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
HeapFree(GetProcessHeap(),0,cond);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sz=0x100;
|
||||||
|
rc = MSI_RecordGetStringW(row,1,buffer,&sz);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
ERR("Error is %x\n",rc);
|
||||||
|
msiobj_release(&row->hdr);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ACTION_PerformAction(package,buffer);
|
||||||
|
msiobj_release(&row->hdr);
|
||||||
|
end:
|
||||||
|
MSI_ViewClose(view);
|
||||||
|
msiobj_release(&view->hdr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rc = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package, BOOL UIran)
|
static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package, BOOL UIran)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue