static void object_header_changed (GMimeObject *object, GMimeHeader *header) { GMimeParserOptions *options = _g_mime_header_list_get_options (object->headers); gboolean can_warn = g_mime_parser_options_get_warning_callback (options) != NULL; GMimeContentDisposition *disposition; GMimeContentType *content_type; const char *name, *value; guint i; name = g_mime_header_get_name (header); /* validate header if requested, caches the decoded value */ if (G_UNLIKELY (can_warn)) g_mime_header_get_value (header); if (g_ascii_strncasecmp (name, "Content-", 8) != 0) return; for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { if (!g_ascii_strcasecmp (content_headers[i] + 8, name + 8)) break; } switch (i) { case HEADER_CONTENT_DISPOSITION: value = g_mime_header_get_value (header); disposition = _g_mime_content_disposition_parse (options, value, header->offset); _g_mime_object_set_content_disposition (object, disposition); g_object_unref (disposition); break; case HEADER_CONTENT_TYPE: value = g_mime_header_get_value (header); content_type = _g_mime_content_type_parse (options, value, header->offset); _g_mime_object_set_content_type (object, content_type); g_object_unref (content_type); break; case HEADER_CONTENT_ID: value = g_mime_header_get_value (header); g_free (object->content_id); object->content_id = g_mime_utils_decode_message_id (value); break; } }
static int decode_envelope (SpruceIMAPEngine *engine, SpruceMessageInfo *info, spruce_imap_token_t *token, GError **err) { unsigned char md5sum[16]; char *nstring, *msgid; GChecksum *checksum; size_t len = 16; if (spruce_imap_engine_next_token (engine, token, err) == -1) return -1; if (token->token != '(') { spruce_imap_utils_set_unexpected_token_error (err, engine, token); return -1; } if (envelope_decode_date (engine, &info->date_sent, err) == -1) goto exception; if (envelope_decode_nstring (engine, &info->subject, TRUE, err) == -1) goto exception; if (envelope_decode_addresses (engine, &info->from, err) == -1) goto exception; if (envelope_decode_addresses (engine, &info->sender, err) == -1) goto exception; if (envelope_decode_addresses (engine, &info->reply_to, err) == -1) goto exception; if (envelope_decode_addresses (engine, &info->to, err) == -1) goto exception; if (envelope_decode_addresses (engine, &info->cc, err) == -1) goto exception; if (envelope_decode_addresses (engine, &info->bcc, err) == -1) goto exception; if (envelope_decode_nstring (engine, &nstring, FALSE, err) == -1) goto exception; if (nstring != NULL) { info->references = decode_references (nstring); g_free (nstring); } if (envelope_decode_nstring (engine, &nstring, FALSE, err) == -1) goto exception; if (nstring != NULL) { if ((msgid = g_mime_utils_decode_message_id (nstring))) { checksum = g_checksum_new (G_CHECKSUM_MD5); g_checksum_update (checksum, msgid, strlen (msgid)); g_checksum_get_digest (checksum, md5sum, &len); g_checksum_free (checksum); memcpy (info->message_id.id.hash, md5sum, sizeof (info->message_id.id.hash)); g_free (msgid); } g_free (nstring); } if (spruce_imap_engine_next_token (engine, token, err) == -1) return -1; if (token->token != ')') { spruce_imap_utils_set_unexpected_token_error (err, engine, token); goto exception; } return 0; exception: return -1; }