*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* GNU General Public License for more details.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
*/
#ifdef HAVE_CONFIG_H
Folder *folder = NULL;
FolderUpdateData hookdata;
+ if (item == NULL)
+ return;
+
folder = item->folder;
/* unset previous root of newtype */
switch(newtype) {
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;
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;
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;
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) { \
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;
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;
~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;
if (!MSG_IS_IGNORE_THREAD(msginfo->flags) && procmsg_msg_has_flagged_parent(msginfo, MSG_IGNORE_THREAD)) {
procmsg_msginfo_change_flags(msginfo, MSG_IGNORE_THREAD, 0, MSG_NEW | MSG_UNREAD, 0);
}
+ if (!MSG_IS_WATCH_THREAD(msginfo->flags) && procmsg_msg_has_flagged_parent(msginfo, MSG_WATCH_THREAD)) {
+ procmsg_msginfo_set_flags(msginfo, MSG_WATCH_THREAD, 0);
+ }
if(prefs_common.thread_by_subject && !msginfo->inreplyto &&
!msginfo->references && !MSG_IS_IGNORE_THREAD(msginfo->flags) &&
(parent_msginfo = subject_table_lookup(subject_table, msginfo->subject)))
}
}
+static void folder_item_remove_cached_msg(FolderItem *item, MsgInfo *msginfo)
+{
+ Folder *folder = item->folder;
+
+ g_return_if_fail(folder != NULL);
+
+ if (folder->klass->remove_cached_msg == NULL)
+ return;
+
+ folder->klass->remove_cached_msg(folder, item, msginfo);
+}
+
+static void folder_item_clean_local_files(FolderItem *item, gint days)
+{
+ g_return_if_fail(item != NULL);
+ g_return_if_fail(item->folder != NULL);
+
+ if (FOLDER_TYPE(item->folder) == F_IMAP ||
+ FOLDER_TYPE(item->folder) == F_NEWS) {
+ GSList *msglist = folder_item_get_msg_list(item);
+ GSList *cur;
+ time_t t = time(NULL);
+ for (cur = msglist; cur; cur = cur->next) {
+ MsgInfo *msginfo = (MsgInfo *)cur->data;
+ gint age = (t - msginfo->date_t) / (60*60*24);
+ if (age > days)
+ folder_item_remove_cached_msg(item, msginfo);
+ }
+ procmsg_msg_list_free(msglist);
+ }
+}
+
static void folder_item_read_cache(FolderItem *item)
{
gchar *cache_file, *mark_file, *tags_file;
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;
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);
}
}
- 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);
}
}
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;
}
statusbar_progress_all(0,0,0);
- statusbar_pop_all();
+ statuswindow_pop_all();
procmsg_msg_list_free(mlist);
return ret;
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);
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;
+
/* Unset tmp flags that should not be copied */
tmp_flags &= ~(MSG_MOVE | MSG_COPY | MSG_MOVE_DONE);
folderscan = TRUE;
}
num = folder_item_get_msg_num_by_file(dest, fileinfo->file);
+ debug_print("got num %d\n", num);
}
if (num > lastnum)
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;
}
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);
}
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;
}
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;
identifier = folder_item_get_identifier(item);
g_return_val_if_fail(identifier != NULL, NULL);
-
+
+#ifdef G_OS_WIN32
+ while (strchr(identifier, '/'))
+ *strchr(identifier, '/') = '\\';
+#endif
+
path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
"tagsdb", G_DIR_SEPARATOR_S,
identifier, NULL);
/* apply post global rules */
filter_message_by_msginfo(post_global_processing, msginfo, NULL,
FILTERING_POST_PROCESSING, NULL);
+ if (curmsg % 1000 == 0)
+ GTK_EVENTS_FLUSH();
}
prefs_common.apply_per_account_filtering_rules = last_apply_per_account;
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)");
- item->folder->klass->synchronise(item);
- statusbar_pop_all();
+ 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);
+ statuswindow_pop_all();
}
}