aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers/local/camel-mh-summary.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2002-06-06 17:53:36 +0800
committerMichael Zucci <zucchi@src.gnome.org>2002-06-06 17:53:36 +0800
commit1f993cacd1ac269ea4e7a77c57edbce732b9e8b5 (patch)
treeb5e1562300b44d813a50320e80eff96e63559a41 /camel/providers/local/camel-mh-summary.c
parenta58c048d65965fd3b543f06dd1c4e2928c60ed68 (diff)
downloadgsoc2013-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.c54
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;
}