| 641 | |
| 642 | |
| 643 | AString URLDecode(const AString & a_String) |
| 644 | { |
| 645 | AString res; |
| 646 | size_t len = a_String.length(); |
| 647 | res.reserve(len); |
| 648 | for (size_t i = 0; i < len; i++) |
| 649 | { |
| 650 | char ch = a_String[i]; |
| 651 | if ((ch != '%') || (i > len - 3)) |
| 652 | { |
| 653 | res.push_back(ch); |
| 654 | continue; |
| 655 | } |
| 656 | // Decode the hex value: |
| 657 | char hi = a_String[i + 1], lo = a_String[i + 2]; |
| 658 | if ((hi >= '0') && (hi <= '9')) |
| 659 | { |
| 660 | hi = hi - '0'; |
| 661 | } |
| 662 | else if ((hi >= 'a') && (hi <= 'f')) |
| 663 | { |
| 664 | hi = hi - 'a' + 10; |
| 665 | } |
| 666 | else if ((hi >= 'A') && (hi <= 'F')) |
| 667 | { |
| 668 | hi = hi - 'F' + 10; |
| 669 | } |
| 670 | else |
| 671 | { |
| 672 | res.push_back(ch); |
| 673 | continue; |
| 674 | } |
| 675 | if ((lo >= '0') && (lo <= '9')) |
| 676 | { |
| 677 | lo = lo - '0'; |
| 678 | } |
| 679 | else if ((lo >= 'a') && (lo <= 'f')) |
| 680 | { |
| 681 | lo = lo - 'a' + 10; |
| 682 | } |
| 683 | else if ((lo >= 'A') && (lo <= 'F')) |
| 684 | { |
| 685 | lo = lo - 'A' + 10; |
| 686 | } |
| 687 | else |
| 688 | { |
| 689 | res.push_back(ch); |
| 690 | continue; |
| 691 | } |
| 692 | res.push_back((hi << 4) | lo); |
| 693 | i += 2; |
| 694 | } // for i - a_String[] |
| 695 | return res; |
| 696 | } |
| 697 | |
| 698 | |
| 699 | |