aboutsummaryrefslogtreecommitdiff
path: root/src/engine/variable.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2020-07-31 17:06:35 -0600
committerSean Hall <r.sean.hall@gmail.com>2020-08-09 10:33:49 -0600
commitd21eed76c48960707561c45c492c10a6a23c052e (patch)
treeebab09d099a699a24801fcfb4d7152cf82cc4a06 /src/engine/variable.cpp
parentad80d6dc10f9bd6cb6a084857a8fb546cc55e756 (diff)
downloadwix-d21eed76c48960707561c45c492c10a6a23c052e.tar.gz
wix-d21eed76c48960707561c45c492c10a6a23c052e.tar.bz2
wix-d21eed76c48960707561c45c492c10a6a23c052e.zip
WIXFEAT:4763 Change "string" variable type to literal and add "formatted".
Diffstat (limited to 'src/engine/variable.cpp')
-rw-r--r--src/engine/variable.cpp102
1 files changed, 36 insertions, 66 deletions
diff --git a/src/engine/variable.cpp b/src/engine/variable.cpp
index 6322942e..fb4b74e2 100644
--- a/src/engine/variable.cpp
+++ b/src/engine/variable.cpp
@@ -83,7 +83,6 @@ static HRESULT SetVariableValue(
83 __in BURN_VARIABLES* pVariables, 83 __in BURN_VARIABLES* pVariables,
84 __in_z LPCWSTR wzVariable, 84 __in_z LPCWSTR wzVariable,
85 __in BURN_VARIANT* pVariant, 85 __in BURN_VARIANT* pVariant,
86 __in BOOL fLiteral,
87 __in SET_VARIABLE setBuiltin, 86 __in SET_VARIABLE setBuiltin,
88 __in BOOL fLog 87 __in BOOL fLog
89 ); 88 );
@@ -335,14 +334,22 @@ extern "C" HRESULT VariablesParseFromXml(
335 { 334 {
336 ExitOnFailure(hr, "Failed to get @Value."); 335 ExitOnFailure(hr, "Failed to get @Value.");
337 336
338 hr = BVariantSetString(&value, scz, 0); 337 hr = BVariantSetString(&value, scz, 0, FALSE);
339 ExitOnFailure(hr, "Failed to set variant value."); 338 ExitOnFailure(hr, "Failed to set variant value.");
340 339
341 // @Type 340 // @Type
342 hr = XmlGetAttributeEx(pixnNode, L"Type", &scz); 341 hr = XmlGetAttributeEx(pixnNode, L"Type", &scz);
343 ExitOnFailure(hr, "Failed to get @Type."); 342 ExitOnFailure(hr, "Failed to get @Type.");
344 343
345 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"numeric", -1)) 344 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"formatted", -1))
345 {
346 if (!fHidden)
347 {
348 LogStringLine(REPORT_STANDARD, "Initializing formatted variable '%ls' to value '%ls'", sczId, value.sczValue);
349 }
350 valueType = BURN_VARIANT_TYPE_FORMATTED;
351 }
352 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"numeric", -1))
346 { 353 {
347 if (!fHidden) 354 if (!fHidden)
348 { 355 {
@@ -637,10 +644,7 @@ extern "C" HRESULT VariableGetFormatted(
637 } 644 }
638 ExitOnFailure(hr, "Failed to get variable: %ls", wzVariable); 645 ExitOnFailure(hr, "Failed to get variable: %ls", wzVariable);
639 646
640 // Strings need to get expanded unless they're built-in or literal because they're guaranteed not to have embedded variables. 647 if (BURN_VARIANT_TYPE_FORMATTED == pVariable->Value.Type)
641 if (BURN_VARIANT_TYPE_STRING == pVariable->Value.Type &&
642 BURN_VARIABLE_INTERNAL_TYPE_NORMAL == pVariable->internalType &&
643 !pVariable->fLiteral)
644 { 648 {
645 hr = BVariantGetString(&pVariable->Value, &scz); 649 hr = BVariantGetString(&pVariable->Value, &scz);
646 ExitOnFailure(hr, "Failed to get unformatted string."); 650 ExitOnFailure(hr, "Failed to get unformatted string.");
@@ -674,39 +678,24 @@ extern "C" HRESULT VariableSetNumeric(
674 variant.llValue = llValue; 678 variant.llValue = llValue;
675 variant.Type = BURN_VARIANT_TYPE_NUMERIC; 679 variant.Type = BURN_VARIANT_TYPE_NUMERIC;
676 680
677 return SetVariableValue(pVariables, wzVariable, &variant, FALSE, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); 681 return SetVariableValue(pVariables, wzVariable, &variant, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE);
678}
679
680extern "C" HRESULT VariableSetLiteralString(
681 __in BURN_VARIABLES* pVariables,
682 __in_z LPCWSTR wzVariable,
683 __in_z_opt LPCWSTR wzValue,
684 __in BOOL fOverwriteBuiltIn
685 )
686{
687 BURN_VARIANT variant = { };
688
689 // We're not going to encrypt this value, so can access the value directly.
690 variant.sczValue = (LPWSTR)wzValue;
691 variant.Type = BURN_VARIANT_TYPE_STRING;
692
693 return SetVariableValue(pVariables, wzVariable, &variant, TRUE, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE);
694} 682}
695 683
696extern "C" HRESULT VariableSetString( 684extern "C" HRESULT VariableSetString(
697 __in BURN_VARIABLES* pVariables, 685 __in BURN_VARIABLES* pVariables,
698 __in_z LPCWSTR wzVariable, 686 __in_z LPCWSTR wzVariable,
699 __in_z_opt LPCWSTR wzValue, 687 __in_z_opt LPCWSTR wzValue,
700 __in BOOL fOverwriteBuiltIn 688 __in BOOL fOverwriteBuiltIn,
689 __in BOOL fFormatted
701 ) 690 )
702{ 691{
703 BURN_VARIANT variant = { }; 692 BURN_VARIANT variant = { };
704 693
705 // We're not going to encrypt this value, so can access the value directly. 694 // We're not going to encrypt this value, so can access the value directly.
706 variant.sczValue = (LPWSTR)wzValue; 695 variant.sczValue = (LPWSTR)wzValue;
707 variant.Type = BURN_VARIANT_TYPE_STRING; 696 variant.Type = fFormatted ? BURN_VARIANT_TYPE_FORMATTED : BURN_VARIANT_TYPE_STRING;
708 697
709 return SetVariableValue(pVariables, wzVariable, &variant, FALSE, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); 698 return SetVariableValue(pVariables, wzVariable, &variant, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE);
710} 699}
711 700
712extern "C" HRESULT VariableSetVersion( 701extern "C" HRESULT VariableSetVersion(
@@ -722,16 +711,7 @@ extern "C" HRESULT VariableSetVersion(
722 variant.qwValue = qwValue; 711 variant.qwValue = qwValue;
723 variant.Type = BURN_VARIANT_TYPE_VERSION; 712 variant.Type = BURN_VARIANT_TYPE_VERSION;
724 713
725 return SetVariableValue(pVariables, wzVariable, &variant, FALSE, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE); 714 return SetVariableValue(pVariables, wzVariable, &variant, fOverwriteBuiltIn ? SET_VARIABLE_OVERRIDE_BUILTIN : SET_VARIABLE_NOT_BUILTIN, TRUE);
726}
727
728extern "C" HRESULT VariableSetLiteralVariant(
729 __in BURN_VARIABLES* pVariables,
730 __in_z LPCWSTR wzVariable,
731 __in BURN_VARIANT* pVariant
732 )
733{
734 return SetVariableValue(pVariables, wzVariable, pVariant, TRUE, SET_VARIABLE_NOT_BUILTIN, TRUE);
735} 715}
736 716
737extern "C" HRESULT VariableSetVariant( 717extern "C" HRESULT VariableSetVariant(
@@ -740,7 +720,7 @@ extern "C" HRESULT VariableSetVariant(
740 __in BURN_VARIANT * pVariant 720 __in BURN_VARIANT * pVariant
741 ) 721 )
742{ 722{
743 return SetVariableValue(pVariables, wzVariable, pVariant, FALSE, SET_VARIABLE_NOT_BUILTIN, TRUE); 723 return SetVariableValue(pVariables, wzVariable, pVariant, SET_VARIABLE_NOT_BUILTIN, TRUE);
744} 724}
745 725
746// The contents of psczOut may be sensitive, should keep encrypted and SecureZeroFree 726// The contents of psczOut may be sensitive, should keep encrypted and SecureZeroFree
@@ -888,6 +868,7 @@ extern "C" HRESULT VariableSerialize(
888 868
889 SecureZeroMemory(&qw, sizeof(qw)); 869 SecureZeroMemory(&qw, sizeof(qw));
890 break; 870 break;
871 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
891 case BURN_VARIANT_TYPE_STRING: 872 case BURN_VARIANT_TYPE_STRING:
892 hr = BVariantGetString(&pVariable->Value, &scz); 873 hr = BVariantGetString(&pVariable->Value, &scz);
893 ExitOnFailure(hr, "Failed to get string."); 874 ExitOnFailure(hr, "Failed to get string.");
@@ -901,10 +882,6 @@ extern "C" HRESULT VariableSerialize(
901 hr = E_INVALIDARG; 882 hr = E_INVALIDARG;
902 ExitOnFailure(hr, "Unsupported variable type."); 883 ExitOnFailure(hr, "Unsupported variable type.");
903 } 884 }
904
905 // Write literal flag.
906 hr = BuffWriteNumber(ppbBuffer, piBuffer, (DWORD)pVariable->fLiteral);
907 ExitOnFailure(hr, "Failed to write literal flag.");
908 } 885 }
909 886
910LExit: 887LExit:
@@ -928,7 +905,6 @@ extern "C" HRESULT VariableDeserialize(
928 DWORD cVariables = 0; 905 DWORD cVariables = 0;
929 LPWSTR sczName = NULL; 906 LPWSTR sczName = NULL;
930 BOOL fIncluded = FALSE; 907 BOOL fIncluded = FALSE;
931 BOOL fLiteral = FALSE;
932 BURN_VARIANT value = { }; 908 BURN_VARIANT value = { };
933 LPWSTR scz = NULL; 909 LPWSTR scz = NULL;
934 DWORD64 qw = 0; 910 DWORD64 qw = 0;
@@ -982,11 +958,12 @@ extern "C" HRESULT VariableDeserialize(
982 958
983 SecureZeroMemory(&qw, sizeof(qw)); 959 SecureZeroMemory(&qw, sizeof(qw));
984 break; 960 break;
961 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
985 case BURN_VARIANT_TYPE_STRING: 962 case BURN_VARIANT_TYPE_STRING:
986 hr = BuffReadString(pbBuffer, cbBuffer, piBuffer, &scz); 963 hr = BuffReadString(pbBuffer, cbBuffer, piBuffer, &scz);
987 ExitOnFailure(hr, "Failed to read variable value as string."); 964 ExitOnFailure(hr, "Failed to read variable value as string.");
988 965
989 hr = BVariantSetString(&value, scz, NULL); 966 hr = BVariantSetString(&value, scz, NULL, BURN_VARIANT_TYPE_FORMATTED == value.Type);
990 ExitOnFailure(hr, "Failed to set variable value."); 967 ExitOnFailure(hr, "Failed to set variable value.");
991 968
992 ReleaseNullStrSecure(scz); 969 ReleaseNullStrSecure(scz);
@@ -996,12 +973,8 @@ extern "C" HRESULT VariableDeserialize(
996 ExitOnFailure(hr, "Unsupported variable type."); 973 ExitOnFailure(hr, "Unsupported variable type.");
997 } 974 }
998 975
999 // Read variable literal flag.
1000 hr = BuffReadNumber(pbBuffer, cbBuffer, piBuffer, (DWORD*)&fLiteral);
1001 ExitOnFailure(hr, "Failed to read variable literal flag.");
1002
1003 // Set variable. 976 // Set variable.
1004 hr = SetVariableValue(pVariables, sczName, &value, fLiteral, fWasPersisted ? SET_VARIABLE_OVERRIDE_PERSISTED_BUILTINS : SET_VARIABLE_ANY, FALSE); 977 hr = SetVariableValue(pVariables, sczName, &value, fWasPersisted ? SET_VARIABLE_OVERRIDE_PERSISTED_BUILTINS : SET_VARIABLE_ANY, FALSE);
1005 ExitOnFailure(hr, "Failed to set variable."); 978 ExitOnFailure(hr, "Failed to set variable.");
1006 979
1007 // Clean up. 980 // Clean up.
@@ -1525,7 +1498,6 @@ static HRESULT SetVariableValue(
1525 __in BURN_VARIABLES* pVariables, 1498 __in BURN_VARIABLES* pVariables,
1526 __in_z LPCWSTR wzVariable, 1499 __in_z LPCWSTR wzVariable,
1527 __in BURN_VARIANT* pVariant, 1500 __in BURN_VARIANT* pVariant,
1528 __in BOOL fLiteral,
1529 __in SET_VARIABLE setBuiltin, 1501 __in SET_VARIABLE setBuiltin,
1530 __in BOOL fLog 1502 __in BOOL fLog
1531 ) 1503 )
@@ -1587,6 +1559,7 @@ static HRESULT SetVariableValue(
1587 LogStringLine(REPORT_STANDARD, "Setting numeric variable '%ls' to value %lld", wzVariable, pVariant->llValue); 1559 LogStringLine(REPORT_STANDARD, "Setting numeric variable '%ls' to value %lld", wzVariable, pVariant->llValue);
1588 break; 1560 break;
1589 1561
1562 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
1590 case BURN_VARIANT_TYPE_STRING: 1563 case BURN_VARIANT_TYPE_STRING:
1591 if (!pVariant->sczValue) 1564 if (!pVariant->sczValue)
1592 { 1565 {
@@ -1594,7 +1567,7 @@ static HRESULT SetVariableValue(
1594 } 1567 }
1595 else 1568 else
1596 { 1569 {
1597 LogStringLine(REPORT_STANDARD, "Setting string variable '%ls' to value '%ls'", wzVariable, pVariant->sczValue); 1570 LogStringLine(REPORT_STANDARD, "Setting %ls variable '%ls' to value '%ls'", BURN_VARIANT_TYPE_FORMATTED == pVariant->Type ? L"formatted" : L"string", wzVariable, pVariant->sczValue);
1598 } 1571 }
1599 break; 1572 break;
1600 1573
@@ -1613,9 +1586,6 @@ static HRESULT SetVariableValue(
1613 hr = BVariantSetValue(&pVariables->rgVariables[iVariable].Value, pVariant); 1586 hr = BVariantSetValue(&pVariables->rgVariables[iVariable].Value, pVariant);
1614 ExitOnFailure(hr, "Failed to set value of variable: %ls", wzVariable); 1587 ExitOnFailure(hr, "Failed to set value of variable: %ls", wzVariable);
1615 1588
1616 // Update variable literal flag.
1617 pVariables->rgVariables[iVariable].fLiteral = fLiteral;
1618
1619LExit: 1589LExit:
1620 ::LeaveCriticalSection(&pVariables->csAccess); 1590 ::LeaveCriticalSection(&pVariables->csAccess);
1621 1591
@@ -1827,7 +1797,7 @@ static HRESULT InitializeVariableComputerName(
1827 } 1797 }
1828 1798
1829 // set value 1799 // set value
1830 hr = BVariantSetString(pValue, wzComputerName, 0); 1800 hr = BVariantSetString(pValue, wzComputerName, 0, FALSE);
1831 ExitOnFailure(hr, "Failed to set variant value."); 1801 ExitOnFailure(hr, "Failed to set variant value.");
1832 1802
1833LExit: 1803LExit:
@@ -1875,7 +1845,7 @@ static HRESULT InitializeVariableCsidlFolder(
1875 ExitOnRootFailure(hr, "Failed to get shell folder."); 1845 ExitOnRootFailure(hr, "Failed to get shell folder.");
1876 1846
1877 // set value 1847 // set value
1878 hr = BVariantSetString(pValue, sczPath, 0); 1848 hr = BVariantSetString(pValue, sczPath, 0, FALSE);
1879 ExitOnFailure(hr, "Failed to set variant value."); 1849 ExitOnFailure(hr, "Failed to set variant value.");
1880 1850
1881LExit: 1851LExit:
@@ -1901,7 +1871,7 @@ static HRESULT InitializeVariableTempFolder(
1901 } 1871 }
1902 1872
1903 // set value 1873 // set value
1904 hr = BVariantSetString(pValue, wzPath, 0); 1874 hr = BVariantSetString(pValue, wzPath, 0, FALSE);
1905 ExitOnFailure(hr, "Failed to set variant value."); 1875 ExitOnFailure(hr, "Failed to set variant value.");
1906 1876
1907LExit: 1877LExit:
@@ -1972,7 +1942,7 @@ static HRESULT InitializeVariableSystemFolder(
1972 } 1942 }
1973 1943
1974 // set value 1944 // set value
1975 hr = BVariantSetString(pValue, wzSystemFolder, 0); 1945 hr = BVariantSetString(pValue, wzSystemFolder, 0, FALSE);
1976 ExitOnFailure(hr, "Failed to set system folder variant value."); 1946 ExitOnFailure(hr, "Failed to set system folder variant value.");
1977 1947
1978LExit: 1948LExit:
@@ -2003,7 +1973,7 @@ static HRESULT InitializeVariableWindowsVolumeFolder(
2003 } 1973 }
2004 1974
2005 // set value 1975 // set value
2006 hr = BVariantSetString(pValue, wzVolumePath, 0); 1976 hr = BVariantSetString(pValue, wzVolumePath, 0, FALSE);
2007 ExitOnFailure(hr, "Failed to set variant value."); 1977 ExitOnFailure(hr, "Failed to set variant value.");
2008 1978
2009LExit: 1979LExit:
@@ -2130,7 +2100,7 @@ static HRESULT InitializeVariableString(
2130 LPCWSTR wzValue = (LPCWSTR)dwpData; 2100 LPCWSTR wzValue = (LPCWSTR)dwpData;
2131 2101
2132 // set value 2102 // set value
2133 hr = BVariantSetString(pValue, wzValue, 0); 2103 hr = BVariantSetString(pValue, wzValue, 0, FALSE);
2134 ExitOnFailure(hr, "Failed to set variant value."); 2104 ExitOnFailure(hr, "Failed to set variant value.");
2135 2105
2136LExit: 2106LExit:
@@ -2176,7 +2146,7 @@ static HRESULT InitializeVariableRegistryFolder(
2176 ExitOnFailure(hr, "Failed to get 64-bit folder."); 2146 ExitOnFailure(hr, "Failed to get 64-bit folder.");
2177 2147
2178 // set value 2148 // set value
2179 hr = BVariantSetString(pValue, sczPath, 0); 2149 hr = BVariantSetString(pValue, sczPath, 0, FALSE);
2180 ExitOnFailure(hr, "Failed to set variant value."); 2150 ExitOnFailure(hr, "Failed to set variant value.");
2181 2151
2182LExit: 2152LExit:
@@ -2212,7 +2182,7 @@ static HRESULT InitializeVariable6432Folder(
2212 } 2182 }
2213 2183
2214 // set value 2184 // set value
2215 hr = BVariantSetString(pValue, sczPath, 0); 2185 hr = BVariantSetString(pValue, sczPath, 0, FALSE);
2216 ExitOnFailure(hr, "Failed to set variant value."); 2186 ExitOnFailure(hr, "Failed to set variant value.");
2217 2187
2218LExit: 2188LExit:
@@ -2249,7 +2219,7 @@ static HRESULT InitializeVariableDate(
2249 } 2219 }
2250 2220
2251 // set value 2221 // set value
2252 hr = BVariantSetString(pValue, sczDate, cchDate); 2222 hr = BVariantSetString(pValue, sczDate, cchDate, FALSE);
2253 ExitOnFailure(hr, "Failed to set variant value."); 2223 ExitOnFailure(hr, "Failed to set variant value.");
2254 2224
2255LExit: 2225LExit:
@@ -2266,7 +2236,7 @@ static HRESULT InitializeVariableInstallerName(
2266 HRESULT hr = S_OK; 2236 HRESULT hr = S_OK;
2267 2237
2268 // set value 2238 // set value
2269 hr = BVariantSetString(pValue, L"WiX Burn", 0); 2239 hr = BVariantSetString(pValue, L"WiX Burn", 0, FALSE);
2270 ExitOnFailure(hr, "Failed to set variant value."); 2240 ExitOnFailure(hr, "Failed to set variant value.");
2271 2241
2272LExit: 2242LExit:
@@ -2285,7 +2255,7 @@ static HRESULT InitializeVariableInstallerVersion(
2285 ExitOnFailure(hr, "Failed to copy the engine version."); 2255 ExitOnFailure(hr, "Failed to copy the engine version.");
2286 2256
2287 // set value 2257 // set value
2288 hr = BVariantSetString(pValue, sczVersion, 0); 2258 hr = BVariantSetString(pValue, sczVersion, 0, FALSE);
2289 ExitOnFailure(hr, "Failed to set variant value."); 2259 ExitOnFailure(hr, "Failed to set variant value.");
2290 2260
2291LExit: 2261LExit:
@@ -2325,7 +2295,7 @@ static HRESULT InitializeVariableLogonUser(
2325 } 2295 }
2326 2296
2327 // set value 2297 // set value
2328 hr = BVariantSetString(pValue, wzUserName, 0); 2298 hr = BVariantSetString(pValue, wzUserName, 0, FALSE);
2329 ExitOnFailure(hr, "Failed to set variant value."); 2299 ExitOnFailure(hr, "Failed to set variant value.");
2330 2300
2331LExit: 2301LExit: