diff options
Diffstat (limited to 'src/engine/search.cpp')
| -rw-r--r-- | src/engine/search.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
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 | } | ||
