Allow ADDLOCAL to override INSTALLLEVEL, implement LaunchConditions.
This commit is contained in:
parent
0c8d6908df
commit
5b936ca2fd
|
@ -129,6 +129,8 @@ static UINT ACTION_ProcessExecSequence(MSIHANDLE hPackage, BOOL UIran);
|
||||||
static UINT ACTION_ProcessUISequence(MSIHANDLE hPackage);
|
static UINT ACTION_ProcessUISequence(MSIHANDLE hPackage);
|
||||||
|
|
||||||
UINT ACTION_PerformAction(MSIHANDLE hPackage, const WCHAR *action);
|
UINT ACTION_PerformAction(MSIHANDLE hPackage, const WCHAR *action);
|
||||||
|
|
||||||
|
static UINT ACTION_LaunchConditions(MSIHANDLE hPackage);
|
||||||
static UINT ACTION_CostInitialize(MSIHANDLE hPackage);
|
static UINT ACTION_CostInitialize(MSIHANDLE hPackage);
|
||||||
static UINT ACTION_CreateFolders(MSIHANDLE hPackage);
|
static UINT ACTION_CreateFolders(MSIHANDLE hPackage);
|
||||||
static UINT ACTION_CostFinalize(MSIHANDLE hPackage);
|
static UINT ACTION_CostFinalize(MSIHANDLE hPackage);
|
||||||
|
@ -612,11 +614,15 @@ UINT ACTION_PerformAction(MSIHANDLE hPackage, const WCHAR *action)
|
||||||
{'I','n','s','t','a','l','l','I','n','i','t','i','a','l','i','z','e',0};
|
{'I','n','s','t','a','l','l','I','n','i','t','i','a','l','i','z','e',0};
|
||||||
const static WCHAR szInstallValidate[] =
|
const static WCHAR szInstallValidate[] =
|
||||||
{'I','n','s','t','a','l','l','V','a','l','i','d','a','t','e',0};
|
{'I','n','s','t','a','l','l','V','a','l','i','d','a','t','e',0};
|
||||||
|
const static WCHAR szLaunchConditions[] =
|
||||||
|
{'L','a','u','n','c','h','C','o','n','d','i','t','i','o','n','s',0};
|
||||||
|
|
||||||
TRACE("Performing action (%s)\n",debugstr_w(action));
|
TRACE("Performing action (%s)\n",debugstr_w(action));
|
||||||
progress_message(hPackage,2,25,0,0);
|
progress_message(hPackage,2,25,0,0);
|
||||||
|
|
||||||
/* pre install, setup and configureation block */
|
/* pre install, setup and configureation block */
|
||||||
|
if (strcmpW(action,szLaunchConditions)==0)
|
||||||
|
return ACTION_LaunchConditions(hPackage);
|
||||||
if (strcmpW(action,szCostInitialize)==0)
|
if (strcmpW(action,szCostInitialize)==0)
|
||||||
return ACTION_CostInitialize(hPackage);
|
return ACTION_CostInitialize(hPackage);
|
||||||
if (strcmpW(action,szFileCost)==0)
|
if (strcmpW(action,szFileCost)==0)
|
||||||
|
@ -642,7 +648,6 @@ UINT ACTION_PerformAction(MSIHANDLE hPackage, const WCHAR *action)
|
||||||
Current called during itunes but unimplemented
|
Current called during itunes but unimplemented
|
||||||
|
|
||||||
AppSearch
|
AppSearch
|
||||||
LaunchConditions
|
|
||||||
FindRelatedProducts
|
FindRelatedProducts
|
||||||
CostInitialize
|
CostInitialize
|
||||||
MigrateFeatureStates
|
MigrateFeatureStates
|
||||||
|
@ -2635,17 +2640,29 @@ static UINT ACTION_InstallInitialize(MSIHANDLE hPackage)
|
||||||
DWORD sz;
|
DWORD sz;
|
||||||
MSIPACKAGE *package;
|
MSIPACKAGE *package;
|
||||||
INT i,j;
|
INT i,j;
|
||||||
|
DWORD rc;
|
||||||
|
LPWSTR override = NULL;
|
||||||
|
static const WCHAR addlocal[]={'A','D','D','L','O','C','A','L',0};
|
||||||
|
static const WCHAR all[]={'A','L','L',0};
|
||||||
|
|
||||||
/* I do not know if this is where it should happen.. but */
|
/* I do not know if this is where it should happen.. but */
|
||||||
|
|
||||||
TRACE("Checking Install Level\n");
|
TRACE("Checking Install Level\n");
|
||||||
FIXME("The Attributes of the feature OVERRIDE THIS... unimplemented\n");
|
|
||||||
FIXME("As does the ALLLOCAL and such propertys\n");
|
|
||||||
|
|
||||||
sz = 10000;
|
sz = 10000;
|
||||||
if (MsiGetPropertyA(hPackage,"INSTALLLEVEL",level,&sz)==ERROR_SUCCESS)
|
if (MsiGetPropertyA(hPackage,"INSTALLLEVEL",level,&sz)==ERROR_SUCCESS)
|
||||||
install_level = atoi(level);
|
install_level = atoi(level);
|
||||||
else
|
else
|
||||||
install_level = 1;
|
install_level = 1;
|
||||||
|
|
||||||
|
sz = 0;
|
||||||
|
rc = MsiGetPropertyA(hPackage,"ADDLOCAL",NULL,&sz);
|
||||||
|
if (rc == ERROR_SUCCESS || rc == ERROR_MORE_DATA)
|
||||||
|
{
|
||||||
|
sz++;
|
||||||
|
override = HeapAlloc(GetProcessHeap(),0,sz*sizeof(WCHAR));
|
||||||
|
MsiGetPropertyW(hPackage, addlocal,override,&sz);
|
||||||
|
}
|
||||||
|
|
||||||
package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
|
package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
|
||||||
if (!package)
|
if (!package)
|
||||||
|
@ -2659,6 +2676,14 @@ static UINT ACTION_InstallInitialize(MSIHANDLE hPackage)
|
||||||
{
|
{
|
||||||
BOOL feature_state= ((package->features[i].Level > 0) &&
|
BOOL feature_state= ((package->features[i].Level > 0) &&
|
||||||
(package->features[i].Level <= install_level));
|
(package->features[i].Level <= install_level));
|
||||||
|
|
||||||
|
if (override && (strcmpiW(override,all)==0 ||
|
||||||
|
strstrW(override,package->features[i].Feature)))
|
||||||
|
{
|
||||||
|
TRACE("Override of install level found\n");
|
||||||
|
feature_state = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
TRACE("Feature %s has a state of %i\n",
|
TRACE("Feature %s has a state of %i\n",
|
||||||
debugstr_w(package->features[i].Feature), feature_state);
|
debugstr_w(package->features[i].Feature), feature_state);
|
||||||
for( j = 0; j < package->features[i].ComponentCount; j++)
|
for( j = 0; j < package->features[i].ComponentCount; j++)
|
||||||
|
@ -2667,6 +2692,8 @@ static UINT ACTION_InstallInitialize(MSIHANDLE hPackage)
|
||||||
|= feature_state;
|
|= feature_state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (override != NULL)
|
||||||
|
HeapFree(GetProcessHeap(),0,override);
|
||||||
/*
|
/*
|
||||||
* so basically we ONLY want to install a component if its Enabled AND
|
* so basically we ONLY want to install a component if its Enabled AND
|
||||||
* FeatureState are both TRUE
|
* FeatureState are both TRUE
|
||||||
|
@ -2741,9 +2768,71 @@ static UINT ACTION_InstallValidate(MSIHANDLE hPackage)
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UINT ACTION_LaunchConditions(MSIHANDLE hPackage)
|
||||||
|
{
|
||||||
|
UINT rc;
|
||||||
|
MSIHANDLE view;
|
||||||
|
MSIHANDLE row = 0;
|
||||||
|
static const CHAR *ExecSeqQuery = "SELECT * from LaunchCondition";
|
||||||
|
MSIHANDLE db;
|
||||||
|
static const WCHAR title[]=
|
||||||
|
{'I','n','s','t','a','l','l',' ','F','a', 'i','l','e','d',0};
|
||||||
|
|
||||||
|
TRACE("Checking launch conditions\n");
|
||||||
|
|
||||||
|
db = MsiGetActiveDatabase(hPackage);
|
||||||
|
rc = MsiDatabaseOpenViewA(db, ExecSeqQuery, &view);
|
||||||
|
MsiCloseHandle(db);
|
||||||
|
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = MsiViewExecute(view, 0);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
MsiViewClose(view);
|
||||||
|
MsiCloseHandle(view);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = ERROR_SUCCESS;
|
||||||
|
while (rc == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
LPWSTR cond = NULL;
|
||||||
|
LPWSTR message = NULL;
|
||||||
|
DWORD sz;
|
||||||
|
|
||||||
|
rc = MsiViewFetch(view,&row);
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
rc = ERROR_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
sz = 0;
|
||||||
|
MsiRecordGetStringW(row,1,NULL,&sz);
|
||||||
|
sz++;
|
||||||
|
cond = HeapAlloc(GetProcessHeap(),0,sz*sizeof(WCHAR));
|
||||||
|
MsiRecordGetStringW(row,1,cond,&sz);
|
||||||
|
|
||||||
|
if (MsiEvaluateConditionW(hPackage,cond) != MSICONDITION_TRUE)
|
||||||
|
{
|
||||||
|
sz = 0;
|
||||||
|
MsiRecordGetStringW(row,2,NULL,&sz);
|
||||||
|
sz++;
|
||||||
|
message = HeapAlloc(GetProcessHeap(),0,sz*sizeof(WCHAR));
|
||||||
|
MsiRecordGetStringW(row,2,message,&sz);
|
||||||
|
MessageBoxW(NULL,message,title,MB_OK);
|
||||||
|
HeapFree(GetProcessHeap(),0,message);
|
||||||
|
rc = ERROR_FUNCTION_FAILED;
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(),0,cond);
|
||||||
|
MsiCloseHandle(row);
|
||||||
|
}
|
||||||
|
MsiViewClose(view);
|
||||||
|
MsiCloseHandle(view);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/* Msi functions that seem approperate here */
|
/* Msi functions that seem approperate here */
|
||||||
UINT WINAPI MsiDoActionA( MSIHANDLE hInstall, LPCSTR szAction )
|
UINT WINAPI MsiDoActionA( MSIHANDLE hInstall, LPCSTR szAction )
|
||||||
|
|
Loading…
Reference in New Issue