diff options
author | Not Zed <NotZed@Ximian.com> | 2004-02-16 17:38:24 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2004-02-16 17:38:24 +0800 |
commit | 1ceb4cd764fbdd89a3b67903251dc89ad3e7d723 (patch) | |
tree | a551592e442ee3404caa5d05a8362d7dd1d553b0 /camel/camel-folder-summary.c | |
parent | 22fdff59a00dbbdcc6c6a59f452cfa7141bc7aad (diff) | |
download | gsoc2013-evolution-1ceb4cd764fbdd89a3b67903251dc89ad3e7d723.tar.gz gsoc2013-evolution-1ceb4cd764fbdd89a3b67903251dc89ad3e7d723.tar.zst gsoc2013-evolution-1ceb4cd764fbdd89a3b67903251dc89ad3e7d723.zip |
** See bug #51045.
2004-02-16 Not Zed <NotZed@Ximian.com>
** See bug #51045.
* providers/imap/camel-imap-store.c (fill_fi): similar to mbox
version.
(get_folder_counts): use fill_fi to try and get folder counts if
we're not doing the hard slog.
(get_one_folder_offline): use fill_fi to try to get folder counts
from open folders or summaries.
* providers/local/camel-maildir-store.c (fill_fi): similar to mbox
version.
(scan_dir): use fill_fi to get the unread count now.
* providers/local/camel-mbox-store.c (fill_fi): helper to lookup
unread count either from active folder or from summary file, if
it's available.
(scan_dir, get_folder_info): use helper above to get folder info.
* devel-docs/camel-folder-summary.txt: New document describing the
format/conventions in the CamelFolderSummary file.
* providers/nntp/camel-nntp-summary.c (summary_header_load/save):
* providers/imapp/camel-imapp-summary.c (summary_header_load/save):
* providers/imap/camel-imap-summary.c (summary_header_load/save):
Handle versions, per-class version number (1).
* providers/local/camel-mbox-summary.c (summary_header_load/save):
Handle versions properly, add a per-class version (1). Write out the
folder size as a size_t rather than 32 bit int.
* providers/local/camel-local-summary.c (summary_header_load/save):
read/write the per-class version number (1).
* camel-folder-summary.c (summary_header_load): do version
checking differently, allow the version to be bumped without
aborting the load. Added unread/deleted/junk counts to base
header.
(summary_header_save): Save out the new-format header. Version
bumped to 13.
* camel.c (camel_init): return 0 rather than spit a compiler warning.
* camel-file-utils.c (camel_file_util_encode_*_t): macro-ise the
type encoder/decoders. Also add size_t encoder/decoder.
svn path=/trunk/; revision=24744
Diffstat (limited to 'camel/camel-folder-summary.c')
-rw-r--r-- | camel/camel-folder-summary.c | 72 |
1 files changed, 54 insertions, 18 deletions
diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c index 05b3f3a056..ac0ca87386 100644 --- a/camel/camel-folder-summary.c +++ b/camel/camel-folder-summary.c @@ -75,7 +75,7 @@ static pthread_mutex_t info_lock = PTHREAD_MUTEX_INITIALIZER; extern int strdup_count, malloc_count, free_count; #endif -#define CAMEL_FOLDER_SUMMARY_VERSION (12) +#define CAMEL_FOLDER_SUMMARY_VERSION (13) #define _PRIVATE(o) (((CamelFolderSummary *)(o))->priv) @@ -1403,45 +1403,81 @@ my_list_size(struct _node **list) static int summary_header_load(CamelFolderSummary *s, FILE *in) { - gint32 version, flags, nextuid, count; - time_t time; - fseek(in, 0, SEEK_SET); io(printf("Loading header\n")); - if (camel_file_util_decode_fixed_int32(in, &version) == -1 - || camel_file_util_decode_fixed_int32(in, &flags) == -1 - || camel_file_util_decode_fixed_int32(in, &nextuid) == -1 - || camel_file_util_decode_time_t(in, &time) == -1 - || camel_file_util_decode_fixed_int32(in, &count) == -1) { + if (camel_file_util_decode_fixed_int32(in, &s->version) == -1) return -1; - } - s->nextuid = nextuid; - s->flags = flags; - s->time = time; - s->saved_count = count; - if (s->version != version) { - d(printf ("Summary header version mismatch")); + /* Legacy version check, before version 12 we have no upgrade knowledge */ + if ((s->version > 0xff) && (s->version & 0xff) < 12) { + (printf ("Summary header version mismatch")); errno = EINVAL; return -1; } + + if (!(s->version < 0x100 && s->version >= 13)) + printf("Loading legacy summary\n"); + else + printf("loading new-format summary\n"); + + /* legacy version */ + if (camel_file_util_decode_fixed_int32(in, &s->flags) == -1 + || camel_file_util_decode_fixed_int32(in, &s->nextuid) == -1 + || camel_file_util_decode_time_t(in, &s->time) == -1 + || camel_file_util_decode_fixed_int32(in, &s->saved_count) == -1) { + return -1; + } + + /* version 13 */ + if (s->version < 0x100 && s->version >= 13 + && (camel_file_util_decode_fixed_int32(in, &s->unread_count) == -1 + || camel_file_util_decode_fixed_int32(in, &s->deleted_count) == -1 + || camel_file_util_decode_fixed_int32(in, &s->junk_count) == -1)) { + return -1; + } + return 0; } static int summary_header_save(CamelFolderSummary *s, FILE *out) { + int unread = 0, deleted = 0, junk = 0, count, i; + fseek(out, 0, SEEK_SET); io(printf("Savining header\n")); - camel_file_util_encode_fixed_int32(out, s->version); + /* we always write out the current version */ + camel_file_util_encode_fixed_int32(out, CAMEL_FOLDER_SUMMARY_VERSION); camel_file_util_encode_fixed_int32(out, s->flags); camel_file_util_encode_fixed_int32(out, s->nextuid); camel_file_util_encode_time_t(out, s->time); - return camel_file_util_encode_fixed_int32(out, camel_folder_summary_count(s)); + + count = camel_folder_summary_count(s); + for (i=0; i<count; i++) { + CamelMessageInfo *info = camel_folder_summary_index(s, i); + + if (info == NULL) + continue; + + if ((info->flags & CAMEL_MESSAGE_SEEN) == 0) + unread++; + if ((info->flags & CAMEL_MESSAGE_DELETED) != 0) + deleted++; + if ((info->flags & CAMEL_MESSAGE_JUNK) != 0) + junk++; + + camel_folder_summary_info_free(s, info); + } + + camel_file_util_encode_fixed_int32(out, count); + camel_file_util_encode_fixed_int32(out, unread); + camel_file_util_encode_fixed_int32(out, deleted); + + return camel_file_util_encode_fixed_int32(out, junk); } /* are these even useful for anything??? */ |