2005-10-26 [wwp] 1.9.15cvs110
[claws.git] / src / folder.c
index 9780f7daaf89b908b36fb996e3f85d4ddee6f33a..33153e5ae3213f1f5e5bc0ae36444807b27fbcc6 100644 (file)
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -297,6 +297,9 @@ FolderItem *folder_item_new(Folder *folder, const gchar *name, const gchar *path
        item->data = NULL;
        item->parent_stype = -1;
 
+       item->sort_key = SORT_BY_DATE;
+       item->sort_type = SORT_ASCENDING;
+
        item->prefs = folder_item_prefs_new();
 
        return item;
@@ -765,7 +768,7 @@ gboolean folder_scan_tree_func(GNode *node, gpointer data)
        return FALSE;
 }
 
-void folder_scan_tree(Folder *folder)
+void folder_scan_tree(Folder *folder, gboolean rebuild)
 {
        GHashTable *pptable;
        FolderUpdateData hookdata;
@@ -775,11 +778,9 @@ void folder_scan_tree(Folder *folder)
        
        pptable = folder_persist_prefs_new(folder);
 
-       /*
-        * should be changed and tree update should be done without 
-        * destroying the tree first
-        */
-       folder_tree_destroy(folder);
+       if (rebuild)
+               folder_tree_destroy(folder);
+
        folder->klass->scan_tree(folder);
 
        hookdata.folder = folder;
@@ -1458,28 +1459,48 @@ static gint folder_sort_folder_list(gconstpointer a, gconstpointer b)
        return (gint_a - gint_b);
 }
 
-gint folder_item_open(FolderItem *item)
+void folder_item_process_open (FolderItem *item,
+                                void (*before_proc_func)(gpointer data),
+                                void (*after_proc_func)(gpointer data),
+                                gpointer data)
 {
        gchar *buf;
-       g_return_val_if_fail(item->no_select == FALSE, -1);
-
+       if (item == NULL)
+               return;
        if((item->folder->klass->scan_required != NULL) &&
           (item->folder->klass->scan_required(item->folder, item))) {
                folder_item_scan_full(item, TRUE);
+       } else {
+               folder_item_syncronize_flags(item);
        }
-       folder_item_syncronize_flags(item);
        
        /* Processing */
        buf = g_strdup_printf(_("Processing (%s)...\n"), 
                              item->path ? item->path : item->name);
        debug_print("%s\n", buf);
        g_free(buf);
-       
+
+       if (before_proc_func)
+               before_proc_func(data);
+
        folder_item_apply_processing(item);
 
-       item->opened = TRUE;
+       if (after_proc_func)
+               after_proc_func(data);
 
        debug_print("done.\n");
+       item->processing_pending = FALSE;
+       return; 
+}
+
+gint folder_item_open(FolderItem *item)
+{
+       g_return_val_if_fail(item->no_select == FALSE, -1);
+
+       item->processing_pending = TRUE;
+       folder_item_process_open (item, NULL, NULL, NULL);
+       
+       item->opened = TRUE;
 
        return 0;
 }
@@ -1575,6 +1596,7 @@ 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;
@@ -1600,6 +1622,7 @@ static gint syncronize_flags(FolderItem *item, MsgInfoList *msglist)
                        }
                }
        }
+       folder_item_set_batch(item, FALSE);
        g_relation_destroy(relation);   
 
        return ret;
@@ -1780,12 +1803,16 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
        g_slist_free(folder_list);
 
        if (new_list != NULL) {
+               GSList *tmp_list = NULL;
                newmsg_list = get_msginfos(item, new_list);
                g_slist_free(new_list);
+               tmp_list = g_slist_concat(g_slist_copy(exists_list), g_slist_copy(newmsg_list));
+               syncronize_flags(item, tmp_list);
+               g_slist_free(tmp_list);
+       } else {
+               syncronize_flags(item, exists_list);
        }
 
-       syncronize_flags(item, exists_list);
-
        folder_item_update_freeze();
        if (newmsg_list != NULL) {
                GSList *elem;
@@ -2156,7 +2183,8 @@ void msginfo_set_mime_flags(GNode *node, gpointer data)
        MsgInfo *msginfo = data;
        MimeInfo *mimeinfo = node->data;
        
-       if (mimeinfo->disposition == DISPOSITIONTYPE_ATTACHMENT) {
+       if (mimeinfo->disposition == DISPOSITIONTYPE_ATTACHMENT
+        && (!mimeinfo->subtype ||  strcmp(mimeinfo->subtype, "pgp-signature"))) {
                procmsg_msginfo_set_flags(msginfo, 0, MSG_HAS_ATTACHMENT);
        } else if (mimeinfo->disposition == DISPOSITIONTYPE_UNKNOWN && 
                 mimeinfo->type != MIMETYPE_TEXT &&
@@ -2727,6 +2755,42 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
                }
        }
 
+       if (remove_source) {
+               MsgInfo *msginfo = (MsgInfo *) msglist->data;
+               FolderItem *item = msginfo->folder;
+               /*
+                * Remove source messages from their folders if
+                * copying was successfull and update folder
+                * message counts
+                */
+               if (item->folder->klass->remove_msgs) {
+                       item->folder->klass->remove_msgs(item->folder,
+                                                               msginfo->folder,
+                                                               msglist,
+                                                               relation);
+               }
+               for (l = msglist; l != NULL; l = g_slist_next(l)) {
+                       GTuples *tuples;
+                       msginfo = (MsgInfo *) l->data;
+                       item = msginfo->folder;
+
+                       tuples = g_relation_select(relation, msginfo, 0);
+                       num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
+                       g_tuples_destroy(tuples);
+
+                       if (g_slist_find(not_moved, msginfo))
+                               continue;
+
+                       if ((num >= 0) && (item->folder->klass->remove_msg != NULL)) {
+                               if (!item->folder->klass->remove_msgs)
+                                       item->folder->klass->remove_msg(item->folder,
+                                                               msginfo->folder,
+                                                               msginfo->msgnum);
+                               remove_msginfo_from_cache(item, msginfo);
+                       }
+               }
+       }
+
        /* Read cache for dest folder */
        if (!dest->cache) folder_item_read_cache(dest);
 
@@ -2781,44 +2845,12 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
                }
        }
 
-       if (remove_source) {
-               MsgInfo *msginfo = (MsgInfo *) msglist->data;
-               FolderItem *item = msginfo->folder;
-               /*
-                * Remove source messages from their folders if
-                * copying was successfull and update folder
-                * message counts
-                */
-               if (item->folder->klass->remove_msgs) {
-                       item->folder->klass->remove_msgs(item->folder,
-                                                               msginfo->folder,
-                                                               msglist,
-                                                               relation);
-               }
-               for (l = msglist; l != NULL; l = g_slist_next(l)) {
-                       GTuples *tuples;
-                       msginfo = (MsgInfo *) l->data;
-                       item = msginfo->folder;
-
-                       tuples = g_relation_select(relation, msginfo, 0);
-                       num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
-                       g_tuples_destroy(tuples);
-
-                       if (g_slist_find(not_moved, msginfo))
-                               continue;
-
-                       if ((num >= 0) && (item->folder->klass->remove_msg != NULL)) {
-                               if (!item->folder->klass->remove_msgs)
-                                       item->folder->klass->remove_msg(item->folder,
-                                                               msginfo->folder,
-                                                               msginfo->msgnum);
-                               remove_msginfo_from_cache(item, msginfo);
-                       }
-               }
-       }
-
        g_relation_destroy(relation);
-       return lastnum;
+       if (not_moved != NULL) {
+               g_slist_free(not_moved);
+               return -1;
+       } else
+               return lastnum;
 }
 
 /**
@@ -3178,7 +3210,7 @@ static gpointer folder_item_to_xml(gpointer nodedata, gpointer data)
        else
                tag = folder_item_get_xml(item->folder, item);
 
-       return xml_node_new(tag, NULL);;
+       return xml_node_new(tag, NULL);
 }
 
 static GNode *folder_get_xml_node(Folder *folder)
@@ -3540,6 +3572,7 @@ static void folder_item_update_func(FolderItem *item, gpointer data)
        if (item->update_flags) {
                source.item = item;
                source.update_flags = item->update_flags;
+               source.msg = NULL;
                hooks_invoke(FOLDER_ITEM_UPDATE_HOOKLIST, &source);                             
                item->update_flags = 0;
        }
@@ -3555,6 +3588,50 @@ void folder_item_update_thaw(void)
        }
 }
 
+static void folder_item_synchronise_func(FolderItem *item, gpointer data)
+{
+       Folder *folder = (Folder *)data;
+       if (folder == NULL || item->folder == folder) {
+               if(item->prefs->offlinesync && item->folder->klass->synchronise)
+                       item->folder->klass->synchronise(item);
+       }
+}
+
+void folder_synchronise(Folder *folder)
+{
+       folder_func_to_all_folders(folder_item_synchronise_func, folder);
+}
+
+typedef struct _WantSyncData {
+       Folder *folder;
+       gboolean want_sync;
+} WantSyncData;
+
+static void folder_item_want_synchronise_func(FolderItem *item, gpointer data)
+{
+       WantSyncData *want_sync_data = (WantSyncData *)data;
+       
+       if (want_sync_data->folder == NULL || item->folder == want_sync_data->folder) {
+               if(item->prefs->offlinesync && item->folder->klass->synchronise)
+                       want_sync_data->want_sync = TRUE;
+               else
+                       want_sync_data->want_sync = FALSE;
+       }
+}
+
+gboolean folder_want_synchronise(Folder *folder)
+{
+       WantSyncData *want_sync_data = g_new0(WantSyncData, 1);
+       gboolean result;
+       want_sync_data->folder = folder;
+       
+       folder_func_to_all_folders(folder_item_want_synchronise_func, want_sync_data);
+       result = want_sync_data->want_sync;
+       g_free(want_sync_data);
+       debug_print("Folder %s wants sync: %d\n", folder->name, result);
+       return result;
+}
+
 void folder_item_set_batch (FolderItem *item, gboolean batch)
 {
        if (item->folder->klass->set_batch) {