aboutsummaryrefslogtreecommitdiff
path: root/src/engine/variant.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/variant.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/variant.cpp')
-rw-r--r--src/engine/variant.cpp34
1 files changed, 26 insertions, 8 deletions
diff --git a/src/engine/variant.cpp b/src/engine/variant.cpp
index 5e9bd29a..43bc19c4 100644
--- a/src/engine/variant.cpp
+++ b/src/engine/variant.cpp
@@ -32,7 +32,8 @@ extern "C" void BVariantUninitialize(
32 __in BURN_VARIANT* pVariant 32 __in BURN_VARIANT* pVariant
33 ) 33 )
34{ 34{
35 if (BURN_VARIANT_TYPE_STRING == pVariant->Type) 35 if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type ||
36 BURN_VARIANT_TYPE_STRING == pVariant->Type)
36 { 37 {
37 StrSecureZeroFreeString(pVariant->sczValue); 38 StrSecureZeroFreeString(pVariant->sczValue);
38 } 39 }
@@ -53,6 +54,7 @@ extern "C" HRESULT BVariantGetNumeric(
53 case BURN_VARIANT_TYPE_NUMERIC: 54 case BURN_VARIANT_TYPE_NUMERIC:
54 BVariantRetrieveNumeric(pVariant, pllValue); 55 BVariantRetrieveNumeric(pVariant, pllValue);
55 break; 56 break;
57 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
56 case BURN_VARIANT_TYPE_STRING: 58 case BURN_VARIANT_TYPE_STRING:
57 hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); 59 hr = BVariantRetrieveDecryptedString(pVariant, &sczValue);
58 if (SUCCEEDED(hr)) 60 if (SUCCEEDED(hr))
@@ -97,6 +99,7 @@ extern "C" HRESULT BVariantGetString(
97 } 99 }
98 SecureZeroMemory(&llValue, sizeof(llValue)); 100 SecureZeroMemory(&llValue, sizeof(llValue));
99 break; 101 break;
102 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
100 case BURN_VARIANT_TYPE_STRING: 103 case BURN_VARIANT_TYPE_STRING:
101 hr = BVariantRetrieveDecryptedString(pVariant, psczValue); 104 hr = BVariantRetrieveDecryptedString(pVariant, psczValue);
102 break; 105 break;
@@ -136,6 +139,7 @@ extern "C" HRESULT BVariantGetVersion(
136 case BURN_VARIANT_TYPE_NUMERIC: 139 case BURN_VARIANT_TYPE_NUMERIC:
137 BVariantRetrieveNumeric(pVariant, (LONGLONG*)pqwValue); 140 BVariantRetrieveNumeric(pVariant, (LONGLONG*)pqwValue);
138 break; 141 break;
142 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
139 case BURN_VARIANT_TYPE_STRING: 143 case BURN_VARIANT_TYPE_STRING:
140 hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); 144 hr = BVariantRetrieveDecryptedString(pVariant, &sczValue);
141 if (SUCCEEDED(hr)) 145 if (SUCCEEDED(hr))
@@ -167,7 +171,8 @@ extern "C" HRESULT BVariantSetNumeric(
167 HRESULT hr = S_OK; 171 HRESULT hr = S_OK;
168 BOOL fEncrypt = pVariant->fEncryptString; 172 BOOL fEncrypt = pVariant->fEncryptString;
169 173
170 if (BURN_VARIANT_TYPE_STRING == pVariant->Type) 174 if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type ||
175 BURN_VARIANT_TYPE_STRING == pVariant->Type)
171 { 176 {
172 StrSecureZeroFreeString(pVariant->sczValue); 177 StrSecureZeroFreeString(pVariant->sczValue);
173 } 178 }
@@ -182,7 +187,8 @@ extern "C" HRESULT BVariantSetNumeric(
182extern "C" HRESULT BVariantSetString( 187extern "C" HRESULT BVariantSetString(
183 __in BURN_VARIANT* pVariant, 188 __in BURN_VARIANT* pVariant,
184 __in_z_opt LPCWSTR wzValue, 189 __in_z_opt LPCWSTR wzValue,
185 __in DWORD_PTR cchValue 190 __in DWORD_PTR cchValue,
191 __in BOOL fFormatted
186 ) 192 )
187{ 193{
188 HRESULT hr = S_OK; 194 HRESULT hr = S_OK;
@@ -194,7 +200,8 @@ extern "C" HRESULT BVariantSetString(
194 } 200 }
195 else // assign the value. 201 else // assign the value.
196 { 202 {
197 if (BURN_VARIANT_TYPE_STRING != pVariant->Type) 203 if (BURN_VARIANT_TYPE_FORMATTED != pVariant->Type &&
204 BURN_VARIANT_TYPE_STRING != pVariant->Type)
198 { 205 {
199 memset(pVariant, 0, sizeof(BURN_VARIANT)); 206 memset(pVariant, 0, sizeof(BURN_VARIANT));
200 } 207 }
@@ -207,7 +214,7 @@ extern "C" HRESULT BVariantSetString(
207 hr = StrAllocStringSecure(&pVariant->sczValue, wzValue, cchValue); 214 hr = StrAllocStringSecure(&pVariant->sczValue, wzValue, cchValue);
208 ExitOnFailure(hr, "Failed to copy string."); 215 ExitOnFailure(hr, "Failed to copy string.");
209 216
210 pVariant->Type = BURN_VARIANT_TYPE_STRING; 217 pVariant->Type = fFormatted ? BURN_VARIANT_TYPE_FORMATTED : BURN_VARIANT_TYPE_STRING;
211 } 218 }
212 219
213LExit: 220LExit:
@@ -223,7 +230,8 @@ extern "C" HRESULT BVariantSetVersion(
223 HRESULT hr = S_OK; 230 HRESULT hr = S_OK;
224 BOOL fEncryptValue = pVariant->fEncryptString; 231 BOOL fEncryptValue = pVariant->fEncryptString;
225 232
226 if (BURN_VARIANT_TYPE_STRING == pVariant->Type) 233 if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type ||
234 BURN_VARIANT_TYPE_STRING == pVariant->Type)
227 { 235 {
228 StrSecureZeroFreeString(pVariant->sczValue); 236 StrSecureZeroFreeString(pVariant->sczValue);
229 } 237 }
@@ -259,11 +267,12 @@ extern "C" HRESULT BVariantSetValue(
259 } 267 }
260 SecureZeroMemory(&llValue, sizeof(llValue)); 268 SecureZeroMemory(&llValue, sizeof(llValue));
261 break; 269 break;
270 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
262 case BURN_VARIANT_TYPE_STRING: 271 case BURN_VARIANT_TYPE_STRING:
263 hr = BVariantGetString(pValue, &sczValue); 272 hr = BVariantGetString(pValue, &sczValue);
264 if (SUCCEEDED(hr)) 273 if (SUCCEEDED(hr))
265 { 274 {
266 hr = BVariantSetString(pVariant, sczValue, 0); 275 hr = BVariantSetString(pVariant, sczValue, 0, BURN_VARIANT_TYPE_FORMATTED == pValue->Type);
267 } 276 }
268 StrSecureZeroFreeString(sczValue); 277 StrSecureZeroFreeString(sczValue);
269 break; 278 break;
@@ -310,11 +319,12 @@ extern "C" HRESULT BVariantCopy(
310 } 319 }
311 SecureZeroMemory(&llValue, sizeof(llValue)); 320 SecureZeroMemory(&llValue, sizeof(llValue));
312 break; 321 break;
322 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
313 case BURN_VARIANT_TYPE_STRING: 323 case BURN_VARIANT_TYPE_STRING:
314 hr = BVariantGetString(pSource, &sczValue); 324 hr = BVariantGetString(pSource, &sczValue);
315 if (SUCCEEDED(hr)) 325 if (SUCCEEDED(hr))
316 { 326 {
317 hr = BVariantSetString(pTarget, sczValue, 0); 327 hr = BVariantSetString(pTarget, sczValue, 0, BURN_VARIANT_TYPE_FORMATTED == pSource->Type);
318 } 328 }
319 StrSecureZeroFreeString(sczValue); 329 StrSecureZeroFreeString(sczValue);
320 break; 330 break;
@@ -350,6 +360,12 @@ extern "C" HRESULT BVariantChangeType(
350 { 360 {
351 ExitFunction(); // variant already is of the requested type 361 ExitFunction(); // variant already is of the requested type
352 } 362 }
363 else if (BURN_VARIANT_TYPE_FORMATTED == pVariant->Type && BURN_VARIANT_TYPE_STRING == type ||
364 BURN_VARIANT_TYPE_STRING == pVariant->Type && BURN_VARIANT_TYPE_FORMATTED == type)
365 {
366 pVariant->Type = type;
367 ExitFunction();
368 }
353 369
354 switch (type) 370 switch (type)
355 { 371 {
@@ -359,6 +375,7 @@ extern "C" HRESULT BVariantChangeType(
359 case BURN_VARIANT_TYPE_NUMERIC: 375 case BURN_VARIANT_TYPE_NUMERIC:
360 hr = BVariantGetNumeric(pVariant, &variant.llValue); 376 hr = BVariantGetNumeric(pVariant, &variant.llValue);
361 break; 377 break;
378 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
362 case BURN_VARIANT_TYPE_STRING: 379 case BURN_VARIANT_TYPE_STRING:
363 hr = BVariantGetString(pVariant, &variant.sczValue); 380 hr = BVariantGetString(pVariant, &variant.sczValue);
364 break; 381 break;
@@ -400,6 +417,7 @@ extern "C" HRESULT BVariantSetEncryption(
400 case BURN_VARIANT_TYPE_VERSION: 417 case BURN_VARIANT_TYPE_VERSION:
401 hr = S_OK; 418 hr = S_OK;
402 break; 419 break;
420 case BURN_VARIANT_TYPE_FORMATTED: __fallthrough;
403 case BURN_VARIANT_TYPE_STRING: 421 case BURN_VARIANT_TYPE_STRING:
404 hr = BVariantEncryptString(pVariant, fEncrypt); 422 hr = BVariantEncryptString(pVariant, fEncrypt);
405 break; 423 break;