+2002-10-18 [christoph] 0.8.5claws43
+
+ * src/folder.[ch]
+ * src/imap.c
+ * src/mbox_folder.c
+ * src/mh.c
+ * src/news.c
+ folder->get_num_list now returns an error code
+ (closes bug [ 609424 ] News cache cleared on failure)
+
2002-10-17 [colin] 0.8.5claws42
* src/news.c
MICRO_VERSION=5
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=claws42
+EXTRA_VERSION=claws43
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
dnl set $target
gint folder_item_scan(FolderItem *item)
{
Folder *folder;
- GSList *folder_list, *cache_list, *folder_list_cur, *cache_list_cur, *new_list = NULL;
+ GSList *folder_list = NULL, *cache_list = NULL, *folder_list_cur, *cache_list_cur, *new_list = NULL;
guint newcnt = 0, unreadcnt = 0, totalcnt = 0;
guint cache_max_num, folder_max_num, cache_cur_num, folder_cur_num;
debug_print("Scanning folder %s for cache changes.\n", item->path);
/* Get list of messages for folder and cache */
+ if (folder->get_num_list(item->folder, item, &folder_list) < 0) {
+ debug_print("Error fetching list of message numbers\n");
+ return(-1);
+ }
+
if (!folder->check_msgnum_validity ||
- folder->check_msgnum_validity(folder, item)) {
+ folder->check_msgnum_validity(folder, item)) {
if (!item->cache)
folder_item_read_cache(item);
cache_list = msgcache_get_msg_list(item->cache);
item->cache = msgcache_new();
cache_list = NULL;
}
- folder_list = folder->get_num_list(item->folder, item);
/* Sort both lists */
cache_list = g_slist_sort(cache_list, folder_sort_cache_list_by_msgnum);
FolderItem *item,
MsgInfo *msginfo);
gint (*scan) (Folder *folder);
- GSList * (*get_num_list) (Folder *folder,
- FolderItem *item);
+ gint (*get_num_list) (Folder *folder,
+ FolderItem *item,
+ GSList **list);
void (*scan_tree) (Folder *folder);
gint (*create_tree) (Folder *folder);
static gboolean imap_rename_folder_func (GNode *node,
gpointer data);
-GSList *imap_get_num_list (Folder *folder,
- FolderItem *item);
+gint imap_get_num_list (Folder *folder,
+ FolderItem *item,
+ GSList **list);
MsgInfo *imap_fetch_msginfo (Folder *folder,
FolderItem *item,
gint num);
return FALSE;
}
-GSList *imap_get_num_list(Folder *folder, FolderItem *_item)
+gint imap_get_num_list(Folder *folder, FolderItem *_item, GSList **msgnum_list)
{
IMAPFolderItem *item = (IMAPFolderItem *)_item;
IMAPSession *session;
- GSList *msgnum_list = NULL;
- gint i, lastuid_old;
+ gint i, lastuid_old, nummsgs = 0;
gint ok, exists = 0, recent = 0, unseen = 0;
guint32 uid_validity = 0;
GPtrArray *argbuf;
gchar *cmdbuf = NULL;
gchar *dir;
- g_return_val_if_fail(folder != NULL, NULL);
- g_return_val_if_fail(item != NULL, NULL);
- g_return_val_if_fail(item->item.path != NULL, NULL);
- g_return_val_if_fail(folder->type == F_IMAP, NULL);
- g_return_val_if_fail(folder->account != NULL, NULL);
+ g_return_val_if_fail(folder != NULL, -1);
+ g_return_val_if_fail(item != NULL, -1);
+ g_return_val_if_fail(item->item.path != NULL, -1);
+ g_return_val_if_fail(folder->type == F_IMAP, -1);
+ g_return_val_if_fail(folder->account != NULL, -1);
session = imap_session_get(folder);
- g_return_val_if_fail(session != NULL, NULL);
+ g_return_val_if_fail(session != NULL, -1);
ok = imap_select(session, IMAP_FOLDER(folder), item->item.path,
&exists, &recent, &unseen, &uid_validity);
if (ok != IMAP_SUCCESS)
- return NULL;
+ return -1;
argbuf = g_ptr_array_new();
if(item->lastuid) {
if (ok != IMAP_SUCCESS) {
ptr_array_free_strings(argbuf);
g_ptr_array_free(argbuf, TRUE);
- return NULL;
+ return -1;
}
lastuid_old = item->lastuid;
- msgnum_list = g_slist_copy(item->uid_list);
- debug_print("Got %d uids from cache\n", g_slist_length(msgnum_list));
+ *msgnum_list = g_slist_copy(item->uid_list);
+ debug_print("Got %d uids from cache\n", g_slist_length(item->uid_list));
for(i = 0; i < argbuf->len; i++) {
int ret, msgidx, msgnum;
if((ret = sscanf(g_ptr_array_index(argbuf, i), "%d FETCH (UID %d)", &msgidx, &msgnum)) == 2) {
if(msgnum > lastuid_old) {
- msgnum_list = g_slist_prepend(msgnum_list, GINT_TO_POINTER(msgnum));
+ *msgnum_list = g_slist_prepend(*msgnum_list, GINT_TO_POINTER(msgnum));
item->uid_list = g_slist_prepend(item->uid_list, GINT_TO_POINTER(msgnum));
+ nummsgs++;
if(msgnum > item->lastuid)
item->lastuid = msgnum;
dir = folder_item_get_path((FolderItem *)item);
debug_print("removing old messages from %s\n", dir);
- remove_numbered_files_not_in_list(dir, msgnum_list);
+ remove_numbered_files_not_in_list(dir, *msgnum_list);
g_free(dir);
- return msgnum_list;
+ return nummsgs;
}
MsgInfo *imap_fetch_msginfo(Folder *_folder, FolderItem *item, gint num)
static gchar * mbox_get_folderitem_name(gchar * name);
MsgInfo *mbox_fetch_msginfo(Folder *folder, FolderItem *item, gint num);
-GSList *mbox_get_num_list(Folder *folder, FolderItem *item);
+gint mbox_get_num_list(Folder *folder, FolderItem *item, GSList **list);
gboolean mbox_check_msgnum_validity(Folder *folder, FolderItem *item);
Folder *mbox_folder_new(const gchar *name, const gchar *path)
return 0;
}
-GSList *mbox_get_num_list(Folder *folder, FolderItem *item)
+gint mbox_get_num_list(Folder *folder, FolderItem *item, GSList **mlist)
{
- GSList *mlist;
GList * l;
FILE * fp;
gchar * mbox_path;
-
- mlist = NULL;
+ gint nummsgs = 0;
mbox_path = mbox_folder_get_path(item);
if (mbox_path == NULL)
- return NULL;
+ return -1;
mbox_purge_deleted(mbox_path);
if (fp == NULL) {
g_free(mbox_path);
- return NULL;
+ return -1;
}
mbox_lockread_file(fp, mbox_path);
msg = (struct _message *) l->data;
if (MSG_IS_INVALID(msg->flags) || !MSG_IS_REALLY_DELETED(msg->flags)) {
- mlist = g_slist_append(mlist, GINT_TO_POINTER(msg->msgnum));
+ *mlist = g_slist_append(*mlist, GINT_TO_POINTER(msg->msgnum));
+ nummsgs++;
} else {
MSG_SET_PERM_FLAGS(msg->flags, MSG_REALLY_DELETED);
}
fclose(fp);
- return mlist;
+ return nummsgs;
}
MsgInfo *mbox_fetch_msginfo(Folder *folder, FolderItem *item, gint num)
gint mh_scan_folder (Folder *folder,
FolderItem *item);
-GSList *mh_get_num_list (Folder *folder,
- FolderItem *item);
+gint mh_get_num_list (Folder *folder,
+ FolderItem *item,
+ GSList **list);
void mh_scan_tree (Folder *folder);
gint mh_create_tree (Folder *folder);
item->last_num = max;
}
-GSList *mh_get_num_list(Folder *folder, FolderItem *item)
+gint mh_get_num_list(Folder *folder, FolderItem *item, GSList **list)
{
gchar *path;
DIR *dp;
struct dirent *d;
struct stat s;
- gint num;
- GSList *list = NULL;
+ gint num, nummsgs = 0;
- g_return_val_if_fail(item != NULL, NULL);
+ g_return_val_if_fail(item != NULL, -1);
debug_print("mh_get_last_num(): Scanning %s ...\n", item->path);
path = folder_item_get_path(item);
- g_return_val_if_fail(path != NULL, NULL);
+ g_return_val_if_fail(path != NULL, -1);
if (change_dir(path) < 0) {
g_free(path);
- return NULL;
+ return -1;
}
g_free(path);
if ((dp = opendir(".")) == NULL) {
FILE_OP_ERROR(item->path, "opendir");
- return NULL;
+ return -1;
}
while ((d = readdir(dp)) != NULL) {
if ((num = to_number(d->d_name)) >= 0 &&
stat(d->d_name, &s) == 0 &&
S_ISREG(s.st_mode)) {
- list = g_slist_prepend(list, GINT_TO_POINTER(num));
+ *list = g_slist_prepend(*list, GINT_TO_POINTER(num));
+ nummsgs++;
}
}
closedir(dp);
- return list;
+ return nummsgs;
}
GSList *mh_get_msg_list(Folder *folder, FolderItem *item, gboolean use_cache)
static gint news_remove_msg (Folder *folder,
FolderItem *item,
gint num);
-GSList *news_get_num_list (Folder *folder,
- FolderItem *item);
+gint news_get_num_list (Folder *folder,
+ FolderItem *item,
+ GSList **list);
MsgInfo *news_fetch_msginfo (Folder *folder,
FolderItem *item,
gint num);
return 0;
}
-GSList *news_get_num_list(Folder *folder, FolderItem *item)
+gint news_get_num_list(Folder *folder, FolderItem *item, GSList **msgnum_list)
{
NNTPSession *session;
- gint i, ok, num, first, last;
- GSList *msgnum_list = NULL;
+ gint i, ok, num, first, last, nummsgs = 0;
gchar *dir;
+ g_return_val_if_fail(item != NULL, -1);
+ g_return_val_if_fail(item->folder != NULL, -1);
+ g_return_val_if_fail(item->folder->type == F_NEWS, -1);
+
session = news_session_get(folder);
- g_return_val_if_fail(session != NULL, NULL);
- g_return_val_if_fail(item != NULL, NULL);
- g_return_val_if_fail(item->folder != NULL, NULL);
- g_return_val_if_fail(item->folder->type == F_NEWS, NULL);
+ g_return_val_if_fail(session != NULL, -1);
ok = news_select_group(session, item->path, &num, &first, &last);
if (ok != NN_SUCCESS) {
log_warning(_("can't set group: %s\n"), item->path);
- return NULL;
+ return -1;
}
if(last < first) {
log_warning(_("invalid article range: %d - %d\n"),
first, last);
- return NULL;
+ return 0;
}
for(i = first; i <= last; i++) {
- msgnum_list = g_slist_prepend(msgnum_list, GINT_TO_POINTER(i));
+ *msgnum_list = g_slist_prepend(*msgnum_list, GINT_TO_POINTER(i));
+ nummsgs++;
}
dir = folder_item_get_path(item);
remove_numbered_files(dir, 1, first - 1);
g_free(dir);
- return msgnum_list;
+ return nummsgs;
}
#define READ_TO_LISTEND(hdr) \