3ad3a54c313617cc0d207af7be869090df036b77
[claws.git] / src / patch
1 diff --git a/src/folder.c b/src/folder.c
2 index 2a8d862..c080f8c 100644
3 --- a/src/folder.c
4 +++ b/src/folder.c
5 @@ -969,7 +969,7 @@ void folder_scan_tree(Folder *folder, gboolean rebuild)
6  FolderItem *folder_create_folder(FolderItem *parent, const gchar *name)
7  {
8         FolderItem *new_item;
9 -       
10 +
11         cm_return_val_if_fail(parent != NULL, NULL);
12  
13         new_item = parent->folder->klass->create_folder(parent->folder, parent, name);
14 diff --git a/src/imap.c b/src/imap.c
15 index 8870719..9086635 100644
16 --- a/src/imap.c
17 +++ b/src/imap.c
18 @@ -290,6 +290,12 @@ static FolderItem *imap_create_special_folder
19  static gint imap_do_copy_msgs          (Folder         *folder,
20                                          FolderItem     *dest,
21                                          MsgInfoList    *msglist,
22 +                                        GHashTable     *relation,
23 +                                        gboolean        same_dest_ok);
24 +
25 +static gint imap_do_remove_msgs                (Folder         *folder,
26 +                                        FolderItem     *dest,
27 +                                        MsgInfoList    *msglist,
28                                          GHashTable     *relation);
29  
30  static void imap_delete_all_cached_messages    (FolderItem     *item);
31 @@ -1810,7 +1816,8 @@ static GSList *flatten_mailimap_set(struct mailimap_set * set)
32         return result;
33  }
34  static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest, 
35 -                             MsgInfoList *msglist, GHashTable *relation)
36 +                             MsgInfoList *msglist, GHashTable *relation,
37 +                             gboolean same_dest_ok)
38  {
39         FolderItem *src;
40         gchar *destdir;
41 @@ -1834,7 +1841,7 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
42  
43         msginfo = (MsgInfo *)msglist->data;
44         src = msginfo->folder;
45 -       if (src == dest) {
46 +       if (!same_dest_ok && src == dest) {
47                 g_warning("the src folder is identical to the dest.\n");
48                 return -1;
49         }
50 @@ -2018,10 +2025,32 @@ static gint imap_copy_msgs(Folder *folder, FolderItem *dest,
51         msginfo = (MsgInfo *)msglist->data;
52         g_return_val_if_fail(msginfo->folder != NULL, -1);
53  
54 -       ret = imap_do_copy_msgs(folder, dest, msglist, relation);
55 +       ret = imap_do_copy_msgs(folder, dest, msglist, relation, FALSE);
56         return ret;
57  }
58  
59 +static gboolean imap_renumber_msg(MsgInfo *info)
60 +{
61 +       GSList msglist;
62 +       int ret;
63 +
64 +       g_return_val_if_fail(info != NULL, -1);
65 +
66 +       msglist.data = info;
67 +       msglist.next = NULL;
68 +
69 +       ret = imap_do_copy_msgs(info->folder->folder, info->folder, &msglist,
70 +                               NULL, TRUE);
71 +       if (ret == 0)
72 +               ret = imap_do_remove_msgs(info->folder->folder, info->folder,
73 +                                         &msglist, NULL);
74 +
75 +       if (ret == 0)
76 +               ret = folder_item_scan_full(info->folder, FALSE);
77 +
78 +       return ret == 0;
79 +}
80 +
81  static gboolean imap_matcher_type_is_local(gint matchertype)
82  {
83         switch (matchertype) {
84 @@ -3069,6 +3098,17 @@ static FolderItem *imap_create_folder(Folder *folder, FolderItem *parent,
85         g_return_val_if_fail(parent != NULL, NULL);
86         g_return_val_if_fail(name != NULL, NULL);
87  
88 +       if (to_number(name) > 0) {
89 +               MsgInfo *info = folder_item_get_msginfo(parent, to_number(name));
90 +               if (info != NULL) {
91 +                       gboolean ok = imap_renumber_msg(info);
92 +                       procmsg_msginfo_free(info);
93 +                       if (!ok) {
94 +                               return NULL;
95 +                       }
96 +               }
97 +       }
98 +
99         debug_print("getting session...\n");
100         session = imap_session_get(folder);
101         if (!session) {
102 diff --git a/src/mh.c b/src/mh.c
103 index e7b9888..b3fbc9c 100644
104 --- a/src/mh.c
105 +++ b/src/mh.c
106 @@ -43,6 +43,7 @@
107  #include "statusbar.h"
108  #include "gtkutils.h"
109  #include "timing.h"
110 +#include "msgcache.h"
111  
112  /* Define possible missing constants for Windows. */
113  #ifdef G_OS_WIN32
114 @@ -368,6 +369,11 @@ static gchar *mh_get_new_msg_filename(FolderItem *dest)
115         destpath = folder_item_get_path(dest);
116         cm_return_val_if_fail(destpath != NULL, NULL);
117  
118 +       if (dest->last_num < 0) {
119 +               mh_get_last_num(dest->folder, dest);
120 +               if (dest->last_num < 0) return NULL;
121 +       }
122 +
123         if (!is_dir_exist(destpath))
124                 make_dir_hier(destpath);
125  
126 @@ -867,6 +873,30 @@ static gchar *mh_item_get_path(Folder *folder, FolderItem *item)
127         return real_path;
128  }
129  
130 +static gboolean mh_renumber_msg(MsgInfo *info)
131 +{
132 +       gchar *src, *dest;
133 +       gboolean result = FALSE;
134 +       guint num;
135 +       cm_return_val_if_fail(info != NULL, FALSE);
136 +
137 +       src = folder_item_fetch_msg(info->folder, info->msgnum);
138 +       dest = mh_get_new_msg_filename(info->folder);
139 +       num = info->folder->last_num + 1;
140 +
141 +       if (move_file(src, dest, FALSE) == 0) {
142 +               msgcache_remove_msg(info->folder->cache, info->msgnum);
143 +               info->msgnum = num;
144 +               msgcache_add_msg(info->folder->cache, info);
145 +               result = TRUE;
146 +       }
147 +
148 +       g_free(src);
149 +       g_free(dest);
150 +
151 +       return result;
152 +}
153 +
154  static FolderItem *mh_create_folder(Folder *folder, FolderItem *parent,
155                                     const gchar *name)
156  {
157 @@ -884,12 +914,24 @@ static FolderItem *mh_create_folder(Folder *folder, FolderItem *parent,
158         if (!is_dir_exist(path)) 
159                 if (make_dir_hier(path) != 0)
160                         return NULL;
161 -               
162 +
163         real_name = mh_filename_from_utf8(name);
164         fullpath = g_strconcat(path, G_DIR_SEPARATOR_S, real_name, NULL);
165         g_free(real_name);
166         g_free(path);
167  
168 +       if (to_number(name) > 0) {
169 +               MsgInfo *info = folder_item_get_msginfo(parent, to_number(name));
170 +               if (info != NULL) {
171 +                       gboolean ok = mh_renumber_msg(info);
172 +                       procmsg_msginfo_free(info);
173 +                       if (!ok) {
174 +                               g_free(fullpath);
175 +                               return NULL;
176 +                       }
177 +               }
178 +       }
179 +
180         if (make_dir(fullpath) < 0) {
181                 g_free(fullpath);
182                 return NULL;