aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-03-29 19:16:30 +1000
committerSean Hall <r.sean.hall@gmail.com>2020-03-30 21:40:34 +1000
commit1a0190bd31953a5ffb68cac75866328dccbf03f2 (patch)
tree56a063bc5ac84b72b62baa71b590d2e26379cf37
parent0354a00e74492ad8d930c5bf499bc8606e48b1c9 (diff)
downloadwix-1a0190bd31953a5ffb68cac75866328dccbf03f2.tar.gz
wix-1a0190bd31953a5ffb68cac75866328dccbf03f2.tar.bz2
wix-1a0190bd31953a5ffb68cac75866328dccbf03f2.zip
Add support for ExtensionSearches.
-rw-r--r--src/engine/burnextension.cpp49
-rw-r--r--src/engine/burnextension.h10
-rw-r--r--src/engine/manifest.cpp16
-rw-r--r--src/engine/precomp.h2
-rw-r--r--src/engine/search.cpp31
-rw-r--r--src/engine/search.h6
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
186EXTERN_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
208LExit:
209 return hr;
210}
211
212EXTERN_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
231LExit:
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(
46void BurnExtensionUnload( 46void BurnExtensionUnload(
47 __in BURN_EXTENSIONS* pBurnExtensions 47 __in BURN_EXTENSIONS* pBurnExtensions
48 ); 48 );
49HRESULT BurnExtensionFindById(
50 __in BURN_EXTENSIONS* pBurnExtensions,
51 __in_z LPCWSTR wzId,
52 __out BURN_EXTENSION** ppExtension
53 );
54BEEAPI 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
123LExit: 123LExit:
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 );
48static HRESULT PerformExtensionSearch(
49 __in BURN_SEARCH* pSearch
50 );
48 51
49 52
50// function definitions 53// function definitions
51 54
52extern "C" HRESULT SearchesParseFromXml( 55extern "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
1215static 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
23enum BURN_DIRECTORY_SEARCH_TYPE 24enum 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
137HRESULT SearchesParseFromXml( 142HRESULT 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 );
141HRESULT SearchesExecute( 147HRESULT SearchesExecute(