}
/* Check if msginfo needs update if in cache and in folder */
if((folderscaninfo[i] & IN_FOLDER) &&
- (folderscaninfo[i] & IN_CACHE) &&
- (folder->is_msg_changed != NULL)) {
+ (folderscaninfo[i] & IN_CACHE)) {
MsgInfo *msginfo;
msginfo = msgcache_get_msg(item->cache, num);
- if(folder->is_msg_changed(folder, item, msginfo)) {
+ if(folder->is_msg_changed && folder->is_msg_changed(folder, item, msginfo)) {
MsgInfo *newmsginfo;
msgcache_remove_msg(item->cache, msginfo->msgnum);
return msginfo;
g_return_val_if_fail(folder->fetch_msginfo, NULL);
- msginfo = folder->fetch_msginfo(folder, item, num);
- return msginfo;
+ if((msginfo = folder->fetch_msginfo(folder, item, num)) != NULL) {
+ msgcache_add_msg(item->cache, msginfo);
+ return msginfo;
+ }
+
+ return NULL;
+}
+
+MsgInfo *folder_item_fetch_msginfo_by_id(FolderItem *item, const gchar *msgid)
+{
+ Folder *folder;
+ MsgInfo *msginfo;
+
+ g_return_val_if_fail(item != NULL, NULL);
+
+ folder = item->folder;
+ if(!item->cache)
+ folder_item_read_cache(item);
+
+ if((msginfo = msgcache_get_msg_by_id(item->cache, msgid)) != NULL)
+ return msginfo;
+
+ return NULL;
}
GSList *folder_item_get_msg_list(FolderItem *item)
gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
{
Folder *folder;
- FolderItem * item;
- GSList * l;
+ FolderItem *item;
+ GSList *newmsgnums = NULL;
+ GSList *l, *l2;
gint num;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(folder->copy_msg != NULL, -1);
g_return_val_if_fail(folder->remove_msg != NULL, -1);
- if (!dest->cache) folder_item_read_cache(dest);
-
+ /*
+ * Copy messages to destination folder and
+ * store new message numbers in newmsgnums
+ */
item = NULL;
for(l = msglist ; l != NULL ; l = g_slist_next(l)) {
MsgInfo * msginfo = (MsgInfo *) l->data;
if (!item && msginfo->folder != NULL)
item = msginfo->folder;
- if (!item->cache) folder_item_read_cache(dest);
num = folder->copy_msg(folder, dest, msginfo);
+ newmsgnums = g_slist_append(newmsgnums, GINT_TO_POINTER(num));
+ }
+
+ /* Read cache for dest folder */
+ if (!dest->cache) folder_item_read_cache(dest);
+
+ /*
+ * Fetch new MsgInfos for new messages in dest folder,
+ * add them to the msgcache and update folder message counts
+ */
+ l2 = newmsgnums;
+ for(l = msglist; l != NULL; l = g_slist_next(l)) {
+ MsgInfo *msginfo = (MsgInfo *) l->data;
+
+ num = GPOINTER_TO_INT(l2->data);
+
if (num != -1) {
MsgInfo *newmsginfo;
MSG_NEW|MSG_UNREAD|MSG_DELETED);
msgcache_add_msg(dest->cache, newmsginfo);
- if (MSG_IS_NEW(msginfo->flags))
- msginfo->folder->new--;
if (MSG_IS_NEW(newmsginfo->flags))
dest->new++;
- if (MSG_IS_UNREAD(msginfo->flags))
- msginfo->folder->unread--;
if (MSG_IS_UNREAD(newmsginfo->flags))
dest->unread++;
- msginfo->folder->total--;
dest->total++;
procmsg_msginfo_free(newmsginfo);
}
+ }
+ l2 = g_slist_next(l2);
+ }
+
+ /*
+ * Remove source messages from their folders if
+ * copying was successfull and update folder
+ * message counts
+ */
+ l2 = newmsgnums;
+ for(l = msglist; l != NULL; l = g_slist_next(l)) {
+ MsgInfo *msginfo = (MsgInfo *) l->data;
+
+ num = GPOINTER_TO_INT(l2->data);
+
+ if(num != -1) {
item->folder->remove_msg(item->folder,
msginfo->folder,
msginfo->msgnum);
+ if(!item->cache)
+ folder_item_read_cache(item);
msgcache_remove_msg(item->cache, msginfo->msgnum);
+
+ if (MSG_IS_NEW(msginfo->flags))
+ msginfo->folder->new--;
+ if (MSG_IS_UNREAD(msginfo->flags))
+ msginfo->folder->unread--;
+ msginfo->folder->total--;
}
- }
+
+ l2 = g_slist_next(l2);
+ }
+
if (folder->finished_copy)
folder->finished_copy(folder, dest);
+ g_slist_free(newmsgnums);
return dest->last_num;
}
{
Folder *folder;
gint num;
- GSList * l;
+ GSList *newmsgnums = NULL;
+ GSList *l, *l2;
g_return_val_if_fail(dest != NULL, -1);
g_return_val_if_fail(msglist != NULL, -1);
g_return_val_if_fail(folder->copy_msg != NULL, -1);
- if (!dest->cache) folder_item_read_cache(dest);
-
+ /*
+ * Copy messages to destination folder and
+ * store new message numbers in newmsgnums
+ */
for(l = msglist ; l != NULL ; l = g_slist_next(l)) {
MsgInfo * msginfo = (MsgInfo *) l->data;
num = folder->copy_msg(folder, dest, msginfo);
+ newmsgnums = g_slist_append(newmsgnums, GINT_TO_POINTER(num));
+ }
+
+ /* Read cache for dest folder */
+ if (!dest->cache) folder_item_read_cache(dest);
+
+ /*
+ * Fetch new MsgInfos for new messages in dest folder,
+ * add them to the msgcache and update folder message counts
+ */
+ l2 = newmsgnums;
+ for(l = msglist; l != NULL; l = g_slist_next(l)) {
+ MsgInfo *msginfo = (MsgInfo *) l->data;
+
+ num = GPOINTER_TO_INT(l2->data);
+
if (num != -1) {
MsgInfo *newmsginfo;
procmsg_msginfo_free(newmsginfo);
}
}
+ l2 = g_slist_next(l2);
}
-
+
if (folder->finished_copy)
folder->finished_copy(folder, dest);
+ g_slist_free(newmsgnums);
return dest->last_num;
}
if (result == 0) {
if (folder->finished_remove)
folder->finished_remove(folder, item);
+
+ folder_item_free_cache(item);
+ item->cache = msgcache_new();
+
+ item->new = 0;
+ item->unread = 0;
+ item->total = 0;
}
return result;
return TRUE;
}
+void folder_item_apply_processing(FolderItem *item)
+{
+ GSList *processing_list;
+ GSList *mlist, *cur;
+ GHashTable *folder_table;
+
+ g_return_if_fail(item != NULL);
+
+ processing_list = item->prefs->processing;
+ if (processing_list == NULL)
+ return;
+ folder_table = g_hash_table_new(NULL, NULL);
+
+ mlist = folder_item_get_msg_list(item);
+
+ for(cur = mlist ; cur != NULL ; cur = cur->next) {
+ MsgInfo * msginfo;
+
+ msginfo = (MsgInfo *) cur->data;
+ filter_message_by_msginfo(processing_list, msginfo,
+ folder_table);
+ procmsg_msginfo_free(msginfo);
+ }
+
+ /* folder_item_scan_foreach(summaryview->folder_table); */
+ folderview_update_item_foreach(folder_table);
+
+ g_slist_free(mlist);
+
+ g_hash_table_destroy(folder_table);
+}