| 587 | |
| 588 | |
| 589 | void VariantToToken(VARIANT &aVar, ResultToken &aToken, bool aRetainVar = true) |
| 590 | { |
| 591 | aToken.mem_to_free = NULL; // Set default. |
| 592 | switch (aVar.vt) |
| 593 | { |
| 594 | case VT_BSTR: |
| 595 | aToken.symbol = SYM_STRING; |
| 596 | aToken.marker = _T(""); // Set default. |
| 597 | aToken.marker_length = 0; |
| 598 | size_t len; |
| 599 | if (len = SysStringLen(aVar.bstrVal)) |
| 600 | { |
| 601 | #ifdef UNICODE |
| 602 | if (aRetainVar) |
| 603 | { |
| 604 | // It's safe to pass back the actual BSTR from aVar in this case. |
| 605 | aToken.marker = aVar.bstrVal; |
| 606 | aToken.marker_length = len; |
| 607 | } |
| 608 | else |
| 609 | { |
| 610 | // Allocate some memory to pass back to caller: |
| 611 | aToken.Malloc(aVar.bstrVal, len); |
| 612 | } |
| 613 | #else |
| 614 | CStringCharFromWChar buf(aVar.bstrVal, len); |
| 615 | len = buf.GetLength(); // Get ANSI length. |
| 616 | if (aToken.mem_to_free = buf.DetachBuffer()) |
| 617 | { |
| 618 | aToken.marker = aToken.mem_to_free; |
| 619 | aToken.marker_length = len; |
| 620 | } |
| 621 | #endif |
| 622 | } |
| 623 | if (!aRetainVar) |
| 624 | VariantClear(&aVar); |
| 625 | break; |
| 626 | case VT_I4: |
| 627 | aToken.symbol = SYM_INTEGER; |
| 628 | aToken.value_int64 = aVar.lVal; |
| 629 | break; |
| 630 | case VT_R8: |
| 631 | aToken.symbol = SYM_FLOAT; |
| 632 | aToken.value_double = aVar.dblVal; |
| 633 | break; |
| 634 | case VT_R4: |
| 635 | aToken.symbol = SYM_FLOAT; |
| 636 | aToken.value_double = (double)aVar.fltVal; |
| 637 | break; |
| 638 | case VT_BOOL: |
| 639 | aToken.symbol = SYM_INTEGER; |
| 640 | aToken.value_int64 = aVar.iVal != VARIANT_FALSE; |
| 641 | break; |
| 642 | case VT_UNKNOWN: |
| 643 | if (aVar.punkVal) |
| 644 | { |
| 645 | IEnumVARIANT *penum; |
| 646 | if (SUCCEEDED(aVar.punkVal->QueryInterface(IID_IEnumVARIANT, (void**) &penum))) |
no test coverage detected