Example #1
0
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;
	}
}
Example #2
0
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;
}