Mercurial > pidgin.yaz
comparison src/util.c @ 7665:0351ff7030d0
[gaim-migrate @ 8309]
Felipe Contreras (aka revo aka shx) writes:
" Basically that, currently gaim will not display
international "subjects" or "from" fields from emails,
like "a??a" or "Pa?l".
This implements the propper RFC that specify the format
for those fields."
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sun, 30 Nov 2003 04:17:17 +0000 |
parents | ee6c31982350 |
children | 30593bf56e71 |
comparison
equal
deleted
inserted
replaced
7664:e4264f71fac7 | 7665:0351ff7030d0 |
---|---|
242 | 242 |
243 if (size) | 243 if (size) |
244 *size = len; | 244 *size = len; |
245 } | 245 } |
246 | 246 |
247 /************************************************************************** | |
248 * Quoted Printable Functions | |
249 **************************************************************************/ | |
250 void | |
251 gaim_quotedp_decode(const char *text, char **data, int *size) | |
252 { | |
253 char *p, *n, *new; | |
254 | |
255 n = new = malloc(strlen (text)); | |
256 | |
257 for (p = (char *)text; *p; p++, n++) { | |
258 if (*p == '=') { | |
259 sscanf(p + 1, "%2x\n", (int *)n); | |
260 p += 2; | |
261 } | |
262 else if (*p == '_') | |
263 *n = ' '; | |
264 else | |
265 *n = *p; | |
266 } | |
267 | |
268 *n = '\0'; | |
269 | |
270 if (size) | |
271 *size = n - new; | |
272 | |
273 /* Resize to take less space */ | |
274 /* new = realloc(new, n - new); */ | |
275 | |
276 *data = new; | |
277 } | |
278 | |
279 /************************************************************************** | |
280 * MIME Functions | |
281 **************************************************************************/ | |
282 #define OUT_CHARSET "utf-8" | |
283 | |
284 char * | |
285 gaim_mime_decode_word(const char *charset, const char *encoding, const char *text) | |
286 { | |
287 /* TODO: We need to check for nulls */ | |
288 char *decoded, *converted; | |
289 int len = 0; | |
290 | |
291 if (g_ascii_strcasecmp(encoding, "Q") == 0) | |
292 gaim_quotedp_decode(text, &decoded, &len); | |
293 else if (g_ascii_strcasecmp(encoding, "B") == 0) | |
294 gaim_base64_decode(text, &decoded, &len); | |
295 else | |
296 return NULL; | |
297 | |
298 | |
299 converted = g_convert(decoded, len, OUT_CHARSET, charset, NULL, NULL, NULL); | |
300 g_free(decoded); | |
301 | |
302 return converted; | |
303 } | |
304 | |
305 char * | |
306 gaim_mime_decode_field(const char *str) | |
307 { | |
308 char *cur, *mark; | |
309 char *unencoded_start, *unencoded_end; | |
310 char *charset, *encoding, *text, *decoded; | |
311 char *new, *n; | |
312 | |
313 n = new = malloc(strlen(str)); | |
314 charset = text = NULL; | |
315 | |
316 /* Here we will be looking for encoded words and if they seem to be | |
317 * valid then decode them */ | |
318 | |
319 for ( unencoded_start = cur = (char *)str; | |
320 (unencoded_end = cur = strstr(cur, "=?")); | |
321 unencoded_start = cur) | |
322 { | |
323 int len; | |
324 char *token; | |
325 GQueue *tokens = g_queue_new(); | |
326 | |
327 for (cur += 2, mark = cur; *cur; cur++) { | |
328 if (*cur == '?') { | |
329 token = g_strndup(mark, cur - mark); | |
330 g_queue_push_head(tokens, token); | |
331 | |
332 mark = (cur + 1); | |
333 | |
334 if (*mark == '=') | |
335 break; | |
336 } else { | |
337 if ((tokens->length == 2) && (*cur == ' ')) | |
338 break; | |
339 else if ((tokens->length < 2) && (strchr("()<>@,;:/[]", *cur))) | |
340 break; | |
341 else if (tokens->length > 2) | |
342 break; | |
343 } | |
344 } | |
345 | |
346 cur += 2; | |
347 | |
348 if ((tokens->length == 3) && (*mark == '=')) { | |
349 len = unencoded_end - unencoded_start; | |
350 n = strncpy(n, unencoded_start, len) + len; | |
351 | |
352 charset = g_queue_pop_tail(tokens); | |
353 encoding = g_queue_pop_tail(tokens); | |
354 text = g_queue_pop_tail(tokens); | |
355 | |
356 if ((decoded = gaim_mime_decode_word(charset, encoding, text))) { | |
357 len = strlen(decoded); | |
358 n = strncpy(n, decoded, len) + len; | |
359 g_free(decoded); | |
360 } | |
361 | |
362 g_free(charset); | |
363 g_free(encoding); | |
364 g_free(text); | |
365 } else { | |
366 len = cur - unencoded_start; | |
367 n = strncpy(n, unencoded_start, len) + len; | |
368 | |
369 while ((token = g_queue_pop_tail(tokens))) | |
370 g_free(token); | |
371 } | |
372 | |
373 g_queue_free(tokens); | |
374 } | |
375 | |
376 if (*unencoded_start) | |
377 n = strcpy(n, unencoded_start); | |
378 | |
379 return new; | |
380 } | |
247 | 381 |
248 /************************************************************************** | 382 /************************************************************************** |
249 * Date/Time Functions | 383 * Date/Time Functions |
250 **************************************************************************/ | 384 **************************************************************************/ |
251 const char * | 385 const char * |