aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-03-30 21:05:11 +1000
committerSean Hall <r.sean.hall@gmail.com>2020-03-30 21:40:34 +1000
commit7e79c6be038f3703e53fa5ff04c4e2ad865541c1 (patch)
tree2fde74276d72bb89f9bb97325e363cb9ce22a2d0
parent8af9c39dceb6a6ccb55b5a4d76bb71c7c4df133a (diff)
downloadwix-7e79c6be038f3703e53fa5ff04c4e2ad865541c1.tar.gz
wix-7e79c6be038f3703e53fa5ff04c4e2ad865541c1.tar.bz2
wix-7e79c6be038f3703e53fa5ff04c4e2ad865541c1.zip
Implement SetVariable.
-rw-r--r--src/engine/search.cpp71
-rw-r--r--src/engine/search.h5
-rw-r--r--src/engine/variable.cpp9
-rw-r--r--src/engine/variable.h5
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(
48static HRESULT PerformExtensionSearch( 48static HRESULT PerformExtensionSearch(
49 __in BURN_SEARCH* pSearch 49 __in BURN_SEARCH* pSearch
50 ); 50 );
51static 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
1281static 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
1291LExit:
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
24enum BURN_DIRECTORY_SEARCH_TYPE 25enum 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
735extern "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
736extern "C" HRESULT VariableFormatString( 745extern "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 );
130HRESULT VariableSetVariant(
131 __in BURN_VARIABLES* pVariables,
132 __in_z LPCWSTR wzVariable,
133 __in BURN_VARIANT* pVariant
134 );
130HRESULT VariableFormatString( 135HRESULT VariableFormatString(
131 __in BURN_VARIABLES* pVariables, 136 __in BURN_VARIABLES* pVariables,
132 __in_z LPCWSTR wzIn, 137 __in_z LPCWSTR wzIn,