diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2020-03-29 19:16:30 +1000 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2020-03-30 21:40:34 +1000 |
commit | 1a0190bd31953a5ffb68cac75866328dccbf03f2 (patch) | |
tree | 56a063bc5ac84b72b62baa71b590d2e26379cf37 | |
parent | 0354a00e74492ad8d930c5bf499bc8606e48b1c9 (diff) | |
download | wix-1a0190bd31953a5ffb68cac75866328dccbf03f2.tar.gz wix-1a0190bd31953a5ffb68cac75866328dccbf03f2.tar.bz2 wix-1a0190bd31953a5ffb68cac75866328dccbf03f2.zip |
Add support for ExtensionSearches.
-rw-r--r-- | src/engine/burnextension.cpp | 49 | ||||
-rw-r--r-- | src/engine/burnextension.h | 10 | ||||
-rw-r--r-- | src/engine/manifest.cpp | 16 | ||||
-rw-r--r-- | src/engine/precomp.h | 2 | ||||
-rw-r--r-- | src/engine/search.cpp | 31 | ||||
-rw-r--r-- | src/engine/search.h | 6 |
6 files changed, 104 insertions, 10 deletions
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( | |||
182 | } | 182 | } |
183 | } | 183 | } |
184 | } | 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 | } | ||
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( | |||
46 | void BurnExtensionUnload( | 46 | void BurnExtensionUnload( |
47 | __in BURN_EXTENSIONS* pBurnExtensions | 47 | __in BURN_EXTENSIONS* pBurnExtensions |
48 | ); | 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 | ); | ||
49 | #if defined(__cplusplus) | 59 | #if defined(__cplusplus) |
50 | } | 60 | } |
51 | #endif | 61 | #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( | |||
80 | hr = VariablesParseFromXml(&pEngineState->variables, pixeBundle); | 80 | hr = VariablesParseFromXml(&pEngineState->variables, pixeBundle); |
81 | ExitOnFailure(hr, "Failed to parse variables."); | 81 | ExitOnFailure(hr, "Failed to parse variables."); |
82 | 82 | ||
83 | // parse searches | ||
84 | hr = SearchesParseFromXml(&pEngineState->searches, pixeBundle); // TODO: Modularization | ||
85 | ExitOnFailure(hr, "Failed to parse searches."); | ||
86 | |||
87 | // parse user experience | 83 | // parse user experience |
88 | hr = UserExperienceParseFromXml(&pEngineState->userExperience, pixeBundle); | 84 | hr = UserExperienceParseFromXml(&pEngineState->userExperience, pixeBundle); |
89 | ExitOnFailure(hr, "Failed to parse user experience."); | 85 | ExitOnFailure(hr, "Failed to parse user experience."); |
90 | 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 | |||
91 | // parse catalog files | 95 | // parse catalog files |
92 | hr = CatalogsParseFromXml(&pEngineState->catalogs, pixeBundle); | 96 | hr = CatalogsParseFromXml(&pEngineState->catalogs, pixeBundle); |
93 | ExitOnFailure(hr, "Failed to parse catalog files."); | 97 | ExitOnFailure(hr, "Failed to parse catalog files."); |
@@ -116,10 +120,6 @@ extern "C" HRESULT ManifestLoadXmlFromBuffer( | |||
116 | hr = ApprovedExesParseFromXml(&pEngineState->approvedExes, pixeBundle); | 120 | hr = ApprovedExesParseFromXml(&pEngineState->approvedExes, pixeBundle); |
117 | ExitOnFailure(hr, "Failed to parse approved exes."); | 121 | ExitOnFailure(hr, "Failed to parse approved exes."); |
118 | 122 | ||
119 | // parse extensions | ||
120 | hr = BurnExtensionParseFromXml(&pEngineState->extensions, &pEngineState->userExperience.payloads, pixeBundle); | ||
121 | ExitOnFailure(hr, "Failed to parse extensions."); | ||
122 | |||
123 | LExit: | 123 | LExit: |
124 | ReleaseObject(pixnChain); | 124 | ReleaseObject(pixnChain); |
125 | ReleaseObject(pixnLog); | 125 | 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 @@ | |||
68 | #include "variant.h" | 68 | #include "variant.h" |
69 | #include "variable.h" | 69 | #include "variable.h" |
70 | #include "condition.h" | 70 | #include "condition.h" |
71 | #include "search.h" | ||
72 | #include "section.h" | 71 | #include "section.h" |
73 | #include "approvedexe.h" | 72 | #include "approvedexe.h" |
74 | #include "container.h" | 73 | #include "container.h" |
@@ -76,6 +75,7 @@ | |||
76 | #include "payload.h" | 75 | #include "payload.h" |
77 | #include "cabextract.h" | 76 | #include "cabextract.h" |
78 | #include "burnextension.h" | 77 | #include "burnextension.h" |
78 | #include "search.h" | ||
79 | #include "userexperience.h" | 79 | #include "userexperience.h" |
80 | #include "package.h" | 80 | #include "package.h" |
81 | #include "update.h" | 81 | #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( | |||
45 | __in BURN_SEARCH* pSearch, | 45 | __in BURN_SEARCH* pSearch, |
46 | __in BURN_VARIABLES* pVariables | 46 | __in BURN_VARIABLES* pVariables |
47 | ); | 47 | ); |
48 | static HRESULT PerformExtensionSearch( | ||
49 | __in BURN_SEARCH* pSearch | ||
50 | ); | ||
48 | 51 | ||
49 | 52 | ||
50 | // function definitions | 53 | // function definitions |
51 | 54 | ||
52 | extern "C" HRESULT SearchesParseFromXml( | 55 | extern "C" HRESULT SearchesParseFromXml( |
53 | __in BURN_SEARCHES* pSearches, | 56 | __in BURN_SEARCHES* pSearches, |
57 | __in BURN_EXTENSIONS* pBurnExtensions, | ||
54 | __in IXMLDOMNode* pixnBundle | 58 | __in IXMLDOMNode* pixnBundle |
55 | ) | 59 | ) |
56 | { | 60 | { |
@@ -62,7 +66,7 @@ extern "C" HRESULT SearchesParseFromXml( | |||
62 | LPWSTR scz = NULL; | 66 | LPWSTR scz = NULL; |
63 | 67 | ||
64 | // select search nodes | 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); |
66 | ExitOnFailure(hr, "Failed to select search nodes."); | 70 | ExitOnFailure(hr, "Failed to select search nodes."); |
67 | 71 | ||
68 | // get search node count | 72 | // get search node count |
@@ -373,6 +377,17 @@ extern "C" HRESULT SearchesParseFromXml( | |||
373 | ExitOnFailure(hr, "Invalid value for @Type: %ls", scz); | 377 | ExitOnFailure(hr, "Invalid value for @Type: %ls", scz); |
374 | } | 378 | } |
375 | } | 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 | } | ||
376 | else | 391 | else |
377 | { | 392 | { |
378 | hr = E_UNEXPECTED; | 393 | hr = E_UNEXPECTED; |
@@ -477,6 +492,9 @@ extern "C" HRESULT SearchesExecute( | |||
477 | case BURN_SEARCH_TYPE_MSI_FEATURE: | 492 | case BURN_SEARCH_TYPE_MSI_FEATURE: |
478 | hr = MsiFeatureSearch(pSearch, pVariables); | 493 | hr = MsiFeatureSearch(pSearch, pVariables); |
479 | break; | 494 | break; |
495 | case BURN_SEARCH_TYPE_EXTENSION: | ||
496 | hr = PerformExtensionSearch(pSearch); | ||
497 | break; | ||
480 | default: | 498 | default: |
481 | hr = E_UNEXPECTED; | 499 | hr = E_UNEXPECTED; |
482 | } | 500 | } |
@@ -1193,3 +1211,14 @@ static HRESULT MsiFeatureSearch( | |||
1193 | 1211 | ||
1194 | return hr; | 1212 | return hr; |
1195 | } | 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 | } | ||
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 | |||
18 | BURN_SEARCH_TYPE_MSI_COMPONENT, | 18 | BURN_SEARCH_TYPE_MSI_COMPONENT, |
19 | BURN_SEARCH_TYPE_MSI_PRODUCT, | 19 | BURN_SEARCH_TYPE_MSI_PRODUCT, |
20 | BURN_SEARCH_TYPE_MSI_FEATURE, | 20 | BURN_SEARCH_TYPE_MSI_FEATURE, |
21 | BURN_SEARCH_TYPE_EXTENSION, | ||
21 | }; | 22 | }; |
22 | 23 | ||
23 | enum BURN_DIRECTORY_SEARCH_TYPE | 24 | enum BURN_DIRECTORY_SEARCH_TYPE |
@@ -122,6 +123,10 @@ typedef struct _BURN_SEARCH | |||
122 | LPWSTR sczProductCode; | 123 | LPWSTR sczProductCode; |
123 | LPWSTR sczFeatureId; | 124 | LPWSTR sczFeatureId; |
124 | } MsiFeatureSearch; | 125 | } MsiFeatureSearch; |
126 | struct | ||
127 | { | ||
128 | BURN_EXTENSION* pExtension; | ||
129 | } ExtensionSearch; | ||
125 | }; | 130 | }; |
126 | } BURN_SEARCH; | 131 | } BURN_SEARCH; |
127 | 132 | ||
@@ -136,6 +141,7 @@ typedef struct _BURN_SEARCHES | |||
136 | 141 | ||
137 | HRESULT SearchesParseFromXml( | 142 | HRESULT SearchesParseFromXml( |
138 | __in BURN_SEARCHES* pSearches, | 143 | __in BURN_SEARCHES* pSearches, |
144 | __in BURN_EXTENSIONS* pBurnExtensions, | ||
139 | __in IXMLDOMNode* pixnBundle | 145 | __in IXMLDOMNode* pixnBundle |
140 | ); | 146 | ); |
141 | HRESULT SearchesExecute( | 147 | HRESULT SearchesExecute( |