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(