diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2020-05-14 19:59:06 +1000 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2020-05-16 21:42:51 +1000 |
commit | 50cb451bcee148afd9768086c1bb5ed4f75562df (patch) | |
tree | b4a28ef01446f2afd02b803af28ee6c628816cee /src/engine/msiengine.cpp | |
parent | d232c5621fe336b1f563b69be7637c93e795e151 (diff) | |
download | wix-50cb451bcee148afd9768086c1bb5ed4f75562df.tar.gz wix-50cb451bcee148afd9768086c1bb5ed4f75562df.tar.bz2 wix-50cb451bcee148afd9768086c1bb5ed4f75562df.zip |
WIXFEAT:6164 Give BA control over UI level and handler.
Diffstat (limited to 'src/engine/msiengine.cpp')
-rw-r--r-- | src/engine/msiengine.cpp | 117 |
1 files changed, 87 insertions, 30 deletions
diff --git a/src/engine/msiengine.cpp b/src/engine/msiengine.cpp index 17571ac5..3f89dde9 100644 --- a/src/engine/msiengine.cpp +++ b/src/engine/msiengine.cpp | |||
@@ -4,7 +4,10 @@ | |||
4 | 4 | ||
5 | 5 | ||
6 | // constants | 6 | // constants |
7 | 7 | #define BURNMSIINSTALL_PROPERTY_NAME L"BURNMSIINSTALL" | |
8 | #define BURNMSIMODIFY_PROPERTY_NAME L"BURNMSIMODIFY" | ||
9 | #define BURNMSIREPAIR_PROPERTY_NAME L"BURNMSIREPAIR" | ||
10 | #define BURNMSIUNINSTALL_PROPERTY_NAME L"BURNMSIUNINSTALL" | ||
8 | 11 | ||
9 | // structs | 12 | // structs |
10 | 13 | ||
@@ -79,10 +82,6 @@ extern "C" HRESULT MsiEngineParsePackageFromXml( | |||
79 | hr = FileVersionFromStringEx(scz, 0, &pPackage->Msi.qwVersion); | 82 | hr = FileVersionFromStringEx(scz, 0, &pPackage->Msi.qwVersion); |
80 | ExitOnFailure(hr, "Failed to parse @Version: %ls", scz); | 83 | ExitOnFailure(hr, "Failed to parse @Version: %ls", scz); |
81 | 84 | ||
82 | // @DisplayInternalUI | ||
83 | hr = XmlGetYesNoAttribute(pixnMsiPackage, L"DisplayInternalUI", &pPackage->Msi.fDisplayInternalUI); | ||
84 | ExitOnFailure(hr, "Failed to get @DisplayInternalUI."); | ||
85 | |||
86 | // @UpgradeCode | 85 | // @UpgradeCode |
87 | hr = XmlGetAttributeEx(pixnMsiPackage, L"UpgradeCode", &pPackage->Msi.sczUpgradeCode); | 86 | hr = XmlGetAttributeEx(pixnMsiPackage, L"UpgradeCode", &pPackage->Msi.sczUpgradeCode); |
88 | if (E_NOTFOUND != hr) | 87 | if (E_NOTFOUND != hr) |
@@ -874,7 +873,7 @@ LExit: | |||
874 | // PlanAdd - adds the calculated execute and rollback actions for the package. | 873 | // PlanAdd - adds the calculated execute and rollback actions for the package. |
875 | // | 874 | // |
876 | extern "C" HRESULT MsiEnginePlanAddPackage( | 875 | extern "C" HRESULT MsiEnginePlanAddPackage( |
877 | __in BOOTSTRAPPER_DISPLAY display, | 876 | __in BURN_USER_EXPERIENCE* pUserExperience, |
878 | __in BURN_PACKAGE* pPackage, | 877 | __in BURN_PACKAGE* pPackage, |
879 | __in BURN_PLAN* pPlan, | 878 | __in BURN_PLAN* pPlan, |
880 | __in BURN_LOGGING* pLog, | 879 | __in BURN_LOGGING* pLog, |
@@ -926,10 +925,13 @@ extern "C" HRESULT MsiEnginePlanAddPackage( | |||
926 | pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE; | 925 | pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE; |
927 | pAction->msiPackage.pPackage = pPackage; | 926 | pAction->msiPackage.pPackage = pPackage; |
928 | pAction->msiPackage.action = pPackage->rollback; | 927 | pAction->msiPackage.action = pPackage->rollback; |
929 | pAction->msiPackage.uiLevel = MsiEngineCalculateInstallUiLevel(pPackage->Msi.fDisplayInternalUI, display, pAction->msiPackage.action); | ||
930 | pAction->msiPackage.rgFeatures = rgRollbackFeatureActions; | 928 | pAction->msiPackage.rgFeatures = rgRollbackFeatureActions; |
931 | rgRollbackFeatureActions = NULL; | 929 | rgRollbackFeatureActions = NULL; |
932 | 930 | ||
931 | hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, FALSE, pAction->msiPackage.action, | ||
932 | &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler); | ||
933 | ExitOnFailure(hr, "Failed to get msi ui options."); | ||
934 | |||
933 | LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors. | 935 | LoggingSetPackageVariable(pPackage, NULL, TRUE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors. |
934 | pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; | 936 | pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; |
935 | 937 | ||
@@ -949,10 +951,13 @@ extern "C" HRESULT MsiEnginePlanAddPackage( | |||
949 | pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE; | 951 | pAction->type = BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE; |
950 | pAction->msiPackage.pPackage = pPackage; | 952 | pAction->msiPackage.pPackage = pPackage; |
951 | pAction->msiPackage.action = pPackage->execute; | 953 | pAction->msiPackage.action = pPackage->execute; |
952 | pAction->msiPackage.uiLevel = MsiEngineCalculateInstallUiLevel(pPackage->Msi.fDisplayInternalUI, display, pAction->msiPackage.action); | ||
953 | pAction->msiPackage.rgFeatures = rgFeatureActions; | 954 | pAction->msiPackage.rgFeatures = rgFeatureActions; |
954 | rgFeatureActions = NULL; | 955 | rgFeatureActions = NULL; |
955 | 956 | ||
957 | hr = MsiEngineCalculateInstallUiLevel(pUserExperience, pPackage->sczId, TRUE, pAction->msiPackage.action, | ||
958 | &pAction->msiPackage.actionMsiProperty, &pAction->msiPackage.uiLevel, &pAction->msiPackage.fDisableExternalUiHandler); | ||
959 | ExitOnFailure(hr, "Failed to get msi ui options."); | ||
960 | |||
956 | LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors. | 961 | LoggingSetPackageVariable(pPackage, NULL, FALSE, pLog, pVariables, &pAction->msiPackage.sczLogPath); // ignore errors. |
957 | pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; | 962 | pAction->msiPackage.dwLoggingAttributes = pLog->dwAttributes; |
958 | } | 963 | } |
@@ -1073,7 +1078,6 @@ extern "C" HRESULT MsiEngineAddCompatiblePackage( | |||
1073 | } | 1078 | } |
1074 | 1079 | ||
1075 | pCompatiblePackage->type = BURN_PACKAGE_TYPE_MSI; | 1080 | pCompatiblePackage->type = BURN_PACKAGE_TYPE_MSI; |
1076 | pCompatiblePackage->Msi.fDisplayInternalUI = pPackage->Msi.fDisplayInternalUI; | ||
1077 | 1081 | ||
1078 | if (ppCompatiblePackage) | 1082 | if (ppCompatiblePackage) |
1079 | { | 1083 | { |
@@ -1161,8 +1165,16 @@ extern "C" HRESULT MsiEngineExecutePackage( | |||
1161 | VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->msiPackage.action, TRUE); | 1165 | VariableSetNumeric(pVariables, BURN_BUNDLE_EXECUTE_PACKAGE_ACTION, pExecuteAction->msiPackage.action, TRUE); |
1162 | 1166 | ||
1163 | // Wire up the external UI handler and logging. | 1167 | // Wire up the external UI handler and logging. |
1164 | hr = WiuInitializeExternalUI(pfnMessageHandler, pExecuteAction->msiPackage.uiLevel, hwndParent, pvContext, fRollback, &context); | 1168 | if (pExecuteAction->msiPackage.fDisableExternalUiHandler) |
1165 | ExitOnFailure(hr, "Failed to initialize external UI handler."); | 1169 | { |
1170 | hr = WiuInitializeInternalUI(pExecuteAction->msiPackage.uiLevel, hwndParent, &context); | ||
1171 | ExitOnFailure(hr, "Failed to initialize internal UI for MSI package."); | ||
1172 | } | ||
1173 | else | ||
1174 | { | ||
1175 | hr = WiuInitializeExternalUI(pfnMessageHandler, pExecuteAction->msiPackage.uiLevel, hwndParent, pvContext, fRollback, &context); | ||
1176 | ExitOnFailure(hr, "Failed to initialize external UI handler."); | ||
1177 | } | ||
1166 | 1178 | ||
1167 | if (pExecuteAction->msiPackage.sczLogPath && *pExecuteAction->msiPackage.sczLogPath) | 1179 | if (pExecuteAction->msiPackage.sczLogPath && *pExecuteAction->msiPackage.sczLogPath) |
1168 | { | 1180 | { |
@@ -1191,6 +1203,12 @@ extern "C" HRESULT MsiEngineExecutePackage( | |||
1191 | hr = ConcatPatchProperty(pExecuteAction->msiPackage.pPackage, pExecuteAction->msiPackage.rgSlipstreamPatches, &sczObfuscatedProperties); | 1203 | hr = ConcatPatchProperty(pExecuteAction->msiPackage.pPackage, pExecuteAction->msiPackage.rgSlipstreamPatches, &sczObfuscatedProperties); |
1192 | ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string."); | 1204 | ExitOnFailure(hr, "Failed to add patch properties to obfuscated argument string."); |
1193 | 1205 | ||
1206 | hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczProperties); | ||
1207 | ExitOnFailure(hr, "Failed to add action property to argument string."); | ||
1208 | |||
1209 | hr = MsiEngineConcatActionProperty(pExecuteAction->msiPackage.actionMsiProperty, &sczObfuscatedProperties); | ||
1210 | ExitOnFailure(hr, "Failed to add action property to obfuscated argument string."); | ||
1211 | |||
1194 | LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pExecuteAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L""); | 1212 | LogId(REPORT_STANDARD, MSG_APPLYING_PACKAGE, LoggingRollbackOrExecute(fRollback), pExecuteAction->msiPackage.pPackage->sczId, LoggingActionStateToString(pExecuteAction->msiPackage.action), sczMsiPath, sczObfuscatedProperties ? sczObfuscatedProperties : L""); |
1195 | 1213 | ||
1196 | // | 1214 | // |
@@ -1300,6 +1318,40 @@ LExit: | |||
1300 | return hr; | 1318 | return hr; |
1301 | } | 1319 | } |
1302 | 1320 | ||
1321 | extern "C" HRESULT MsiEngineConcatActionProperty( | ||
1322 | __in BURN_MSI_PROPERTY actionMsiProperty, | ||
1323 | __deref_out_z LPWSTR* psczProperties | ||
1324 | ) | ||
1325 | { | ||
1326 | HRESULT hr = S_OK; | ||
1327 | LPCWSTR wzPropertyName = NULL; | ||
1328 | |||
1329 | switch (actionMsiProperty) | ||
1330 | { | ||
1331 | case BURN_MSI_PROPERTY_INSTALL: | ||
1332 | wzPropertyName = BURNMSIINSTALL_PROPERTY_NAME; | ||
1333 | break; | ||
1334 | case BURN_MSI_PROPERTY_MODIFY: | ||
1335 | wzPropertyName = BURNMSIMODIFY_PROPERTY_NAME; | ||
1336 | break; | ||
1337 | case BURN_MSI_PROPERTY_REPAIR: | ||
1338 | wzPropertyName = BURNMSIREPAIR_PROPERTY_NAME; | ||
1339 | break; | ||
1340 | case BURN_MSI_PROPERTY_UNINSTALL: | ||
1341 | wzPropertyName = BURNMSIUNINSTALL_PROPERTY_NAME; | ||
1342 | break; | ||
1343 | } | ||
1344 | |||
1345 | if (wzPropertyName) | ||
1346 | { | ||
1347 | hr = StrAllocConcatFormattedSecure(psczProperties, L" %ls=1", wzPropertyName); | ||
1348 | ExitOnFailure(hr, "Failed to add burn action property."); | ||
1349 | } | ||
1350 | |||
1351 | LExit: | ||
1352 | return hr; | ||
1353 | } | ||
1354 | |||
1303 | // The contents of psczProperties may be sensitive, should keep encrypted and SecureZeroFree. | 1355 | // The contents of psczProperties may be sensitive, should keep encrypted and SecureZeroFree. |
1304 | extern "C" HRESULT MsiEngineConcatProperties( | 1356 | extern "C" HRESULT MsiEngineConcatProperties( |
1305 | __in_ecount(cProperties) BURN_MSIPROPERTY* rgProperties, | 1357 | __in_ecount(cProperties) BURN_MSIPROPERTY* rgProperties, |
@@ -1363,31 +1415,36 @@ LExit: | |||
1363 | return hr; | 1415 | return hr; |
1364 | } | 1416 | } |
1365 | 1417 | ||
1366 | extern "C" INSTALLUILEVEL MsiEngineCalculateInstallUiLevel( | 1418 | extern "C" HRESULT MsiEngineCalculateInstallUiLevel( |
1367 | __in BOOL fDisplayInternalUI, | 1419 | __in BURN_USER_EXPERIENCE* pUserExperience, |
1368 | __in BOOTSTRAPPER_DISPLAY display, | 1420 | __in LPCWSTR wzPackageId, |
1369 | __in BOOTSTRAPPER_ACTION_STATE actionState | 1421 | __in BOOL fExecute, |
1422 | __in BOOTSTRAPPER_ACTION_STATE actionState, | ||
1423 | __out BURN_MSI_PROPERTY* pActionMsiProperty, | ||
1424 | __out INSTALLUILEVEL* pUiLevel, | ||
1425 | __out BOOL* pfDisableExternalUiHandler | ||
1370 | ) | 1426 | ) |
1371 | { | 1427 | { |
1372 | // Assume there will be no internal UI displayed. | 1428 | *pUiLevel = static_cast<INSTALLUILEVEL>(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY); |
1373 | INSTALLUILEVEL uiLevel = static_cast<INSTALLUILEVEL>(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY); | 1429 | *pfDisableExternalUiHandler = FALSE; |
1374 | 1430 | ||
1375 | // suppress internal UI during uninstall to mimic ARP and "msiexec /x" behavior | 1431 | switch (actionState) |
1376 | if (fDisplayInternalUI && BOOTSTRAPPER_ACTION_STATE_UNINSTALL != actionState && BOOTSTRAPPER_ACTION_STATE_REPAIR != actionState) | ||
1377 | { | 1432 | { |
1378 | switch (display) | 1433 | case BOOTSTRAPPER_ACTION_STATE_UNINSTALL: |
1379 | { | 1434 | *pActionMsiProperty = BURN_MSI_PROPERTY_UNINSTALL; |
1380 | case BOOTSTRAPPER_DISPLAY_FULL: | 1435 | break; |
1381 | uiLevel = INSTALLUILEVEL_FULL; | 1436 | case BOOTSTRAPPER_ACTION_STATE_REPAIR: |
1382 | break; | 1437 | *pActionMsiProperty = BURN_MSI_PROPERTY_REPAIR; |
1383 | 1438 | break; | |
1384 | case BOOTSTRAPPER_DISPLAY_PASSIVE: | 1439 | case BOOTSTRAPPER_ACTION_STATE_MODIFY: |
1385 | uiLevel = INSTALLUILEVEL_REDUCED; | 1440 | *pActionMsiProperty = BURN_MSI_PROPERTY_MODIFY; |
1386 | break; | 1441 | break; |
1387 | } | 1442 | default: |
1443 | *pActionMsiProperty = BURN_MSI_PROPERTY_INSTALL; | ||
1444 | break; | ||
1388 | } | 1445 | } |
1389 | 1446 | ||
1390 | return uiLevel; | 1447 | return UserExperienceOnPlanMsiPackage(pUserExperience, wzPackageId, fExecute, actionState, pActionMsiProperty, pUiLevel, pfDisableExternalUiHandler); |
1391 | } | 1448 | } |
1392 | 1449 | ||
1393 | 1450 | ||