Allow any leaf part to be a message/rfc822 part. (digest_get_uids):

2002-03-11  Jeffrey Stedfast  <fejj@ximian.com>

	* camel-digest-folder.c (camel_digest_folder_new): Allow any leaf
	part to be a message/rfc822 part.
	(digest_get_uids): Recurse the mime structure and add all
	message/rfc822 parts and use a uid scheme similar to IMAP's mime
	part naming convention.
	(digest_get_message): Decode the uid to get the correct mime part.

svn path=/trunk/; revision=16111
This commit is contained in:
Jeffrey Stedfast
2002-03-11 23:38:42 +00:00
committed by Jeffrey Stedfast
parent abed3a2d41
commit a14aadf6f5
2 changed files with 89 additions and 42 deletions

View File

@ -1,3 +1,12 @@
2002-03-11 Jeffrey Stedfast <fejj@ximian.com>
* camel-digest-folder.c (camel_digest_folder_new): Allow any leaf
part to be a message/rfc822 part.
(digest_get_uids): Recurse the mime structure and add all
message/rfc822 parts and use a uid scheme similar to IMAP's mime
part naming convention.
(digest_get_message): Decode the uid to get the correct mime part.
2002-03-11 Ettore Perazzoli <ettore@ximian.com>
* camel-mime-utils.c: Change the order of the mailing list magic

View File

@ -146,6 +146,28 @@ camel_digest_folder_get_type (void)
return type;
}
static gboolean
multipart_contains_message_parts (CamelMultipart *multipart)
{
gboolean has_message_parts = FALSE;
CamelDataWrapper *wrapper;
CamelMimePart *part;
int i, parts;
parts = camel_multipart_get_number (multipart);
for (i = 0; i < parts && !has_message_parts; i++) {
part = camel_multipart_get_part (multipart, i);
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
if (CAMEL_IS_MULTIPART (wrapper)) {
has_message_parts = multipart_contains_message_parts (CAMEL_MULTIPART (wrapper));
} else if (header_content_type_is (part->content_type, "message", "rfc822")) {
has_message_parts = TRUE;
}
}
return has_message_parts;
}
CamelFolder *
camel_digest_folder_new (CamelMimeMessage *message)
{
@ -157,20 +179,9 @@ camel_digest_folder_new (CamelMimeMessage *message)
if (!wrapper || !CAMEL_IS_MULTIPART (wrapper))
return NULL;
if (!header_content_type_is (CAMEL_MIME_PART (message)->content_type, "multipart", "*")) {
gboolean is_digest = FALSE;
int i, parts;
/* Make sure we have a multipart of message/rfc822 attachments... */
parts = camel_multipart_get_number (CAMEL_MULTIPART (wrapper));
for (i = 0; i < parts && !is_digest; i++) {
CamelMimePart *part = camel_multipart_get_part (CAMEL_MULTIPART (wrapper), i);
if (header_content_type_is (part->content_type, "message", "rfc822"))
is_digest = TRUE;
}
if (!is_digest)
if (!header_content_type_is (CAMEL_MIME_PART (message)->content_type, "multipart", "digest")) {
/* Make sure we have a multipart/digest subpart or at least some message/rfc822 attachments... */
if (!multipart_contains_message_parts (CAMEL_MULTIPART (wrapper)))
return NULL;
}
@ -203,6 +214,45 @@ digest_expunge (CamelFolder *folder, CamelException *ex)
/* no-op */
}
static void
digest_add_multipart (CamelDigestFolder *digest, CamelMultipart *multipart,
GPtrArray *summary, GPtrArray *uids, GHashTable *info_hash,
const char *preuid)
{
int parts, i;
parts = camel_multipart_get_number (multipart);
for (i = 0; i < parts; i++) {
CamelDataWrapper *wrapper;
CamelMessageInfo *info;
CamelMimePart *part;
char *uid;
part = camel_multipart_get_part (multipart, i);
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
if (CAMEL_IS_MULTIPART (wrapper)) {
uid = g_strdup_printf ("%s%d.", preuid, i);
digest_add_multipart (digest, CAMEL_MULTIPART (wrapper),
summary, uids, info_hash, uid);
g_free (uid);
continue;
} else if (!header_content_type_is (part->content_type, "message", "rfc822")) {
continue;
}
info = camel_message_info_new_from_header (part->headers);
uid = g_strdup_printf ("%s%d", preuid, i);
camel_message_info_set_uid (info, uid);
g_ptr_array_add (uids, uid);
g_ptr_array_add (summary, info);
g_hash_table_insert (info_hash, uid, info);
}
}
static GPtrArray *
digest_get_uids (CamelFolder *folder)
{
@ -211,7 +261,6 @@ digest_get_uids (CamelFolder *folder)
GHashTable *info_hash;
GPtrArray *summary;
GPtrArray *uids;
int parts, i;
if (digest_folder->priv->uids)
return digest_folder->priv->uids;
@ -221,29 +270,7 @@ digest_get_uids (CamelFolder *folder)
info_hash = digest_folder->priv->info_hash;
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (digest_folder->priv->message));
parts = camel_multipart_get_number (CAMEL_MULTIPART (wrapper));
for (i = 0; i < parts; i++) {
CamelMimeMessage *message;
CamelMessageInfo *info;
CamelMimePart *part;
char *uid;
part = camel_multipart_get_part (CAMEL_MULTIPART (wrapper), i);
if (!header_content_type_is (part->content_type, "message", "rfc822"))
continue;
message = CAMEL_MIME_MESSAGE (part);
info = camel_message_info_new_from_header (CAMEL_MIME_PART (message)->headers);
uid = g_strdup_printf ("%d", i + 1);
camel_message_info_set_uid (info, uid);
g_ptr_array_add (uids, uid);
g_ptr_array_add (summary, info);
g_hash_table_insert (info_hash, uid, info);
}
digest_add_multipart (digest_folder, CAMEL_MULTIPART (wrapper), summary, uids, info_hash, "");
digest_folder->priv->uids = uids;
digest_folder->priv->summary = summary;
@ -299,13 +326,24 @@ digest_get_message (CamelFolder *folder, const char *uid, CamelException *ex)
CamelDataWrapper *wrapper;
CamelMimeMessage *message;
CamelMimePart *part;
char *subuid = "";
int id;
id = atoi (uid) - 1;
g_assert (id > 0);
part = CAMEL_MIME_PART (digest->priv->message);
do {
id = strtoul (uid, &subuid, 10);
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part));
if (!CAMEL_IS_MULTIPART (wrapper))
return NULL;
part = camel_multipart_get_part (CAMEL_MULTIPART (wrapper), id);
uid = subuid++;
} while (*uid == '.');
if (!CAMEL_IS_MIME_MESSAGE (part))
return NULL;
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (digest->priv->message));
part = camel_multipart_get_part (CAMEL_MULTIPART (wrapper), id);
message = CAMEL_MIME_MESSAGE (part);
camel_object_ref (CAMEL_OBJECT (message));