aboutsummaryrefslogtreecommitdiff
path: root/src/dutil/jsonutil.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/dutil/jsonutil.cpp79
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
5const DWORD JSON_STACK_INCREMENT = 5; 20const 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
222LExit: 237LExit:
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
242LExit: 257LExit:
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
262LExit: 277LExit:
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
277LExit: 292LExit:
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
291LExit: 306LExit:
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
305LExit: 320LExit:
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
324LExit: 339LExit:
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
339LExit: 354LExit:
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