@joebigelow / wix-1 / commits / 1a0190bd

Add support for ExtensionSearches.

Sean Hall committed Mar 29, 2020 at 19:16 UTC 1a0190bd31953a5ffb68cac75866328dccbf03f2
6 files changed +104 -10
src/engine/burnextension.cpp
+49
@@ -182,3 +182,52 @@ EXTERN_C void BurnExtensionUnload(
182 }
183 }
184 }
185 +
186 +EXTERN_C HRESULT BurnExtensionFindById(
187 + __in BURN_EXTENSIONS* pBurnExtensions,
188 + __in_z LPCWSTR wzId,
189 + __out BURN_EXTENSION** ppExtension
190 + )
191 +{
192 + HRESULT hr = S_OK;
193 + BURN_EXTENSION* pExtension = NULL;
194 +
195 + for (DWORD i = 0; i < pBurnExtensions->cExtensions; ++i)
196 + {
197 + pExtension = &pBurnExtensions->rgExtensions[i];
198 +
199 + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pExtension->sczId, -1, wzId, -1))
200 + {
201 + *ppExtension = pExtension;
202 + ExitFunction1(hr = S_OK);
203 + }
204 + }
205 +
206 + hr = E_NOTFOUND;
207 +
208 +LExit:
209 + return hr;
210 +}
211 +
212 +EXTERN_C BEEAPI BurnExtensionPerformSearch(
213 + __in BURN_EXTENSION* pExtension,
214 + __in LPWSTR wzSearchId,
215 + __in LPWSTR wzVariable
216 + )
217 +{
218 + HRESULT hr = S_OK;
219 + BUNDLE_EXTENSION_SEARCH_ARGS args = { };
220 + BUNDLE_EXTENSION_SEARCH_RESULTS results = { };
221 +
222 + args.cbSize = sizeof(args);
223 + args.wzId = wzSearchId;
224 + args.wzVariable = wzVariable;
225 +
226 + results.cbSize = sizeof(results);
227 +
228 + hr = pExtension->pfnBurnExtensionProc(BUNDLE_EXTENSION_MESSAGE_SEARCH, &args, &results, pExtension->pvBurnExtensionProcContext);
229 + ExitOnFailure(hr, "BundleExtension '%ls' Search '%ls' failed.", pExtension->sczId, wzSearchId);
230 +
231 +LExit:
232 + return hr;
233 +}
src/engine/burnextension.h
+10
@@ -46,6 +46,16 @@ HRESULT BurnExtensionLoad(
46 void BurnExtensionUnload(
47 __in BURN_EXTENSIONS* pBurnExtensions
48 );
49 +HRESULT BurnExtensionFindById(
50 + __in BURN_EXTENSIONS* pBurnExtensions,
51 + __in_z LPCWSTR wzId,
52 + __out BURN_EXTENSION** ppExtension
53 + );
54 +BEEAPI BurnExtensionPerformSearch(
55 + __in BURN_EXTENSION* pExtension,
56 + __in LPWSTR wzSearchId,
57 + __in LPWSTR wzVariable
58 + );
59 #if defined(__cplusplus)
60 }
61 #endif
src/engine/manifest.cpp
+8 -8
@@ -80,14 +80,18 @@ extern "C" HRESULT ManifestLoadXmlFromBuffer(
80 hr = VariablesParseFromXml(&pEngineState->variables, pixeBundle);
81 ExitOnFailure(hr, "Failed to parse variables.");
82
83 - // parse searches
84 - hr = SearchesParseFromXml(&pEngineState->searches, pixeBundle); // TODO: Modularization
85 - ExitOnFailure(hr, "Failed to parse searches.");
86 -
83 // parse user experience
84 hr = UserExperienceParseFromXml(&pEngineState->userExperience, pixeBundle);
85 ExitOnFailure(hr, "Failed to parse user experience.");
86
87 + // parse extensions
88 + hr = BurnExtensionParseFromXml(&pEngineState->extensions, &pEngineState->userExperience.payloads, pixeBundle);
89 + ExitOnFailure(hr, "Failed to parse extensions.");
90 +
91 + // parse searches
92 + hr = SearchesParseFromXml(&pEngineState->searches, &pEngineState->extensions, pixeBundle);
93 + ExitOnFailure(hr, "Failed to parse searches.");
94 +
95 // parse catalog files
96 hr = CatalogsParseFromXml(&pEngineState->catalogs, pixeBundle);
97 ExitOnFailure(hr, "Failed to parse catalog files.");
@@ -116,10 +120,6 @@ extern "C" HRESULT ManifestLoadXmlFromBuffer(
120 hr = ApprovedExesParseFromXml(&pEngineState->approvedExes, pixeBundle);
121 ExitOnFailure(hr, "Failed to parse approved exes.");
122
119 - // parse extensions
120 - hr = BurnExtensionParseFromXml(&pEngineState->extensions, &pEngineState->userExperience.payloads, pixeBundle);
121 - ExitOnFailure(hr, "Failed to parse extensions.");
122 -
123 LExit:
124 ReleaseObject(pixnChain);
125 ReleaseObject(pixnLog);
src/engine/precomp.h
+1 -1
@@ -68,7 +68,6 @@
68 #include "variant.h"
69 #include "variable.h"
70 #include "condition.h"
71 -#include "search.h"
71 #include "section.h"
72 #include "approvedexe.h"
73 #include "container.h"
@@ -76,6 +75,7 @@
75 #include "payload.h"
76 #include "cabextract.h"
77 #include "burnextension.h"
78 +#include "search.h"
79 #include "userexperience.h"
80 #include "package.h"
81 #include "update.h"
src/engine/search.cpp
+30 -1
@@ -45,12 +45,16 @@ static HRESULT MsiFeatureSearch(
45 __in BURN_SEARCH* pSearch,
46 __in BURN_VARIABLES* pVariables
47 );
48 +static HRESULT PerformExtensionSearch(
49 + __in BURN_SEARCH* pSearch
50 + );
51
52
53 // function definitions
54
55 extern "C" HRESULT SearchesParseFromXml(
56 __in BURN_SEARCHES* pSearches,
57 + __in BURN_EXTENSIONS* pBurnExtensions,
58 __in IXMLDOMNode* pixnBundle
59 )
60 {
@@ -62,7 +66,7 @@ extern "C" HRESULT SearchesParseFromXml(
66 LPWSTR scz = NULL;
67
68 // select search nodes
65 - hr = XmlSelectNodes(pixnBundle, L"DirectorySearch|FileSearch|RegistrySearch|MsiComponentSearch|MsiProductSearch|MsiFeatureSearch", &pixnNodes);
69 + hr = XmlSelectNodes(pixnBundle, L"DirectorySearch|FileSearch|RegistrySearch|MsiComponentSearch|MsiProductSearch|MsiFeatureSearch|ExtensionSearch", &pixnNodes);
70 ExitOnFailure(hr, "Failed to select search nodes.");
71
72 // get search node count
@@ -373,6 +377,17 @@ extern "C" HRESULT SearchesParseFromXml(
377 ExitOnFailure(hr, "Invalid value for @Type: %ls", scz);
378 }
379 }
380 + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"ExtensionSearch", -1))
381 + {
382 + pSearch->Type = BURN_SEARCH_TYPE_EXTENSION;
383 +
384 + // @ExtensionId
385 + hr = XmlGetAttributeEx(pixnNode, L"ExtensionId", &scz);
386 + ExitOnFailure(hr, "Failed to get @ExtensionId.");
387 +
388 + hr = BurnExtensionFindById(pBurnExtensions, scz, &pSearch->ExtensionSearch.pExtension);
389 + ExitOnFailure(hr, "Failed to find extension '%ls' for search '%ls'", scz, pSearch->sczKey);
390 + }
391 else
392 {
393 hr = E_UNEXPECTED;
@@ -477,6 +492,9 @@ extern "C" HRESULT SearchesExecute(
492 case BURN_SEARCH_TYPE_MSI_FEATURE:
493 hr = MsiFeatureSearch(pSearch, pVariables);
494 break;
495 + case BURN_SEARCH_TYPE_EXTENSION:
496 + hr = PerformExtensionSearch(pSearch);
497 + break;
498 default:
499 hr = E_UNEXPECTED;
500 }
@@ -1193,3 +1211,14 @@ static HRESULT MsiFeatureSearch(
1211
1212 return hr;
1213 }
1214 +
1215 +static HRESULT PerformExtensionSearch(
1216 + __in BURN_SEARCH* pSearch
1217 + )
1218 +{
1219 + HRESULT hr = S_OK;
1220 +
1221 + hr = BurnExtensionPerformSearch(pSearch->ExtensionSearch.pExtension, pSearch->sczKey, pSearch->sczVariable);
1222 +
1223 + return hr;
1224 +}
src/engine/search.h
+6
@@ -18,6 +18,7 @@ enum BURN_SEARCH_TYPE
18 BURN_SEARCH_TYPE_MSI_COMPONENT,
19 BURN_SEARCH_TYPE_MSI_PRODUCT,
20 BURN_SEARCH_TYPE_MSI_FEATURE,
21 + BURN_SEARCH_TYPE_EXTENSION,
22 };
23
24 enum BURN_DIRECTORY_SEARCH_TYPE
@@ -122,6 +123,10 @@ typedef struct _BURN_SEARCH
123 LPWSTR sczProductCode;
124 LPWSTR sczFeatureId;
125 } MsiFeatureSearch;
126 + struct
127 + {
128 + BURN_EXTENSION* pExtension;
129 + } ExtensionSearch;
130 };
131 } BURN_SEARCH;
132
@@ -136,6 +141,7 @@ typedef struct _BURN_SEARCHES
141
142 HRESULT SearchesParseFromXml(
143 __in BURN_SEARCHES* pSearches,
144 + __in BURN_EXTENSIONS* pBurnExtensions,
145 __in IXMLDOMNode* pixnBundle
146 );
147 HRESULT SearchesExecute(