aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers')
-rw-r--r--camel/providers/imap/camel-imap-folder.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index 0b9f785d21..e798dcbebf 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -56,6 +56,7 @@
#include "camel-mime-message.h"
#include "camel-mime-utils.h"
#include "camel-multipart.h"
+#include "camel-multipart-signed.h"
#include "camel-operation.h"
#include "camel-session.h"
#include "camel-stream-buffer.h"
@@ -512,6 +513,9 @@ imap_rescan (CamelFolder *folder, int exists, CamelException *ex)
g_datalist_clear (&data);
}
+ /* Free the final tagged response */
+ g_free (resp);
+
camel_operation_end (NULL);
if (type == CAMEL_IMAP_RESPONSE_ERROR) {
for (i = 0; i < summary_len && new[i].uid; i++)
@@ -519,8 +523,6 @@ imap_rescan (CamelFolder *folder, int exists, CamelException *ex)
g_free (new);
return;
}
- /* Free the final tagged response */
- g_free (resp);
/* If we find a UID in the summary that doesn't correspond to
* the UID in the folder, then either: (a) it's a real UID,
@@ -1574,8 +1576,35 @@ get_content (CamelImapFolder *imap_folder, const char *uid,
part_spec = content_info_get_part_spec (ci);
- /* There are three cases: multipart, message/rfc822, and "other" */
- if (header_content_type_is (ci->type, "multipart", "*")) {
+ /* There are three cases: multipart/signed, multipart, message/rfc822, and "other" */
+ if (header_content_type_is(ci->type, "multipart", "signed")) {
+ CamelMultipartSigned *body_mp;
+ char *spec;
+ int ret;
+
+ /* Note: because we get the content parts uninterpreted anyway, we could potentially
+ just use the normalmultipart code, except that multipart/signed wont let you yet! */
+
+ body_mp = camel_multipart_signed_new();
+ /* need to set this so it grabs the boundary and other info about the signed type */
+ /* we assume that part->content_type is more accurate/full than ci->type */
+ camel_data_wrapper_set_mime_type_field(CAMEL_DATA_WRAPPER(body_mp), part->content_type);
+
+ spec = alloca(strlen(part_spec) + 6);
+ sprintf(spec, part_spec[0]?"%s.TEXT":"TEXT", part_spec);
+
+ stream = camel_imap_folder_fetch_data (imap_folder, uid, spec, FALSE, ex);
+ if (stream) {
+ ret = camel_data_wrapper_construct_from_stream(CAMEL_DATA_WRAPPER(body_mp), stream);
+ camel_object_unref(CAMEL_OBJECT(stream));
+ if (ret == -1) {
+ camel_object_unref((CamelObject *)body_mp);
+ return NULL;
+ }
+ }
+
+ return (CamelDataWrapper *)body_mp;
+ } else if (header_content_type_is (ci->type, "multipart", "*")) {
CamelMultipart *body_mp;
char *child_spec;
int speclen, num;