2007-09-28 [colin] 3.0.1cvs38
[claws.git] / src / folder.c
index 869cdc7160d3c2bf3458c74e9f2ba903b0dc4066..38ed4ed4f66bddb4890f94e2a67a84f71abfbfb9 100644 (file)
@@ -1466,6 +1466,26 @@ FolderItem *folder_get_default_outbox(void)
        return NULL;
 }
 
+FolderItem *folder_get_default_outbox_for_class(FolderType type)
+{
+       GList *flist;
+
+       for (flist = folder_list; flist != NULL; flist = g_list_next(flist)) {
+               Folder * folder = FOLDER(flist->data);
+
+               if (folder == NULL)
+                       continue;
+               if (folder->outbox == NULL)
+                       continue;
+               if (folder->klass->type != type)
+                       continue;
+
+               return folder->outbox;
+       }
+
+       return NULL;
+}
+
 FolderItem *folder_get_default_draft(void)
 {
        GList *flist;
@@ -1486,6 +1506,26 @@ FolderItem *folder_get_default_draft(void)
        return NULL;
 }
 
+FolderItem *folder_get_default_draft_for_class(FolderType type)
+{
+       GList *flist;
+
+       for (flist = folder_list; flist != NULL; flist = g_list_next(flist)) {
+               Folder * folder = FOLDER(flist->data);
+
+               if (folder == NULL)
+                       continue;
+               if (folder->draft == NULL)
+                       continue;
+               if (folder->klass->type != type)
+                       continue;
+
+               return folder->draft;
+       }
+
+       return NULL;
+}
+
 FolderItem *folder_get_default_queue(void)
 {
        GList *flist;
@@ -1506,6 +1546,26 @@ FolderItem *folder_get_default_queue(void)
        return NULL;
 }
 
+FolderItem *folder_get_default_queue_for_class(FolderType type)
+{
+       GList *flist;
+
+       for (flist = folder_list; flist != NULL; flist = g_list_next(flist)) {
+               Folder * folder = FOLDER(flist->data);
+
+               if (folder == NULL)
+                       continue;
+               if (folder->queue == NULL)
+                       continue;
+               if (folder->klass->type != type)
+                       continue;
+
+               return folder->queue;
+       }
+
+       return NULL;
+}
+
 FolderItem *folder_get_default_trash(void)
 {
        GList *flist;
@@ -1526,6 +1586,26 @@ FolderItem *folder_get_default_trash(void)
        return NULL;
 }
 
+FolderItem *folder_get_default_trash_for_class(FolderType type)
+{
+       GList *flist;
+
+       for (flist = folder_list; flist != NULL; flist = g_list_next(flist)) {
+               Folder * folder = FOLDER(flist->data);
+
+               if (folder == NULL)
+                       continue;
+               if (folder->trash == NULL)
+                       continue;
+               if (folder->klass->type != type)
+                       continue;
+
+               return folder->trash;
+       }
+
+       return NULL;
+}
+
 #define CREATE_FOLDER_IF_NOT_EXIST(member, dir, type)          \
 {                                                              \
        if (!folder->member) {                                  \
@@ -1788,7 +1868,6 @@ static gint syncronize_flags(FolderItem *item, MsgInfoList *msglist)
 
        relation = g_relation_new(2);
        g_relation_index(relation, 0, g_direct_hash, g_direct_equal);
-       folder_item_set_batch(item, TRUE);
        if ((ret = item->folder->klass->get_flags(
            item->folder, item, msglist, relation)) == 0) {
                GTuples *tuples;
@@ -1797,6 +1876,7 @@ static gint syncronize_flags(FolderItem *item, MsgInfoList *msglist)
                gboolean skip;
 
                folder_item_update_freeze();
+               folder_item_set_batch(item, TRUE);
                for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
                        msginfo = (MsgInfo *) cur->data;
                
@@ -1814,9 +1894,9 @@ static gint syncronize_flags(FolderItem *item, MsgInfoList *msglist)
                                        ~permflags & msginfo->flags.perm_flags, 0);
                        }
                }
+               folder_item_set_batch(item, FALSE);
                folder_item_update_thaw();
        }
-       folder_item_set_batch(item, FALSE);
        g_relation_destroy(relation);   
 
        return ret;
@@ -2367,6 +2447,7 @@ static void folder_item_read_cache(FolderItem *item)
                                        unreadmarkedcnt++;
                                if (MSG_IS_MARKED(msginfo->flags))
                                        markedcnt++;
+                               procmsg_msginfo_unset_flags(msginfo, MSG_FULLY_CACHED, 0);
                        }
                        item->new_msgs = newcnt;
                        item->unread_msgs = unreadcnt;
@@ -2400,10 +2481,8 @@ void folder_item_write_cache(FolderItem *item)
        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);
-       }
+       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);
@@ -2423,9 +2502,9 @@ void folder_item_write_cache(FolderItem *item)
                }
         }
 
-       if (!need_scan && FOLDER_TYPE(item->folder) == F_MH) {
+       if (!need_scan && item->folder->klass->set_mtime) {
                if (item->mtime == last_mtime) {
-                       mh_set_mtime(item);
+                       item->folder->klass->set_mtime(item->folder, item);
                }
        }
 
@@ -2631,7 +2710,7 @@ gint folder_item_fetch_all_msg(FolderItem *item)
                return -1;
 
        debug_print("fetching all messages in %s ...\n", item->path ? item->path : "(null)");
-       statusbar_print_all(_("Fetching all messages in %s ...\n"), item->path ? item->path : "(null)");
+       statuswindow_print_all(_("Fetching all messages in %s ...\n"), item->path ? item->path : "(null)");
 
        folder = item->folder;
 
@@ -2668,7 +2747,7 @@ gint folder_item_fetch_all_msg(FolderItem *item)
        }
        
        statusbar_progress_all(0,0,0);
-       statusbar_pop_all();
+       statuswindow_pop_all();
        procmsg_msg_list_free(mlist);
 
        return ret;
@@ -2688,10 +2767,27 @@ static gint folder_item_get_msg_num_by_file(FolderItem *dest, const gchar *file)
 
        if ((folder_has_parent_of_type(dest, F_QUEUE)) || 
            (folder_has_parent_of_type(dest, F_DRAFT)))
-               while (fgets(buf, sizeof(buf), fp) != NULL)
+               while (fgets(buf, sizeof(buf), fp) != NULL) {
+                       /* new way */
+                       if ((!strncmp(buf, "X-Claws-End-Special-Headers: 1",
+                               strlen("X-Claws-End-Special-Headers:"))) ||
+                           (!strncmp(buf, "X-Sylpheed-End-Special-Headers: 1",
+                               strlen("X-Sylpheed-End-Special-Headers:"))))
+                               break;
+                       /* old way */
                        if (buf[0] == '\r' || buf[0] == '\n') break;
+                       /* from other mailers */
+                       if (!strncmp(buf, "Date: ", 6)
+                       ||  !strncmp(buf, "To: ", 4)
+                       ||  !strncmp(buf, "From: ", 6)
+                       ||  !strncmp(buf, "Subject: ", 9)) {
+                               rewind(fp);
+                               break;
+                       }
+               }
 
        procheader_get_header_fields(fp, hentry);
+       debug_print("looking for %s\n", hentry[0].body);
        if (hentry[0].body) {
                extract_parenthesis(hentry[0].body, '<', '>');
                remove_space(hentry[0].body);
@@ -2736,6 +2832,9 @@ static void copy_msginfo_flags(MsgInfo *source, MsgInfo *dest)
        if (procmsg_msg_has_flagged_parent(dest, MSG_IGNORE_THREAD))
                perm_flags |= MSG_IGNORE_THREAD;
 
+       /* unset FULLY_CACHED flags */
+       perm_flags &= ~MSG_FULLY_CACHED;
+
        if (procmsg_msg_has_flagged_parent(dest, MSG_WATCH_THREAD))
                perm_flags |= MSG_WATCH_THREAD;
 
@@ -2881,6 +2980,7 @@ gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
                                        folderscan = TRUE;
                                }
                                num = folder_item_get_msg_num_by_file(dest, fileinfo->file);
+                               debug_print("got num %d\n", num);
                        }
 
                        if (num > lastnum)
@@ -2922,7 +3022,7 @@ static FolderItem *folder_item_move_recursive(FolderItem *src, FolderItem *dest,
        debug_print("%s %s to %s\n", copy?"Copying":"Moving", src->path, dest->path);
        new_item = folder_create_folder(dest, src->name);
        if (new_item == NULL) {
-               printf("Can't create folder\n");
+               g_print("Can't create folder\n");
                return NULL;
        }
        
@@ -3378,9 +3478,13 @@ gint folder_item_remove_msg(FolderItem *item, gint num)
 
        if (!item->cache) folder_item_read_cache(item);
 
+       msginfo = msgcache_get_msg(item->cache, num);
+       if (msginfo && MSG_IS_LOCKED(msginfo->flags)) {
+               procmsg_msginfo_free(msginfo);
+               return -1;
+       }
        ret = folder->klass->remove_msg(folder, item, num);
 
-       msginfo = msgcache_get_msg(item->cache, num);
        if (msginfo != NULL) {
                remove_msginfo_from_cache(item, msginfo);
                procmsg_msginfo_free(msginfo);
@@ -3411,7 +3515,7 @@ gint folder_item_remove_msgs(FolderItem *item, GSList *msglist)
        }
        while (ret == 0 && msglist != NULL) {
                MsgInfo *msginfo = (MsgInfo *)msglist->data;
-               if (MSG_IS_LOCKED(msginfo->flags)) {
+               if (msginfo && MSG_IS_LOCKED(msginfo->flags)) {
                        msglist = msglist->next;
                        continue;
                }
@@ -3496,6 +3600,30 @@ gboolean folder_item_is_msg_changed(FolderItem *item, MsgInfo *msginfo)
        return folder->klass->is_msg_changed(folder, item, msginfo);
 }
 
+void folder_item_discard_cache(FolderItem *item)
+{
+       gchar *dir;
+       gchar *cache;
+
+       if (!item)
+               return;
+
+       if (item->cache) {
+               msgcache_destroy(item->cache);
+               item->cache = NULL;
+       }
+       dir = folder_item_get_path(item);
+       if (is_dir_exist(dir))
+               remove_all_numbered_files(dir);
+       g_free(dir);
+       
+       cache = folder_item_get_cache_file(item);
+       if (is_file_exist(cache))
+               g_unlink(cache);
+       g_free(cache);
+       
+}
+
 static gchar *folder_item_get_cache_file(FolderItem *item)
 {
        gchar *path;
@@ -4113,13 +4241,13 @@ void folder_item_synchronise(FolderItem *item)
        if (!item)
                return;
        if (item->prefs->offlinesync && item->folder->klass->synchronise) {
-               statusbar_print_all(_("Synchronising %s for offline use...\n"), item->path ? item->path : "(null)");
+               statuswindow_print_all(_("Synchronising %s for offline use...\n"), item->path ? item->path : "(null)");
                item->folder->klass->synchronise(item, 
                        item->prefs->offlinesync_days);
                if (item->prefs->offlinesync_days > 0 &&
                    item->prefs->remove_old_bodies)
                        folder_item_clean_local_files(item, item->prefs->offlinesync_days);
-               statusbar_pop_all();
+               statuswindow_pop_all();
        }
 }