/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team
*
* 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
#include "tags.h"
#include "timing.h"
#include "inc.h"
+#include "privacy.h"
+
+extern SessionStats session_stats;
static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr,
FolderItem *queue, gint msgnum, gboolean *queued_removed);
g_slist_free(mlist);
}
+MsgNumberList *procmsg_get_number_list_for_msgs(MsgInfoList *msglist)
+{
+ GSList *cur = NULL;
+ GSList *nums = NULL;
+
+ for (cur = msglist; cur; cur = cur->next) {
+ MsgInfo *msg = (MsgInfo *)cur->data;
+ nums = g_slist_prepend(nums, GUINT_TO_POINTER(msg->msgnum));
+ }
+
+ return g_slist_reverse(nums);
+}
+
struct MarkSum {
gint *new_msgs;
gint *unread_msgs;
/* CLAWS subject threading:
in the first round it inserts subject lines in a
- relation (subject <-> node)
+ hashtable (subject <-> node)
the second round finishes the threads by attaching
matching subject lines to the one found in the
- relation. will use the oldest node with the same
+ hashtable. will use the oldest node with the same
subject that is not more then thread_by_subject_max_age
- days old (see subject_relation_lookup)
+ days old (see subject_hashtable_lookup)
*/
-static void subject_relation_insert(GRelation *relation, GNode *node)
+static void subject_hashtable_insert(GHashTable *hashtable, GNode *node)
{
gchar *subject;
MsgInfo *msginfo;
+ GSList *list = NULL;
- g_return_if_fail(relation != NULL);
- g_return_if_fail(node != NULL);
+ cm_return_if_fail(hashtable != NULL);
+ cm_return_if_fail(node != NULL);
msginfo = (MsgInfo *) node->data;
- g_return_if_fail(msginfo != NULL);
+ cm_return_if_fail(msginfo != NULL);
subject = msginfo->subject;
if (subject == NULL)
return;
+
subject += subject_get_prefix_length(subject);
- g_relation_insert(relation, subject, node);
+ list = g_hash_table_lookup(hashtable, subject);
+ list = g_slist_prepend(list, node);
+ g_hash_table_insert(hashtable, subject, list);
}
-static GNode *subject_relation_lookup(GRelation *relation, MsgInfo *msginfo)
+static GNode *subject_hashtable_lookup(GHashTable *hashtable, MsgInfo *msginfo)
{
gchar *subject;
- GTuples *tuples;
- GNode *node = NULL;
+ GSList *list, *cur;
+ GNode *node = NULL, *hashtable_node = NULL;
gint prefix_length;
+ MsgInfo *hashtable_msginfo = NULL, *best_msginfo = NULL;
+ gboolean match;
- g_return_val_if_fail(relation != NULL, NULL);
+ cm_return_val_if_fail(hashtable != NULL, NULL);
subject = msginfo->subject;
if (subject == NULL)
return NULL;
subject += prefix_length;
- tuples = g_relation_select(relation, subject, 0);
- if (tuples == NULL)
+ list = g_hash_table_lookup(hashtable, subject);
+ if (list == NULL)
return NULL;
- if (tuples->len > 0) {
- int i;
- GNode *relation_node;
- MsgInfo *relation_msginfo = NULL, *best_msginfo = NULL;
- gboolean match;
-
- /* check all nodes with the same subject to find the best parent */
- for (i = 0; i < tuples->len; i++) {
- relation_node = (GNode *) g_tuples_index(tuples, i, 1);
- relation_msginfo = (MsgInfo *) relation_node->data;
+ /* check all nodes with the same subject to find the best parent */
+ for (cur = list; cur; cur = cur->next) {
+ hashtable_node = (GNode *)cur->data;
+ hashtable_msginfo = (MsgInfo *) hashtable_node->data;
+ match = FALSE;
+
+ /* best node should be the oldest in the found nodes */
+ /* parent node must not be older then msginfo */
+ if ((hashtable_msginfo->date_t < msginfo->date_t) &&
+ ((best_msginfo == NULL) ||
+ (best_msginfo->date_t > hashtable_msginfo->date_t)))
+ match = TRUE;
+
+ /* parent node must not be more then thread_by_subject_max_age
+ days older then msginfo */
+ if (abs(difftime(msginfo->date_t, hashtable_msginfo->date_t)) >
+ prefs_common.thread_by_subject_max_age * 3600 * 24)
match = FALSE;
- /* best node should be the oldest in the found nodes */
- /* parent node must not be older then msginfo */
- if ((relation_msginfo->date_t < msginfo->date_t) &&
- ((best_msginfo == NULL) ||
- (best_msginfo->date_t > relation_msginfo->date_t)))
- match = TRUE;
-
- /* parent node must not be more then thread_by_subject_max_age
- days older then msginfo */
- if (abs(difftime(msginfo->date_t, relation_msginfo->date_t)) >
- prefs_common.thread_by_subject_max_age * 3600 * 24)
- match = FALSE;
-
- /* can add new tests for all matching
- nodes found by subject */
-
- if (match) {
- node = relation_node;
- best_msginfo = relation_msginfo;
- }
- }
+ /* can add new tests for all matching
+ nodes found by subject */
+
+ if (match) {
+ node = hashtable_node;
+ best_msginfo = hashtable_msginfo;
+ }
}
- g_tuples_destroy(tuples);
return node;
}
+static void subject_hashtable_free(gpointer key, gpointer value, gpointer data)
+{
+ g_slist_free(value);
+}
+
/* return the reversed thread tree */
GNode *procmsg_get_thread_tree(GSList *mlist)
{
GNode *root, *parent, *node, *next;
GHashTable *msgid_table;
- GRelation *subject_relation = NULL;
+ GHashTable *subject_hashtable = NULL;
MsgInfo *msginfo;
const gchar *msgid;
GSList *reflist;
msgid_table = g_hash_table_new(g_str_hash, g_str_equal);
if (prefs_common.thread_by_subject) {
- subject_relation = g_relation_new(2);
- g_relation_index(subject_relation, 0, g_str_hash, g_str_equal);
+ subject_hashtable = g_hash_table_new(g_str_hash, g_str_equal);
}
for (; mlist != NULL; mlist = mlist->next) {
if ((msgid = msginfo->msgid) && g_hash_table_lookup(msgid_table, msgid) == NULL)
g_hash_table_insert(msgid_table, (gchar *)msgid, node);
- /* CLAWS: add subject to relation (without prefix) */
+ /* CLAWS: add subject to hashtable (without prefix) */
if (prefs_common.thread_by_subject) {
- subject_relation_insert(subject_relation, node);
+ subject_hashtable_insert(subject_hashtable, node);
}
}
next = node->next;
msginfo = (MsgInfo *) node->data;
- parent = subject_relation_lookup(subject_relation, msginfo);
+ parent = subject_hashtable_lookup(subject_hashtable, msginfo);
/* the node may already be threaded by IN-REPLY-TO, so go up
* in the tree to
}
if (prefs_common.thread_by_subject)
- g_relation_destroy(subject_relation);
+ {
+ g_hash_table_foreach(subject_hashtable, subject_hashtable_free, NULL);
+ g_hash_table_destroy(subject_hashtable);
+ }
g_hash_table_destroy(msgid_table);
END_TIMING();
{
gchar *file;
- g_return_val_if_fail(msginfo != NULL, NULL);
+ cm_return_val_if_fail(msginfo != NULL, NULL);
if (msginfo->plaintext_file)
file = g_strdup(msginfo->plaintext_file);
{
gchar *filename = NULL;
- g_return_val_if_fail(msginfo != NULL, NULL);
+ cm_return_val_if_fail(msginfo != NULL, NULL);
filename = folder_item_fetch_msg(msginfo->folder, msginfo->msgnum);
if (!filename)
{
gchar *filename = NULL;
- g_return_val_if_fail(msginfo != NULL, NULL);
+ cm_return_val_if_fail(msginfo != NULL, NULL);
filename = folder_item_fetch_msg_full(msginfo->folder, msginfo->msgnum,
headers, body);
FILE *fp;
gchar *file;
- g_return_val_if_fail(msginfo != NULL, NULL);
-
+ cm_return_val_if_fail(msginfo != NULL, NULL);
+
file = procmsg_get_message_file_path(msginfo);
- g_return_val_if_fail(file != NULL, NULL);
+ cm_return_val_if_fail(file != NULL, NULL);
if (!is_file_exist(file)) {
g_free(file);
FILE *fp;
- g_return_if_fail(msginfo != NULL);
- g_return_if_fail(header != NULL);
- g_return_if_fail(key != NULL);
+ cm_return_if_fail(msginfo != NULL);
+ cm_return_if_fail(header != NULL);
+ cm_return_if_fail(key != NULL);
*header = NULL;
*key = NULL;
hentry[idx].body = NULL; \
}
- if (hentry[H_X_BEENTHERE].body != NULL) {
+ if (hentry[H_LIST_ID].body != NULL) {
+ SET_FILTER_KEY("header \"List-Id\"", H_LIST_ID);
+ extract_list_id_str(*key);
+ } else if (hentry[H_X_BEENTHERE].body != NULL) {
SET_FILTER_KEY("header \"X-BeenThere\"", H_X_BEENTHERE);
} else if (hentry[H_X_ML_NAME].body != NULL) {
SET_FILTER_KEY("header \"X-ML-Name\"", H_X_ML_NAME);
SET_FILTER_KEY("header \"X-List\"", H_X_LIST);
} else if (hentry[H_X_MAILING_LIST].body != NULL) {
SET_FILTER_KEY("header \"X-Mailing-List\"", H_X_MAILING_LIST);
- } else if (hentry[H_LIST_ID].body != NULL) {
- SET_FILTER_KEY("header \"List-Id\"", H_LIST_ID);
- extract_list_id_str(*key);
- } else if (hentry[H_X_SEQUENCE].body != NULL) {
+ } else if (hentry[H_X_SEQUENCE].body != NULL) {
gchar *p;
SET_FILTER_KEY("X-Sequence", H_X_SEQUENCE);
{"X-Sylpheed-Encrypt-Data:", NULL, FALSE},
{NULL, NULL, FALSE}};
- g_return_val_if_fail(file != NULL, NULL);
+ cm_return_val_if_fail(file != NULL, NULL);
if ((fp = g_fopen(file, "rb")) == NULL) {
FILE_OP_ERROR(file, "fopen");
return mailac;
}
+gchar *procmsg_msginfo_get_identifier(MsgInfo *msginfo)
+{
+ gchar *folder_id;
+ const gchar *msgid;
+ gchar *id;
+
+ cm_return_val_if_fail(msginfo != NULL, NULL);
+ folder_id = folder_item_get_identifier(msginfo->folder);
+ msgid = msginfo->msgid;
+
+ id = g_strconcat(folder_id, G_DIR_SEPARATOR_S, msgid, NULL);
+
+ g_free(folder_id);
+
+ return id;
+}
+
+MsgInfo *procmsg_get_msginfo_from_identifier(const gchar *id)
+{
+ gchar *folder_id = g_strdup(id);
+ gchar *separator = strrchr(folder_id, G_DIR_SEPARATOR);
+ const gchar *msgid;
+ FolderItem *item;
+ MsgInfo *msginfo;
+
+ if (separator == NULL) {
+ g_free(folder_id);
+ return NULL;
+ }
+
+ *separator = '\0';
+ msgid = separator + 1;
+
+ item = folder_find_item_from_identifier(folder_id);
+
+ if (item == NULL) {
+ g_free(folder_id);
+ return NULL;
+ }
+
+ msginfo = folder_item_get_msginfo_by_msgid(item, msgid);
+ g_free(folder_id);
+
+ return msginfo;
+}
+
static GSList *procmsg_list_sort_by_account(FolderItem *queue, GSList *list)
{
GSList *result = NULL;
{
gchar *file = folder_item_fetch_msg(queue, msginfo->msgnum);
PrefsAccount *ac = procmsg_get_account_from_file(file);
- GSList *cur = elem;
+ GSList *cur;
g_free(file);
for (cur = elem; cur; cur = cur->next) {
MsgInfo *cur_msginfo = (MsgInfo *)cur->data;
}
static gboolean send_queue_lock = FALSE;
+
+gboolean procmsg_queue_lock(char **errstr)
+{
+ if (send_queue_lock) {
+ /* Avoid having to translate two similar strings */
+ log_warning(LOG_PROTOCOL, "%s\n", _("Already trying to send."));
+ if (errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("Already trying to send."));
+ }
+ return FALSE;
+ }
+ send_queue_lock = TRUE;
+ return TRUE;
+}
+void procmsg_queue_unlock(void)
+{
+ send_queue_lock = FALSE;
+}
/*!
*\brief Send messages in queue
*
GSList *sorted_list = NULL;
GNode *node, *next;
- if (send_queue_lock) {
- /* Avoid having to translate two similar strings */
- log_warning(LOG_PROTOCOL, "%s\n", _("Already trying to send."));
- if (errstr) {
- if (*errstr) g_free(*errstr);
- *errstr = g_strdup_printf(_("Already trying to send."));
- }
+ if (!procmsg_queue_lock(errstr)) {
+ main_window_set_menu_sensitive(mainwindow_get_mainwindow());
toolbar_main_set_sensitive(mainwindow_get_mainwindow());
return -1;
}
- send_queue_lock = TRUE;
inc_lock();
if (!queue)
queue = folder_get_default_queue();
if (queue == NULL) {
- send_queue_lock = FALSE;
+ procmsg_queue_unlock();
inc_unlock();
return -1;
}
+ main_window_set_menu_sensitive(mainwindow_get_mainwindow());
toolbar_main_set_sensitive(mainwindow_get_mainwindow());
folder_item_scan(queue);
MsgInfo *msginfo;
msginfo = (MsgInfo *)(elem->data);
- if (!MSG_IS_LOCKED(msginfo->flags)) {
+ if (!MSG_IS_LOCKED(msginfo->flags) && !MSG_IS_DELETED(msginfo->flags)) {
file = folder_item_fetch_msg(queue, msginfo->msgnum);
if (file) {
gboolean queued_removed = FALSE;
node = next;
}
}
- send_queue_lock = FALSE;
+ procmsg_queue_unlock();
inc_unlock();
+ main_window_set_menu_sensitive(mainwindow_get_mainwindow());
toolbar_main_set_sensitive(mainwindow_get_mainwindow());
return (err != 0 ? -err : sent);
gboolean res = FALSE;
if (!queue)
queue = folder_get_default_queue();
- g_return_val_if_fail(queue != NULL, TRUE);
+ cm_return_val_if_fail(queue != NULL, TRUE);
folder_item_scan(queue);
list = folder_item_get_msg_list(queue);
if (!outbox)
outbox = folder_get_default_outbox();
- g_return_val_if_fail(outbox != NULL, -1);
+ cm_return_val_if_fail(outbox != NULL, -1);
/* remove queueing headers */
if (is_queued) {
folder_item_scan(outbox);
if ((num = folder_item_add_msg(outbox, tmp, &flag, TRUE)) < 0) {
g_warning("can't save message\n");
- g_unlink(tmp);
+ claws_unlink(tmp);
return -1;
}
} else {
return 0;
}
+
void procmsg_print_message(MsgInfo *msginfo, const gchar *cmdline)
{
static const gchar *def_cmd = "lpr %s";
gchar buf[1024];
gchar *p;
int r;
- g_return_if_fail(msginfo);
+
+ cm_return_if_fail(msginfo);
if (procmime_msginfo_is_encrypted(msginfo))
tmpfp = procmime_get_first_encrypted_text_content(msginfo);
return;
}
- if (msginfo->date) r = fprintf(prfp, "Date: %s\n", msginfo->date);
- if (msginfo->from) r = fprintf(prfp, "From: %s\n", msginfo->from);
- if (msginfo->to) r = fprintf(prfp, "To: %s\n", msginfo->to);
- if (msginfo->cc) r = fprintf(prfp, "Cc: %s\n", msginfo->cc);
- if (msginfo->newsgroups)
- r = fprintf(prfp, "Newsgroups: %s\n", msginfo->newsgroups);
- if (msginfo->subject) r = fprintf(prfp, "Subject: %s\n", msginfo->subject);
- fputc('\n', prfp);
+ if (msginfo->date) { r = fprintf(prfp, "Date: %s\n", msginfo->date); if (r < 0) goto fpferr; }
+ if (msginfo->from) { r = fprintf(prfp, "From: %s\n", msginfo->from); if (r < 0) goto fpferr; }
+ if (msginfo->to) { r = fprintf(prfp, "To: %s\n", msginfo->to); if (r < 0) goto fpferr; }
+ if (msginfo->cc) { r = fprintf(prfp, "Cc: %s\n", msginfo->cc); if (r < 0) goto fpferr; }
+ if (msginfo->newsgroups) {
+ r = fprintf(prfp, "Newsgroups: %s\n", msginfo->newsgroups); if (r < 0) goto fpferr;
+ }
+ if (msginfo->subject) { r = fprintf(prfp, "Subject: %s\n", msginfo->subject); if (r < 0) goto fpferr; }
+ if (fputc('\n', prfp) == EOF) goto fpferr;
- while (fgets(buf, sizeof(buf), tmpfp) != NULL)
+ while (fgets(buf, sizeof(buf), tmpfp) != NULL) {
r = fputs(buf, prfp);
+ if (r == EOF) goto fpferr;
+ }
fclose(prfp);
fclose(tmpfp);
g_snprintf(buf, sizeof(buf) - 1, cmdline, prtmp);
else {
if (cmdline)
- g_warning("Print command line is invalid: '%s'\n",
+ g_warning("Print command-line is invalid: '%s'\n",
cmdline);
g_snprintf(buf, sizeof(buf) - 1, def_cmd, prtmp);
}
g_free(prtmp);
g_strchomp(buf);
- if (buf[strlen(buf) - 1] != '&') strcat(buf, "&");
- system(buf);
+ if (buf[strlen(buf) - 1] != '&')
+ strncat(buf, "&", sizeof(buf) - strlen(buf) - 1);
+ if (system(buf) == -1)
+ g_warning("system(%s) failed.", buf);
+ return;
+fpferr:
+ FILE_OP_ERROR(prtmp, "fprintf/fputc/fputs");
+ g_free(prtmp);
+ fclose(tmpfp);
+ fclose(prfp);
}
MsgInfo *procmsg_msginfo_new_ref(MsgInfo *msginfo)
g_free(msginfo->extradata->account_login);
g_free(msginfo->extradata);
}
- slist_free_strings(msginfo->references);
- g_slist_free(msginfo->references);
+ slist_free_strings_full(msginfo->references);
g_slist_free(msginfo->tags);
g_free(msginfo->plaintext_file);
gboolean save_clear_text = TRUE;
gchar *tmp_enc_file = NULL;
- int local = 0;
-
- g_return_val_if_fail(file != NULL, -1);
+ cm_return_val_if_fail(file != NULL, -1);
if ((fp = g_fopen(file, "rb")) == NULL) {
FILE_OP_ERROR(file, "fopen");
procmime_mimeinfo_free_all(mimeinfo);
g_free(from);
g_free(smtpserver);
- slist_free_strings(to_list);
- g_slist_free(to_list);
- slist_free_strings(newsgroup_list);
- g_slist_free(newsgroup_list);
+ slist_free_strings_full(to_list);
+ slist_free_strings_full(newsgroup_list);
g_free(savecopyfolder);
g_free(replymessageid);
g_free(fwdmessageid);
} else if (mailac && mailac->use_mail_command &&
mailac->mail_command && (* mailac->mail_command)) {
mailval = send_message_local(mailac->mail_command, fp);
- local = 1;
} else {
if (!mailac) {
mailac = account_find_from_smtp_server(from, smtpserver);
} else if (!to_list && !newsgroup_list) {
if (errstr) {
if (*errstr) g_free(*errstr);
- *errstr = g_strdup(_("Couldn't determine sending informations. "
+ *errstr = g_strdup(_("Couldn't determine sending information. "
"Maybe the email hasn't been generated by Claws Mail."));
}
mailval = -1;
}
fseek(fp, filepos, SEEK_SET);
- if (newsgroup_list && (mailval == 0)) {
+ if (newsgroup_list && newsac && (mailval == 0)) {
Folder *folder;
gchar *tmp = NULL;
FILE *tmpfp;
newsac->nntp_server);
}
}
- g_unlink(tmp);
+ claws_unlink(tmp);
}
g_free(tmp);
}
fclose(fp);
+ /* update session statistics */
+ if (mailval == 0 && newsval == 0) {
+ /* update session stats */
+ if (replymessageid)
+ session_stats.replied++;
+ else if (fwdmessageid)
+ session_stats.forwarded++;
+ else
+ session_stats.sent++;
+ }
+
/* save message to outbox */
if (mailval == 0 && newsval == 0 && savecopyfolder) {
FolderItem *outbox;
}
if (tmp_enc_file != NULL) {
- g_unlink(tmp_enc_file);
+ claws_unlink(tmp_enc_file);
free(tmp_enc_file);
tmp_enc_file = NULL;
}
}
if (msginfo != NULL) {
- MsgPermFlags to_unset = 0;
+ if (replymessageid != NULL) {
+ MsgPermFlags to_unset = 0;
- if (prefs_common.mark_as_read_on_new_window)
- to_unset = (MSG_NEW|MSG_UNREAD);
+ if (prefs_common.mark_as_read_on_new_window)
+ to_unset = (MSG_NEW|MSG_UNREAD);
- if (replymessageid != NULL) {
- procmsg_msginfo_unset_flags(msginfo, to_unset|MSG_FORWARDED, 0);
+ procmsg_msginfo_unset_flags(msginfo, to_unset, 0);
procmsg_msginfo_set_flags(msginfo, MSG_REPLIED, 0);
} else {
- procmsg_msginfo_unset_flags(msginfo, MSG_REPLIED, 0);
procmsg_msginfo_set_flags(msginfo, MSG_FORWARDED, 0);
}
procmsg_msginfo_free(msginfo);
g_free(from);
g_free(smtpserver);
- slist_free_strings(to_list);
- g_slist_free(to_list);
- slist_free_strings(newsgroup_list);
- g_slist_free(newsgroup_list);
+ slist_free_strings_full(to_list);
+ slist_free_strings_full(newsgroup_list);
g_free(savecopyfolder);
g_free(replymessageid);
g_free(fwdmessageid);
gint procmsg_send_message_queue(const gchar *file, gchar **errstr, FolderItem *queue, gint msgnum, gboolean *queued_removed)
{
gint result = procmsg_send_message_queue_full(file, FALSE, errstr, queue, msgnum, queued_removed);
+ main_window_set_menu_sensitive(mainwindow_get_mainwindow());
toolbar_main_set_sensitive(mainwindow_get_mainwindow());
return result;
}
+gint procmsg_send_message_queue_with_lock(const gchar *file, gchar **errstr, FolderItem *queue, gint msgnum, gboolean *queued_removed)
+{
+ gint val;
+ if (procmsg_queue_lock(errstr)) {
+ val = procmsg_send_message_queue(file, errstr, queue, msgnum, queued_removed);
+ procmsg_queue_unlock();
+ return val;
+ }
+ return -1;
+}
+
static void update_folder_msg_counts(FolderItem *item, MsgInfo *msginfo, MsgPermFlags old_flags)
{
MsgPermFlags new_flags = msginfo->flags.perm_flags;
procmsg_update_unread_children(msginfo, FALSE);
item->marked_msgs--;
}
+
+ if (!(old_flags & MSG_REPLIED) && (new_flags & MSG_REPLIED)) {
+ item->replied_msgs++;
+ }
+
+ if ((old_flags & MSG_REPLIED) && !(new_flags & MSG_REPLIED)) {
+ item->replied_msgs--;
+ }
+
+ if (!(old_flags & MSG_FORWARDED) && (new_flags & MSG_FORWARDED)) {
+ item->forwarded_msgs++;
+ }
+
+ if ((old_flags & MSG_FORWARDED) && !(new_flags & MSG_FORWARDED)) {
+ item->forwarded_msgs--;
+ }
+
+ if (!(old_flags & MSG_LOCKED) && (new_flags & MSG_LOCKED)) {
+ item->locked_msgs++;
+ }
+
+ if ((old_flags & MSG_LOCKED) && !(new_flags & MSG_LOCKED)) {
+ item->locked_msgs--;
+ }
+
+ if ((old_flags & MSG_IGNORE_THREAD) && !(new_flags & MSG_IGNORE_THREAD)) {
+ item->ignored_msgs--;
+ }
+
+ if (!(old_flags & MSG_IGNORE_THREAD) && (new_flags & MSG_IGNORE_THREAD)) {
+ item->ignored_msgs++;
+ }
+
+ if ((old_flags & MSG_WATCH_THREAD) && !(new_flags & MSG_WATCH_THREAD)) {
+ item->watched_msgs--;
+ }
+
+ if (!(old_flags & MSG_WATCH_THREAD) && (new_flags & MSG_WATCH_THREAD)) {
+ item->watched_msgs++;
+ }
}
void procmsg_msginfo_set_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmpFlags tmp_flags)
MsgPermFlags perm_flags_new, perm_flags_old;
MsgTmpFlags tmp_flags_old;
- g_return_if_fail(msginfo != NULL);
+ cm_return_if_fail(msginfo != NULL);
item = msginfo->folder;
- g_return_if_fail(item != NULL);
+ cm_return_if_fail(item != NULL);
debug_print("Setting flags for message %d in folder %s\n", msginfo->msgnum, item->path);
folder_item_change_msg_flags(msginfo->folder, msginfo, perm_flags_new);
update_folder_msg_counts(item, msginfo, perm_flags_old);
-
+ summary_update_unread(mainwindow_get_mainwindow()->summaryview, NULL);
}
/* Tmp flags handling */
MsgPermFlags perm_flags_new, perm_flags_old;
MsgTmpFlags tmp_flags_old;
- g_return_if_fail(msginfo != NULL);
+ cm_return_if_fail(msginfo != NULL);
item = msginfo->folder;
- g_return_if_fail(item != NULL);
+ cm_return_if_fail(item != NULL);
debug_print("Unsetting flags for message %d in folder %s\n", msginfo->msgnum, item->path);
MsgPermFlags perm_flags_new, perm_flags_old;
MsgTmpFlags tmp_flags_old;
- g_return_if_fail(msginfo != NULL);
+ cm_return_if_fail(msginfo != NULL);
item = msginfo->folder;
- g_return_if_fail(item != NULL);
+ cm_return_if_fail(item != NULL);
debug_print("Changing flags for message %d in folder %s\n", msginfo->msgnum, item->path);
{
MsgInfo *tmp;
- g_return_val_if_fail(info != NULL, FALSE);
+ cm_return_val_if_fail(info != NULL, FALSE);
if (info != NULL && info->folder != NULL && info->inreplyto != NULL) {
tmp = folder_item_get_msginfo_by_msgid(info->folder,
{
GSList *cur;
- g_return_val_if_fail(info!=NULL, children);
+ cm_return_val_if_fail(info!=NULL, children);
if (info->msgid == NULL)
return children;
GSList *children;
GSList *all, *cur;
- g_return_val_if_fail(info!=NULL, NULL);
+ cm_return_val_if_fail(info!=NULL, NULL);
all = folder_item_get_msg_list(info->folder);
children = procmsg_find_children_func(info, NULL, all);
if (children != NULL) {
gint total = 0, curnum = 0;
MailFilteringData mail_filtering_data;
- g_return_if_fail(filtered != NULL);
- g_return_if_fail(unfiltered != NULL);
+ cm_return_if_fail(filtered != NULL);
+ cm_return_if_fail(unfiltered != NULL);
*filtered = NULL;
*unfiltered = NULL;
gboolean *result = (gboolean *)data;
if (*result == TRUE)
return;
- if (folder_has_parent_of_type(item, F_QUEUE) && item->total_msgs > 0)
- *result = TRUE;
+ if (folder_has_parent_of_type(item, F_QUEUE)) {
+ if (item->total_msgs == 0)
+ return;
+ else {
+ GSList *msglist = folder_item_get_msg_list(item);
+ GSList *cur;
+ for (cur = msglist; cur; cur = cur->next) {
+ MsgInfo *msginfo = (MsgInfo *)cur->data;
+ if (!MSG_IS_DELETED(msginfo->flags) &&
+ !MSG_IS_LOCKED(msginfo->flags)) {
+ *result = TRUE;
+ break;
+ }
+ }
+ procmsg_msg_list_free(msglist);
+ }
+ }
}
gboolean procmsg_have_queued_mails_fast (void)