00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <cctype>
00027 #include <cstdio>
00028 #include <mpcl/net/url_decoder.hh>
00029
00030
00031
00032
00033
00034
00035 mpcl::text::TString mpcl::net::TUrlDecoder::
00036 _decode (const text::TString& rkySOURCE_ENCODED)
00037 {
00038
00039 using std::strtol;
00040 using text::TString;
00041
00042 static char _acSourceHexBuffer[] = "%NN";
00043 static char _acTargetHexBuffer[] = "0xNN";
00044 static char _acConvertedBuffer[] = " ";
00045 static char* _pcSourceHexDigits = _acSourceHexBuffer + 1;
00046 static char* _pcTargetHexDigits = _acTargetHexBuffer + 2;
00047
00048 size_t zOffset = 0;
00049 TString yDecoded = rkySOURCE_ENCODED;
00050
00051 yDecoded.replaceAll ('+', ' ');
00052
00053
00054
00055
00056
00057 for (zOffset = 0; ( TString::npos != (zOffset = yDecoded.find ('%')) ) ;)
00058 {
00059 _pcTargetHexDigits [0] = (_pcSourceHexDigits [0] = yDecoded [zOffset + 1]);
00060 _pcTargetHexDigits [1] = (_pcSourceHexDigits [1] = yDecoded [zOffset + 2]);
00061 _acConvertedBuffer [0] = strtol (_acTargetHexBuffer, NULL, 16);
00062 yDecoded.replaceAll (_acSourceHexBuffer, _acConvertedBuffer);
00063 }
00064 return yDecoded;
00065
00066 }