/* To parse something like... * =?UTF-8?Q?=E0=A4=95=E0=A4=95=E0=A4=AC=E0=A5=82=E0=A5=8B=E0=A5=87?=\t\n=?UTF-8?Q?=E0=A4=B0?=\t\n<*****@*****.**> * and return the decoded representation of name & email parts. */ gboolean eab_parse_qp_email (const gchar *string, gchar **name, gchar **email) { struct _camel_header_address *address; gboolean res = FALSE; address = camel_header_address_decode (string, "UTF-8"); if (!address) return FALSE; /* report success only when we have filled both name and email address */ if (address->type == CAMEL_HEADER_ADDRESS_NAME && address->name && *address->name && address->v.addr && *address->v.addr) { *name = g_strdup (address->name); *email = g_strdup (address->v.addr); res = TRUE; } camel_header_address_unref (address); return res; }
static int envelope_decode_address (CamelIMAP4Engine *engine, GString *addrs, CamelException *ex) { char *addr, *name = NULL, *user = NULL; struct _camel_header_address *cia; unsigned char *literal = NULL; camel_imap4_token_t token; const char *domain = NULL; int part = 0; size_t n; if (camel_imap4_engine_next_token (engine, &token, ex) == -1) return -1; if (token.token == CAMEL_IMAP4_TOKEN_NIL) { return 0; } else if (token.token != '(') { camel_imap4_utils_set_unexpected_token_error (ex, engine, &token); return -1; } if (addrs->len > 0) g_string_append (addrs, ", "); do { if (camel_imap4_engine_next_token (engine, &token, ex) == -1) goto exception; literal = NULL; switch (token.token) { case CAMEL_IMAP4_TOKEN_NIL: break; case CAMEL_IMAP4_TOKEN_ATOM: case CAMEL_IMAP4_TOKEN_QSTRING: switch (part) { case 0: name = camel_header_decode_string (token.v.qstring, NULL); break; case 2: user = g_strdup (token.v.qstring); break; case 3: domain = token.v.qstring; break; } break; case CAMEL_IMAP4_TOKEN_LITERAL: if (camel_imap4_engine_literal (engine, &literal, &n, ex) == -1) goto exception; switch (part) { case 0: name = camel_header_decode_string (literal, NULL); g_free (literal); break; case 2: user = literal; break; case 3: domain = literal; break; } break; default: camel_imap4_utils_set_unexpected_token_error (ex, engine, &token); goto exception; } part++; } while (part < 4); addr = g_strdup_printf ("%s@%s", user, domain); g_free (literal); g_free (user); cia = camel_header_address_new_name (name, addr); g_free (name); g_free (addr); addr = camel_header_address_list_format (cia); camel_header_address_unref (cia); g_string_append (addrs, addr); g_free (addr); if (camel_imap4_engine_next_token (engine, &token, ex) == -1) return -1; if (token.token != ')') { camel_imap4_utils_set_unexpected_token_error (ex, engine, &token); return -1; } return 0; exception: g_free (name); g_free (user); return -1; }
static void emfqe_format_header (EMailFormatter *formatter, EMailFormatterContext *context, GString *buffer, EMailPart *part, const gchar *header_name, const gchar *charset) { CamelMimePart *mime_part; EMailFormatterHeaderFlags flags; gchar *canon_name, *buf, *value = NULL; const gchar *txt, *label; gboolean addrspec = FALSE; gint is_html = FALSE; gint i; /* Skip Face header in prints, which includes also message forward */ if (context->mode == E_MAIL_FORMATTER_MODE_PRINTING && g_ascii_strcasecmp (header_name, "Face") == 0) return; flags = E_MAIL_FORMATTER_HEADER_FLAG_NOELIPSIZE; canon_name = g_alloca (strlen (header_name) + 1); strcpy (canon_name, header_name); e_mail_formatter_canon_header_name (canon_name); /* Never quote Bcc/Resent-Bcc headers. */ if (g_str_equal (canon_name, "Bcc")) return; if (g_str_equal (canon_name, "Resent-Bcc")) return; mime_part = e_mail_part_ref_mime_part (part); for (i = 0; addrspec_hdrs[i]; i++) { if (g_str_equal (canon_name, addrspec_hdrs[i])) { addrspec = TRUE; break; } } label = _(canon_name); if (addrspec) { CamelMedium *medium; struct _camel_header_address *addrs; GString *html; gchar *charset; medium = CAMEL_MEDIUM (mime_part); txt = camel_medium_get_header (medium, canon_name); if (txt == NULL) return; charset = e_mail_formatter_dup_charset (formatter); if (!charset) charset = e_mail_formatter_dup_default_charset (formatter); buf = camel_header_unfold (txt); addrs = camel_header_address_decode (txt, charset); g_free (charset); if (addrs == NULL) { g_free (buf); return; } g_free (buf); html = g_string_new (""); e_mail_formatter_format_address (formatter, html, addrs, canon_name, FALSE, FALSE); camel_header_address_unref (addrs); txt = value = html->str; g_string_free (html, FALSE); flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; is_html = TRUE; } else if (g_str_equal (canon_name, "Subject")) { CamelMimeMessage *message; message = CAMEL_MIME_MESSAGE (mime_part); txt = camel_mime_message_get_subject (message); label = _("Subject"); flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else if (g_str_equal (canon_name, "X-Evolution-Mailer")) { CamelMedium *medium; medium = CAMEL_MEDIUM (mime_part); txt = camel_medium_get_header (medium, "x-mailer"); if (txt == NULL) txt = camel_medium_get_header (medium, "user-agent"); if (txt == NULL) txt = camel_medium_get_header (medium, "x-newsreader"); if (txt == NULL) txt = camel_medium_get_header (medium, "x-mimeole"); if (txt == NULL) return; txt = value = camel_header_format_ctext (txt, charset); label = _("Mailer"); flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else if (g_str_equal (canon_name, "Date") || g_str_equal (canon_name, "Resent-Date")) { CamelMedium *medium; medium = CAMEL_MEDIUM (mime_part); txt = camel_medium_get_header (medium, canon_name); if (txt == NULL) return; flags |= E_MAIL_FORMATTER_HEADER_FLAG_BOLD; } else { CamelMedium *medium; medium = CAMEL_MEDIUM (mime_part); txt = camel_medium_get_header (medium, canon_name); buf = camel_header_unfold (txt); txt = value = camel_header_decode_string (txt, charset); g_free (buf); } emfqe_format_text_header (formatter, buffer, label, txt, flags, is_html); g_free (value); g_object_unref (mime_part); }