From 1a0190bd31953a5ffb68cac75866328dccbf03f2 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Sun, 29 Mar 2020 19:16:30 +1000 Subject: Add support for ExtensionSearches. --- src/engine/burnextension.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++ src/engine/burnextension.h | 10 +++++++++ src/engine/manifest.cpp | 16 +++++++-------- src/engine/precomp.h | 2 +- src/engine/search.cpp | 31 +++++++++++++++++++++++++++- src/engine/search.h | 6 ++++++ 6 files changed, 104 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/engine/burnextension.cpp b/src/engine/burnextension.cpp index 99673cd9..68d34123 100644 --- a/src/engine/burnextension.cpp +++ b/src/engine/burnextension.cpp @@ -182,3 +182,52 @@ EXTERN_C void BurnExtensionUnload( } } } + +EXTERN_C HRESULT BurnExtensionFindById( + __in BURN_EXTENSIONS* pBurnExtensions, + __in_z LPCWSTR wzId, + __out BURN_EXTENSION** ppExtension + ) +{ + HRESULT hr = S_OK; + BURN_EXTENSION* pExtension = NULL; + + for (DWORD i = 0; i < pBurnExtensions->cExtensions; ++i) + { + pExtension = &pBurnExtensions->rgExtensions[i]; + + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pExtension->sczId, -1, wzId, -1)) + { + *ppExtension = pExtension; + ExitFunction1(hr = S_OK); + } + } + + hr = E_NOTFOUND; + +LExit: + return hr; +} + +EXTERN_C BEEAPI BurnExtensionPerformSearch( + __in BURN_EXTENSION* pExtension, + __in LPWSTR wzSearchId, + __in LPWSTR wzVariable + ) +{ + HRESULT hr = S_OK; + BUNDLE_EXTENSION_SEARCH_ARGS args = { }; + BUNDLE_EXTENSION_SEARCH_RESULTS results = { }; + + args.cbSize = sizeof(args); + args.wzId = wzSearchId; + args.wzVariable = wzVariable; + + results.cbSize = sizeof(results); + + hr = pExtension->pfnBurnExtensionProc(BUNDLE_EXTENSION_MESSAGE_SEARCH, &args, &results, pExtension->pvBurnExtensionProcContext); + ExitOnFailure(hr, "BundleExtension '%ls' Search '%ls' failed.", pExtension->sczId, wzSearchId); + +LExit: + return hr; +} diff --git a/src/engine/burnextension.h b/src/engine/burnextension.h index 43c8afe6..370ddd2d 100644 --- a/src/engine/burnextension.h +++ b/src/engine/burnextension.h @@ -46,6 +46,16 @@ HRESULT BurnExtensionLoad( void BurnExtensionUnload( __in BURN_EXTENSIONS* pBurnExtensions ); +HRESULT BurnExtensionFindById( + __in BURN_EXTENSIONS* pBurnExtensions, + __in_z LPCWSTR wzId, + __out BURN_EXTENSION** ppExtension + ); +BEEAPI BurnExtensionPerformSearch( + __in BURN_EXTENSION* pExtension, + __in LPWSTR wzSearchId, + __in LPWSTR wzVariable + ); #if defined(__cplusplus) } #endif diff --git a/src/engine/manifest.cpp b/src/engine/manifest.cpp index a20f1980..8783b15e 100644 --- a/src/engine/manifest.cpp +++ b/src/engine/manifest.cpp @@ -80,14 +80,18 @@ extern "C" HRESULT ManifestLoadXmlFromBuffer( hr = VariablesParseFromXml(&pEngineState->variables, pixeBundle); ExitOnFailure(hr, "Failed to parse variables."); - // parse searches - hr = SearchesParseFromXml(&pEngineState->searches, pixeBundle); // TODO: Modularization - ExitOnFailure(hr, "Failed to parse searches."); - // parse user experience hr = UserExperienceParseFromXml(&pEngineState->userExperience, pixeBundle); ExitOnFailure(hr, "Failed to parse user experience."); + // parse extensions + hr = BurnExtensionParseFromXml(&pEngineState->extensions, &pEngineState->userExperience.payloads, pixeBundle); + ExitOnFailure(hr, "Failed to parse extensions."); + + // parse searches + hr = SearchesParseFromXml(&pEngineState->searches, &pEngineState->extensions, pixeBundle); + ExitOnFailure(hr, "Failed to parse searches."); + // parse catalog files hr = CatalogsParseFromXml(&pEngineState->catalogs, pixeBundle); ExitOnFailure(hr, "Failed to parse catalog files."); @@ -116,10 +120,6 @@ extern "C" HRESULT ManifestLoadXmlFromBuffer( hr = ApprovedExesParseFromXml(&pEngineState->approvedExes, pixeBundle); ExitOnFailure(hr, "Failed to parse approved exes."); - // parse extensions - hr = BurnExtensionParseFromXml(&pEngineState->extensions, &pEngineState->userExperience.payloads, pixeBundle); - ExitOnFailure(hr, "Failed to parse extensions."); - LExit: ReleaseObject(pixnChain); ReleaseObject(pixnLog); diff --git a/src/engine/precomp.h b/src/engine/precomp.h index 780822a1..7aa7dafa 100644 --- a/src/engine/precomp.h +++ b/src/engine/precomp.h @@ -68,7 +68,6 @@ #include "variant.h" #include "variable.h" #include "condition.h" -#include "search.h" #include "section.h" #include "approvedexe.h" #include "container.h" @@ -76,6 +75,7 @@ #include "payload.h" #include "cabextract.h" #include "burnextension.h" +#include "search.h" #include "userexperience.h" #include "package.h" #include "update.h" diff --git a/src/engine/search.cpp b/src/engine/search.cpp index c50790fd..763286fd 100644 --- a/src/engine/search.cpp +++ b/src/engine/search.cpp @@ -45,12 +45,16 @@ static HRESULT MsiFeatureSearch( __in BURN_SEARCH* pSearch, __in BURN_VARIABLES* pVariables ); +static HRESULT PerformExtensionSearch( + __in BURN_SEARCH* pSearch + ); // function definitions extern "C" HRESULT SearchesParseFromXml( __in BURN_SEARCHES* pSearches, + __in BURN_EXTENSIONS* pBurnExtensions, __in IXMLDOMNode* pixnBundle ) { @@ -62,7 +66,7 @@ extern "C" HRESULT SearchesParseFromXml( LPWSTR scz = NULL; // select search nodes - hr = XmlSelectNodes(pixnBundle, L"DirectorySearch|FileSearch|RegistrySearch|MsiComponentSearch|MsiProductSearch|MsiFeatureSearch", &pixnNodes); + hr = XmlSelectNodes(pixnBundle, L"DirectorySearch|FileSearch|RegistrySearch|MsiComponentSearch|MsiProductSearch|MsiFeatureSearch|ExtensionSearch", &pixnNodes); ExitOnFailure(hr, "Failed to select search nodes."); // get search node count @@ -373,6 +377,17 @@ extern "C" HRESULT SearchesParseFromXml( ExitOnFailure(hr, "Invalid value for @Type: %ls", scz); } } + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"ExtensionSearch", -1)) + { + pSearch->Type = BURN_SEARCH_TYPE_EXTENSION; + + // @ExtensionId + hr = XmlGetAttributeEx(pixnNode, L"ExtensionId", &scz); + ExitOnFailure(hr, "Failed to get @ExtensionId."); + + hr = BurnExtensionFindById(pBurnExtensions, scz, &pSearch->ExtensionSearch.pExtension); + ExitOnFailure(hr, "Failed to find extension '%ls' for search '%ls'", scz, pSearch->sczKey); + } else { hr = E_UNEXPECTED; @@ -477,6 +492,9 @@ extern "C" HRESULT SearchesExecute( case BURN_SEARCH_TYPE_MSI_FEATURE: hr = MsiFeatureSearch(pSearch, pVariables); break; + case BURN_SEARCH_TYPE_EXTENSION: + hr = PerformExtensionSearch(pSearch); + break; default: hr = E_UNEXPECTED; } @@ -1193,3 +1211,14 @@ static HRESULT MsiFeatureSearch( return hr; } + +static HRESULT PerformExtensionSearch( + __in BURN_SEARCH* pSearch + ) +{ + HRESULT hr = S_OK; + + hr = BurnExtensionPerformSearch(pSearch->ExtensionSearch.pExtension, pSearch->sczKey, pSearch->sczVariable); + + return hr; +} diff --git a/src/engine/search.h b/src/engine/search.h index 65dfb18f..d6b2586e 100644 --- a/src/engine/search.h +++ b/src/engine/search.h @@ -18,6 +18,7 @@ enum BURN_SEARCH_TYPE BURN_SEARCH_TYPE_MSI_COMPONENT, BURN_SEARCH_TYPE_MSI_PRODUCT, BURN_SEARCH_TYPE_MSI_FEATURE, + BURN_SEARCH_TYPE_EXTENSION, }; enum BURN_DIRECTORY_SEARCH_TYPE @@ -122,6 +123,10 @@ typedef struct _BURN_SEARCH LPWSTR sczProductCode; LPWSTR sczFeatureId; } MsiFeatureSearch; + struct + { + BURN_EXTENSION* pExtension; + } ExtensionSearch; }; } BURN_SEARCH; @@ -136,6 +141,7 @@ typedef struct _BURN_SEARCHES HRESULT SearchesParseFromXml( __in BURN_SEARCHES* pSearches, + __in BURN_EXTENSIONS* pBurnExtensions, __in IXMLDOMNode* pixnBundle ); HRESULT SearchesExecute( -- cgit v1.2.3-55-g6feb