aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog6
-rw-r--r--camel/providers/local/camel-maildir-store.c104
2 files changed, 35 insertions, 75 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 7e93eac944..9166e7e1ab 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,5 +1,11 @@
2004-03-17 Not Zed <NotZed@Ximian.com>
+ * providers/local/camel-maildir-store.c: Reverted jeff's fix for
+ #55018, since it wasn't tested, and doesn't work. Wrote an
+ alternate implementation, and tested it at least once. Turns out
+ it was a one line error, it still wasn't tested. Oh well, its
+ rewritten now.
+
* See bug #55618.
* camel-disco-diary.c (camel_disco_diary_new): seek to the end of
diff --git a/camel/providers/local/camel-maildir-store.c b/camel/providers/local/camel-maildir-store.c
index a7c3eb4624..056ac22d0c 100644
--- a/camel/providers/local/camel-maildir-store.c
+++ b/camel/providers/local/camel-maildir-store.c
@@ -222,8 +222,7 @@ static void delete_folder(CamelStore * store, const char *folder_name, CamelExce
g_free(new);
}
-static CamelFolderInfo *
-camel_folder_info_new (const char *url, const char *full, const char *name, guint32 flags)
+static CamelFolderInfo *camel_folder_info_new(const char *url, const char *full, const char *name)
{
CamelFolderInfo *fi;
@@ -233,13 +232,12 @@ camel_folder_info_new (const char *url, const char *full, const char *name, guin
fi->name = g_strdup(name);
fi->unread = -1;
fi->total = -1;
- fi->flags = flags;
camel_folder_info_build_path(fi, '/');
-
+
if (!strcmp(full, "."))
fi->flags |= CAMEL_FOLDER_SYSTEM;
- d(printf("Adding maildir info: '%s' '%s' '%s' '%s'\n", fi->path, fi->name, fi->full_name, fi->uri));
+ d(printf("Adding maildir info: '%s' '%s' '%s' '%s'\n", fi->path, fi->name, fi->full_name, fi->url));
return fi;
}
@@ -283,16 +281,13 @@ struct _inode {
};
/* returns number of records found at or below this level */
-static int
-scan_dir (CamelStore *store, CamelURL *url, GHashTable *visited, char *root, const char *path, guint32 flags,
- CamelFolderInfo *parent, CamelFolderInfo **fip, CamelException *ex)
+static int scan_dir(CamelStore *store, GHashTable *visited, CamelURL *url, const char *path, guint32 flags, CamelFolderInfo *parent, CamelFolderInfo **fip, CamelException *ex)
{
DIR *dir;
struct dirent *d;
- char *name, *uri, *tmp, *cur, *new;
- const char *base;
+ char *name, *tmp, *cur, *new;
+ const char *base, *root = ((CamelService *)store)->url->path;
CamelFolderInfo *fi = NULL;
- guint32 fi_flags = 0;
struct stat st;
/* look for folders matching the right structure, recursively */
@@ -304,75 +299,33 @@ scan_dir (CamelStore *store, CamelURL *url, GHashTable *visited, char *root, con
cur = g_strdup_printf("%s/cur", name);
new = g_strdup_printf("%s/new", name);
- if (!(stat (tmp, &st) == 0 && S_ISDIR (st.st_mode)
- && stat (cur, &st) == 0 && S_ISDIR (st.st_mode)
- && stat (new, &st) == 0 && S_ISDIR (st.st_mode)))
- fi_flags = CAMEL_FOLDER_NOSELECT;
-
base = strrchr(path, '/');
if (base)
base++;
else
base = path;
-#if 0
- /* if we have this folder open, get the real unread count */
- folder = camel_object_bag_get(store->folders, path);
- if (folder) {
- if ((flags & CAMEL_STORE_FOLDER_INFO_FAST) == 0)
- camel_folder_refresh_info(folder, NULL);
- unread = camel_folder_get_unread_message_count(folder);
- camel_object_unref(folder);
- } else {
- unread = -1;
- }
+ camel_url_set_fragment(url, path);
+
+ fi = camel_folder_info_new(camel_url_to_string(url, 0), path, base);
+ fill_fi(store, fi, flags);
+
+ if (!(stat(tmp, &st) == 0 && S_ISDIR(st.st_mode)
+ && stat(cur, &st) == 0 && S_ISDIR(st.st_mode)
+ && stat(new, &st) == 0 && S_ISDIR(st.st_mode)))
+ fi->flags |= CAMEL_FOLDER_NOSELECT;
- /* if we dont have a folder, then scan the directory and get the unread
- count from there, which is reasonably cheap (on decent filesystem) */
- /* Well we could get this from the summary, but this is more accurate */
- if (folder == NULL
- && (flags & CAMEL_STORE_FOLDER_INFO_FAST) == 0) {
- unread = 0;
- dir = opendir(new);
- if (dir) {
- /* we assume that all files here are unread ones */
- while ( (d = readdir(dir)) ) {
- if (d->d_name[0] != '.')
- unread++;
- }
- closedir(dir);
- }
- dir = opendir(cur);
- if (dir) {
- /* any files with flags but not the 'S' (seen) flag are unread */
- while ( (d = readdir(dir)) ) {
- char *p = strstr(d->d_name, ":2,");
-
- if (p && strchr(p, 'S') == NULL)
- unread++;
- }
- closedir(dir);
- }
- }
-#endif
-
- g_free (tmp);
- g_free (new);
- g_free (cur);
-
- uri = camel_url_to_string (url, 0);
- fi = camel_folder_info_new (uri, path, base, fi_flags);
- g_free (uri);
-
- fill_fi (store, fi, flags);
-
d(printf("found! uri = %s\n", fi->uri));
d(printf(" full_name = %s\n name = '%s'\n", fi->full_name, fi->name));
fi->parent = parent;
fi->next = *fip;
*fip = fi;
-
+
+ g_free(tmp);
+ g_free(cur);
+ g_free(new);
+
/* always look further if asked */
if (((flags & CAMEL_STORE_FOLDER_INFO_RECURSIVE) || parent == NULL)) {
int children = 0;
@@ -407,7 +360,7 @@ scan_dir (CamelStore *store, CamelURL *url, GHashTable *visited, char *root, con
*inew = in;
g_hash_table_insert(visited, inew, inew);
new = g_strdup_printf("%s/%s", path, d->d_name);
- if (scan_dir(store, url, visited, root, new, flags, fi, &fi->child, ex) == -1) {
+ if (scan_dir(store, visited, url, new, flags, fi, &fi->child, ex) == -1) {
g_free(tmp);
g_free(new);
closedir(dir);
@@ -457,19 +410,20 @@ get_folder_info (CamelStore *store, const char *top, guint32 flags, CamelExcepti
CamelLocalStore *local_store = (CamelLocalStore *)store;
GHashTable *visited;
CamelURL *url;
-
- url = camel_url_copy (((CamelService *) store)->url);
-
+
visited = g_hash_table_new(inode_hash, inode_equal);
-
- if (scan_dir(store, url, visited, ((CamelService *)local_store)->url->path, top?top:".", flags, NULL, &fi, ex) == -1 && fi != NULL) {
+
+ url = camel_url_new("maildir:", NULL);
+ camel_url_set_path(url, ((CamelService *)local_store)->url->path);
+
+ if (scan_dir(store, visited, url, top?top:".", flags, NULL, &fi, ex) == -1 && fi != NULL) {
camel_store_free_folder_info_full(store, fi);
fi = NULL;
}
+ camel_url_free(url);
g_hash_table_foreach(visited, inode_free, NULL);
g_hash_table_destroy(visited);
- camel_url_free (url);
-
+
return fi;
}