0.9.3claws53
authorChristoph Hohmann <reboot@gmx.ch>
Fri, 25 Jul 2003 18:47:43 +0000 (18:47 +0000)
committerChristoph Hohmann <reboot@gmx.ch>
Fri, 25 Jul 2003 18:47:43 +0000 (18:47 +0000)
* src/folder.[ch]
* src/imap.c
* src/mh.c
        rewrite adding of multiple messages to a folder for
        claws' folder system

ChangeLog.claws
configure.ac
src/folder.c
src/folder.h
src/imap.c
src/mh.c

index 26cf48911b98ffe4e56a24603b84815786e9897d..98462f1c8197220f29c4917721e16939f54eade9 100644 (file)
@@ -1,3 +1,11 @@
+2003-07-25 [christoph] 0.9.3claws53
+
+       * src/folder.[ch]
+       * src/imap.c
+       * src/mh.c
+               rewrite adding of multiple messages to a folder for
+               claws' folder system
+
 2003-07-25 [luke]      0.9.3claws52
 
        * src/mimeview.c
index fa29ead8e25590373829657637becb0a0579d61f..01923af3bef92eabbfda445fd0dc32b701956f41 100644 (file)
@@ -11,8 +11,12 @@ MINOR_VERSION=9
 MICRO_VERSION=3
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=52
-VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}claws${EXTRA_VERSION}
+EXTRA_VERSION=53
+if test $EXTRA_VERSION -eq 0; then
+    VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}claws
+else
+    VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}claws${EXTRA_VERSION}
+fi
 
 dnl set $target
 AC_CANONICAL_SYSTEM
index 090d048e284495b03ba96df304e8c2141d231900..5c3b42634f853bf01efb8d273c2f8b4e57776d72 100644 (file)
@@ -1655,67 +1655,95 @@ static void remove_msginfo_from_cache(FolderItem *item, MsgInfo *msginfo)
 gint folder_item_add_msg(FolderItem *dest, const gchar *file,
                         gboolean remove_source)
 {
-       Folder *folder;
-       gint num;
-       MsgInfo *msginfo;
+       GSList file_list;
 
        g_return_val_if_fail(dest != NULL, -1);
        g_return_val_if_fail(file != NULL, -1);
 
-       folder = dest->folder;
+       file_list.data = (gpointer) file;
+       file_list.next = NULL;
 
-       g_return_val_if_fail(folder->klass->add_msg != NULL, -1);
+       return folder_item_add_msgs(dest, &file_list, remove_source);
+}
 
-       if (!dest->cache)
-               folder_item_read_cache(dest);
+gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
+                          gboolean remove_source)
+{
+        Folder *folder;
+        gint ret, num, lastnum = -1;
+       GSList *file_cur;
+       MsgNumberList *newnum_list = NULL, *newnum_cur = NULL;
+       gchar *file = NULL;
+       gboolean folderscan = FALSE;
 
-       num = folder->klass->add_msg(folder, dest, file, FALSE);
+        g_return_val_if_fail(dest != NULL, -1);
+        g_return_val_if_fail(file_list != NULL, -1);
+        g_return_val_if_fail(dest->folder != NULL, -1);
 
-        if (num > 0) {
-               msginfo = folder->klass->get_msginfo(folder, dest, num);
+        folder = dest->folder;
 
-               if (msginfo != NULL) {
-                       add_msginfo_to_cache(dest, msginfo, NULL);
-                       procmsg_msginfo_free(msginfo);
-                       folder_item_update(dest, F_ITEM_UPDATE_MSGCNT | F_ITEM_UPDATE_CONTENT);
+       if (folder->klass->add_msgs != NULL) {
+               ret = folder->klass->add_msgs(folder, dest, file_list, &newnum_list);
+               if (ret < 0) {
+                       g_slist_free(newnum_list);
+                       return ret;
                }
+       } else {
+               for (file_cur = file_list; file_cur != NULL; file_cur = g_slist_next(file_cur)) {
+                       file = (gchar *) file_cur->data;
 
-                dest->last_num = num;
-        } else if (num == 0) {
-               folder_item_scan_full(dest, FALSE);
-               num = folder_item_get_msg_num_by_file(dest, file);
+                       ret = folder->klass->add_msg(folder, dest, file);
+                       if (ret < 0) {
+                               g_slist_free(newnum_list);
+                               return ret;
+                       }
+                       newnum_list = g_slist_append(newnum_list, GINT_TO_POINTER(ret));
+               }
        }
 
-       if (num >= 0 && remove_source) {
-               if (unlink(file) < 0)
-                       FILE_OP_ERROR(file, "unlink");
-       }
+       for (newnum_cur = newnum_list, file_cur = file_list;
+            newnum_cur != NULL && file_cur != NULL;
+            newnum_cur = g_slist_next(newnum_cur), file_cur = g_slist_next(file_cur)) {
 
-       return num;
-}
+               num = GPOINTER_TO_INT(newnum_cur->data);
+               file = (gchar *) file_cur->data;
 
-gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
-                          gboolean remove_source, gint *first)
-{
-        Folder *folder;
-        gint num;
+               if (num >= 0) {
+                       MsgInfo *newmsginfo;
 
-        g_return_val_if_fail(dest != NULL, -1);
-        g_return_val_if_fail(file_list != NULL, -1);
-        g_return_val_if_fail(dest->folder != NULL, -1);
-        g_return_val_if_fail(dest->folder->klass->add_msgs != NULL, -1);
+                       if (num == 0) {
+                               if (!folderscan) {
+                                       folder_item_scan_full(dest, FALSE);
+                                       folderscan = TRUE;
+                               }
+                               num = folder_item_get_msg_num_by_file(dest, file);
+                       }
 
-        folder = dest->folder;
+                       if (num > lastnum)
+                               lastnum = num;
 
-        num = folder->klass->add_msgs(folder, dest, file_list, remove_source, first);
+                       if (num >= 0 && remove_source) {
+                               if (unlink(file) < 0)
+                                       FILE_OP_ERROR(file, "unlink");
+                       }
 
-       /*
-         * TODO: Claws should get feedback about each message
-        *       remove source done here in claws, not in folder
-         *       function
-        */
-       
-        return num;
+                       if (num == 0)
+                               continue;
+
+                       if (!folderscan && 
+                           ((newmsginfo = folder->klass->get_msginfo(folder, dest, num)) != NULL)) {
+                               add_msginfo_to_cache(dest, newmsginfo, NULL);
+                               procmsg_msginfo_free(newmsginfo);
+                       } else if ((newmsginfo = msgcache_get_msg(dest->cache, num)) != NULL) {
+                               /* TODO: set default flags */
+                               procmsg_msginfo_free(newmsginfo);
+                       }
+               }
+       }
+
+       g_slist_free(newnum_list);
+
+        return lastnum;
 }
 
 /*
@@ -1938,12 +1966,12 @@ gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
         * 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)) {
+       for (l = msglist, l2 = newmsgnums; 
+            l != NULL && l2 != NULL;
+            l = g_slist_next(l), l2 = g_slist_next(l2)) {
                MsgInfo *msginfo = (MsgInfo *) l->data;
 
                num = GPOINTER_TO_INT(l2->data);
-               l2 = g_slist_next(l2);
 
                if (num >= 0) {
                        MsgInfo *newmsginfo;
@@ -1983,12 +2011,13 @@ gint folder_item_move_msgs_with_dest(FolderItem *dest, GSList *msglist)
         * message counts
         */
        l2 = newmsgnums;
-       for (l = msglist; l != NULL; l = g_slist_next(l)) {
+       for (l = msglist, l2 = newmsgnums;
+            l != NULL && l2 != NULL;
+            l = g_slist_next(l), l2 = g_slist_next(l2)) {
                MsgInfo *msginfo = (MsgInfo *) l->data;
                FolderItem *item = msginfo->folder;
 
                num = GPOINTER_TO_INT(l2->data);
-               l2 = g_slist_next(l2);
 
                if ((num >= 0) && (item->folder->klass->remove_msg != NULL)) {
                        item->folder->klass->remove_msg(item->folder,
@@ -2090,12 +2119,12 @@ gint folder_item_copy_msgs_with_dest(FolderItem *dest, GSList *msglist)
         * 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)) {
+       for (l = msglist, l2 = newmsgnums;
+            l != NULL && l2 != NULL;
+            l = g_slist_next(l), l2 = g_slist_next(l2)) {
                MsgInfo *msginfo = (MsgInfo *) l->data;
 
                num = GPOINTER_TO_INT(l2->data);
-               l2 = g_slist_next(l2);
 
                if (num >= 0) {
                        MsgInfo *newmsginfo;
index 5360f64359db3ea180be34a51515d9f680f07d80..10d361046ec95f906ef9027966c2c87391cc972d 100644 (file)
@@ -216,13 +216,11 @@ struct _FolderClass
                                                 gint            num);
        gint            (*add_msg)              (Folder         *folder,
                                                 FolderItem     *dest,
-                                                const gchar    *file,
-                                                gboolean        remove_source);
+                                                const gchar    *file);
        gint            (*add_msgs)             (Folder         *folder,
                                                 FolderItem     *dest,
                                                 GSList         *file_list,
-                                                gboolean        remove_source,
-                                                gint           *first);
+                                                MsgNumberList **newnum_list);
        gint            (*copy_msg)             (Folder         *folder,
                                                 FolderItem     *dest,
                                                 MsgInfo        *msginfo);
@@ -421,8 +419,7 @@ gint   folder_item_add_msg          (FolderItem     *dest,
                                         gboolean        remove_source);
 gint   folder_item_add_msgs             (FolderItem     *dest,
                                          GSList         *file_list,
-                                         gboolean        remove_source,
-                                         gint           *first);
+                                         gboolean        remove_source);
 gint   folder_item_move_to             (FolderItem     *src,
                                         FolderItem     *dest,
                                         FolderItem    **new_item);
index 7029facbdda765de54be527a361a3f1382bfc360..ddee6dfaa19ce470677e839d230b43ff6245ca2c 100644 (file)
@@ -163,7 +163,7 @@ static void imap_session_destroy(Session * session);
 static gchar *imap_fetch_msg(Folder * folder, FolderItem * item, gint uid);
 static gint imap_add_msg(Folder * folder,
                         FolderItem * dest,
-                        const gchar * file, gboolean remove_source);
+                        const gchar * file);
 
 static gint imap_copy_msg(Folder * folder,
                          FolderItem * dest, MsgInfo * msginfo);
@@ -778,8 +778,7 @@ gchar *imap_fetch_msg(Folder *folder, FolderItem *item, gint uid)
        return filename;
 }
 
-gint imap_add_msg(Folder *folder, FolderItem *dest, const gchar *file,
-                 gboolean remove_source)
+gint imap_add_msg(Folder *folder, FolderItem *dest, const gchar *file)
 {
        gchar *destdir;
        IMAPSession *session;
@@ -801,11 +800,6 @@ gint imap_add_msg(Folder *folder, FolderItem *dest, const gchar *file,
                return -1;
        }
 
-       if (remove_source) {
-               if (unlink(file) < 0)
-                       FILE_OP_ERROR(file, "unlink");
-       }
-
        return newuid;
 }
 
@@ -884,7 +878,7 @@ gint imap_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
        srcfile = procmsg_get_message_file(msginfo);
        if (!srcfile) return -1;
 
-       ret = imap_add_msg(folder, dest, srcfile, FALSE);
+       ret = imap_add_msg(folder, dest, srcfile);
 
        g_free(srcfile);
 
index 5db3c3cce7d9d733579177460f2e2f101284f983..0b021edd0b7c6db863e06699367e7dbc0bd689f4 100644 (file)
--- a/src/mh.c
+++ b/src/mh.c
@@ -53,12 +53,9 @@ static MsgInfo *mh_get_msginfo(Folder * folder,
                               FolderItem * item, gint num);
 static gint mh_add_msg(Folder * folder,
                       FolderItem * dest,
-                      const gchar * file, gboolean remove_source);
-gint     mh_add_msgs           (Folder         *folder,
-                                FolderItem     *dest,
-                                GSList         *file_list,
-                                gboolean        remove_source,
-                                gint           *first);
+                      const gchar * file);
+static gint mh_add_msgs(Folder * folder,
+                FolderItem * dest, GSList * file_list, MsgNumberList **newnum_list);
 static gint mh_copy_msg(Folder * folder,
                        FolderItem * dest, MsgInfo * msginfo);
 static gint mh_remove_msg(Folder * folder, FolderItem * item, gint num);
@@ -311,26 +308,28 @@ gchar *mh_get_new_msg_filename(FolderItem *dest)
        procmsg_write_flags(&newmsginfo, fp); \
 }
 
-gint mh_add_msg(Folder *folder, FolderItem *dest, const gchar *file,
-               gboolean remove_source)
+gint mh_add_msg(Folder *folder, FolderItem *dest, const gchar *file)
 {
         GSList file_list; 
+       gint ret;
+       MsgNumberList *newnum_list = NULL;
   
         g_return_val_if_fail(file != NULL, -1); 
   
         file_list.data = (gpointer) file; 
         file_list.next = NULL; 
   
-        return mh_add_msgs(folder, dest, &file_list, remove_source, NULL); 
+        ret = mh_add_msgs(folder, dest, &file_list, NULL); 
+       g_slist_free(newnum_list);
+       return ret;
 } 
  
 gint mh_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list, 
-                gboolean remove_source, gint *first) 
+                 MsgNumberList **newnum_list) 
 { 
        gchar *destfile;
         GSList *cur; 
         gchar *file; 
-        gint first_ = 0; 
 
        g_return_val_if_fail(dest != NULL, -1);
        g_return_val_if_fail(file_list != NULL, -1);
@@ -345,8 +344,6 @@ gint mh_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list,
 
                 destfile = mh_get_new_msg_filename(dest); 
                 if (destfile == NULL) return -1; 
-                if (first_ == 0 || first_ > dest->last_num + 1) 
-                        first_ = dest->last_num + 1; 
   
                 if (link(file, destfile) < 0) { 
                         if (copy_file(file, destfile, TRUE) < 0) { 
@@ -356,22 +353,12 @@ gint mh_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list,
                                 return -1; 
                         } 
                }
+               *newnum_list = g_slist_append(*newnum_list, GINT_TO_POINTER(dest->last_num + 1));
 
                g_free(destfile);
                dest->last_num++;
        }
 
-       if (first)
-               *first = first_;
-
-       if (remove_source) {
-               for (cur = file_list; cur != NULL; cur = cur->next) {
-                       file = (gchar *)cur->data;
-                       if (unlink(file) < 0)
-                               FILE_OP_ERROR(file, "unlink");
-               }
-       }
-
        return dest->last_num; 
 }