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 | |
parent | 8af9c39dceb6a6ccb55b5a4d76bb71c7c4df133a (diff) | |
download | wix-7e79c6be038f3703e53fa5ff04c4e2ad865541c1.tar.gz wix-7e79c6be038f3703e53fa5ff04c4e2ad865541c1.tar.bz2 wix-7e79c6be038f3703e53fa5ff04c4e2ad865541c1.zip |
Implement SetVariable.
-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, |