diff options
Diffstat (limited to 'src/dutil/jsonutil.cpp')
| -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 | ||
