| 252 ascii[len * 3 - 1] = 0; |
252 ascii[len * 3 - 1] = 0; |
| 253 |
253 |
| 254 return ascii; |
254 return ascii; |
| 255 } |
255 } |
| 256 |
256 |
| 257 |
|
| 258 /************************************************************************** |
257 /************************************************************************** |
| 259 * Base64 Functions |
258 * Quoted Printable Functions (see RFC 2045). |
| 260 **************************************************************************/ |
259 **************************************************************************/ |
| 261 static const char xdigits[] = |
260 static const char xdigits[] = |
| 262 "0123456789abcdef"; |
261 "0123456789abcdef"; |
| 263 |
262 |
| 264 gchar * |
|
| 265 purple_base64_encode(const guchar *data, gsize len) |
|
| 266 { |
|
| 267 return g_base64_encode(data, len); |
|
| 268 } |
|
| 269 |
|
| 270 guchar * |
|
| 271 purple_base64_decode(const char *str, gsize *ret_len) |
|
| 272 { |
|
| 273 /* |
|
| 274 * We want to allow ret_len to be NULL for backward compatibility, |
|
| 275 * but g_base64_decode() requires a valid length variable. So if |
|
| 276 * ret_len is NULL then pass in a dummy variable. |
|
| 277 */ |
|
| 278 gsize unused; |
|
| 279 return g_base64_decode(str, ret_len != NULL ? ret_len : &unused); |
|
| 280 } |
|
| 281 |
|
| 282 /************************************************************************** |
|
| 283 * Quoted Printable Functions (see RFC 2045). |
|
| 284 **************************************************************************/ |
|
| 285 guchar * |
263 guchar * |
| 286 purple_quotedp_decode(const char *str, gsize *ret_len) |
264 purple_quotedp_decode(const char *str, gsize *ret_len) |
| 287 { |
265 { |
| 288 char *n, *new; |
266 char *n, *new; |
| 289 const char *end, *p; |
267 const char *end, *p; |
| 439 guchar *decoded = NULL; |
417 guchar *decoded = NULL; |
| 440 gsize dec_len; |
418 gsize dec_len; |
| 441 if (g_ascii_strcasecmp(encoding, "Q") == 0) |
419 if (g_ascii_strcasecmp(encoding, "Q") == 0) |
| 442 decoded = purple_quotedp_decode(encoded_text, &dec_len); |
420 decoded = purple_quotedp_decode(encoded_text, &dec_len); |
| 443 else if (g_ascii_strcasecmp(encoding, "B") == 0) |
421 else if (g_ascii_strcasecmp(encoding, "B") == 0) |
| 444 decoded = purple_base64_decode(encoded_text, &dec_len); |
422 decoded = g_base64_decode(encoded_text, &dec_len); |
| 445 else |
423 else |
| 446 decoded = NULL; |
424 decoded = NULL; |
| 447 if (decoded) { |
425 if (decoded) { |
| 448 gsize len; |
426 gsize len; |
| 449 char *converted = g_convert((const gchar *)decoded, dec_len, "utf-8", charset, NULL, &len, NULL); |
427 char *converted = g_convert((const gchar *)decoded, dec_len, "utf-8", charset, NULL, &len, NULL); |