OLD | NEW |
1 | 1 |
2 //********************************************************************* | 2 //********************************************************************* |
3 //* Base64 - a simple base64 encoder and decoder. | 3 //* Base64 - a simple base64 encoder and decoder. |
4 //* | 4 //* |
5 //* Copyright (c) 1999, Bob Withers - bwit@pobox.com | 5 //* Copyright (c) 1999, Bob Withers - bwit@pobox.com |
6 //* | 6 //* |
7 //* This code may be freely used for any purpose, either personal | 7 //* This code may be freely used for any purpose, either personal |
8 //* or commercial, provided the authors copyright notice remains | 8 //* or commercial, provided the authors copyright notice remains |
9 //* intact. | 9 //* intact. |
10 //* | 10 //* |
11 //* Enhancements by Stanley Yamane: | 11 //* Enhancements by Stanley Yamane: |
12 //* o reverse lookup table for the decode function | 12 //* o reverse lookup table for the decode function |
13 //* o reserve string buffer space in advance | 13 //* o reserve string buffer space in advance |
14 //* | 14 //* |
15 //********************************************************************* | 15 //********************************************************************* |
16 | 16 |
17 #include "webrtc/base/base64.h" | 17 #include "webrtc/base/base64.h" |
18 | 18 |
19 #include <string.h> | 19 #include <string.h> |
20 | 20 |
21 #include "webrtc/base/common.h" | 21 #include "webrtc/base/checks.h" |
22 | 22 |
23 using std::vector; | 23 using std::vector; |
24 | 24 |
25 namespace rtc { | 25 namespace rtc { |
26 | 26 |
27 static const char kPad = '='; | 27 static const char kPad = '='; |
28 static const unsigned char pd = 0xFD; // Padding | 28 static const unsigned char pd = 0xFD; // Padding |
29 static const unsigned char sp = 0xFE; // Whitespace | 29 static const unsigned char sp = 0xFE; // Whitespace |
30 static const unsigned char il = 0xFF; // Illegal base64 character | 30 static const unsigned char il = 0xFF; // Illegal base64 character |
31 | 31 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 bool Base64::IsBase64Encoded(const std::string& str) { | 90 bool Base64::IsBase64Encoded(const std::string& str) { |
91 for (size_t i = 0; i < str.size(); ++i) { | 91 for (size_t i = 0; i < str.size(); ++i) { |
92 if (!IsBase64Char(str.at(i))) | 92 if (!IsBase64Char(str.at(i))) |
93 return false; | 93 return false; |
94 } | 94 } |
95 return true; | 95 return true; |
96 } | 96 } |
97 | 97 |
98 void Base64::EncodeFromArray(const void* data, size_t len, | 98 void Base64::EncodeFromArray(const void* data, size_t len, |
99 std::string* result) { | 99 std::string* result) { |
100 ASSERT(NULL != result); | 100 RTC_DCHECK(NULL != result); |
101 result->clear(); | 101 result->clear(); |
102 result->resize(((len + 2) / 3) * 4); | 102 result->resize(((len + 2) / 3) * 4); |
103 const unsigned char* byte_data = static_cast<const unsigned char*>(data); | 103 const unsigned char* byte_data = static_cast<const unsigned char*>(data); |
104 | 104 |
105 unsigned char c; | 105 unsigned char c; |
106 size_t i = 0; | 106 size_t i = 0; |
107 size_t dest_ix = 0; | 107 size_t dest_ix = 0; |
108 while (i < len) { | 108 while (i < len) { |
109 c = (byte_data[i] >> 2) & 0x3f; | 109 c = (byte_data[i] >> 2) & 0x3f; |
110 (*result)[dest_ix++] = Base64Table[c]; | 110 (*result)[dest_ix++] = Base64Table[c]; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 vector<char>* result, size_t* data_used) { | 199 vector<char>* result, size_t* data_used) { |
200 return DecodeFromArrayTemplate<vector<char> >(data, len, flags, result, | 200 return DecodeFromArrayTemplate<vector<char> >(data, len, flags, result, |
201 data_used); | 201 data_used); |
202 } | 202 } |
203 | 203 |
204 template<typename T> | 204 template<typename T> |
205 bool Base64::DecodeFromArrayTemplate(const char* data, size_t len, | 205 bool Base64::DecodeFromArrayTemplate(const char* data, size_t len, |
206 DecodeFlags flags, T* result, | 206 DecodeFlags flags, T* result, |
207 size_t* data_used) | 207 size_t* data_used) |
208 { | 208 { |
209 ASSERT(NULL != result); | 209 RTC_DCHECK(NULL != result); |
210 ASSERT(flags <= (DO_PARSE_MASK | DO_PAD_MASK | DO_TERM_MASK)); | 210 RTC_DCHECK(flags <= (DO_PARSE_MASK | DO_PAD_MASK | DO_TERM_MASK)); |
211 | 211 |
212 const DecodeFlags parse_flags = flags & DO_PARSE_MASK; | 212 const DecodeFlags parse_flags = flags & DO_PARSE_MASK; |
213 const DecodeFlags pad_flags = flags & DO_PAD_MASK; | 213 const DecodeFlags pad_flags = flags & DO_PAD_MASK; |
214 const DecodeFlags term_flags = flags & DO_TERM_MASK; | 214 const DecodeFlags term_flags = flags & DO_TERM_MASK; |
215 ASSERT(0 != parse_flags); | 215 RTC_DCHECK(0 != parse_flags); |
216 ASSERT(0 != pad_flags); | 216 RTC_DCHECK(0 != pad_flags); |
217 ASSERT(0 != term_flags); | 217 RTC_DCHECK(0 != term_flags); |
218 | 218 |
219 result->clear(); | 219 result->clear(); |
220 result->reserve(len); | 220 result->reserve(len); |
221 | 221 |
222 size_t dpos = 0; | 222 size_t dpos = 0; |
223 bool success = true, padded; | 223 bool success = true, padded; |
224 unsigned char c, qbuf[4]; | 224 unsigned char c, qbuf[4]; |
225 while (dpos < len) { | 225 while (dpos < len) { |
226 size_t qlen = GetNextQuantum(parse_flags, (DO_PAD_NO == pad_flags), | 226 size_t qlen = GetNextQuantum(parse_flags, (DO_PAD_NO == pad_flags), |
227 data, len, &dpos, qbuf, &padded); | 227 data, len, &dpos, qbuf, &padded); |
(...skipping 23 matching lines...) Expand all Loading... |
251 if ((DO_TERM_BUFFER == term_flags) && (dpos != len)) { | 251 if ((DO_TERM_BUFFER == term_flags) && (dpos != len)) { |
252 success = false; // unused chars | 252 success = false; // unused chars |
253 } | 253 } |
254 if (data_used) { | 254 if (data_used) { |
255 *data_used = dpos; | 255 *data_used = dpos; |
256 } | 256 } |
257 return success; | 257 return success; |
258 } | 258 } |
259 | 259 |
260 } // namespace rtc | 260 } // namespace rtc |
OLD | NEW |