2005-10-03 [colin] 1.9.15cvs2
[claws.git] / src / folder.c
index 204b36038fe801daef790b6837dafa2461421be1..037790fbd5faf0389dd3a1d6fab62322fb04f60a 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
@@ -51,6 +51,7 @@
 #include "remotefolder.h"
 #include "partial_download.h"
 #include "statusbar.h"
+#include "summaryview.h"
 
 /* Dependecies to be removed ?! */
 #include "prefs_common.h"
@@ -313,11 +314,32 @@ void folder_item_append(FolderItem *parent, FolderItem *item)
        g_node_append(parent->node, item->node);
 }
 
-static gboolean folder_item_remove_func(GNode *node, gpointer data)
+void folder_item_remove(FolderItem *item)
 {
-       FolderItem *item = FOLDER_ITEM(node->data);
+       GNode *node, *start_node;
        FolderUpdateData hookdata;
 
+       g_return_if_fail(item != NULL);
+       g_return_if_fail(item->folder != NULL);
+       g_return_if_fail(item->folder->node != NULL);
+
+       start_node = node = item->node;
+       
+       node = item->folder->node;
+       
+       node = g_node_find(node, G_PRE_ORDER, G_TRAVERSE_ALL, item);
+       node = node->children;
+
+       /* remove my children */
+       while (node != NULL) {
+               if (node && node->data) {
+                       FolderItem *sub_item = (FolderItem*) node->data;
+                       node = node->next;
+                       folder_item_remove(sub_item);
+               }
+       }
+       
+       /* remove myself */
        if (item->cache != NULL) {
                msgcache_destroy(item->cache);
                item->cache = NULL;
@@ -328,25 +350,13 @@ static gboolean folder_item_remove_func(GNode *node, gpointer data)
        hookdata.item = item;
        hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
 
-       folder_item_destroy(item);
-
-       return FALSE;
-}
-
-void folder_item_remove(FolderItem *item)
-{
-       GNode *node;
-
-       g_return_if_fail(item != NULL);
-       g_return_if_fail(item->folder != NULL);
-       g_return_if_fail(item->node != NULL);
-       node = item->node;
+       node = start_node;
 
        if (item->folder->node == node)
                item->folder->node = NULL;
 
-       g_node_traverse(node, G_POST_ORDER, G_TRAVERSE_ALL, -1,
-                       folder_item_remove_func, NULL);
+       folder_item_destroy(item);
+
        g_node_destroy(node);
 }
 
@@ -1483,6 +1493,8 @@ gint folder_item_close(FolderItem *item)
        g_return_val_if_fail(item != NULL, -1);
        g_return_val_if_fail(item->no_select == FALSE, -1);
 
+       summary_lock(mainwindow_get_mainwindow()->summaryview);
+
        if (item->new_msgs) {
                folder_item_update_freeze();
                mlist = folder_item_get_msg_list(item);
@@ -1502,6 +1514,8 @@ gint folder_item_close(FolderItem *item)
        
        folder_item_update(item, F_ITEM_UPDATE_MSGCNT);
 
+       summary_unlock(mainwindow_get_mainwindow()->summaryview);
+       
        item->opened = FALSE;
        folder = item->folder;
 
@@ -1585,9 +1599,8 @@ static gint syncronize_flags(FolderItem *item, MsgInfoList *msglist)
                                continue;
                        
                        if (msginfo->flags.perm_flags != permflags) {
-                               procmsg_msginfo_set_flags(msginfo,
-                                       permflags & ~msginfo->flags.perm_flags, 0);
-                               procmsg_msginfo_unset_flags(msginfo,
+                               procmsg_msginfo_change_flags(msginfo,
+                                       permflags & ~msginfo->flags.perm_flags, 0,
                                        ~permflags & msginfo->flags.perm_flags, 0);
                        }
                }
@@ -1819,8 +1832,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                if (MSG_IS_IGNORE_THREAD(msginfo->flags) && (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)))
                        procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
                if (!MSG_IS_IGNORE_THREAD(msginfo->flags) && procmsg_msg_has_flagged_parent(msginfo, MSG_IGNORE_THREAD)) {
-                       procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
-                       procmsg_msginfo_set_flags(msginfo, MSG_IGNORE_THREAD, 0);
+                       procmsg_msginfo_change_flags(msginfo, MSG_IGNORE_THREAD, 0, MSG_NEW | MSG_UNREAD, 0);
                }
                if ((folder_has_parent_of_type(item, F_OUTBOX) ||
                     folder_has_parent_of_type(item, F_QUEUE)  ||
@@ -2318,7 +2330,7 @@ static gint folder_item_get_msg_num_by_file(FolderItem *dest, const gchar *file)
        gint msgnum = 0;
        gchar buf[BUFFSIZE];
 
-       if ((fp = fopen(file, "rb")) == NULL)
+       if ((fp = g_fopen(file, "rb")) == NULL)
                return 0;
 
        if ((folder_has_parent_of_type(dest, F_QUEUE)) || 
@@ -2375,13 +2387,12 @@ static void copy_msginfo_flags(MsgInfo *source, MsgInfo *dest)
        tmp_flags &= ~(MSG_MOVE | MSG_COPY);
 
        /* unset flags that are set but should not */
-       procmsg_msginfo_unset_flags(dest,
-                                   dest->flags.perm_flags & ~perm_flags,
-                                   dest->flags.tmp_flags  & ~tmp_flags);
-       /* set new flags */
-       procmsg_msginfo_set_flags(dest,
+       /* and set new flags */
+       procmsg_msginfo_change_flags(dest,
                                  ~dest->flags.perm_flags & perm_flags,
-                                 ~dest->flags.tmp_flags  & tmp_flags);
+                                 ~dest->flags.tmp_flags  & tmp_flags,
+                                  dest->flags.perm_flags & ~perm_flags,
+                                  dest->flags.tmp_flags  & ~tmp_flags);
 }
 
 static void add_msginfo_to_cache(FolderItem *item, MsgInfo *newmsginfo, MsgInfo *flagsource)
@@ -2510,7 +2521,7 @@ gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
                                lastnum = num;
 
                        if (num >= 0 && remove_source) {
-                               if (unlink(fileinfo->file) < 0)
+                               if (g_unlink(fileinfo->file) < 0)
                                        FILE_OP_ERROR(fileinfo->file, "unlink");
                        }
 
@@ -2812,7 +2823,11 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
        }
 
        g_relation_destroy(relation);
-       return lastnum;
+       if (not_moved != NULL) {
+               g_slist_free(not_moved);
+               return -1;
+       } else
+               return lastnum;
 }
 
 /**
@@ -3172,7 +3187,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)
@@ -3549,6 +3564,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) {