2006-08-29 [colin] 2.4.0cvs107
[claws.git] / src / folder.c
index 8e7b0f1350a34e097b800067ea58f655f518426e..cc2e53d65102aed1a2c0899afcf158d0cc21462d 100644 (file)
@@ -205,7 +205,6 @@ static void reset_parent_type(FolderItem *item, gpointer data) {
 
 void folder_item_change_type(FolderItem *item, SpecialFolderItemType newtype)
 {
-       FolderItem *parent;
        Folder *folder = NULL;
        FolderUpdateData hookdata;
 
@@ -832,16 +831,22 @@ void folder_scan_tree(Folder *folder, gboolean rebuild)
 {
        GHashTable *pptable;
        FolderUpdateData hookdata;
-       
+       Folder *old_folder = folder;
+
        if (!folder->klass->scan_tree)
                return;
        
        pptable = folder_persist_prefs_new(folder);
 
        if (rebuild)
-               folder_tree_destroy(folder);
+               folder_remove(folder);
 
-       folder->klass->scan_tree(folder);
+       if (folder->klass->scan_tree(folder) < 0) {
+               if (rebuild)
+                       folder_add(old_folder);
+               return;
+       } else if (rebuild)
+               folder_add(folder);
 
        hookdata.folder = folder;
        hookdata.update_flags = FOLDER_TREE_CHANGED;
@@ -1341,6 +1346,8 @@ FolderItem *folder_get_default_inbox(void)
                        continue;
                if (folder->inbox == NULL)
                        continue;
+               if (folder->klass->type == F_UNKNOWN)
+                       continue;
 
                return folder->inbox;
        }
@@ -1359,6 +1366,8 @@ FolderItem *folder_get_default_outbox(void)
                        continue;
                if (folder->outbox == NULL)
                        continue;
+               if (folder->klass->type == F_UNKNOWN)
+                       continue;
 
                return folder->outbox;
        }
@@ -1377,6 +1386,8 @@ FolderItem *folder_get_default_draft(void)
                        continue;
                if (folder->draft == NULL)
                        continue;
+               if (folder->klass->type == F_UNKNOWN)
+                       continue;
 
                return folder->draft;
        }
@@ -1395,6 +1406,8 @@ FolderItem *folder_get_default_queue(void)
                        continue;
                if (folder->queue == NULL)
                        continue;
+               if (folder->klass->type == F_UNKNOWN)
+                       continue;
 
                return folder->queue;
        }
@@ -1413,6 +1426,8 @@ FolderItem *folder_get_default_trash(void)
                        continue;
                if (folder->trash == NULL)
                        continue;
+               if (folder->klass->type == F_UNKNOWN)
+                       continue;
 
                return folder->trash;
        }
@@ -1937,7 +1952,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                            (item->stype == F_INBOX) &&
                            (item->folder->account != NULL) && 
                            (item->folder->account->filter_on_recv) &&
-                           procmsg_msginfo_filter(msginfo))
+                           procmsg_msginfo_filter(msginfo,  item->folder->account))
                                to_filter = g_slist_prepend(to_filter, msginfo);
                        else {
                                exists_list = g_slist_prepend(exists_list, msginfo);
@@ -2008,6 +2023,12 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                g_hash_table_destroy(subject_table);
        }
        
+       if (item->new_msgs != newcnt || item->unread_msgs != unreadcnt
+       ||  item->total_msgs != totalcnt || item->marked_msgs != markedcnt
+       ||  item->unreadmarked_msgs != unreadmarkedcnt) {
+               update_flags |= F_ITEM_UPDATE_CONTENT;
+       }
+
        item->new_msgs = newcnt;
        item->unread_msgs = unreadcnt;
        item->total_msgs = totalcnt;
@@ -2243,10 +2264,17 @@ void folder_item_write_cache(FolderItem *item)
        FolderItemPrefs *prefs;
        gint filemode = 0;
        gchar *id;
+       time_t last_mtime = (time_t)0;
+       gboolean need_scan = FALSE;
        
        if (!item || !item->path || !item->cache)
                return;
 
+       if (FOLDER_TYPE(item->folder) == F_MH) {
+               last_mtime = item->mtime;
+               need_scan = item->folder->klass->scan_required(item->folder, item);
+       }
+
        id = folder_item_get_identifier(item);
        debug_print("Save cache for folder %s\n", id);
        g_free(id);
@@ -2264,6 +2292,11 @@ void folder_item_write_cache(FolderItem *item)
                }
         }
 
+       if (!need_scan && FOLDER_TYPE(item->folder) == F_MH) {
+               if (item->mtime == last_mtime)
+                       item->mtime = time(NULL);
+       }
+
        g_free(cache_file);
        g_free(mark_file);
 }
@@ -2340,7 +2373,12 @@ void msginfo_set_mime_flags(GNode *node, gpointer data)
                if (!mimeinfo->subtype 
                ||  strcmp(mimeinfo->subtype, "pgp-signature"))
                        procmsg_msginfo_set_flags(msginfo, 0, MSG_HAS_ATTACHMENT);
-       }
+       } else if (mimeinfo->disposition == DISPOSITIONTYPE_INLINE &&
+               strcmp(mimeinfo->subtype, "pgp-signature") && 
+               (procmime_mimeinfo_get_parameter(mimeinfo, "name") != NULL ||
+                procmime_mimeinfo_get_parameter(mimeinfo, "filename") != NULL)) {
+               procmsg_msginfo_set_flags(msginfo, 0, MSG_HAS_ATTACHMENT);
+       } 
 
        /* don't descend below top level message for signed and encrypted info */
        if (mimeinfo->type == MIMETYPE_MESSAGE)
@@ -2560,7 +2598,7 @@ static void copy_msginfo_flags(MsgInfo *source, MsgInfo *dest)
                perm_flags |= MSG_IGNORE_THREAD;
 
        /* Unset tmp flags that should not be copied */
-       tmp_flags &= ~(MSG_MOVE | MSG_COPY);
+       tmp_flags &= ~(MSG_MOVE | MSG_COPY | MSG_MOVE_DONE);
 
        /* unset flags that are set but should not */
        /* and set new flags */
@@ -2974,7 +3012,7 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
                 * copying was successfull and update folder
                 * message counts
                 */
-               if (item->folder->klass->remove_msgs) {
+               if (not_moved == NULL && item->folder->klass->remove_msgs) {
                        item->folder->klass->remove_msgs(item->folder,
                                                                msginfo->folder,
                                                                msglist,
@@ -3460,6 +3498,9 @@ static GNode *folder_get_xml_node(Folder *folder)
        xmlnode = xml_node_new(tag, NULL);
 
        node = g_node_new(xmlnode);
+       
+       g_return_val_if_fail (folder->node != NULL, NULL);
+       
        if (folder->node->children) {
                GNode *cur;
 
@@ -3728,13 +3769,13 @@ void folder_item_apply_processing(FolderItem *item)
                statusbar_progress_all(curmsg++,total, 10);
 
                 /* apply pre global rules */
-               filter_message_by_msginfo(pre_global_processing, msginfo);
+               filter_message_by_msginfo(pre_global_processing, msginfo, NULL);
                
                 /* apply rules of the folder */
-               filter_message_by_msginfo(processing_list, msginfo);
+               filter_message_by_msginfo(processing_list, msginfo, NULL);
 
                 /* apply post global rules */
-               filter_message_by_msginfo(post_global_processing, msginfo);
+               filter_message_by_msginfo(post_global_processing, msginfo, NULL);
                 
        }
        if (pre_global_processing || processing_list