diff options
author | Not Zed <NotZed@Ximian.com> | 2002-06-06 17:53:36 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2002-06-06 17:53:36 +0800 |
commit | 1f993cacd1ac269ea4e7a77c57edbce732b9e8b5 (patch) | |
tree | b5e1562300b44d813a50320e80eff96e63559a41 /camel/providers/local/camel-mh-summary.c | |
parent | a58c048d65965fd3b543f06dd1c4e2928c60ed68 (diff) | |
download | gsoc2013-evolution-1f993cacd1ac269ea4e7a77c57edbce732b9e8b5.tar gsoc2013-evolution-1f993cacd1ac269ea4e7a77c57edbce732b9e8b5.tar.gz gsoc2013-evolution-1f993cacd1ac269ea4e7a77c57edbce732b9e8b5.tar.bz2 gsoc2013-evolution-1f993cacd1ac269ea4e7a77c57edbce732b9e8b5.tar.lz gsoc2013-evolution-1f993cacd1ac269ea4e7a77c57edbce732b9e8b5.tar.xz gsoc2013-evolution-1f993cacd1ac269ea4e7a77c57edbce732b9e8b5.tar.zst gsoc2013-evolution-1f993cacd1ac269ea4e7a77c57edbce732b9e8b5.zip |
Remove the CONF_DEFAULT_PATH entry, as this is handled by the url config
2002-06-04 Not Zed <NotZed@Ximian.com>
* providers/local/camel-local-provider.c: Remove the
CONF_DEFAULT_PATH entry, as this is handled by the url config
stuff. This made it basically impossible to configure any local
folder from the gui.
* providers/local/camel-local-folder.c (local_refresh_info): Force
a refresh. Should work for all local folders to force them to
refresh.
* providers/local/camel-maildir-folder.c (maildir_refresh_info):
Removed, moved into camel-local-folder.
* providers/local/camel-mh-summary.c (mh_summary_next_uid_string):
Once we assign or get a uid, tell the summary of this, so the next
uid we get will be higher than any previously.
* camel-object.c (camel_object_ref, camel_object_unref): I got
sick of casting, these now take void * like they should, and
perform their own run-time type checking.
* providers/local/camel-mh-store.c (recursive_scan): Changed to
use stat, not lstat (*shrug* maybe someone wants to softlink their
maildir tree?).
(inode_hash):
(inode_equal):
(inode_free): Copied from camel-maildir store (should put into
camel-local-store or utils?).
(recursive_scan): Changed to check for re-visiting inodes. Also,
it builds the tree itself, rather than using folder_info_build.
(add_folder): Changed to folder_info_new.
(recursive_scan): Properly honour the recursive flag. Also,
lookup unread count from folder.
(folder_info_new): Init unread message count to -1, since we dont
know yet.
(folder_info_new): Take the name as an argument, and perform the
merging here.
(folders_update): Util func to add/remove folders from .folders
file. I'm assuming its sorted.
(get_folder): Add the folder to .folders if we created a new one,
and if it exists.
(delete_folder): Remove from .folders, etc.
(folders_scan): If we have a .folders file, read and use that
instead.
(recursive_scan): Handle scanning from a particular directory
properly.
(rename_folder): Implement so we can track any changes to the
.folders file if its turned on.
** Applied patch below from Greg Hudson.
2002-05-10 Greg Hudson <ghudson@mit.edu>
* camel-mh-store.c (get_inbox, get_folder_info, recursive_scan,
add_folder): Implement support for MH stores.
* camel-mh-summary.c (mh_summary_check, sort_uid_cmp): Sort MH
messages by message number (uid), like we sort maildir messages by
date.
* camel-local-provider.c (mh_provider): Turn on source and store
flags.
svn path=/trunk/; revision=17130
Diffstat (limited to 'camel/providers/local/camel-mh-summary.c')
-rw-r--r-- | camel/providers/local/camel-mh-summary.c | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/camel/providers/local/camel-mh-summary.c b/camel/providers/local/camel-mh-summary.c index 530baa3caf..9eeeb25718 100644 --- a/camel/providers/local/camel-mh-summary.c +++ b/camel/providers/local/camel-mh-summary.c @@ -39,6 +39,8 @@ #include "camel-mh-summary.h" #include <camel/camel-mime-message.h> +#include "camel-private.h" + #define d(x) /*(printf("%s(%d): ", __FILE__, __LINE__),(x))*/ #define CAMEL_MH_SUMMARY_VERSION (0x2000) @@ -135,24 +137,30 @@ static char *mh_summary_next_uid_string(CamelFolderSummary *s) int fd = -1; guint32 uid; char *name; + char *uidstr; /* if we are working to add an existing file, then use current_uid */ - if (mhs->priv->current_uid) - return g_strdup(mhs->priv->current_uid); + if (mhs->priv->current_uid) { + uidstr = g_strdup(mhs->priv->current_uid); + /* tell the summary of this, so we always append numbers to the end */ + camel_folder_summary_set_uid(s, strtoul(uidstr, NULL, 10)+1); + } else { + /* else scan for one - and create it too, to make sure */ + do { + close(fd); + uid = camel_folder_summary_next_uid(s); + name = g_strdup_printf("%s/%u", cls->folder_path, uid); + /* O_EXCL isn't guaranteed, sigh. Oh well, bad luck, mh has problems anyway */ + fd = open(name, O_WRONLY|O_CREAT|O_EXCL, 0600); + g_free(name); + } while (fd == -1 && errno == EEXIST); - /* else scan for one - and create it too, to make sure */ - do { close(fd); - uid = camel_folder_summary_next_uid(s); - name = g_strdup_printf("%s/%u", cls->folder_path, uid); - /* O_EXCL isn't guaranteed, sigh. Oh well, bad luck, mh has problems anyway */ - fd = open(name, O_WRONLY|O_CREAT|O_EXCL, 0600); - g_free(name); - } while (fd == -1 && errno == EEXIST); - close(fd); + uidstr = g_strdup_printf("%u", uid); + } - return g_strdup_printf("%u", uid); + return uidstr; } static int camel_mh_summary_add(CamelLocalSummary *cls, const char *name, int forceindex) @@ -199,12 +207,27 @@ remove_summary(char *key, CamelMessageInfo *info, CamelLocalSummary *cls) } static int +sort_uid_cmp(const void *ap, const void *bp) +{ + const CamelMessageInfo + *a = *((CamelMessageInfo **)ap), + *b = *((CamelMessageInfo **)bp); + const char + *auid = camel_message_info_uid(a), + *buid = camel_message_info_uid(b); + int aval = atoi(auid), bval = atoi(buid); + + return (aval < bval) ? -1 : (aval > bval) ? 1 : 0; +} + +static int mh_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changeinfo, CamelException *ex) { DIR *dir; struct dirent *d; char *p, c; CamelMessageInfo *info; + CamelFolderSummary *s = (CamelFolderSummary *)cls; GHashTable *left; int i, count; int forceindex; @@ -258,13 +281,18 @@ mh_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changeinfo, Came g_hash_table_remove(left, uid); } camel_folder_summary_info_free((CamelFolderSummary *)cls, info); - } + } } } closedir(dir); g_hash_table_foreach(left, (GHFunc)remove_summary, cls); g_hash_table_destroy(left); + /* sort the summary based on message number (uid), since the directory order is not useful */ + CAMEL_SUMMARY_LOCK(s, summary_lock); + qsort(s->messages->pdata, s->messages->len, sizeof(CamelMessageInfo *), sort_uid_cmp); + CAMEL_SUMMARY_UNLOCK(s, summary_lock); + return 0; } |