diff options
Diffstat (limited to 'src/engine/search.cpp')
-rw-r--r-- | src/engine/search.cpp | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/src/engine/search.cpp b/src/engine/search.cpp index 763286fd..16f8e459 100644 --- a/src/engine/search.cpp +++ b/src/engine/search.cpp | |||
@@ -48,6 +48,10 @@ static HRESULT MsiFeatureSearch( | |||
48 | static HRESULT PerformExtensionSearch( | 48 | static HRESULT PerformExtensionSearch( |
49 | __in BURN_SEARCH* pSearch | 49 | __in BURN_SEARCH* pSearch |
50 | ); | 50 | ); |
51 | static HRESULT PerformSetVariable( | ||
52 | __in BURN_SEARCH* pSearch, | ||
53 | __in BURN_VARIABLES* pVariables | ||
54 | ); | ||
51 | 55 | ||
52 | 56 | ||
53 | // function definitions | 57 | // function definitions |
@@ -64,9 +68,10 @@ extern "C" HRESULT SearchesParseFromXml( | |||
64 | DWORD cNodes = 0; | 68 | DWORD cNodes = 0; |
65 | BSTR bstrNodeName = NULL; | 69 | BSTR bstrNodeName = NULL; |
66 | LPWSTR scz = NULL; | 70 | LPWSTR scz = NULL; |
71 | BURN_VARIANT_TYPE valueType = BURN_VARIANT_TYPE_NONE; | ||
67 | 72 | ||
68 | // select search nodes | 73 | // select search nodes |
69 | hr = XmlSelectNodes(pixnBundle, L"DirectorySearch|FileSearch|RegistrySearch|MsiComponentSearch|MsiProductSearch|MsiFeatureSearch|ExtensionSearch", &pixnNodes); | 74 | hr = XmlSelectNodes(pixnBundle, L"DirectorySearch|FileSearch|RegistrySearch|MsiComponentSearch|MsiProductSearch|MsiFeatureSearch|ExtensionSearch|SetVariable", &pixnNodes); |
70 | ExitOnFailure(hr, "Failed to select search nodes."); | 75 | ExitOnFailure(hr, "Failed to select search nodes."); |
71 | 76 | ||
72 | // get search node count | 77 | // get search node count |
@@ -388,6 +393,50 @@ extern "C" HRESULT SearchesParseFromXml( | |||
388 | hr = BurnExtensionFindById(pBurnExtensions, scz, &pSearch->ExtensionSearch.pExtension); | 393 | hr = BurnExtensionFindById(pBurnExtensions, scz, &pSearch->ExtensionSearch.pExtension); |
389 | ExitOnFailure(hr, "Failed to find extension '%ls' for search '%ls'", scz, pSearch->sczKey); | 394 | ExitOnFailure(hr, "Failed to find extension '%ls' for search '%ls'", scz, pSearch->sczKey); |
390 | } | 395 | } |
396 | else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"SetVariable", -1)) | ||
397 | { | ||
398 | pSearch->Type = BURN_SEARCH_TYPE_SET_VARIABLE; | ||
399 | |||
400 | // @Value | ||
401 | hr = XmlGetAttributeEx(pixnNode, L"Value", &scz); | ||
402 | if (E_NOTFOUND != hr) | ||
403 | { | ||
404 | ExitOnFailure(hr, "Failed to get @Value."); | ||
405 | |||
406 | hr = BVariantSetString(&pSearch->SetVariable.value, scz, 0); | ||
407 | ExitOnFailure(hr, "Failed to set variant value."); | ||
408 | |||
409 | // @Type | ||
410 | hr = XmlGetAttributeEx(pixnNode, L"Type", &scz); | ||
411 | ExitOnFailure(hr, "Failed to get @Type."); | ||
412 | |||
413 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"numeric", -1)) | ||
414 | { | ||
415 | valueType = BURN_VARIANT_TYPE_NUMERIC; | ||
416 | } | ||
417 | else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"string", -1)) | ||
418 | { | ||
419 | valueType = BURN_VARIANT_TYPE_STRING; | ||
420 | } | ||
421 | else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"version", -1)) | ||
422 | { | ||
423 | valueType = BURN_VARIANT_TYPE_VERSION; | ||
424 | } | ||
425 | else | ||
426 | { | ||
427 | hr = E_INVALIDARG; | ||
428 | ExitOnFailure(hr, "Invalid value for @Type: %ls", scz); | ||
429 | } | ||
430 | } | ||
431 | else | ||
432 | { | ||
433 | valueType = BURN_VARIANT_TYPE_NONE; | ||
434 | } | ||
435 | |||
436 | // change value variant to correct type | ||
437 | hr = BVariantChangeType(&pSearch->SetVariable.value, valueType); | ||
438 | ExitOnFailure(hr, "Failed to change variant type."); | ||
439 | } | ||
391 | else | 440 | else |
392 | { | 441 | { |
393 | hr = E_UNEXPECTED; | 442 | hr = E_UNEXPECTED; |
@@ -495,6 +544,9 @@ extern "C" HRESULT SearchesExecute( | |||
495 | case BURN_SEARCH_TYPE_EXTENSION: | 544 | case BURN_SEARCH_TYPE_EXTENSION: |
496 | hr = PerformExtensionSearch(pSearch); | 545 | hr = PerformExtensionSearch(pSearch); |
497 | break; | 546 | break; |
547 | case BURN_SEARCH_TYPE_SET_VARIABLE: | ||
548 | hr = PerformSetVariable(pSearch, pVariables); | ||
549 | break; | ||
498 | default: | 550 | default: |
499 | hr = E_UNEXPECTED; | 551 | hr = E_UNEXPECTED; |
500 | } | 552 | } |
@@ -549,6 +601,9 @@ extern "C" void SearchesUninitialize( | |||
549 | ReleaseStr(pSearch->MsiFeatureSearch.sczProductCode); | 601 | ReleaseStr(pSearch->MsiFeatureSearch.sczProductCode); |
550 | ReleaseStr(pSearch->MsiFeatureSearch.sczFeatureId); | 602 | ReleaseStr(pSearch->MsiFeatureSearch.sczFeatureId); |
551 | break; | 603 | break; |
604 | case BURN_SEARCH_TYPE_SET_VARIABLE: | ||
605 | BVariantUninitialize(&pSearch->SetVariable.value); | ||
606 | break; | ||
552 | } | 607 | } |
553 | } | 608 | } |
554 | MemFree(pSearches->rgSearches); | 609 | MemFree(pSearches->rgSearches); |
@@ -1222,3 +1277,17 @@ static HRESULT PerformExtensionSearch( | |||
1222 | 1277 | ||
1223 | return hr; | 1278 | return hr; |
1224 | } | 1279 | } |
1280 | |||
1281 | static HRESULT PerformSetVariable( | ||
1282 | __in BURN_SEARCH* pSearch, | ||
1283 | __in BURN_VARIABLES* pVariables | ||
1284 | ) | ||
1285 | { | ||
1286 | HRESULT hr = S_OK; | ||
1287 | |||
1288 | hr = VariableSetVariant(pVariables, pSearch->sczVariable, &pSearch->SetVariable.value); | ||
1289 | ExitOnFailure(hr, "Failed to set variable: %ls", pSearch->sczVariable); | ||
1290 | |||
1291 | LExit: | ||
1292 | return hr; | ||
1293 | } | ||