* src/folder.[ch]
* src/imap.c
* src/mbox_folder.c
* src/mh.c
* src/news.c
optimize folder system
* src/gtk/gtkstext.c
fix division by zero when font has 0 width for ' '
+2003-08-21 [christoph] 0.9.4claws33
+
+ * src/folder.[ch]
+ * src/imap.c
+ * src/mbox_folder.c
+ * src/mh.c
+ * src/news.c
+ optimize folder system
+
+ * src/gtk/gtkstext.c
+ fix division by zero when font has 0 width for ' '
+
2003-08-21 [paul] 0.9.4claws32
* sync with 0.9.4cvs7
2003-08-21 [paul] 0.9.4claws32
* sync with 0.9.4cvs7
MICRO_VERSION=4
INTERFACE_AGE=0
BINARY_AGE=0
MICRO_VERSION=4
INTERFACE_AGE=0
BINARY_AGE=0
if test $EXTRA_VERSION -eq 0; then
VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}claws
else
if test $EXTRA_VERSION -eq 0; then
VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}claws
else
"/Spelling/Spelling Configuration");
gtkaspell_populate_submenu(gtkaspell, menuitem);
menu_set_sensitive(ifactory, "/Spelling", TRUE);
"/Spelling/Spelling Configuration");
gtkaspell_populate_submenu(gtkaspell, menuitem);
menu_set_sensitive(ifactory, "/Spelling", TRUE);
gint folder_item_open(FolderItem *item)
{
gint folder_item_open(FolderItem *item)
{
- if(((FOLDER_TYPE(item->folder) == F_IMAP) && !item->no_select) || (FOLDER_TYPE(item->folder) == F_NEWS)) {
+ if((item->folder->klass->scan_required != NULL) && (item->folder->klass->scan_required(item->folder, item))) {
folder_item_scan_full(item, TRUE);
}
folder_item_scan_full(item, TRUE);
}
GSList *newmsg_list = NULL;
guint newcnt = 0, unreadcnt = 0, totalcnt = 0, unreadmarkedcnt = 0;
guint cache_max_num, folder_max_num, cache_cur_num, folder_cur_num;
GSList *newmsg_list = NULL;
guint newcnt = 0, unreadcnt = 0, totalcnt = 0, unreadmarkedcnt = 0;
guint cache_max_num, folder_max_num, cache_cur_num, folder_cur_num;
- gboolean update_flags = 0;
+ gboolean update_flags = 0, old_uids_valid = FALSE;
g_return_val_if_fail(item != NULL, -1);
if (item->path == NULL) return -1;
g_return_val_if_fail(item != NULL, -1);
if (item->path == NULL) return -1;
debug_print("Scanning folder %s for cache changes.\n", item->path);
/* Get list of messages for folder and cache */
debug_print("Scanning folder %s for cache changes.\n", item->path);
/* Get list of messages for folder and cache */
- if (folder->klass->get_num_list(item->folder, item, &folder_list) < 0) {
+ if (folder->klass->get_num_list(item->folder, item, &folder_list, &old_uids_valid) < 0) {
debug_print("Error fetching list of message numbers\n");
return(-1);
}
debug_print("Error fetching list of message numbers\n");
return(-1);
}
- if (!folder->klass->check_msgnum_validity ||
- folder->klass->check_msgnum_validity(folder, item)) {
if (!item->cache)
folder_item_read_cache(item);
cache_list = msgcache_get_msg_list(item->cache);
if (!item->cache)
folder_item_read_cache(item);
cache_list = msgcache_get_msg_list(item->cache);
FolderItem *item);
gint (*get_num_list) (Folder *folder,
FolderItem *item,
FolderItem *item);
gint (*get_num_list) (Folder *folder,
FolderItem *item,
+ GSList **list,
+ gboolean *old_uids_valid);
void (*update_mark) (Folder *folder,
FolderItem *item);
void (*finished_copy) (Folder *folder,
FolderItem *item);
void (*finished_remove) (Folder *folder,
void (*update_mark) (Folder *folder,
FolderItem *item);
void (*finished_copy) (Folder *folder,
FolderItem *item);
void (*finished_remove) (Folder *folder,
- FolderItem * item);
- gboolean (*check_msgnum_validity)(Folder *folder,
- FolderItem * item);
+ FolderItem *item);
+ gboolean (*scan_required) (Folder *folder,
+ FolderItem *item);
/* Message functions */
MsgInfo *(*get_msginfo) (Folder *folder,
/* Message functions */
MsgInfo *(*get_msginfo) (Folder *folder,
pixels_remaining -= running_offset;
space_width = MARK_CURRENT_TEXT_FONT(text, &mark)->char_widths[' '];
pixels_remaining -= running_offset;
space_width = MARK_CURRENT_TEXT_FONT(text, &mark)->char_widths[' '];
-
- spaces_avail = pixels_remaining / space_width;
- spaces_avail = MIN (spaces_avail, tab_mark.to_next_tab);
+ if (space_width > 0) {
+ spaces_avail = pixels_remaining / space_width;
+ spaces_avail = MIN (spaces_avail, tab_mark.to_next_tab);
+ } else {
+ spaces_avail = 0;
+ }
draw_bg_rect (text, &mark, running_offset, pixel_start_height,
spaces_avail * space_width, LINE_HEIGHT (*lp), TRUE);
draw_bg_rect (text, &mark, running_offset, pixel_start_height,
spaces_avail * space_width, LINE_HEIGHT (*lp), TRUE);
gpointer data);
static gint imap_get_num_list (Folder *folder,
FolderItem *item,
gpointer data);
static gint imap_get_num_list (Folder *folder,
FolderItem *item,
+ GSList **list,
+ gboolean *old_uids_valid);
static GSList *imap_get_msginfos (Folder *folder,
FolderItem *item,
GSList *msgnum_list);
static MsgInfo *imap_get_msginfo (Folder *folder,
FolderItem *item,
gint num);
static GSList *imap_get_msginfos (Folder *folder,
FolderItem *item,
GSList *msgnum_list);
static MsgInfo *imap_get_msginfo (Folder *folder,
FolderItem *item,
gint num);
-static gboolean imap_check_msgnum_validity (Folder *folder,
+static gboolean imap_scan_required (Folder *folder,
FolderItem *item);
static void imap_change_flags (Folder *folder,
FolderItem *item,
FolderItem *item);
static void imap_change_flags (Folder *folder,
FolderItem *item,
- imap_check_msgnum_validity,
/* Message functions */
imap_get_msginfo,
/* Message functions */
imap_get_msginfo,
*messages = *recent = *uid_next = *uid_validity = *unseen = 0;
*messages = *recent = *uid_next = *uid_validity = *unseen = 0;
+ if (path == NULL)
+ return -1;
+
argbuf = g_ptr_array_new();
real_path = imap_get_real_path(folder, path);
argbuf = g_ptr_array_new();
real_path = imap_get_real_path(folder, path);
-gint imap_get_num_list(Folder *folder, FolderItem *_item, GSList **msgnum_list)
+gint imap_get_num_list(Folder *folder, FolderItem *_item, GSList **msgnum_list, gboolean *old_uids_valid)
{
IMAPFolderItem *item = (IMAPFolderItem *)_item;
IMAPSession *session;
{
IMAPFolderItem *item = (IMAPFolderItem *)_item;
IMAPSession *session;
- gint ok, nummsgs = 0, exists, recent, unseen, uid_val, uid_next;
+ gint ok, nummsgs = 0, exists, recent, uid_val, uid_next, unseen;
GSList *uidlist;
gchar *dir;
gboolean selected_folder;
GSList *uidlist;
gchar *dir;
gboolean selected_folder;
if (ok != IMAP_SUCCESS)
return -1;
exists = session->exists;
if (ok != IMAP_SUCCESS)
return -1;
exists = session->exists;
+
+ *old_uids_valid = TRUE;
} else {
ok = imap_status(session, IMAP_FOLDER(folder), item->item.path,
&exists, &recent, &uid_next, &uid_val, &unseen);
if (ok != IMAP_SUCCESS)
return -1;
} else {
ok = imap_status(session, IMAP_FOLDER(folder), item->item.path,
&exists, &recent, &uid_next, &uid_val, &unseen);
if (ok != IMAP_SUCCESS)
return -1;
+
+ if(item->item.mtime == uid_val)
+ *old_uids_valid = TRUE;
+ else {
+ *old_uids_valid = FALSE;
+
+ debug_print("Freeing imap uid cache\n");
+ item->lastuid = 0;
+ g_slist_free(item->uid_list);
+ item->uid_list = NULL;
+
+ item->item.mtime = uid_val;
+
+ imap_delete_all_cached_messages((FolderItem *)item);
+ }
+ if (!selected_folder)
+ item->uid_next = uid_next;
+
/* If old uid_next matches new uid_next we can be sure no message
was added to the folder */
if (( selected_folder && !session->folder_content_changed) ||
/* If old uid_next matches new uid_next we can be sure no message
was added to the folder */
if (( selected_folder && !session->folder_content_changed) ||
item->uid_list = NULL;
}
}
item->uid_list = NULL;
}
}
- if (!selected_folder)
- item->uid_next = uid_next;
if (exists == 0) {
*msgnum_list = NULL;
if (exists == 0) {
*msgnum_list = NULL;
-gboolean imap_check_msgnum_validity(Folder *folder, FolderItem *_item)
+gboolean imap_scan_required(Folder *folder, FolderItem *_item)
{
IMAPSession *session;
IMAPFolderItem *item = (IMAPFolderItem *)_item;
gint ok, exists = 0, recent = 0, unseen = 0;
{
IMAPSession *session;
IMAPFolderItem *item = (IMAPFolderItem *)_item;
gint ok, exists = 0, recent = 0, unseen = 0;
- guint32 uid_next, uid_validity = 0;
+ guint32 uid_next, uid_val = 0;
+ gboolean selected_folder;
g_return_val_if_fail(folder != NULL, FALSE);
g_return_val_if_fail(item != NULL, FALSE);
g_return_val_if_fail(item->item.folder != NULL, FALSE);
g_return_val_if_fail(FOLDER_CLASS(item->item.folder) == &imap_class, FALSE);
g_return_val_if_fail(folder != NULL, FALSE);
g_return_val_if_fail(item != NULL, FALSE);
g_return_val_if_fail(item->item.folder != NULL, FALSE);
g_return_val_if_fail(FOLDER_CLASS(item->item.folder) == &imap_class, FALSE);
+ if (item->item.path == NULL)
+ return FALSE;
+
session = imap_session_get(folder);
g_return_val_if_fail(session != NULL, FALSE);
session = imap_session_get(folder);
g_return_val_if_fail(session != NULL, FALSE);
- ok = imap_status(session, IMAP_FOLDER(folder), item->item.path,
- &exists, &recent, &uid_next, &uid_validity, &unseen);
- if (ok != IMAP_SUCCESS)
- return FALSE;
-
- if(item->item.mtime == uid_validity)
- return TRUE;
+ selected_folder = (session->mbox != NULL) &&
+ (!strcmp(session->mbox, item->item.path));
+ if (selected_folder) {
+ ok = imap_cmd_noop(session);
+ if (ok != IMAP_SUCCESS)
+ return FALSE;
- debug_print("Freeing imap uid cache\n");
- item->lastuid = 0;
- g_slist_free(item->uid_list);
- item->uid_list = NULL;
-
- item->item.mtime = uid_validity;
+ if (session->folder_content_changed)
+ return TRUE;
+ } else {
+ ok = imap_status(session, IMAP_FOLDER(folder), item->item.path,
+ &exists, &recent, &uid_next, &uid_val, &unseen);
+ if (ok != IMAP_SUCCESS)
+ return FALSE;
- imap_delete_all_cached_messages((FolderItem *)item);
+ if ((uid_next != item->uid_next) || (exists < item->item.total_msgs))
+ return TRUE;
+ }
static gchar * mbox_get_folderitem_name(gchar * name);
static MsgInfo *mbox_get_msginfo(Folder *folder, FolderItem *item, gint num);
static gchar * mbox_get_folderitem_name(gchar * name);
static MsgInfo *mbox_get_msginfo(Folder *folder, FolderItem *item, gint num);
-static gint mbox_get_num_list(Folder *folder, FolderItem *item, GSList **list);
-static gboolean mbox_check_msgnum_validity(Folder *folder, FolderItem *item);
+static gint mbox_get_num_list(Folder *folder, FolderItem *item,
+ GSList **list, gboolean *old_uids_valid);
+static gboolean mbox_scan_required(Folder *folder, FolderItem *item);
static gchar *mbox_folder_get_path(Folder *folder, FolderItem *item);
FolderClass mbox_class =
static gchar *mbox_folder_get_path(Folder *folder, FolderItem *item);
FolderClass mbox_class =
- mbox_check_msgnum_validity,
/* Message functions */
mbox_get_msginfo,
/* Message functions */
mbox_get_msginfo,
-gint mbox_get_num_list(Folder *folder, FolderItem *item, GSList **mlist)
+gint mbox_get_num_list(Folder *folder, FolderItem *item, GSList **mlist, gboolean *old_uids_valid)
{
GList * l;
FILE * fp;
gchar * mbox_path;
{
GList * l;
FILE * fp;
gchar * mbox_path;
mbox_path = mbox_folder_get_path(folder, item);
mbox_path = mbox_folder_get_path(folder, item);
if (mbox_path == NULL)
return -1;
if (mbox_path == NULL)
return -1;
+ old_cache = mbox_cache_get_mbox(mbox_path);
+ *old_uids_valid = TRUE;
+ if (old_cache != NULL) {
+ if (stat(mbox_path, &s) < 0) {
+ FILE_OP_ERROR(mbox_path, "stat");
+ } else if (old_cache->mtime == s.st_mtime) {
+ debug_print("Folder is not modified.\n");
+ *old_uids_valid = FALSE;
+ }
+ }
+
mbox_purge_deleted(mbox_path);
fp = fopen(mbox_path, "rb");
mbox_purge_deleted(mbox_path);
fp = fopen(mbox_path, "rb");
-gboolean mbox_check_msgnum_validity(Folder *folder, FolderItem *item)
+gboolean mbox_scan_required(Folder *folder, FolderItem *item)
{
mboxcache * old_cache;
gboolean scan_new = TRUE;
struct stat s;
gchar *filename;
{
mboxcache * old_cache;
gboolean scan_new = TRUE;
struct stat s;
gchar *filename;
- filename = mbox_folder_get_path(folder, item);
-
+ filename = mbox_folder_get_path(folder, item);
old_cache = mbox_cache_get_mbox(filename);
if (old_cache != NULL) {
old_cache = mbox_cache_get_mbox(filename);
if (old_cache != NULL) {
FolderItem * item, MsgInfo * msginfo);
static gint mh_get_num_list(Folder * folder,
FolderItem * item, MsgInfo * msginfo);
static gint mh_get_num_list(Folder * folder,
- FolderItem * item, GSList ** list);
+ FolderItem * item, GSList ** list, gboolean *old_uids_valid);
static void mh_scan_tree(Folder * folder);
static gint mh_create_tree(Folder * folder);
static void mh_scan_tree(Folder * folder);
static gint mh_create_tree(Folder * folder);
-gint mh_get_num_list(Folder *folder, FolderItem *item, GSList **list)
+gint mh_get_num_list(Folder *folder, FolderItem *item, GSList **list, gboolean *old_uids_valid)
debug_print("mh_get_last_num(): Scanning %s ...\n", item->path);
debug_print("mh_get_last_num(): Scanning %s ...\n", item->path);
+ *old_uids_valid = TRUE;
+
path = folder_item_get_path(item);
g_return_val_if_fail(path != NULL, -1);
if (change_dir(path) < 0) {
path = folder_item_get_path(item);
g_return_val_if_fail(path != NULL, -1);
if (change_dir(path) < 0) {
MsgInfo *msginfo);
gint news_get_num_list (Folder *folder,
FolderItem *item,
MsgInfo *msginfo);
gint news_get_num_list (Folder *folder,
FolderItem *item,
+ GSList **list,
+ gboolean *old_uids_valid);
MsgInfo *news_get_msginfo (Folder *folder,
FolderItem *item,
gint num);
MsgInfo *news_get_msginfo (Folder *folder,
FolderItem *item,
gint num);
-gint news_get_num_list(Folder *folder, FolderItem *item, GSList **msgnum_list)
+gint news_get_num_list(Folder *folder, FolderItem *item, GSList **msgnum_list, gboolean *old_uids_valid)
{
NNTPSession *session;
gint i, ok, num, first, last, nummsgs = 0;
{
NNTPSession *session;
gint i, ok, num, first, last, nummsgs = 0;
session = news_session_get(folder);
g_return_val_if_fail(session != NULL, -1);
session = news_session_get(folder);
g_return_val_if_fail(session != NULL, -1);
+ *old_uids_valid = TRUE;
+
ok = news_select_group(session, item->path, &num, &first, &last);
if (ok != NN_SUCCESS) {
log_warning(_("can't set group: %s\n"), item->path);
ok = news_select_group(session, item->path, &num, &first, &last);
if (ok != NN_SUCCESS) {
log_warning(_("can't set group: %s\n"), item->path);