From bb7b3dc1bc20629e04014b3f049cc30625a1a06c Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sat, 16 May 2020 21:52:31 +1000 Subject: WIXFEAT:6164 Update to latest balutil. --- src/Samples/bafunctions/bafunctions.vcxproj | 12 +- src/Samples/bafunctions/packages.config | 6 +- src/WixToolset.Mba.Host/WixToolset.Mba.Host.csproj | 2 +- src/WixToolset.Mba.Host/packages.config | 2 +- src/dnchost/dnchost.vcxproj | 12 +- src/dnchost/packages.config | 6 +- src/mbahost/mbahost.vcxproj | 12 +- src/mbahost/packages.config | 6 +- .../EarliestCoreMBA/Example.EarliestCoreMBA.csproj | 2 +- .../Example.FullFramework2MBA.csproj | 6 +- .../examples/FullFramework2MBA/packages.config | 2 +- .../Example.FullFramework4MBA.csproj | 2 +- .../LatestCoreMBA/Example.LatestCoreMBA.csproj | 2 +- .../examples/TestEngine/Example.TestEngine.vcxproj | 12 +- src/test/examples/TestEngine/TestEngine.cpp | 4 +- src/test/examples/TestEngine/packages.config | 6 +- .../examples/WPFCoreMBA/Example.WPFCoreMBA.csproj | 4 +- .../WixStandardBootstrapperApplication.cpp | 232 ++++++++++----------- src/wixstdba/packages.config | 6 +- src/wixstdba/wixstdba.mc | 7 + src/wixstdba/wixstdba.vcxproj | 12 +- 21 files changed, 178 insertions(+), 177 deletions(-) (limited to 'src') diff --git a/src/Samples/bafunctions/bafunctions.vcxproj b/src/Samples/bafunctions/bafunctions.vcxproj index 9f2181f2..d4de1461 100644 --- a/src/Samples/bafunctions/bafunctions.vcxproj +++ b/src/Samples/bafunctions/bafunctions.vcxproj @@ -2,9 +2,9 @@ - - - + + + @@ -57,9 +57,9 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + + + diff --git a/src/Samples/bafunctions/packages.config b/src/Samples/bafunctions/packages.config index 23b191d4..1b4c9487 100644 --- a/src/Samples/bafunctions/packages.config +++ b/src/Samples/bafunctions/packages.config @@ -1,7 +1,7 @@  - - - + + + \ No newline at end of file diff --git a/src/WixToolset.Mba.Host/WixToolset.Mba.Host.csproj b/src/WixToolset.Mba.Host/WixToolset.Mba.Host.csproj index 65467acc..579284f5 100644 --- a/src/WixToolset.Mba.Host/WixToolset.Mba.Host.csproj +++ b/src/WixToolset.Mba.Host/WixToolset.Mba.Host.csproj @@ -44,7 +44,7 @@ - ..\..\packages\WixToolset.Mba.Core.4.0.19\lib\net20\WixToolset.Mba.Core.dll + ..\..\packages\WixToolset.Mba.Core.4.0.22\lib\net20\WixToolset.Mba.Core.dll diff --git a/src/WixToolset.Mba.Host/packages.config b/src/WixToolset.Mba.Host/packages.config index 10ce3830..0565784e 100644 --- a/src/WixToolset.Mba.Host/packages.config +++ b/src/WixToolset.Mba.Host/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/src/dnchost/dnchost.vcxproj b/src/dnchost/dnchost.vcxproj index e2b8b529..f61c084e 100644 --- a/src/dnchost/dnchost.vcxproj +++ b/src/dnchost/dnchost.vcxproj @@ -1,9 +1,9 @@ - - - + + + Debug @@ -69,9 +69,9 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + + + \ No newline at end of file diff --git a/src/dnchost/packages.config b/src/dnchost/packages.config index c8911ea5..fdcf876c 100644 --- a/src/dnchost/packages.config +++ b/src/dnchost/packages.config @@ -2,7 +2,7 @@ - - - + + + \ No newline at end of file diff --git a/src/mbahost/mbahost.vcxproj b/src/mbahost/mbahost.vcxproj index fbcc9094..037adc99 100644 --- a/src/mbahost/mbahost.vcxproj +++ b/src/mbahost/mbahost.vcxproj @@ -2,9 +2,9 @@ - - - + + + @@ -68,9 +68,9 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + + + \ No newline at end of file diff --git a/src/mbahost/packages.config b/src/mbahost/packages.config index 23b191d4..1b4c9487 100644 --- a/src/mbahost/packages.config +++ b/src/mbahost/packages.config @@ -1,7 +1,7 @@  - - - + + + \ No newline at end of file diff --git a/src/test/examples/EarliestCoreMBA/Example.EarliestCoreMBA.csproj b/src/test/examples/EarliestCoreMBA/Example.EarliestCoreMBA.csproj index 326633ba..1224fa49 100644 --- a/src/test/examples/EarliestCoreMBA/Example.EarliestCoreMBA.csproj +++ b/src/test/examples/EarliestCoreMBA/Example.EarliestCoreMBA.csproj @@ -13,6 +13,6 @@ - + \ No newline at end of file diff --git a/src/test/examples/FullFramework2MBA/Example.FullFramework2MBA.csproj b/src/test/examples/FullFramework2MBA/Example.FullFramework2MBA.csproj index c946fcde..d08565ff 100644 --- a/src/test/examples/FullFramework2MBA/Example.FullFramework2MBA.csproj +++ b/src/test/examples/FullFramework2MBA/Example.FullFramework2MBA.csproj @@ -3,7 +3,7 @@ - + {CC4236FC-226E-4232-AB50-24CBEC4D314D} Example.FullFramework2MBA @@ -39,7 +39,7 @@ - ..\..\..\..\packages\WixToolset.Mba.Core.4.0.19\lib\net20\WixToolset.Mba.Core.dll + ..\..\..\..\packages\WixToolset.Mba.Core.4.0.22\lib\net20\WixToolset.Mba.Core.dll @@ -50,7 +50,7 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + \ No newline at end of file diff --git a/src/test/examples/FullFramework2MBA/packages.config b/src/test/examples/FullFramework2MBA/packages.config index 4f9f88e6..1f2a91d9 100644 --- a/src/test/examples/FullFramework2MBA/packages.config +++ b/src/test/examples/FullFramework2MBA/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/src/test/examples/FullFramework4MBA/Example.FullFramework4MBA.csproj b/src/test/examples/FullFramework4MBA/Example.FullFramework4MBA.csproj index 9be3cc4a..51f7090f 100644 --- a/src/test/examples/FullFramework4MBA/Example.FullFramework4MBA.csproj +++ b/src/test/examples/FullFramework4MBA/Example.FullFramework4MBA.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/test/examples/LatestCoreMBA/Example.LatestCoreMBA.csproj b/src/test/examples/LatestCoreMBA/Example.LatestCoreMBA.csproj index 1d325b1b..dc013b68 100644 --- a/src/test/examples/LatestCoreMBA/Example.LatestCoreMBA.csproj +++ b/src/test/examples/LatestCoreMBA/Example.LatestCoreMBA.csproj @@ -18,6 +18,6 @@ - + \ No newline at end of file diff --git a/src/test/examples/TestEngine/Example.TestEngine.vcxproj b/src/test/examples/TestEngine/Example.TestEngine.vcxproj index b9425295..ef54389d 100644 --- a/src/test/examples/TestEngine/Example.TestEngine.vcxproj +++ b/src/test/examples/TestEngine/Example.TestEngine.vcxproj @@ -1,9 +1,9 @@ - - - + + + Debug @@ -68,8 +68,8 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + + + \ No newline at end of file diff --git a/src/test/examples/TestEngine/TestEngine.cpp b/src/test/examples/TestEngine/TestEngine.cpp index 7b7dafce..a6a21174 100644 --- a/src/test/examples/TestEngine/TestEngine.cpp +++ b/src/test/examples/TestEngine/TestEngine.cpp @@ -53,7 +53,7 @@ HRESULT TestEngine::LoadBA( m_pCreateResults->cbSize = sizeof(BOOTSTRAPPER_CREATE_RESULTS); m_hBAModule = ::LoadLibraryExW(wzBAFilePath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); - ExitOnNullWithLastError(m_hBAModule, hr, "Failed to load BA dll."); + ConsoleExitOnNullWithLastError(m_hBAModule, hr, CONSOLE_COLOR_RED, "Failed to load BA dll."); pfnCreate = (PFN_BOOTSTRAPPER_APPLICATION_CREATE)::GetProcAddress(m_hBAModule, "BootstrapperApplicationCreate"); ConsoleExitOnNull(pfnCreate, hr, E_OUTOFMEMORY, CONSOLE_COLOR_RED, "Failed to get address for BootstrapperApplicationCreate."); @@ -181,7 +181,7 @@ HRESULT TestEngine::BAEngineQuit( if (!::PostThreadMessageW(m_dwThreadId, WM_TESTENG_QUIT, static_cast(pArgs->dwExitCode), 0)) { - ExitWithLastError(hr, "Failed to post shutdown message."); + ConsoleExitWithLastError(hr, CONSOLE_COLOR_RED, "Failed to post shutdown message."); } LExit: diff --git a/src/test/examples/TestEngine/packages.config b/src/test/examples/TestEngine/packages.config index 23b191d4..1b4c9487 100644 --- a/src/test/examples/TestEngine/packages.config +++ b/src/test/examples/TestEngine/packages.config @@ -1,7 +1,7 @@  - - - + + + \ No newline at end of file diff --git a/src/test/examples/WPFCoreMBA/Example.WPFCoreMBA.csproj b/src/test/examples/WPFCoreMBA/Example.WPFCoreMBA.csproj index 3b559f9b..02d400ee 100644 --- a/src/test/examples/WPFCoreMBA/Example.WPFCoreMBA.csproj +++ b/src/test/examples/WPFCoreMBA/Example.WPFCoreMBA.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.1 @@ -11,6 +11,6 @@ - + \ No newline at end of file diff --git a/src/wixstdba/WixStandardBootstrapperApplication.cpp b/src/wixstdba/WixStandardBootstrapperApplication.cpp index 826c4386..69913de2 100644 --- a/src/wixstdba/WixStandardBootstrapperApplication.cpp +++ b/src/wixstdba/WixStandardBootstrapperApplication.cpp @@ -146,13 +146,13 @@ static THEME_ASSIGN_CONTROL_ID vrgInitControls[] = { { WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON, L"FailureRestartButton" }, }; -typedef struct _WIXSTDBA_PREREQ_PACKAGE +typedef struct _WIXSTDBA_PACKAGE_INFO { LPWSTR sczPackageId; BOOL fWasAlreadyInstalled; BOOL fPlannedToBeInstalled; BOOL fSuccessfullyInstalled; -} WIXSTDBA_PREREQ_PACKAGE; +} WIXSTDBA_PACKAGE_INFO; static HRESULT DAPI EvaluateVariableConditionCallback( @@ -268,7 +268,11 @@ public: // IBootstrapperApplication __inout BOOL* pfCancel ) { - BalInfoAddRelatedBundleAsPackage(&m_Bundle.packages, wzBundleId, relationType, fPerMachine); + BAL_INFO_PACKAGE* pPackage = NULL; + if (SUCCEEDED(BalInfoAddRelatedBundleAsPackage(&m_Bundle.packages, wzBundleId, relationType, fPerMachine, &pPackage))) + { + InitializePackageInfoForPackage(pPackage); + } // If we're not doing a prerequisite install, remember when our bundle would cause a downgrade. if (!m_fPrereq && BOOTSTRAPPER_RELATED_OPERATION_DOWNGRADE == operation) @@ -286,13 +290,15 @@ public: // IBootstrapperApplication __in BOOTSTRAPPER_PACKAGE_STATE state ) { - WIXSTDBA_PREREQ_PACKAGE* pPrereqPackage = NULL; + WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL; BAL_INFO_PACKAGE* pPackage = NULL; - HRESULT hr = GetPrereqPackage(wzPackageId, &pPrereqPackage, &pPackage); - if (SUCCEEDED(hr) && BOOTSTRAPPER_PACKAGE_STATE_PRESENT == state) + + if (BOOTSTRAPPER_PACKAGE_STATE_PRESENT == state && + SUCCEEDED(GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage)) && + pPackageInfo) { - // If the prerequisite package is already installed, remember that. - pPrereqPackage->fWasAlreadyInstalled = TRUE; + // If the package is already installed, remember that. + pPackageInfo->fWasAlreadyInstalled = TRUE; } return S_OK; @@ -314,9 +320,11 @@ public: // IBootstrapperApplication m_fPrereqAlreadyInstalled = TRUE; // At this point we have to assume that all prerequisite packages need to be installed, so set to false if any of them aren't installed. - for (DWORD i = 0; i < m_cPrereqPackages; ++i) + for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) { - if (m_rgPrereqPackages[i].sczPackageId && !m_rgPrereqPackages[i].fWasAlreadyInstalled) + BAL_INFO_PACKAGE* pPackage = &m_Bundle.packages.rgPackages[i]; + WIXSTDBA_PACKAGE_INFO* pPackageInfo = reinterpret_cast(pPackage->pvCustomData); + if (pPackage->fPrereqPackage && pPackageInfo && !pPackageInfo->fWasAlreadyInstalled) { m_fPrereqAlreadyInstalled = FALSE; break; @@ -384,17 +392,17 @@ public: // IBootstrapperApplication ) { HRESULT hr = S_OK; - WIXSTDBA_PREREQ_PACKAGE* pPrereqPackage = NULL; + WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL; BAL_INFO_PACKAGE* pPackage = NULL; // If we're planning to install a prerequisite, install it. The prerequisite needs to be installed // in all cases (even uninstall!) so the BA can load next. if (m_fPrereq) { - // Only install prerequisite packages, and check the InstallCondition on prerequisite support packages. + // Only install prerequisite packages, and check the InstallCondition on them. BOOL fInstall = FALSE; - hr = GetPrereqPackage(wzPackageId, &pPrereqPackage, &pPackage); - if (SUCCEEDED(hr) && pPackage) + hr = GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage); + if (SUCCEEDED(hr) && pPackage->fPrereqPackage && pPackageInfo) { if (pPackage->sczInstallCondition && *pPackage->sczInstallCondition) { @@ -410,7 +418,7 @@ public: // IBootstrapperApplication fInstall = TRUE; } - pPrereqPackage->fPlannedToBeInstalled = fInstall; + pPackageInfo->fPlannedToBeInstalled = fInstall; } if (fInstall) @@ -459,9 +467,11 @@ public: // IBootstrapperApplication m_fPrereqAlreadyInstalled = TRUE; // Now that we've planned the packages, we can focus on the prerequisite packages that are supposed to be installed. - for (DWORD i = 0; i < m_cPrereqPackages; ++i) + for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) { - if (m_rgPrereqPackages[i].sczPackageId && !m_rgPrereqPackages[i].fWasAlreadyInstalled && m_rgPrereqPackages[i].fPlannedToBeInstalled) + BAL_INFO_PACKAGE* pPackage = &m_Bundle.packages.rgPackages[i]; + WIXSTDBA_PACKAGE_INFO* pPackageInfo = reinterpret_cast(pPackage->pvCustomData); + if (pPackage->fPrereqPackage && pPackageInfo && !pPackageInfo->fWasAlreadyInstalled && pPackageInfo->fPlannedToBeInstalled) { m_fPrereqAlreadyInstalled = FALSE; break; @@ -706,6 +716,8 @@ public: // IBootstrapperApplication __in_z LPCWSTR wzPackageId, __in BOOL fExecute, __in BOOTSTRAPPER_ACTION_STATE action, + __in INSTALLUILEVEL uiLevel, + __in BOOL fDisableExternalUiHandler, __inout BOOL* pfCancel ) { @@ -750,12 +762,7 @@ public: // IBootstrapperApplication wz = sczFormattedString ? sczFormattedString : pPackage->sczDisplayName ? pPackage->sczDisplayName : wzPackageId; } - // Needs to match MsiEngineCalculateInstallUiLevel in msiengine.cpp in Burn. - fShowingInternalUiThisPackage = pPackage && pPackage->fDisplayInternalUI && - BOOTSTRAPPER_ACTION_STATE_UNINSTALL != action && - BOOTSTRAPPER_ACTION_STATE_REPAIR != action && - (BOOTSTRAPPER_DISPLAY_FULL == m_command.display || - BOOTSTRAPPER_DISPLAY_PASSIVE == m_command.display); + fShowingInternalUiThisPackage = INSTALLUILEVEL_NONE != (INSTALLUILEVEL_NONE & uiLevel); ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_EXECUTE_PROGRESS_PACKAGE_TEXT, wz); ThemeSetTextControl(m_pTheme, WIXSTDBA_CONTROL_OVERALL_PROGRESS_PACKAGE_TEXT, wz); @@ -763,7 +770,7 @@ public: // IBootstrapperApplication ::EnterCriticalSection(&m_csShowingInternalUiThisPackage); m_fShowingInternalUiThisPackage = fShowingInternalUiThisPackage; - hr = __super::OnExecutePackageBegin(wzPackageId, fExecute, action, pfCancel); + hr = __super::OnExecutePackageBegin(wzPackageId, fExecute, action, uiLevel, fDisableExternalUiHandler, pfCancel); ::LeaveCriticalSection(&m_csShowingInternalUiThisPackage); ReleaseStr(sczFormattedString); @@ -811,16 +818,16 @@ public: // IBootstrapperApplication hr = __super::OnExecutePackageComplete(wzPackageId, hrStatus, restart, recommendation, pAction); - WIXSTDBA_PREREQ_PACKAGE* pPrereqPackage = NULL; + WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL; BAL_INFO_PACKAGE* pPackage; - HRESULT hrPrereq = GetPrereqPackage(wzPackageId, &pPrereqPackage, &pPackage); - if (SUCCEEDED(hrPrereq)) + HRESULT hrPrereq = GetPackageInfo(wzPackageId, &pPackageInfo, &pPackage); + if (SUCCEEDED(hrPrereq) && pPackageInfo) { - pPrereqPackage->fSuccessfullyInstalled = SUCCEEDED(hrStatus); + pPackageInfo->fSuccessfullyInstalled = SUCCEEDED(hrStatus); // If the prerequisite required a restart (any restart) then do an immediate // restart to ensure that the bundle will get launched again post reboot. - if (BOOTSTRAPPER_APPLY_RESTART_NONE != restart) + if (m_fPrereq && pPackage->fPrereqPackage && BOOTSTRAPPER_APPLY_RESTART_NONE != restart) { *pAction = BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_RESTART; } @@ -931,11 +938,13 @@ public: // IBootstrapperApplication m_fPrereqInstalled = TRUE; BOOL fInstalledAPackage = FALSE; - for (DWORD i = 0; i < m_cPrereqPackages; ++i) + for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) { - if (m_rgPrereqPackages[i].sczPackageId && m_rgPrereqPackages[i].fPlannedToBeInstalled && !m_rgPrereqPackages[i].fWasAlreadyInstalled) + BAL_INFO_PACKAGE* pPackage = &m_Bundle.packages.rgPackages[i]; + WIXSTDBA_PACKAGE_INFO* pPackageInfo = reinterpret_cast(pPackage->pvCustomData); + if (pPackage->fPrereqPackage && pPackageInfo && pPackageInfo->fPlannedToBeInstalled && !pPackageInfo->fWasAlreadyInstalled) { - if (m_rgPrereqPackages[i].fSuccessfullyInstalled) + if (pPackageInfo->fSuccessfullyInstalled) { fInstalledAPackage = TRUE; } @@ -1164,6 +1173,9 @@ public: // IBootstrapperApplication case BOOTSTRAPPER_APPLICATION_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE: OnLaunchApprovedExeCompleteFallback(reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); break; + case BOOTSTRAPPER_APPLICATION_MESSAGE_ONPLANMSIPACKAGE: + OnPlanMsiPackageFallback(reinterpret_cast(pvArgs), reinterpret_cast(pvResults)); + break; default: BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "WIXSTDBA: Forwarding unknown BA message: %d", message); m_pfnBAFunctionsProc((BA_FUNCTIONS_MESSAGE)message, pvArgs, pvResults, m_pvBAFunctionsProcContext); @@ -1617,6 +1629,18 @@ private: // privates m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONLAUNCHAPPROVEDEXECOMPLETE, pArgs, pResults, m_pvBAFunctionsProcContext); } + void OnPlanMsiPackageFallback( + __in BA_ONPLANMSIPACKAGE_ARGS* pArgs, + __inout BA_ONPLANMSIPACKAGE_RESULTS* pResults + ) + { + BURN_MSI_PROPERTY actionMsiProperty = pResults->actionMsiProperty; + INSTALLUILEVEL uiLevel = pResults->uiLevel; + BOOL fDisableExternalUiHandler = pResults->fDisableExternalUiHandler; + m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONPLANMSIPACKAGE, pArgs, pResults, m_pvBAFunctionsProcContext); + BalLogId(BOOTSTRAPPER_LOG_LEVEL_STANDARD, MSG_WIXSTDBA_PLANNED_MSI_PACKAGE, m_hModule, pArgs->wzPackageId, actionMsiProperty, uiLevel, fDisableExternalUiHandler ? "yes" : "no", pResults->actionMsiProperty, pResults->uiLevel, pResults->fDisableExternalUiHandler ? "yes" : "no"); + } + // // UiThreadProc - entrypoint for UI thread. // @@ -1752,10 +1776,13 @@ private: // privates GetBundleFileVersion(); // don't fail if we couldn't get the version info; best-effort only + hr = InitializePackageInfo(); + BalExitOnFailure(hr, "Failed to initialize wixstdba package information."); + if (m_fPrereq) { - hr = ParsePrerequisiteInformationFromXml(pixdManifest); - BalExitOnFailure(hr, "Failed to read prerequisite information."); + hr = InitializePrerequisiteInformation(); + BalExitOnFailure(hr, "Failed to initialize prerequisite information."); } else { @@ -1982,100 +2009,77 @@ private: // privates } - HRESULT ParsePrerequisiteInformationFromXml( - __in IXMLDOMDocument* pixdManifest - ) + HRESULT InitializePackageInfo() { HRESULT hr = S_OK; - IXMLDOMNode* pNode = NULL; - IXMLDOMNodeList* pNodes = NULL; - DWORD cNodes = 0; - LPWSTR scz = NULL; - WIXSTDBA_PREREQ_PACKAGE* pPrereqPackage = NULL; BAL_INFO_PACKAGE* pPackage = NULL; - hr = XmlSelectNodes(pixdManifest, L"/BootstrapperApplicationData/WixMbaPrereqInformation", &pNodes); - if (S_FALSE == hr) + for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) { - hr = E_INVALIDARG; - BalExitOnFailure(hr, "BootstrapperApplication.xml manifest is missing prerequisite information."); - } - BalExitOnFailure(hr, "Failed to select prerequisite information nodes."); + pPackage = &m_Bundle.packages.rgPackages[i]; - hr = pNodes->get_length((long*)&cNodes); - BalExitOnFailure(hr, "Failed to get prerequisite information node count."); + hr = InitializePackageInfoForPackage(pPackage); + BalExitOnFailure(hr, "Failed to initialize wixstdba package info for package: %ls.", pPackage->sczId); + } - m_cPrereqPackages = cNodes; - m_rgPrereqPackages = static_cast(MemAlloc(sizeof(WIXSTDBA_PREREQ_PACKAGE) * m_cPrereqPackages, TRUE)); + LExit: + return hr; + } - hr = DictCreateWithEmbeddedKey(&m_shPrereqSupportPackages, m_cPrereqPackages, reinterpret_cast(&m_rgPrereqPackages), offsetof(WIXSTDBA_PREREQ_PACKAGE, sczPackageId), DICT_FLAG_NONE); - BalExitOnFailure(hr, "Failed to create the prerequisite package dictionary."); - for (DWORD i = 0; i < cNodes; ++i) - { - hr = XmlNextElement(pNodes, &pNode, NULL); - BalExitOnFailure(hr, "Failed to get next node."); + HRESULT InitializePackageInfoForPackage( + __in BAL_INFO_PACKAGE* pPackage + ) + { + HRESULT hr = S_OK; - hr = XmlGetAttributeEx(pNode, L"PackageId", &scz); - BalExitOnFailure(hr, "Failed to get @PackageId."); + pPackage->pvCustomData = MemAlloc(sizeof(WIXSTDBA_PACKAGE_INFO), TRUE); + BalExitOnNull(pPackage->pvCustomData, hr, E_OUTOFMEMORY, "Failed to allocate memory for wixstdba package info."); - hr = DictGetValue(m_shPrereqSupportPackages, scz, reinterpret_cast(&pPrereqPackage)); - if (SUCCEEDED(hr)) - { - hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); - BalExitOnFailure(hr, "Duplicate prerequisite information: %ls", scz); - } - else if (E_NOTFOUND != hr) - { - BalExitOnFailure(hr, "Failed to check if \"%ls\" was in the prerequisite package dictionary.", scz); - } + LExit: + return hr; + } - hr = BalInfoFindPackageById(&m_Bundle.packages, scz, &pPackage); - BalExitOnFailure(hr, "Failed to get info about \"%ls\" from BootstrapperApplicationData.", scz); - pPrereqPackage = &m_rgPrereqPackages[i]; - pPrereqPackage->sczPackageId = pPackage->sczId; - hr = DictAddValue(m_shPrereqSupportPackages, pPrereqPackage); - BalExitOnFailure(hr, "Failed to add \"%ls\" to the prerequisite package dictionary.", pPrereqPackage->sczPackageId); + HRESULT InitializePrerequisiteInformation() + { + HRESULT hr = S_OK; + BAL_INFO_PACKAGE* pPackage = NULL; - hr = XmlGetAttributeEx(pNode, L"LicenseFile", &scz); - if (E_NOTFOUND != hr) + for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) + { + pPackage = &m_Bundle.packages.rgPackages[i]; + if (!pPackage->fPrereqPackage) { - BalExitOnFailure(hr, "Failed to get @LicenseFile."); + continue; + } + if (pPackage->sczPrereqLicenseFile) + { if (m_sczLicenseFile) { hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); BalExitOnFailure(hr, "More than one license file specified in prerequisite info."); } - m_sczLicenseFile = scz; - scz = NULL; + hr = StrAllocString(&m_sczLicenseFile, pPackage->sczPrereqLicenseFile, 0); + BalExitOnFailure(hr, "Failed to copy license file location from prereq package."); } - hr = XmlGetAttributeEx(pNode, L"LicenseUrl", &scz); - if (E_NOTFOUND != hr) + if (pPackage->sczPrereqLicenseUrl) { - BalExitOnFailure(hr, "Failed to get @LicenseUrl."); - if (m_sczLicenseUrl) { hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); BalExitOnFailure(hr, "More than one license URL specified in prerequisite info."); } - m_sczLicenseUrl = scz; - scz = NULL; + hr = StrAllocString(&m_sczLicenseUrl, pPackage->sczPrereqLicenseUrl, 0); + BalExitOnFailure(hr, "Failed to copy license URL from prereq package."); } - - // Prepare next iteration. - ReleaseNullObject(pNode); } LExit: - ReleaseObject(pNode); - ReleaseObject(pNodes); - ReleaseStr(scz); return hr; } @@ -2182,37 +2186,31 @@ private: // privates return hr; } - HRESULT GetPrereqPackage( + HRESULT GetPackageInfo( __in_z LPCWSTR wzPackageId, - __out WIXSTDBA_PREREQ_PACKAGE** ppPrereqPackage, + __out WIXSTDBA_PACKAGE_INFO** ppPackageInfo, __out BAL_INFO_PACKAGE** ppPackage ) { HRESULT hr = E_NOTFOUND; - WIXSTDBA_PREREQ_PACKAGE* pPrereqPackage = NULL; + WIXSTDBA_PACKAGE_INFO* pPackageInfo = NULL; BAL_INFO_PACKAGE* pPackage = NULL; Assert(wzPackageId && *wzPackageId); Assert(ppPackage); - Assert(ppPrereqPackage); + Assert(ppPackageInfo); - if (m_shPrereqSupportPackages) + hr = BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage); + if (E_NOTFOUND != hr) { - hr = DictGetValue(m_shPrereqSupportPackages, wzPackageId, reinterpret_cast(&pPrereqPackage)); - if (E_NOTFOUND != hr) - { - ExitOnFailure(hr, "Failed to check the dictionary of prerequisite packages."); + ExitOnFailure(hr, "Failed trying to find the requested package."); - // Ignore error. - BalInfoFindPackageById(&m_Bundle.packages, wzPackageId, &pPackage); - } + pPackageInfo = reinterpret_cast(pPackage->pvCustomData); } - if (pPrereqPackage) - { - *ppPrereqPackage = pPrereqPackage; - *ppPackage = pPackage; - } + *ppPackageInfo = pPackageInfo; + *ppPackage = pPackage; + LExit: return hr; } @@ -3636,9 +3634,6 @@ public: m_fSupportCacheOnly = FALSE; m_sdOverridableVariables = NULL; - m_shPrereqSupportPackages = NULL; - m_rgPrereqPackages = NULL; - m_cPrereqPackages = 0; m_pTaskbarList = NULL; m_uTaskbarButtonCreatedMessage = UINT_MAX; m_fTaskbarButtonOK = FALSE; @@ -3667,11 +3662,14 @@ public: AssertSz(!::IsWindow(m_hWnd), "Window should have been destroyed before destructor."); AssertSz(!m_pTheme, "Theme should have been released before destructor."); + for (DWORD i = 0; i < m_Bundle.packages.cPackages; ++i) + { + ReleaseMem(m_Bundle.packages.rgPackages[i].pvCustomData); + } + ::DeleteCriticalSection(&m_csShowingInternalUiThisPackage); ReleaseObject(m_pTaskbarList); ReleaseDict(m_sdOverridableVariables); - ReleaseDict(m_shPrereqSupportPackages); - ReleaseMem(m_rgPrereqPackages); ReleaseStr(m_sczFailedMessage); ReleaseStr(m_sczConfirmCloseMessage); BalConditionsUninitialize(&m_Conditions); @@ -3739,10 +3737,6 @@ private: STRINGDICT_HANDLE m_sdOverridableVariables; - WIXSTDBA_PREREQ_PACKAGE* m_rgPrereqPackages; - DWORD m_cPrereqPackages; - STRINGDICT_HANDLE m_shPrereqSupportPackages; - BOOL m_fPrereq; BOOL m_fPrereqInstalled; BOOL m_fPrereqAlreadyInstalled; diff --git a/src/wixstdba/packages.config b/src/wixstdba/packages.config index 23b191d4..1b4c9487 100644 --- a/src/wixstdba/packages.config +++ b/src/wixstdba/packages.config @@ -1,7 +1,7 @@  - - - + + + \ No newline at end of file diff --git a/src/wixstdba/wixstdba.mc b/src/wixstdba/wixstdba.mc index 66aa9767..34f8f844 100644 --- a/src/wixstdba/wixstdba.mc +++ b/src/wixstdba/wixstdba.mc @@ -71,3 +71,10 @@ Language=English WIXSTDBA: Planned MSI feature: %2!ls! for %1!ls!, wixstdba requested: %3!hs!, bafunctions requested: %4!hs! . +MessageId=7 +Severity=Success +SymbolicName=MSG_WIXSTDBA_PLANNED_MSI_PACKAGE +Language=English +WIXSTDBA: Planned MSI package: %1!ls!, wixstdba requested: actionMsiProperty=%2!d!;uiLevel=%3!d!;disableExternalUiHandler=%4!hs!, bafunctions requested: actionMsiProperty=%5!d!;uiLevel=%6!d!;disableExternalUiHandler=%7!hs! +. + diff --git a/src/wixstdba/wixstdba.vcxproj b/src/wixstdba/wixstdba.vcxproj index ab15c62f..e97c4692 100644 --- a/src/wixstdba/wixstdba.vcxproj +++ b/src/wixstdba/wixstdba.vcxproj @@ -2,9 +2,9 @@ - - - + + + @@ -107,9 +107,9 @@ rc.exe -fo "$(OutDir)wixstdba.res" "$(IntDir)wixstdba.messages.rc" This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + + + -- cgit v1.2.3-55-g6feb