#include "summaryview.h"
#include "log.h"
#include "timing.h"
+#include "inc.h"
-static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr);
+static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr,
+ FolderItem *queue, gint msgnum);
enum
{
{
GNode *root, *parent, *node, *next;
GHashTable *msgid_table;
- GRelation *subject_relation;
+ GRelation *subject_relation = NULL;
MsgInfo *msginfo;
const gchar *msgid;
GSList *reflist;
START_TIMING("procmsg_get_thread_tree");
root = g_node_new(NULL);
msgid_table = g_hash_table_new(g_str_hash, g_str_equal);
- subject_relation = g_relation_new(2);
- g_relation_index(subject_relation, 0, 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);
+ }
for (; mlist != NULL; mlist = mlist->next) {
msginfo = (MsgInfo *)mlist->data;
END_TIMING();
}
- g_relation_destroy(subject_relation);
+ if (prefs_common.thread_by_subject)
+ g_relation_destroy(subject_relation);
+
g_hash_table_destroy(msgid_table);
END_TIMING();
return root;
return TRUE;
}
+static gboolean send_queue_lock = FALSE;
/*!
*\brief Send messages in queue
*
GSList *list, *elem;
GSList *sorted_list = NULL;
GNode *node, *next;
- static gboolean send_queue_lock = FALSE;
if (send_queue_lock) {
log_error(_("Already trying to send\n"));
if (*errstr) g_free(*errstr);
*errstr = g_strdup_printf(_("Already trying to send."));
}
+ toolbar_main_set_sensitive(mainwindow_get_mainwindow());
return -1;
}
send_queue_lock = TRUE;
+ inc_lock();
if (!queue)
queue = folder_get_default_queue();
- g_return_val_if_fail(queue != NULL, -1);
+
+ if (queue == NULL) {
+ send_queue_lock = FALSE;
+ inc_unlock();
+ return -1;
+ }
+
+ toolbar_main_set_sensitive(mainwindow_get_mainwindow());
folder_item_scan(queue);
list = folder_item_get_msg_list(queue);
if (file) {
if (procmsg_send_message_queue_full(file,
!procmsg_is_last_for_account(queue, msginfo, elem),
- errstr) < 0) {
+ errstr, queue, msginfo->msgnum) < 0) {
g_warning("Sending queued message %d failed.\n",
msginfo->msgnum);
err++;
}
}
send_queue_lock = FALSE;
+ inc_unlock();
+ toolbar_main_set_sensitive(mainwindow_get_mainwindow());
+
return (err != 0 ? -err : sent);
}
+gboolean procmsg_is_sending(void)
+{
+ return send_queue_lock;
+}
+
/*!
*\brief Determine if a queue folder is empty
*
g_warning("can't save message\n");
return -1;
}
- return 0;
}
msginfo = folder_item_get_msginfo(outbox, num); /* refcnt++ */
tmp_msginfo = procmsg_msginfo_get_full_info(msginfo); /* refcnt++ */
procmsg_msginfo_unset_flags(msginfo, ~0, 0);
procmsg_msginfo_free(msginfo); /* refcnt-- */
/* tmp_msginfo == msginfo */
- if (tmp_msginfo && (msginfo->dispositionnotificationto ||
- msginfo->returnreceiptto)) {
+ if (tmp_msginfo && msginfo->extradata &&
+ (msginfo->extradata->dispositionnotificationto ||
+ msginfo->extradata->returnreceiptto)) {
procmsg_msginfo_set_flags(msginfo, MSG_RETRCPT_SENT, 0);
- procmsg_msginfo_free(msginfo); /* refcnt-- */
}
+ procmsg_msginfo_free(tmp_msginfo); /* refcnt-- */
}
return 0;
MEMBCOPY(folder);
MEMBCOPY(to_folder);
- MEMBDUP(face);
- MEMBDUP(xface);
- MEMBDUP(dispositionnotificationto);
- MEMBDUP(returnreceiptto);
+ if (msginfo->extradata) {
+ newmsginfo->extradata = g_new0(MsgInfoExtraData, 1);
+ MEMBDUP(extradata->face);
+ MEMBDUP(extradata->xface);
+ MEMBDUP(extradata->dispositionnotificationto);
+ MEMBDUP(extradata->returnreceiptto);
+ MEMBDUP(extradata->partial_recv);
+ MEMBDUP(extradata->account_server);
+ MEMBDUP(extradata->account_login);
+ MEMBDUP(extradata->list_post);
+ MEMBDUP(extradata->list_subscribe);
+ MEMBDUP(extradata->list_unsubscribe);
+ MEMBDUP(extradata->list_help);
+ MEMBDUP(extradata->list_archive);
+ MEMBDUP(extradata->list_owner);
+ }
refs = msginfo->references;
for (refs = msginfo->references; refs != NULL; refs = refs->next) {
g_free(file);
if (!full_msginfo) return NULL;
- /* CLAWS: make sure we add the missing members; see:
- * procheader.c::procheader_get_headernames() */
- if (!msginfo->list_post)
- msginfo->list_post = g_strdup(full_msginfo->list_post);
- if (!msginfo->list_subscribe)
- msginfo->list_subscribe = g_strdup(full_msginfo->list_subscribe);
- if (!msginfo->list_unsubscribe)
- msginfo->list_unsubscribe = g_strdup(full_msginfo->list_unsubscribe);
- if (!msginfo->list_help)
- msginfo->list_help = g_strdup(full_msginfo->list_help);
- if (!msginfo->list_archive)
- msginfo->list_archive= g_strdup(full_msginfo->list_archive);
- if (!msginfo->list_owner)
- msginfo->list_owner = g_strdup(full_msginfo->list_owner);
- if (!msginfo->xface)
- msginfo->xface = g_strdup(full_msginfo->xface);
- if (!msginfo->face)
- msginfo->face = g_strdup(full_msginfo->face);
- if (!msginfo->dispositionnotificationto)
- msginfo->dispositionnotificationto =
- g_strdup(full_msginfo->dispositionnotificationto);
- if (!msginfo->returnreceiptto)
- msginfo->returnreceiptto = g_strdup
- (full_msginfo->returnreceiptto);
- if (!msginfo->partial_recv && full_msginfo->partial_recv)
- msginfo->partial_recv = g_strdup
- (full_msginfo->partial_recv);
msginfo->total_size = full_msginfo->total_size;
- if (!msginfo->account_server && full_msginfo->account_server)
- msginfo->account_server = g_strdup
- (full_msginfo->account_server);
- if (!msginfo->account_login && full_msginfo->account_login)
- msginfo->account_login = g_strdup
- (full_msginfo->account_login);
msginfo->planned_download = full_msginfo->planned_download;
+
+ if (full_msginfo->extradata) {
+ if (!msginfo->extradata)
+ msginfo->extradata = g_new0(MsgInfoExtraData, 1);
+ if (!msginfo->extradata->list_post)
+ msginfo->extradata->list_post = g_strdup(full_msginfo->extradata->list_post);
+ if (!msginfo->extradata->list_subscribe)
+ msginfo->extradata->list_subscribe = g_strdup(full_msginfo->extradata->list_subscribe);
+ if (!msginfo->extradata->list_unsubscribe)
+ msginfo->extradata->list_unsubscribe = g_strdup(full_msginfo->extradata->list_unsubscribe);
+ if (!msginfo->extradata->list_help)
+ msginfo->extradata->list_help = g_strdup(full_msginfo->extradata->list_help);
+ if (!msginfo->extradata->list_archive)
+ msginfo->extradata->list_archive= g_strdup(full_msginfo->extradata->list_archive);
+ if (!msginfo->extradata->list_owner)
+ msginfo->extradata->list_owner = g_strdup(full_msginfo->extradata->list_owner);
+ if (!msginfo->extradata->xface)
+ msginfo->extradata->xface = g_strdup(full_msginfo->extradata->xface);
+ if (!msginfo->extradata->face)
+ msginfo->extradata->face = g_strdup(full_msginfo->extradata->face);
+ if (!msginfo->extradata->dispositionnotificationto)
+ msginfo->extradata->dispositionnotificationto =
+ g_strdup(full_msginfo->extradata->dispositionnotificationto);
+ if (!msginfo->extradata->returnreceiptto)
+ msginfo->extradata->returnreceiptto = g_strdup
+ (full_msginfo->extradata->returnreceiptto);
+ if (!msginfo->extradata->partial_recv && full_msginfo->extradata->partial_recv)
+ msginfo->extradata->partial_recv = g_strdup
+ (full_msginfo->extradata->partial_recv);
+ if (!msginfo->extradata->account_server && full_msginfo->extradata->account_server)
+ msginfo->extradata->account_server = g_strdup
+ (full_msginfo->extradata->account_server);
+ if (!msginfo->extradata->account_login && full_msginfo->extradata->account_login)
+ msginfo->extradata->account_login = g_strdup
+ (full_msginfo->extradata->account_login);
+ }
procmsg_msginfo_free(full_msginfo);
return procmsg_msginfo_new_ref(msginfo);
}
g_free(msginfo->fromspace);
- g_free(msginfo->returnreceiptto);
- g_free(msginfo->dispositionnotificationto);
- g_free(msginfo->xface);
- g_free(msginfo->face);
g_free(msginfo->fromname);
g_free(msginfo->inreplyto);
g_free(msginfo->xref);
- g_free(msginfo->list_post);
- g_free(msginfo->list_subscribe);
- g_free(msginfo->list_unsubscribe);
- g_free(msginfo->list_help);
- g_free(msginfo->list_archive);
- g_free(msginfo->list_owner);
-
- g_free(msginfo->partial_recv);
- g_free(msginfo->account_server);
- g_free(msginfo->account_login);
-
+ if (msginfo->extradata) {
+ g_free(msginfo->extradata->returnreceiptto);
+ g_free(msginfo->extradata->dispositionnotificationto);
+ g_free(msginfo->extradata->xface);
+ g_free(msginfo->extradata->face);
+ g_free(msginfo->extradata->list_post);
+ g_free(msginfo->extradata->list_subscribe);
+ g_free(msginfo->extradata->list_unsubscribe);
+ g_free(msginfo->extradata->list_help);
+ g_free(msginfo->extradata->list_archive);
+ g_free(msginfo->extradata->list_owner);
+ g_free(msginfo->extradata->partial_recv);
+ g_free(msginfo->extradata->account_server);
+ g_free(msginfo->extradata->account_login);
+ g_free(msginfo->extradata);
+ }
slist_free_strings(msginfo->references);
g_slist_free(msginfo->references);
memusage += strlen(msginfo->msgid);
if (msginfo->inreplyto)
memusage += strlen(msginfo->inreplyto);
- if (msginfo->xface)
- memusage += strlen(msginfo->xface);
- if (msginfo->face)
- memusage += strlen(msginfo->face);
- if (msginfo->dispositionnotificationto)
- memusage += strlen(msginfo->dispositionnotificationto);
- if (msginfo->returnreceiptto)
- memusage += strlen(msginfo->returnreceiptto);
for (refs = msginfo->references; refs; refs=refs->next) {
gchar *r = (gchar *)refs->data;
memusage += r?strlen(r):0;
if (msginfo->fromspace)
memusage += strlen(msginfo->fromspace);
+ if (msginfo->extradata) {
+ memusage += sizeof(MsgInfoExtraData);
+ if (msginfo->extradata->xface)
+ memusage += strlen(msginfo->extradata->xface);
+ if (msginfo->extradata->face)
+ memusage += strlen(msginfo->extradata->face);
+ if (msginfo->extradata->dispositionnotificationto)
+ memusage += strlen(msginfo->extradata->dispositionnotificationto);
+ if (msginfo->extradata->returnreceiptto)
+ memusage += strlen(msginfo->extradata->returnreceiptto);
+
+ if (msginfo->extradata->partial_recv)
+ memusage += strlen(msginfo->extradata->partial_recv);
+ if (msginfo->extradata->account_server)
+ memusage += strlen(msginfo->extradata->account_server);
+ if (msginfo->extradata->account_login)
+ memusage += strlen(msginfo->extradata->account_login);
+
+ if (msginfo->extradata->list_post)
+ memusage += strlen(msginfo->extradata->list_post);
+ if (msginfo->extradata->list_subscribe)
+ memusage += strlen(msginfo->extradata->list_subscribe);
+ if (msginfo->extradata->list_unsubscribe)
+ memusage += strlen(msginfo->extradata->list_unsubscribe);
+ if (msginfo->extradata->list_help)
+ memusage += strlen(msginfo->extradata->list_help);
+ if (msginfo->extradata->list_archive)
+ memusage += strlen(msginfo->extradata->list_archive);
+ if (msginfo->extradata->list_owner)
+ memusage += strlen(msginfo->extradata->list_owner);
+ }
return memusage;
}
return msginfo1->msgnum - msginfo2->msgnum;
}
-static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr)
+static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr,
+ FolderItem *queue, gint msgnum)
{
static HeaderEntry qentry[] = {{"S:", NULL, FALSE},
{"SSV:", NULL, FALSE},
outbox = folder_get_default_outbox();
if (save_clear_text || tmp_enc_file == NULL) {
- procmsg_save_to_outbox(outbox, file, TRUE);
+ gboolean saved = FALSE;
+ if (queue && msgnum > 0) {
+ MsgInfo *queued_mail = folder_item_get_msginfo(queue, msgnum);
+ if (folder_item_copy_msg(outbox, queued_mail) >= 0)
+ saved = TRUE;
+ procmsg_msginfo_free(queued_mail);
+ }
+ if (!saved)
+ procmsg_save_to_outbox(outbox, file, TRUE);
} else {
procmsg_save_to_outbox(outbox, tmp_enc_file, FALSE);
}
return (newsval != 0 ? newsval : mailval);
}
-gint procmsg_send_message_queue(const gchar *file, gchar **errstr)
+gint procmsg_send_message_queue(const gchar *file, gchar **errstr, FolderItem *queue, gint msgnum)
{
- return procmsg_send_message_queue_full(file, FALSE, errstr);
+ gint result = procmsg_send_message_queue_full(file, FALSE, errstr, queue, msgnum);
+ toolbar_main_set_sensitive(mainwindow_get_mainwindow());
+ return result;
}
static void update_folder_msg_counts(FolderItem *item, MsgInfo *msginfo, MsgPermFlags old_flags)
* \return TRUE if the message was moved and MsgInfo is now invalid,
* FALSE otherwise
*/
-gboolean procmsg_msginfo_filter(MsgInfo *msginfo)
+gboolean procmsg_msginfo_filter(MsgInfo *msginfo, PrefsAccount* ac_prefs)
{
MailFilteringData mail_filtering_data;
/* filter if enabled in prefs or move to inbox if not */
if((filtering_rules != NULL) &&
- filter_message_by_msginfo(filtering_rules, msginfo)) {
+ filter_message_by_msginfo(filtering_rules, msginfo, ac_prefs)) {
return TRUE;
}
FolderItem *item = spam_folder_item ? folder_find_item_from_identifier(spam_folder_item) : NULL;
return item ? item : folder_get_default_trash();
}
+
+static void item_has_queued_mails(FolderItem *item, gpointer data)
+{
+ gboolean *result = (gboolean *)data;
+ if (*result == TRUE)
+ return;
+ if (folder_has_parent_of_type(item, F_QUEUE) && item->total_msgs > 0)
+ *result = TRUE;
+}
+
+gboolean procmsg_have_queued_mails_fast (void)
+{
+ gboolean result = FALSE;
+ folder_func_to_all_folders(item_has_queued_mails, &result);
+ return result;
+}