diff options
-rw-r--r-- | camel/ChangeLog | 7 | ||||
-rw-r--r-- | camel/providers/imap/camel-imap-folder.c | 107 |
2 files changed, 111 insertions, 3 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 7e38c2d529..d35e6babc0 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,10 @@ +2000-06-17 Jeffrey Stedfast <fejj@helixcode.com> + + * providers/imap/camel-imap-folder.c (imap_free_summary): We were + leaking memory - but not anymore! + (imap_get_summary): We now get the UIDs and the beginnings of the + code to get the message flags as well. + 2000-06-17 Dan Winship <danw@helixcode.com> * camel-mime-parser.c (folder_scan_header): Don't copy newlines diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index 74148d3d92..c9af368d3c 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -666,7 +666,7 @@ imap_get_summary (CamelFolder *folder, CamelException *ex) GPtrArray *array = NULL; CamelMessageInfo *info; int i, num, status; - char *result, *datestr; + char *result, *datestr, *p, *q; num = imap_get_message_count (folder, ex); @@ -696,11 +696,110 @@ imap_get_summary (CamelFolder *folder, CamelException *ex) datestr = get_header_field (result, "\nDate:"); info->date_sent = header_decode_date (datestr, NULL); g_free (datestr); + g_free (result); + + /* now to get the UID */ + status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder, + &result, "FETCH %d UID", i); - info->uid = NULL; /* FIXME: how can we get the UID? */ + if (status != CAMEL_IMAP_OK) { + CamelService *service = CAMEL_SERVICE (folder->parent_store); + + camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, + "Could not get summary for %s on IMAP server %s: %s", + folder->full_name, service->url->host, + status == CAMEL_IMAP_ERR ? result : + "Unknown error"); + g_free (result); + + g_free (info->subject); + g_free (info->to); + g_free (info->from); + g_free (info); + + break; + } + + if (!result || *result != '*') { + g_free (result); + fprintf (stderr, "Warning: UID for message %d not found\n", i); + + g_free (info->subject); + g_free (info->to); + g_free (info->from); + g_free (info); + + break; + } + + p = strchr (result, '(') + 1; + if (strncasecmp (p, "UID", 3)) { + g_free (result); + fprintf (stderr, "Warning: UID for message %d not found\n", i); + + g_free (info->subject); + g_free (info->to); + g_free (info->from); + g_free (info); + + break; + } + + for (p += 4; *p && *p != ' '; 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)); g_free (result); - /* still need to get flags */ + /* now to get the flags */ + status = camel_imap_command_extended (CAMEL_IMAP_STORE (folder->parent_store), folder, + &result, "FETCH %d FLAGS", i); + + if (status != CAMEL_IMAP_OK) { + CamelService *service = CAMEL_SERVICE (folder->parent_store); + + camel_exception_setv (ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, + "Could not get summary for %s on IMAP server %s: %s", + folder->full_name, service->url->host, + status == CAMEL_IMAP_ERR ? result : + "Unknown error"); + g_free (result); + + g_free (info->subject); + g_free (info->to); + g_free (info->from); + g_free (info); + + break; + } + + if (!result || *result != '*') { + g_free (result); + fprintf (stderr, "Warning: FLAGS for message %d not found\n", i); + + g_free (info->subject); + g_free (info->to); + g_free (info->from); + g_free (info); + + break; + } + + p = strchr (result, '(') + 1; + if (strncasecmp (p, "FLAGS", 5)) { + g_free (result); + fprintf (stderr, "Warning: FLAGS for message %d not found\n", i); + + g_free (info->subject); + g_free (info->to); + g_free (info->from); + g_free (info); + + break; + } + + /* now we gotta parse for the flags */ + + g_free (result); g_ptr_array_add (array, info); } @@ -721,6 +820,8 @@ imap_free_summary (CamelFolder *folder, GPtrArray *array) g_free (info->to); g_free (info->from); g_free (info->uid); + g_free (info); + info = NULL; } g_ptr_array_free (array, TRUE); |