diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2020-03-30 21:05:11 +1000 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2020-03-30 21:40:34 +1000 |
| commit | 7e79c6be038f3703e53fa5ff04c4e2ad865541c1 (patch) | |
| tree | 2fde74276d72bb89f9bb97325e363cb9ce22a2d0 /src/engine | |
| parent | 8af9c39dceb6a6ccb55b5a4d76bb71c7c4df133a (diff) | |
| download | wix-7e79c6be038f3703e53fa5ff04c4e2ad865541c1.tar.gz wix-7e79c6be038f3703e53fa5ff04c4e2ad865541c1.tar.bz2 wix-7e79c6be038f3703e53fa5ff04c4e2ad865541c1.zip | |
Implement SetVariable.
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/search.cpp | 71 | ||||
| -rw-r--r-- | src/engine/search.h | 5 | ||||
| -rw-r--r-- | src/engine/variable.cpp | 9 | ||||
| -rw-r--r-- | src/engine/variable.h | 5 |
4 files changed, 89 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 | } | ||
diff --git a/src/engine/search.h b/src/engine/search.h index d6b2586e..c699c97c 100644 --- a/src/engine/search.h +++ b/src/engine/search.h | |||
| @@ -19,6 +19,7 @@ enum BURN_SEARCH_TYPE | |||
| 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 | BURN_SEARCH_TYPE_EXTENSION, |
| 22 | BURN_SEARCH_TYPE_SET_VARIABLE, | ||
| 22 | }; | 23 | }; |
| 23 | 24 | ||
| 24 | enum BURN_DIRECTORY_SEARCH_TYPE | 25 | enum BURN_DIRECTORY_SEARCH_TYPE |
| @@ -127,6 +128,10 @@ typedef struct _BURN_SEARCH | |||
| 127 | { | 128 | { |
| 128 | BURN_EXTENSION* pExtension; | 129 | BURN_EXTENSION* pExtension; |
| 129 | } ExtensionSearch; | 130 | } ExtensionSearch; |
| 131 | struct | ||
| 132 | { | ||
| 133 | BURN_VARIANT value; | ||
| 134 | } SetVariable; | ||
| 130 | }; | 135 | }; |
| 131 | } BURN_SEARCH; | 136 | } BURN_SEARCH; |
| 132 | 137 | ||
diff --git a/src/engine/variable.cpp b/src/engine/variable.cpp index 8b1fd279..dc5a569a 100644 --- a/src/engine/variable.cpp +++ b/src/engine/variable.cpp | |||
| @@ -732,6 +732,15 @@ extern "C" HRESULT VariableSetLiteralVariant( | |||
| 732 | return SetVariableValue(pVariables, wzVariable, pVariant, TRUE, SET_VARIABLE_NOT_BUILTIN, TRUE); | 732 | return SetVariableValue(pVariables, wzVariable, pVariant, TRUE, SET_VARIABLE_NOT_BUILTIN, TRUE); |
| 733 | } | 733 | } |
| 734 | 734 | ||
| 735 | extern "C" HRESULT VariableSetVariant( | ||
| 736 | __in BURN_VARIABLES * pVariables, | ||
| 737 | __in_z LPCWSTR wzVariable, | ||
| 738 | __in BURN_VARIANT * pVariant | ||
| 739 | ) | ||
| 740 | { | ||
| 741 | return SetVariableValue(pVariables, wzVariable, pVariant, FALSE, SET_VARIABLE_NOT_BUILTIN, TRUE); | ||
| 742 | } | ||
| 743 | |||
| 735 | // The contents of psczOut may be sensitive, should keep encrypted and SecureZeroFree | 744 | // The contents of psczOut may be sensitive, should keep encrypted and SecureZeroFree |
| 736 | extern "C" HRESULT VariableFormatString( | 745 | extern "C" HRESULT VariableFormatString( |
| 737 | __in BURN_VARIABLES* pVariables, | 746 | __in BURN_VARIABLES* pVariables, |
diff --git a/src/engine/variable.h b/src/engine/variable.h index c48e0160..63f12cdf 100644 --- a/src/engine/variable.h +++ b/src/engine/variable.h | |||
| @@ -127,6 +127,11 @@ HRESULT VariableSetLiteralVariant( | |||
| 127 | __in_z LPCWSTR wzVariable, | 127 | __in_z LPCWSTR wzVariable, |
| 128 | __in BURN_VARIANT* pVariant | 128 | __in BURN_VARIANT* pVariant |
| 129 | ); | 129 | ); |
| 130 | HRESULT VariableSetVariant( | ||
| 131 | __in BURN_VARIABLES* pVariables, | ||
| 132 | __in_z LPCWSTR wzVariable, | ||
| 133 | __in BURN_VARIANT* pVariant | ||
| 134 | ); | ||
| 130 | HRESULT VariableFormatString( | 135 | HRESULT VariableFormatString( |
| 131 | __in BURN_VARIABLES* pVariables, | 136 | __in BURN_VARIABLES* pVariables, |
| 132 | __in_z LPCWSTR wzIn, | 137 | __in_z LPCWSTR wzIn, |
