aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers')
-rw-r--r--camel/providers/imap/camel-imap-folder.c123
1 files changed, 117 insertions, 6 deletions
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index d6705ace8e..649cf8d94e 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -735,6 +735,115 @@ imap_delete_message_by_uid (CamelFolder *folder, const gchar *uid, CamelExceptio
static CamelMimeMessage *
imap_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *ex)
{
+ CamelStream *msgstream;
+ CamelStreamFilter *f_stream; /* will be used later w/ crlf filter */
+ CamelMimeFilter *filter; /* crlf/dot filter */
+ CamelMimeMessage *msg;
+ CamelMimePart *part;
+ gchar *result, *header, *body, *mesg, *p;
+ int id, status, part_len;
+
+ status = camel_imap_command_extended (CAMEL_STORE (folder->parent_store), folder,
+ &result, "UID FETCH %s BODY.PEEK[HEADER]", uid);
+
+ if (!result || status != CAMEL_IMAP_OK) {
+ CamelService *service = CAMEL_SERVICE (folder->parent_store);
+
+ camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
+ "Could not fetch message %s on IMAP server %s: %s",
+ uid, service->url->host,
+ status == CAMEL_IMAP_ERR ? result :
+ "Unknown error");
+ g_free (result);
+ return camel_mime_message_new ();
+ }
+
+ for (p = result; *p && *p != '{' && *p != '\n'; p++);
+ if (*p != '{') {
+ g_free (result);
+ return camel_mime_message_new ();
+ }
+
+ part_len = atoi (p + 1);
+ for ( ; *p && *p != '\n'; p++);
+ if (*p != '\n') {
+ g_free (result);
+ return camel_mime_message_new ();
+ }
+
+ header = g_strndup (p, part_len);
+ for (p = header + strlen (header) - 1; p > header && *p != ')'; p--);
+ if (p != header)
+ *p = '\0';
+ g_free (result);
+ printf ("*** We got the header ***\n");
+
+ status = camel_imap_command_extended (CAMEL_STORE (folder->parent_store), folder,
+ &result, "UID FETCH %s BODY[TEXT]", uid);
+
+ if (!result || status != CAMEL_IMAP_OK) {
+ CamelService *service = CAMEL_SERVICE (folder->parent_store);
+
+ camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE,
+ "Could not fetch message %s on IMAP server %s: %s",
+ uid, service->url->host,
+ status == CAMEL_IMAP_ERR ? result :
+ "Unknown error");
+ g_free (result);
+ g_free (header);
+ return camel_mime_message_new ();
+ }
+
+ for (p = result; *p && *p != '{' && *p != '\n'; p++);
+ if (*p != '{') {
+ g_free (result);
+ g_free (header);
+ return camel_mime_message_new ();
+ }
+
+ part_len = atoi (p + 1);
+ for ( ; *p && *p != '\n'; p++);
+ if (*p != '\n') {
+ g_free (result);
+ g_free (header);
+ return camel_mime_message_new ();
+ }
+
+ body = g_strndup (p, part_len);
+ for (p = body + strlen (body) - 1; p > body && *p != ')'; p--);
+ *p = '\0';
+ g_free (result);
+ printf ("*** We got the body ***\n");
+
+ mesg = g_strdup_printf ("%s%s", header, body);
+ g_free (header);
+ g_free (body);
+ printf ("*** We got the mesg ***\n");
+
+ fprintf (stderr, "Message:\n%s\n", mesg);
+
+ msgstream = camel_stream_mem_new_with_buffer (mesg, strlen (mesg) + 1);
+#if 0
+ f_stream = camel_stream_filter_new_with_stream (msgstream);
+ filter = camel_mime_filter_crlf_new (CAMEL_MIME_FILTER_CRLF_DECODE, CAMEL_MIME_FILTER_CRLF_MODE_CRLF_DOTS);
+ id = camel_stream_filter_add (f_stream, CAMEL_MIME_FILTER (filter));
+#endif
+ msg = camel_mime_message_new ();
+ printf ("*** We created the camel_mime_message ***\n");
+
+ camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (msg), msgstream);
+#if 0
+ camel_stream_filter_remove (f_stream, id);
+ camel_stream_close (CAMEL_STREAM (f_stream));
+#endif
+ gtk_object_unref (GTK_OBJECT (msgstream));
+ /*gtk_object_unref (GTK_OBJECT (f_stream));*/
+
+ printf ("*** We're returning... ***\n");
+
+ return msg;
+
+#if 0
CamelStream *imap_stream;
CamelStream *msgstream;
CamelStreamFilter *f_stream; /* will be used later w/ crlf filter */
@@ -744,7 +853,7 @@ imap_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *
CamelDataWrapper *cdw;
gchar *cmdbuf;
int id;
-
+
/* TODO: fetch the correct part, get rid of the hard-coded stuff */
cmdbuf = g_strdup_printf ("UID FETCH %s BODY[TEXT]", uid);
imap_stream = camel_imap_stream_new (CAMEL_IMAP_FOLDER (folder), cmdbuf);
@@ -753,7 +862,7 @@ imap_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *
/* Temp hack - basically we read in the entire message instead of getting a part as it's needed */
msgstream = camel_stream_mem_new ();
- camel_stream_write_to_stream (msgstream, CAMEL_STREAM (imap_stream));
+ camel_stream_write_to_stream (CAMEL_STREAM (imap_stream), msgstream);
gtk_object_unref (GTK_OBJECT (imap_stream));
f_stream = camel_stream_filter_new_with_stream (msgstream);
@@ -777,6 +886,7 @@ imap_get_message_by_uid (CamelFolder *folder, const gchar *uid, CamelException *
/*gtk_object_unref (GTK_OBJECT (cdw));*/
return msg;
+#endif
}
/* This probably shouldn't go here...but it will for now */
@@ -885,8 +995,8 @@ imap_get_summary (CamelFolder *folder, CamelException *ex)
break;
}
- p = strchr (result, '(') + 1;
- if (strncasecmp (p, "UID", 3)) {
+ p = strchr (result, '(');
+ if (!p || strncasecmp (p + 1, "UID", 3)) {
g_free (result);
fprintf (stderr, "Warning: UID for message %d not found\n", i);
@@ -899,9 +1009,10 @@ imap_get_summary (CamelFolder *folder, CamelException *ex)
break;
}
- for (p += 4; *p && *p != ' '; p++); /* advance to <uid> */
- for (q = p; *q && *q != ')' && *q != ' '; q++); /* find the end of the <uid> */
+ for (p += 4; *p && (*p < '0' || *p > '9'); p++); /* advance to <uid> */
+ for (q = p; *q && *q != ')' && *q != ' '; q++); /* find the end of the <uid> */
info->uid = g_strndup (p, (gint)(q - p));
+ printf ("*** info->uid = %s\n", info->uid);
g_free (result);
/* now to get the flags */