diff options
-rw-r--r-- | camel/ChangeLog | 10 | ||||
-rw-r--r-- | camel/camel-folder.c | 54 | ||||
-rw-r--r-- | camel/camel-folder.h | 10 |
3 files changed, 60 insertions, 14 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index df83d0acb6..d01fd2a9b5 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,13 @@ +2004-04-13 Not Zed <NotZed@Ximian.com> + + * camel-folder.c (folder_getv): implement the new counts, and get + them all atomically so they're only calculated once and can return + consistent results. + + * camel-folder.h: Added CAMEL_FOLDER_DELETED, CAMEL_FOLDER_JUNKED, + and CAMEL_FOLDER_VISIBLE args, to support client display of + various values. + 2004-04-13 Jeffrey Stedfast <fejj@ximian.com> * camel-folder.h (camel_folder_delete_message): Fix NotZed's fix diff --git a/camel/camel-folder.c b/camel/camel-folder.c index ca30bb24cd..853c49400d 100644 --- a/camel/camel-folder.c +++ b/camel/camel-folder.c @@ -313,6 +313,7 @@ folder_getv(CamelObject *object, CamelException *ex, CamelArgGetV *args) CamelFolder *folder = (CamelFolder *)object; int i; guint32 tag; + int unread = -1, deleted = 0, junked = 0, visible = 0, count; for (i=0;i<args->argc;i++) { CamelArgGet *arg = &args->argv[i]; @@ -343,21 +344,50 @@ folder_getv(CamelObject *object, CamelException *ex, CamelArgGetV *args) case CAMEL_FOLDER_ARG_TOTAL: *arg->ca_int = camel_folder_summary_count(folder->summary); break; - case CAMEL_FOLDER_ARG_UNREAD: { - int j, unread = 0, count; - CamelMessageInfo *info; - - count = camel_folder_summary_count(folder->summary); - for (j=0; j<count; j++) { - if ((info = camel_folder_summary_index(folder->summary, j))) { - if (!(info->flags & CAMEL_MESSAGE_SEEN)) - unread++; - camel_folder_summary_info_free(folder->summary, info); + case CAMEL_FOLDER_ARG_UNREAD: + case CAMEL_FOLDER_ARG_DELETED: + case CAMEL_FOLDER_ARG_JUNKED: + case CAMEL_FOLDER_ARG_VISIBLE: + /* This is so we can get the values atomically, and also so we can calculate them only once */ + if (unread == -1) { + int j; + CamelMessageInfo *info; + + /* TODO: Locking? */ + unread = 0; + count = camel_folder_summary_count(folder->summary); + for (j=0; j<count; j++) { + if ((info = camel_folder_summary_index(folder->summary, j))) { + if (!(info->flags & CAMEL_MESSAGE_SEEN)) + unread++; + if (info->flags & CAMEL_MESSAGE_DELETED) + deleted++; + if (info->flags & CAMEL_MESSAGE_JUNK) + junked++; + if ((info->flags & (CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK)) == 0) + visible++; + camel_folder_summary_info_free(folder->summary, info); + } } } - *arg->ca_int = unread; - break; } + switch (tag & CAMEL_ARG_TAG) { + case CAMEL_FOLDER_ARG_UNREAD: + count = unread; + break; + case CAMEL_FOLDER_ARG_DELETED: + count = deleted; + break; + case CAMEL_FOLDER_ARG_JUNKED: + count = junked; + break; + case CAMEL_FOLDER_ARG_VISIBLE: + count = visible; + break; + } + + *arg->ca_int = count; + break; case CAMEL_FOLDER_ARG_UID_ARRAY: { int j, count; CamelMessageInfo *info; diff --git a/camel/camel-folder.h b/camel/camel-folder.h index 24e02fecb2..78f8885dc6 100644 --- a/camel/camel-folder.h +++ b/camel/camel-folder.h @@ -49,7 +49,10 @@ enum { CAMEL_FOLDER_ARG_STORE, CAMEL_FOLDER_ARG_PERMANENTFLAGS, CAMEL_FOLDER_ARG_TOTAL, - CAMEL_FOLDER_ARG_UNREAD, + CAMEL_FOLDER_ARG_UNREAD, /* unread messages */ + CAMEL_FOLDER_ARG_DELETED, /* deleted messages */ + CAMEL_FOLDER_ARG_JUNKED, /* junked messages */ + CAMEL_FOLDER_ARG_VISIBLE, /* visible !(deleted or junked) */ CAMEL_FOLDER_ARG_UID_ARRAY, CAMEL_FOLDER_ARG_INFO_ARRAY, CAMEL_FOLDER_ARG_PROPERTIES, @@ -63,7 +66,10 @@ enum { CAMEL_FOLDER_PERMANENTFLAGS = CAMEL_FOLDER_ARG_PERMANENTFLAGS | CAMEL_ARG_INT, CAMEL_FOLDER_TOTAL = CAMEL_FOLDER_ARG_TOTAL | CAMEL_ARG_INT, CAMEL_FOLDER_UNREAD = CAMEL_FOLDER_ARG_UNREAD | CAMEL_ARG_INT, - /* should we only get static data? not stuff that needs to be free'd? */ + CAMEL_FOLDER_DELETED = CAMEL_FOLDER_ARG_DELETED | CAMEL_ARG_INT, + CAMEL_FOLDER_JUNKED = CAMEL_FOLDER_ARG_JUNKED | CAMEL_ARG_INT, + CAMEL_FOLDER_VISIBLE = CAMEL_FOLDER_ARG_VISIBLE | CAMEL_ARG_INT, + CAMEL_FOLDER_UID_ARRAY = CAMEL_FOLDER_ARG_UID_ARRAY | CAMEL_ARG_PTR, CAMEL_FOLDER_INFO_ARRAY = CAMEL_FOLDER_ARG_INFO_ARRAY | CAMEL_ARG_PTR, |