diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2020-10-17 19:12:21 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2020-10-24 20:07:21 -0500 |
commit | 273c69f34311f4f4e5f6b5896e71d0788f12d96a (patch) | |
tree | 4cf8f42f3ecfa9341a41686b74aa5e48068ede87 /src/engine/variant.cpp | |
parent | 3f8e35223216ebbe7f6683a5031a5a97bbc66d5a (diff) | |
download | wix-273c69f34311f4f4e5f6b5896e71d0788f12d96a.tar.gz wix-273c69f34311f4f4e5f6b5896e71d0788f12d96a.tar.bz2 wix-273c69f34311f4f4e5f6b5896e71d0788f12d96a.zip |
WIXFEAT:6210 Change data type of versions to strings.
Diffstat (limited to 'src/engine/variant.cpp')
-rw-r--r-- | src/engine/variant.cpp | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/src/engine/variant.cpp b/src/engine/variant.cpp index 43bc19c4..28578691 100644 --- a/src/engine/variant.cpp +++ b/src/engine/variant.cpp | |||
@@ -23,7 +23,7 @@ static HRESULT BVariantRetrieveDecryptedString( | |||
23 | 23 | ||
24 | static void BVariantRetrieveVersion( | 24 | static void BVariantRetrieveVersion( |
25 | __in BURN_VARIANT* pVariant, | 25 | __in BURN_VARIANT* pVariant, |
26 | __out DWORD64* pqwValue | 26 | __out VERUTIL_VERSION** ppValue |
27 | ); | 27 | ); |
28 | 28 | ||
29 | // function definitions | 29 | // function definitions |
@@ -48,6 +48,7 @@ extern "C" HRESULT BVariantGetNumeric( | |||
48 | { | 48 | { |
49 | HRESULT hr = S_OK; | 49 | HRESULT hr = S_OK; |
50 | LPWSTR sczValue = NULL; | 50 | LPWSTR sczValue = NULL; |
51 | VERUTIL_VERSION* pVersionValue = NULL; | ||
51 | 52 | ||
52 | switch (pVariant->Type) | 53 | switch (pVariant->Type) |
53 | { | 54 | { |
@@ -68,7 +69,13 @@ extern "C" HRESULT BVariantGetNumeric( | |||
68 | StrSecureZeroFreeString(sczValue); | 69 | StrSecureZeroFreeString(sczValue); |
69 | break; | 70 | break; |
70 | case BURN_VARIANT_TYPE_VERSION: | 71 | case BURN_VARIANT_TYPE_VERSION: |
71 | BVariantRetrieveVersion(pVariant, (DWORD64*)pllValue); | 72 | BVariantRetrieveVersion(pVariant, &pVersionValue); |
73 | |||
74 | hr = StrStringToInt64(pVersionValue->sczVersion, 0, pllValue); | ||
75 | if (FAILED(hr)) | ||
76 | { | ||
77 | hr = DISP_E_TYPEMISMATCH; | ||
78 | } | ||
72 | break; | 79 | break; |
73 | default: | 80 | default: |
74 | hr = E_INVALIDARG; | 81 | hr = E_INVALIDARG; |
@@ -86,7 +93,7 @@ extern "C" HRESULT BVariantGetString( | |||
86 | { | 93 | { |
87 | HRESULT hr = S_OK; | 94 | HRESULT hr = S_OK; |
88 | LONGLONG llValue = 0; | 95 | LONGLONG llValue = 0; |
89 | DWORD64 qwValue = 0; | 96 | VERUTIL_VERSION* pVersionValue = NULL; |
90 | 97 | ||
91 | switch (pVariant->Type) | 98 | switch (pVariant->Type) |
92 | { | 99 | { |
@@ -104,17 +111,9 @@ extern "C" HRESULT BVariantGetString( | |||
104 | hr = BVariantRetrieveDecryptedString(pVariant, psczValue); | 111 | hr = BVariantRetrieveDecryptedString(pVariant, psczValue); |
105 | break; | 112 | break; |
106 | case BURN_VARIANT_TYPE_VERSION: | 113 | case BURN_VARIANT_TYPE_VERSION: |
107 | BVariantRetrieveVersion(pVariant, &qwValue); | 114 | BVariantRetrieveVersion(pVariant, &pVersionValue); |
108 | if (SUCCEEDED(hr)) | 115 | |
109 | { | 116 | hr = StrAllocStringSecure(psczValue, pVersionValue->sczVersion, 0); |
110 | hr = StrAllocFormattedSecure(psczValue, L"%hu.%hu.%hu.%hu", | ||
111 | (WORD)(qwValue >> 48), | ||
112 | (WORD)(qwValue >> 32), | ||
113 | (WORD)(qwValue >> 16), | ||
114 | (WORD)qwValue); | ||
115 | ExitOnFailure(hr, "Failed to convert version to string."); | ||
116 | } | ||
117 | SecureZeroMemory(&qwValue, sizeof(qwValue)); | ||
118 | break; | 117 | break; |
119 | default: | 118 | default: |
120 | hr = E_INVALIDARG; | 119 | hr = E_INVALIDARG; |
@@ -125,26 +124,30 @@ LExit: | |||
125 | return hr; | 124 | return hr; |
126 | } | 125 | } |
127 | 126 | ||
128 | // The contents of pqwValue may be sensitive, should keep encrypted and SecureZeroMemory. | 127 | // The contents of ppValue may be sensitive, should keep encrypted and SecureZeroMemory. |
129 | extern "C" HRESULT BVariantGetVersion( | 128 | extern "C" HRESULT BVariantGetVersion( |
130 | __in BURN_VARIANT* pVariant, | 129 | __in BURN_VARIANT* pVariant, |
131 | __out DWORD64* pqwValue | 130 | __out VERUTIL_VERSION** ppValue |
132 | ) | 131 | ) |
133 | { | 132 | { |
134 | HRESULT hr = S_OK; | 133 | HRESULT hr = S_OK; |
134 | LONGLONG llValue = 0; | ||
135 | LPWSTR sczValue = NULL; | 135 | LPWSTR sczValue = NULL; |
136 | VERUTIL_VERSION* pValue = NULL; | ||
136 | 137 | ||
137 | switch (pVariant->Type) | 138 | switch (pVariant->Type) |
138 | { | 139 | { |
139 | case BURN_VARIANT_TYPE_NUMERIC: | 140 | case BURN_VARIANT_TYPE_NUMERIC: |
140 | BVariantRetrieveNumeric(pVariant, (LONGLONG*)pqwValue); | 141 | BVariantRetrieveNumeric(pVariant, &llValue); |
142 | |||
143 | hr = VerVersionFromQword(llValue, ppValue); | ||
141 | break; | 144 | break; |
142 | case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; | 145 | case BURN_VARIANT_TYPE_FORMATTED: __fallthrough; |
143 | case BURN_VARIANT_TYPE_STRING: | 146 | case BURN_VARIANT_TYPE_STRING: |
144 | hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); | 147 | hr = BVariantRetrieveDecryptedString(pVariant, &sczValue); |
145 | if (SUCCEEDED(hr)) | 148 | if (SUCCEEDED(hr)) |
146 | { | 149 | { |
147 | hr = FileVersionFromStringEx(sczValue, 0, pqwValue); | 150 | hr = VerParseVersion(sczValue, 0, FALSE, ppValue); |
148 | if (FAILED(hr)) | 151 | if (FAILED(hr)) |
149 | { | 152 | { |
150 | hr = DISP_E_TYPEMISMATCH; | 153 | hr = DISP_E_TYPEMISMATCH; |
@@ -153,7 +156,9 @@ extern "C" HRESULT BVariantGetVersion( | |||
153 | StrSecureZeroFreeString(sczValue); | 156 | StrSecureZeroFreeString(sczValue); |
154 | break; | 157 | break; |
155 | case BURN_VARIANT_TYPE_VERSION: | 158 | case BURN_VARIANT_TYPE_VERSION: |
156 | BVariantRetrieveVersion(pVariant, pqwValue); | 159 | BVariantRetrieveVersion(pVariant, &pValue); |
160 | |||
161 | hr = VerCopyVersion(pValue, ppValue); | ||
157 | break; | 162 | break; |
158 | default: | 163 | default: |
159 | hr = E_INVALIDARG; | 164 | hr = E_INVALIDARG; |
@@ -224,7 +229,7 @@ LExit: | |||
224 | 229 | ||
225 | extern "C" HRESULT BVariantSetVersion( | 230 | extern "C" HRESULT BVariantSetVersion( |
226 | __in BURN_VARIANT* pVariant, | 231 | __in BURN_VARIANT* pVariant, |
227 | __in DWORD64 qwValue | 232 | __in VERUTIL_VERSION* pValue |
228 | ) | 233 | ) |
229 | { | 234 | { |
230 | HRESULT hr = S_OK; | 235 | HRESULT hr = S_OK; |
@@ -236,7 +241,7 @@ extern "C" HRESULT BVariantSetVersion( | |||
236 | StrSecureZeroFreeString(pVariant->sczValue); | 241 | StrSecureZeroFreeString(pVariant->sczValue); |
237 | } | 242 | } |
238 | memset(pVariant, 0, sizeof(BURN_VARIANT)); | 243 | memset(pVariant, 0, sizeof(BURN_VARIANT)); |
239 | pVariant->qwValue = qwValue; | 244 | hr = VerCopyVersion(pValue, &pVariant->pValue); |
240 | pVariant->Type = BURN_VARIANT_TYPE_VERSION; | 245 | pVariant->Type = BURN_VARIANT_TYPE_VERSION; |
241 | BVariantSetEncryption(pVariant, fEncryptValue); | 246 | BVariantSetEncryption(pVariant, fEncryptValue); |
242 | 247 | ||
@@ -251,7 +256,7 @@ extern "C" HRESULT BVariantSetValue( | |||
251 | HRESULT hr = S_OK; | 256 | HRESULT hr = S_OK; |
252 | LONGLONG llValue = 0; | 257 | LONGLONG llValue = 0; |
253 | LPWSTR sczValue = NULL; | 258 | LPWSTR sczValue = NULL; |
254 | DWORD64 qwValue = 0; | 259 | VERUTIL_VERSION* pVersionValue = NULL; |
255 | BOOL fEncrypt = pVariant->fEncryptString; | 260 | BOOL fEncrypt = pVariant->fEncryptString; |
256 | 261 | ||
257 | switch (pValue->Type) | 262 | switch (pValue->Type) |
@@ -277,12 +282,11 @@ extern "C" HRESULT BVariantSetValue( | |||
277 | StrSecureZeroFreeString(sczValue); | 282 | StrSecureZeroFreeString(sczValue); |
278 | break; | 283 | break; |
279 | case BURN_VARIANT_TYPE_VERSION: | 284 | case BURN_VARIANT_TYPE_VERSION: |
280 | hr = BVariantGetVersion(pValue, &qwValue); | 285 | hr = BVariantGetVersion(pValue, &pVersionValue); |
281 | if (SUCCEEDED(hr)) | 286 | if (SUCCEEDED(hr)) |
282 | { | 287 | { |
283 | hr = BVariantSetVersion(pVariant, qwValue); | 288 | hr = BVariantSetVersion(pVariant, pVersionValue); |
284 | } | 289 | } |
285 | SecureZeroMemory(&qwValue, sizeof(qwValue)); | ||
286 | break; | 290 | break; |
287 | default: | 291 | default: |
288 | hr = E_INVALIDARG; | 292 | hr = E_INVALIDARG; |
@@ -303,7 +307,7 @@ extern "C" HRESULT BVariantCopy( | |||
303 | HRESULT hr = S_OK; | 307 | HRESULT hr = S_OK; |
304 | LONGLONG llValue = 0; | 308 | LONGLONG llValue = 0; |
305 | LPWSTR sczValue = NULL; | 309 | LPWSTR sczValue = NULL; |
306 | DWORD64 qwValue = 0; | 310 | VERUTIL_VERSION* pVersionValue = 0; |
307 | 311 | ||
308 | BVariantUninitialize(pTarget); | 312 | BVariantUninitialize(pTarget); |
309 | 313 | ||
@@ -329,12 +333,11 @@ extern "C" HRESULT BVariantCopy( | |||
329 | StrSecureZeroFreeString(sczValue); | 333 | StrSecureZeroFreeString(sczValue); |
330 | break; | 334 | break; |
331 | case BURN_VARIANT_TYPE_VERSION: | 335 | case BURN_VARIANT_TYPE_VERSION: |
332 | hr = BVariantGetVersion(pSource, &qwValue); | 336 | hr = BVariantGetVersion(pSource, &pVersionValue); |
333 | if (SUCCEEDED(hr)) | 337 | if (SUCCEEDED(hr)) |
334 | { | 338 | { |
335 | hr = BVariantSetVersion(pTarget, qwValue); | 339 | hr = BVariantSetVersion(pTarget, pVersionValue); |
336 | } | 340 | } |
337 | SecureZeroMemory(&qwValue, sizeof(qwValue)); | ||
338 | break; | 341 | break; |
339 | default: | 342 | default: |
340 | hr = E_INVALIDARG; | 343 | hr = E_INVALIDARG; |
@@ -380,13 +383,13 @@ extern "C" HRESULT BVariantChangeType( | |||
380 | hr = BVariantGetString(pVariant, &variant.sczValue); | 383 | hr = BVariantGetString(pVariant, &variant.sczValue); |
381 | break; | 384 | break; |
382 | case BURN_VARIANT_TYPE_VERSION: | 385 | case BURN_VARIANT_TYPE_VERSION: |
383 | hr = BVariantGetVersion(pVariant, &variant.qwValue); | 386 | hr = BVariantGetVersion(pVariant, &variant.pValue); |
384 | break; | 387 | break; |
385 | default: | 388 | default: |
386 | ExitFunction1(hr = E_INVALIDARG); | 389 | ExitFunction1(hr = E_INVALIDARG); |
387 | } | 390 | } |
388 | ExitOnFailure(hr, "Failed to copy variant value."); | ||
389 | variant.Type = type; | 391 | variant.Type = type; |
392 | ExitOnFailure(hr, "Failed to copy variant value."); | ||
390 | 393 | ||
391 | BVariantUninitialize(pVariant); | 394 | BVariantUninitialize(pVariant); |
392 | memcpy_s(pVariant, sizeof(BURN_VARIANT), &variant, sizeof(BURN_VARIANT)); | 395 | memcpy_s(pVariant, sizeof(BURN_VARIANT), &variant, sizeof(BURN_VARIANT)); |
@@ -524,10 +527,10 @@ LExit: | |||
524 | 527 | ||
525 | static void BVariantRetrieveVersion( | 528 | static void BVariantRetrieveVersion( |
526 | __in BURN_VARIANT* pVariant, | 529 | __in BURN_VARIANT* pVariant, |
527 | __out DWORD64* pqwValue | 530 | __out VERUTIL_VERSION** ppValue |
528 | ) | 531 | ) |
529 | { | 532 | { |
530 | Assert(NULL != pqwValue); | 533 | Assert(ppValue); |
531 | 534 | ||
532 | *pqwValue = pVariant->qwValue; | 535 | *ppValue = pVariant->pValue; |
533 | } | 536 | } |