diff options
Diffstat (limited to '')
-rw-r--r-- | src/dutil/jsonutil.cpp | 79 |
1 files changed, 47 insertions, 32 deletions
diff --git a/src/dutil/jsonutil.cpp b/src/dutil/jsonutil.cpp index ba088705..3450ba59 100644 --- a/src/dutil/jsonutil.cpp +++ b/src/dutil/jsonutil.cpp | |||
@@ -2,6 +2,21 @@ | |||
2 | 2 | ||
3 | #include "precomp.h" | 3 | #include "precomp.h" |
4 | 4 | ||
5 | |||
6 | // Exit macros | ||
7 | #define JsonExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_JSONUTIL, x, s, __VA_ARGS__) | ||
8 | #define JsonExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_JSONUTIL, x, s, __VA_ARGS__) | ||
9 | #define JsonExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_JSONUTIL, x, s, __VA_ARGS__) | ||
10 | #define JsonExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_JSONUTIL, x, s, __VA_ARGS__) | ||
11 | #define JsonExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_JSONUTIL, x, s, __VA_ARGS__) | ||
12 | #define JsonExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_JSONUTIL, x, s, __VA_ARGS__) | ||
13 | #define JsonExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_JSONUTIL, p, x, e, s, __VA_ARGS__) | ||
14 | #define JsonExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_JSONUTIL, p, x, s, __VA_ARGS__) | ||
15 | #define JsonExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_JSONUTIL, p, x, e, s, __VA_ARGS__) | ||
16 | #define JsonExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_JSONUTIL, p, x, s, __VA_ARGS__) | ||
17 | #define JsonExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_JSONUTIL, e, x, s, __VA_ARGS__) | ||
18 | #define JsonExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_JSONUTIL, g, x, s, __VA_ARGS__) | ||
19 | |||
5 | const DWORD JSON_STACK_INCREMENT = 5; | 20 | const DWORD JSON_STACK_INCREMENT = 5; |
6 | 21 | ||
7 | // Prototypes | 22 | // Prototypes |
@@ -44,7 +59,7 @@ DAPI_(HRESULT) JsonInitializeReader( | |||
44 | ::InitializeCriticalSection(&pReader->cs); | 59 | ::InitializeCriticalSection(&pReader->cs); |
45 | 60 | ||
46 | hr = StrAllocString(&pReader->sczJson, wzJson, 0); | 61 | hr = StrAllocString(&pReader->sczJson, wzJson, 0); |
47 | ExitOnFailure(hr, "Failed to allocate json string."); | 62 | JsonExitOnFailure(hr, "Failed to allocate json string."); |
48 | 63 | ||
49 | pReader->pwz = pReader->sczJson; | 64 | pReader->pwz = pReader->sczJson; |
50 | 65 | ||
@@ -153,7 +168,7 @@ DAPI_(HRESULT) JsonReadNext( | |||
153 | { | 168 | { |
154 | ExitFunction(); | 169 | ExitFunction(); |
155 | } | 170 | } |
156 | ExitOnFailure(hr, "Failed to get next token."); | 171 | JsonExitOnFailure(hr, "Failed to get next token."); |
157 | 172 | ||
158 | if (JSON_TOKEN_VALUE == *pToken) | 173 | if (JSON_TOKEN_VALUE == *pToken) |
159 | { | 174 | { |
@@ -214,10 +229,10 @@ DAPI_(HRESULT) JsonWriteBool( | |||
214 | LPWSTR sczValue = NULL; | 229 | LPWSTR sczValue = NULL; |
215 | 230 | ||
216 | hr = StrAllocString(&sczValue, fValue ? L"true" : L"false", 0); | 231 | hr = StrAllocString(&sczValue, fValue ? L"true" : L"false", 0); |
217 | ExitOnFailure(hr, "Failed to convert boolean to string."); | 232 | JsonExitOnFailure(hr, "Failed to convert boolean to string."); |
218 | 233 | ||
219 | hr = DoValue(pWriter, sczValue); | 234 | hr = DoValue(pWriter, sczValue); |
220 | ExitOnFailure(hr, "Failed to add boolean to JSON."); | 235 | JsonExitOnFailure(hr, "Failed to add boolean to JSON."); |
221 | 236 | ||
222 | LExit: | 237 | LExit: |
223 | ReleaseStr(sczValue); | 238 | ReleaseStr(sczValue); |
@@ -234,10 +249,10 @@ DAPI_(HRESULT) JsonWriteNumber( | |||
234 | LPWSTR sczValue = NULL; | 249 | LPWSTR sczValue = NULL; |
235 | 250 | ||
236 | hr = StrAllocFormatted(&sczValue, L"%u", dwValue); | 251 | hr = StrAllocFormatted(&sczValue, L"%u", dwValue); |
237 | ExitOnFailure(hr, "Failed to convert number to string."); | 252 | JsonExitOnFailure(hr, "Failed to convert number to string."); |
238 | 253 | ||
239 | hr = DoValue(pWriter, sczValue); | 254 | hr = DoValue(pWriter, sczValue); |
240 | ExitOnFailure(hr, "Failed to add number to JSON."); | 255 | JsonExitOnFailure(hr, "Failed to add number to JSON."); |
241 | 256 | ||
242 | LExit: | 257 | LExit: |
243 | ReleaseStr(sczValue); | 258 | ReleaseStr(sczValue); |
@@ -254,10 +269,10 @@ DAPI_(HRESULT) JsonWriteString( | |||
254 | LPWSTR sczJsonString = NULL; | 269 | LPWSTR sczJsonString = NULL; |
255 | 270 | ||
256 | hr = SerializeJsonString(&sczJsonString, wzValue); | 271 | hr = SerializeJsonString(&sczJsonString, wzValue); |
257 | ExitOnFailure(hr, "Failed to allocate string JSON."); | 272 | JsonExitOnFailure(hr, "Failed to allocate string JSON."); |
258 | 273 | ||
259 | hr = DoValue(pWriter, sczJsonString); | 274 | hr = DoValue(pWriter, sczJsonString); |
260 | ExitOnFailure(hr, "Failed to add string to JSON."); | 275 | JsonExitOnFailure(hr, "Failed to add string to JSON."); |
261 | 276 | ||
262 | LExit: | 277 | LExit: |
263 | ReleaseStr(sczJsonString); | 278 | ReleaseStr(sczJsonString); |
@@ -272,7 +287,7 @@ DAPI_(HRESULT) JsonWriteArrayStart( | |||
272 | HRESULT hr = S_OK; | 287 | HRESULT hr = S_OK; |
273 | 288 | ||
274 | hr = DoStart(pWriter, JSON_TOKEN_ARRAY_START, L"["); | 289 | hr = DoStart(pWriter, JSON_TOKEN_ARRAY_START, L"["); |
275 | ExitOnFailure(hr, "Failed to start JSON array."); | 290 | JsonExitOnFailure(hr, "Failed to start JSON array."); |
276 | 291 | ||
277 | LExit: | 292 | LExit: |
278 | return hr; | 293 | return hr; |
@@ -286,7 +301,7 @@ DAPI_(HRESULT) JsonWriteArrayEnd( | |||
286 | HRESULT hr = S_OK; | 301 | HRESULT hr = S_OK; |
287 | 302 | ||
288 | hr = DoEnd(pWriter, JSON_TOKEN_ARRAY_END, L"]"); | 303 | hr = DoEnd(pWriter, JSON_TOKEN_ARRAY_END, L"]"); |
289 | ExitOnFailure(hr, "Failed to end JSON array."); | 304 | JsonExitOnFailure(hr, "Failed to end JSON array."); |
290 | 305 | ||
291 | LExit: | 306 | LExit: |
292 | return hr; | 307 | return hr; |
@@ -300,7 +315,7 @@ DAPI_(HRESULT) JsonWriteObjectStart( | |||
300 | HRESULT hr = S_OK; | 315 | HRESULT hr = S_OK; |
301 | 316 | ||
302 | hr = DoStart(pWriter, JSON_TOKEN_OBJECT_START, L"{"); | 317 | hr = DoStart(pWriter, JSON_TOKEN_OBJECT_START, L"{"); |
303 | ExitOnFailure(hr, "Failed to start JSON object."); | 318 | JsonExitOnFailure(hr, "Failed to start JSON object."); |
304 | 319 | ||
305 | LExit: | 320 | LExit: |
306 | return hr; | 321 | return hr; |
@@ -316,10 +331,10 @@ DAPI_(HRESULT) JsonWriteObjectKey( | |||
316 | LPWSTR sczObjectKey = NULL; | 331 | LPWSTR sczObjectKey = NULL; |
317 | 332 | ||
318 | hr = StrAllocFormatted(&sczObjectKey, L"\"%ls\":", wzKey); | 333 | hr = StrAllocFormatted(&sczObjectKey, L"\"%ls\":", wzKey); |
319 | ExitOnFailure(hr, "Failed to allocate JSON object key."); | 334 | JsonExitOnFailure(hr, "Failed to allocate JSON object key."); |
320 | 335 | ||
321 | hr = DoKey(pWriter, sczObjectKey); | 336 | hr = DoKey(pWriter, sczObjectKey); |
322 | ExitOnFailure(hr, "Failed to add object key to JSON."); | 337 | JsonExitOnFailure(hr, "Failed to add object key to JSON."); |
323 | 338 | ||
324 | LExit: | 339 | LExit: |
325 | ReleaseStr(sczObjectKey); | 340 | ReleaseStr(sczObjectKey); |
@@ -334,7 +349,7 @@ DAPI_(HRESULT) JsonWriteObjectEnd( | |||
334 | HRESULT hr = S_OK; | 349 | HRESULT hr = S_OK; |
335 | 350 | ||
336 | hr = DoEnd(pWriter, JSON_TOKEN_OBJECT_END, L"}"); | 351 | hr = DoEnd(pWriter, JSON_TOKEN_OBJECT_END, L"}"); |
337 | ExitOnFailure(hr, "Failed to end JSON object."); | 352 | JsonExitOnFailure(hr, "Failed to end JSON object."); |
338 | 353 | ||
339 | LExit: | 354 | LExit: |
340 | return hr; | 355 | return hr; |
@@ -357,7 +372,7 @@ static HRESULT DoStart( | |||
357 | ::EnterCriticalSection(&pWriter->cs); | 372 | ::EnterCriticalSection(&pWriter->cs); |
358 | 373 | ||
359 | hr = EnsureTokenStack(pWriter); | 374 | hr = EnsureTokenStack(pWriter); |
360 | ExitOnFailure(hr, "Failed to ensure token stack for start."); | 375 | JsonExitOnFailure(hr, "Failed to ensure token stack for start."); |
361 | 376 | ||
362 | token = pWriter->rgTokenStack[pWriter->cTokens - 1]; | 377 | token = pWriter->rgTokenStack[pWriter->cTokens - 1]; |
363 | switch (token) | 378 | switch (token) |
@@ -381,16 +396,16 @@ static HRESULT DoStart( | |||
381 | hr = E_UNEXPECTED; | 396 | hr = E_UNEXPECTED; |
382 | break; | 397 | break; |
383 | } | 398 | } |
384 | ExitOnRootFailure(hr, "Cannot start array or object to JSON serializer now."); | 399 | JsonExitOnRootFailure(hr, "Cannot start array or object to JSON serializer now."); |
385 | 400 | ||
386 | if (fNeedComma) | 401 | if (fNeedComma) |
387 | { | 402 | { |
388 | hr = StrAllocConcat(&pWriter->sczJson, L",", 0); | 403 | hr = StrAllocConcat(&pWriter->sczJson, L",", 0); |
389 | ExitOnFailure(hr, "Failed to add comma for start array or object to JSON."); | 404 | JsonExitOnFailure(hr, "Failed to add comma for start array or object to JSON."); |
390 | } | 405 | } |
391 | 406 | ||
392 | hr = StrAllocConcat(&pWriter->sczJson, wzStartString, 0); | 407 | hr = StrAllocConcat(&pWriter->sczJson, wzStartString, 0); |
393 | ExitOnFailure(hr, "Failed to start JSON array or object."); | 408 | JsonExitOnFailure(hr, "Failed to start JSON array or object."); |
394 | 409 | ||
395 | pWriter->rgTokenStack[pWriter->cTokens - 1] = token; | 410 | pWriter->rgTokenStack[pWriter->cTokens - 1] = token; |
396 | if (fPushToken) | 411 | if (fPushToken) |
@@ -418,7 +433,7 @@ static HRESULT DoEnd( | |||
418 | if (!pWriter->rgTokenStack || 0 == pWriter->cTokens) | 433 | if (!pWriter->rgTokenStack || 0 == pWriter->cTokens) |
419 | { | 434 | { |
420 | hr = E_UNEXPECTED; | 435 | hr = E_UNEXPECTED; |
421 | ExitOnRootFailure(hr, "Failure to pop token because the stack is empty."); | 436 | JsonExitOnRootFailure(hr, "Failure to pop token because the stack is empty."); |
422 | } | 437 | } |
423 | else | 438 | else |
424 | { | 439 | { |
@@ -427,12 +442,12 @@ static HRESULT DoEnd( | |||
427 | (JSON_TOKEN_OBJECT_END == tokenEnd && JSON_TOKEN_OBJECT_START != token && JSON_TOKEN_OBJECT_VALUE != token)) | 442 | (JSON_TOKEN_OBJECT_END == tokenEnd && JSON_TOKEN_OBJECT_START != token && JSON_TOKEN_OBJECT_VALUE != token)) |
428 | { | 443 | { |
429 | hr = E_UNEXPECTED; | 444 | hr = E_UNEXPECTED; |
430 | ExitOnRootFailure(hr, "Failure to pop token because the stack did not match the expected token: %d", tokenEnd); | 445 | JsonExitOnRootFailure(hr, "Failure to pop token because the stack did not match the expected token: %d", tokenEnd); |
431 | } | 446 | } |
432 | } | 447 | } |
433 | 448 | ||
434 | hr = StrAllocConcat(&pWriter->sczJson, wzEndString, 0); | 449 | hr = StrAllocConcat(&pWriter->sczJson, wzEndString, 0); |
435 | ExitOnFailure(hr, "Failed to end JSON array or object."); | 450 | JsonExitOnFailure(hr, "Failed to end JSON array or object."); |
436 | 451 | ||
437 | --pWriter->cTokens; | 452 | --pWriter->cTokens; |
438 | 453 | ||
@@ -454,7 +469,7 @@ static HRESULT DoKey( | |||
454 | ::EnterCriticalSection(&pWriter->cs); | 469 | ::EnterCriticalSection(&pWriter->cs); |
455 | 470 | ||
456 | hr = EnsureTokenStack(pWriter); | 471 | hr = EnsureTokenStack(pWriter); |
457 | ExitOnFailure(hr, "Failed to ensure token stack for key."); | 472 | JsonExitOnFailure(hr, "Failed to ensure token stack for key."); |
458 | 473 | ||
459 | token = pWriter->rgTokenStack[pWriter->cTokens - 1]; | 474 | token = pWriter->rgTokenStack[pWriter->cTokens - 1]; |
460 | switch (token) | 475 | switch (token) |
@@ -472,16 +487,16 @@ static HRESULT DoKey( | |||
472 | hr = E_UNEXPECTED; | 487 | hr = E_UNEXPECTED; |
473 | break; | 488 | break; |
474 | } | 489 | } |
475 | ExitOnRootFailure(hr, "Cannot add key to JSON serializer now."); | 490 | JsonExitOnRootFailure(hr, "Cannot add key to JSON serializer now."); |
476 | 491 | ||
477 | if (fNeedComma) | 492 | if (fNeedComma) |
478 | { | 493 | { |
479 | hr = StrAllocConcat(&pWriter->sczJson, L",", 0); | 494 | hr = StrAllocConcat(&pWriter->sczJson, L",", 0); |
480 | ExitOnFailure(hr, "Failed to add comma for key to JSON."); | 495 | JsonExitOnFailure(hr, "Failed to add comma for key to JSON."); |
481 | } | 496 | } |
482 | 497 | ||
483 | hr = StrAllocConcat(&pWriter->sczJson, wzKey, 0); | 498 | hr = StrAllocConcat(&pWriter->sczJson, wzKey, 0); |
484 | ExitOnFailure(hr, "Failed to add key to JSON."); | 499 | JsonExitOnFailure(hr, "Failed to add key to JSON."); |
485 | 500 | ||
486 | pWriter->rgTokenStack[pWriter->cTokens - 1] = token; | 501 | pWriter->rgTokenStack[pWriter->cTokens - 1] = token; |
487 | 502 | ||
@@ -503,7 +518,7 @@ static HRESULT DoValue( | |||
503 | ::EnterCriticalSection(&pWriter->cs); | 518 | ::EnterCriticalSection(&pWriter->cs); |
504 | 519 | ||
505 | hr = EnsureTokenStack(pWriter); | 520 | hr = EnsureTokenStack(pWriter); |
506 | ExitOnFailure(hr, "Failed to ensure token stack for value."); | 521 | JsonExitOnFailure(hr, "Failed to ensure token stack for value."); |
507 | 522 | ||
508 | token = pWriter->rgTokenStack[pWriter->cTokens - 1]; | 523 | token = pWriter->rgTokenStack[pWriter->cTokens - 1]; |
509 | switch (token) | 524 | switch (token) |
@@ -528,23 +543,23 @@ static HRESULT DoValue( | |||
528 | hr = E_UNEXPECTED; | 543 | hr = E_UNEXPECTED; |
529 | break; | 544 | break; |
530 | } | 545 | } |
531 | ExitOnRootFailure(hr, "Cannot add value to JSON serializer now."); | 546 | JsonExitOnRootFailure(hr, "Cannot add value to JSON serializer now."); |
532 | 547 | ||
533 | if (fNeedComma) | 548 | if (fNeedComma) |
534 | { | 549 | { |
535 | hr = StrAllocConcat(&pWriter->sczJson, L",", 0); | 550 | hr = StrAllocConcat(&pWriter->sczJson, L",", 0); |
536 | ExitOnFailure(hr, "Failed to add comma for value to JSON."); | 551 | JsonExitOnFailure(hr, "Failed to add comma for value to JSON."); |
537 | } | 552 | } |
538 | 553 | ||
539 | if (wzValue) | 554 | if (wzValue) |
540 | { | 555 | { |
541 | hr = StrAllocConcat(&pWriter->sczJson, wzValue, 0); | 556 | hr = StrAllocConcat(&pWriter->sczJson, wzValue, 0); |
542 | ExitOnFailure(hr, "Failed to add value to JSON."); | 557 | JsonExitOnFailure(hr, "Failed to add value to JSON."); |
543 | } | 558 | } |
544 | else | 559 | else |
545 | { | 560 | { |
546 | hr = StrAllocConcat(&pWriter->sczJson, L"null", 0); | 561 | hr = StrAllocConcat(&pWriter->sczJson, L"null", 0); |
547 | ExitOnFailure(hr, "Failed to add null value to JSON."); | 562 | JsonExitOnFailure(hr, "Failed to add null value to JSON."); |
548 | } | 563 | } |
549 | 564 | ||
550 | pWriter->rgTokenStack[pWriter->cTokens - 1] = token; | 565 | pWriter->rgTokenStack[pWriter->cTokens - 1] = token; |
@@ -563,7 +578,7 @@ static HRESULT EnsureTokenStack( | |||
563 | DWORD cNumAlloc = pWriter->cTokens != 0 ? pWriter->cTokens : 0; | 578 | DWORD cNumAlloc = pWriter->cTokens != 0 ? pWriter->cTokens : 0; |
564 | 579 | ||
565 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&pWriter->rgTokenStack), cNumAlloc, sizeof(JSON_TOKEN), JSON_STACK_INCREMENT); | 580 | hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&pWriter->rgTokenStack), cNumAlloc, sizeof(JSON_TOKEN), JSON_STACK_INCREMENT); |
566 | ExitOnFailure(hr, "Failed to allocate JSON token stack."); | 581 | JsonExitOnFailure(hr, "Failed to allocate JSON token stack."); |
567 | 582 | ||
568 | if (0 == pWriter->cTokens) | 583 | if (0 == pWriter->cTokens) |
569 | { | 584 | { |
@@ -596,7 +611,7 @@ static HRESULT SerializeJsonString( | |||
596 | } | 611 | } |
597 | 612 | ||
598 | hr = StrAlloc(psczJsonString, cchRequired); | 613 | hr = StrAlloc(psczJsonString, cchRequired); |
599 | ExitOnFailure(hr, "Failed to allocate space for JSON string."); | 614 | JsonExitOnFailure(hr, "Failed to allocate space for JSON string."); |
600 | 615 | ||
601 | LPWSTR pchTarget = *psczJsonString; | 616 | LPWSTR pchTarget = *psczJsonString; |
602 | 617 | ||