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 *