/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2008 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_avatar(MsgInfo *msginfo, gint type)
+{
+ GSList *mia;
+
+ if (!msginfo || !msginfo->extradata || !msginfo->extradata->avatars)
+ return NULL;
+
+ for (mia = msginfo->extradata->avatars; mia; mia = mia->next) {
+ MsgInfoAvatar *avatar = (MsgInfoAvatar *)mia->data;
+ if (avatar->avatar_id == type)
+ return avatar->avatar_src;
+ }
+
+ return NULL;
+}
+
+void procmsg_msginfo_add_avatar(MsgInfo *msginfo, gint type, const gchar *data)
+{
+ MsgInfoAvatar *av;
+
+ if (!msginfo->extradata)
+ msginfo->extradata = g_new0(MsgInfoExtraData, 1);
+
+ av = g_new0(MsgInfoAvatar, 1);
+ av->avatar_id = type;
+ av->avatar_src = g_strdup(data);
+
+ msginfo->extradata->avatars = g_slist_append(msginfo->extradata->avatars, av);
+}
+
+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;
cur = cur->next;
}
- if (orig || g_slist_length(orig)) {
+ if (orig && g_slist_length(orig)) {
if (!last_account && nothing_to_sort) {
/* can't find an account for the rest of the list */
cur = orig;
{
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);
break;
}
}
- while (fgets(buf, sizeof(buf), fp) != NULL)
- fputs(buf, outfp);
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
+ if (fputs(buf, outfp) == EOF) {
+ FILE_OP_ERROR(out, "fputs");
+ fclose(outfp);
+ fclose(fp);
+ return -1;
+ }
+ }
fclose(outfp);
fclose(fp);
return 0;
}
-static gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
+gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
gboolean is_queued)
{
gint num;
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) {
return 0;
}
-void procmsg_print_message(MsgInfo *msginfo, const gchar *cmdline)
-{
- static const gchar *def_cmd = "lpr %s";
- static guint id = 0;
- gchar *prtmp;
- FILE *tmpfp, *prfp;
- gchar buf[1024];
- gchar *p;
- int r;
- g_return_if_fail(msginfo);
-
- if (procmime_msginfo_is_encrypted(msginfo))
- tmpfp = procmime_get_first_encrypted_text_content(msginfo);
- else
- tmpfp = procmime_get_first_text_content(msginfo);
- if (tmpfp == NULL) {
- g_warning("Can't get text part\n");
- return;
- }
-
- prtmp = g_strdup_printf("%s%cprinttmp.%08x",
- get_mime_tmp_dir(), G_DIR_SEPARATOR, id++);
-
- if ((prfp = g_fopen(prtmp, "wb")) == NULL) {
- FILE_OP_ERROR(prtmp, "fopen");
- g_free(prtmp);
- fclose(tmpfp);
- 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);
-
- while (fgets(buf, sizeof(buf), tmpfp) != NULL)
- r = fputs(buf, prfp);
-
- fclose(prfp);
- fclose(tmpfp);
-
- if (cmdline && (p = strchr(cmdline, '%')) && *(p + 1) == 's' &&
- !strchr(p + 2, '%'))
- g_snprintf(buf, sizeof(buf) - 1, cmdline, prtmp);
- else {
- if (cmdline)
- 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);
-}
MsgInfo *procmsg_msginfo_new_ref(MsgInfo *msginfo)
{
return newmsginfo;
}
+static MsgInfoAvatar *procmsg_msginfoavatar_copy(MsgInfoAvatar *avatar)
+{
+ MsgInfoAvatar *newavatar;
+
+ if (avatar == NULL) return NULL;
+
+ newavatar = g_new0(MsgInfoAvatar, 1);
+ newavatar->avatar_id = avatar->avatar_id;
+ newavatar->avatar_src = g_strdup(avatar->avatar_src);
+
+ return newavatar;
+}
+
+static void procmsg_msginfoavatar_free(MsgInfoAvatar *avatar)
+{
+ if (avatar != NULL) {
+ if (avatar->avatar_src != NULL)
+ g_free(avatar->avatar_src);
+ g_free(avatar);
+ }
+}
+
MsgInfo *procmsg_msginfo_copy(MsgInfo *msginfo)
{
MsgInfo *newmsginfo;
if (msginfo->extradata) {
newmsginfo->extradata = g_new0(MsgInfoExtraData, 1);
- MEMBDUP(extradata->face);
- MEMBDUP(extradata->xface);
+ if (msginfo->extradata->avatars) {
+ newmsginfo->extradata->avatars = slist_copy_deep(msginfo->extradata->avatars,
+ (GCopyFunc) procmsg_msginfoavatar_copy);
+ }
MEMBDUP(extradata->dispositionnotificationto);
MEMBDUP(extradata->returnreceiptto);
MEMBDUP(extradata->partial_recv);
MEMBDUP(extradata->list_help);
MEMBDUP(extradata->list_archive);
MEMBDUP(extradata->list_owner);
+ MEMBDUP(extradata->resent_from);
}
refs = msginfo->references;
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->avatars)
+ msginfo->extradata->avatars = slist_copy_deep(full_msginfo->extradata->avatars,
+ (GCopyFunc) procmsg_msginfoavatar_copy);
if (!msginfo->extradata->dispositionnotificationto)
msginfo->extradata->dispositionnotificationto =
g_strdup(full_msginfo->extradata->dispositionnotificationto);
if (!msginfo->extradata->account_login && full_msginfo->extradata->account_login)
msginfo->extradata->account_login = g_strdup
(full_msginfo->extradata->account_login);
+ if (!msginfo->extradata->resent_from && full_msginfo->extradata->resent_from)
+ msginfo->extradata->resent_from = g_strdup
+ (full_msginfo->extradata->resent_from);
}
procmsg_msginfo_free(full_msginfo);
g_free(msginfo->xref);
if (msginfo->extradata) {
+ if (msginfo->extradata->avatars) {
+ g_slist_foreach(msginfo->extradata->avatars,
+ (GFunc)procmsg_msginfoavatar_free,
+ NULL);
+ g_slist_free(msginfo->extradata->avatars);
+ }
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->partial_recv);
g_free(msginfo->extradata->account_server);
g_free(msginfo->extradata->account_login);
+ g_free(msginfo->extradata->resent_from);
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);
}
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->avatars) {
+ for (tmp = msginfo->extradata->avatars; tmp; tmp = tmp->next) {
+ MsgInfoAvatar *avt = (MsgInfoAvatar *)tmp->data;
+ memusage += (avt->avatar_src)? strlen(avt->avatar_src): 0;
+ memusage += sizeof(MsgInfoAvatar) + sizeof(GSList);
+ }
+ }
if (msginfo->extradata->dispositionnotificationto)
memusage += strlen(msginfo->extradata->dispositionnotificationto);
if (msginfo->extradata->returnreceiptto)
memusage += strlen(msginfo->extradata->account_server);
if (msginfo->extradata->account_login)
memusage += strlen(msginfo->extradata->account_login);
+ if (msginfo->extradata->resent_from)
+ memusage += strlen(msginfo->extradata->resent_from);
if (msginfo->extradata->list_post)
memusage += strlen(msginfo->extradata->list_post);
static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr,
FolderItem *queue, gint msgnum, gboolean *queued_removed)
{
- static HeaderEntry qentry[] = {{"S:", NULL, FALSE},
+ static HeaderEntry qentry[] = {
+ {"S:", NULL, FALSE}, /* 0 */
{"SSV:", NULL, FALSE},
{"R:", NULL, FALSE},
{"NG:", NULL, FALSE},
{"MAID:", NULL, FALSE},
- {"NAID:", NULL, FALSE},
+ {"NAID:", NULL, FALSE}, /* 5 */
{"SCF:", NULL, FALSE},
{"RMID:", NULL, FALSE},
{"FMID:", NULL, FALSE},
{"X-Claws-Privacy-System:", NULL, FALSE},
- {"X-Claws-Encrypt:", NULL, FALSE},
+ {"X-Claws-Encrypt:", NULL, FALSE}, /* 10 */
{"X-Claws-Encrypt-Data:", NULL, FALSE},
{"X-Claws-End-Special-Headers:", NULL, FALSE},
{"X-Sylpheed-Privacy-System:", NULL, FALSE},
{"X-Sylpheed-Encrypt:", NULL, FALSE},
- {"X-Sylpheed-Encrypt-Data:", NULL, FALSE},
+ {"X-Sylpheed-Encrypt-Data:", NULL, FALSE}, /* 15 */
{"X-Sylpheed-End-Special-Headers:", NULL, FALSE},
{NULL, NULL, FALSE}};
FILE *fp;
gchar *savecopyfolder = NULL;
gchar *replymessageid = NULL;
gchar *fwdmessageid = NULL;
- gchar *privacy_system = NULL;
- gboolean encrypt = FALSE;
- gchar *encrypt_data = NULL;
gchar buf[BUFFSIZE];
gint hnum;
PrefsAccount *mailac = NULL, *newsac = NULL;
- gboolean save_clear_text = TRUE;
- gchar *tmp_enc_file = NULL;
-
- int local = 0;
+ gboolean encrypt = FALSE;
+ FolderItem *outbox;
- 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");
if (fwdmessageid == NULL)
fwdmessageid = g_strdup(p);
break;
- case Q_PRIVACY_SYSTEM:
- case Q_PRIVACY_SYSTEM_OLD:
- if (privacy_system == NULL)
- privacy_system = g_strdup(p);
- break;
case Q_ENCRYPT:
case Q_ENCRYPT_OLD:
if (p[0] == '1')
encrypt = TRUE;
break;
- case Q_ENCRYPT_DATA:
- case Q_ENCRYPT_DATA_OLD:
- if (encrypt_data == NULL)
- encrypt_data = g_strdup(p);
- break;
case Q_CLAWS_HDRS:
case Q_CLAWS_HDRS_OLD:
/* end of special headers reached */
}
send_mail:
filepos = ftell(fp);
-
- if (encrypt) {
- MimeInfo *mimeinfo;
-
- if (mailac && mailac->save_encrypted_as_clear_text
- && !mailac->encrypt_to_self)
- save_clear_text = TRUE;
- else
- save_clear_text = FALSE;
-
- fclose(fp);
- fp = NULL;
-
- mimeinfo = procmime_scan_queue_file(file);
- if (!privacy_encrypt(privacy_system, mimeinfo, encrypt_data)
- || (fp = my_tmpfile()) == NULL
- || procmime_write_mimeinfo(mimeinfo, fp) < 0) {
- if (fp)
- fclose(fp);
- 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);
- g_free(savecopyfolder);
- g_free(replymessageid);
- g_free(fwdmessageid);
- g_free(privacy_system);
- g_free(encrypt_data);
- if (errstr) {
- if (*errstr) g_free(*errstr);
- *errstr = g_strdup_printf(_("Couldn't encrypt the email: %s"),
- privacy_get_error());
- }
- return -1;
+ if (filepos < 0) {
+ FILE_OP_ERROR(file, "ftell");
+ if (errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("Couldn't open file %s."), file);
}
-
- rewind(fp);
- if (!save_clear_text) {
- gchar *content = NULL;
- FILE *tmpfp = get_tmpfile_in_dir(get_mime_tmp_dir(), &tmp_enc_file);
- if (tmpfp) {
- fclose(tmpfp);
-
- content = file_read_stream_to_str(fp);
- rewind(fp);
-
- str_write_to_file(content, tmp_enc_file);
- g_free(content);
- } else {
- g_warning("couldn't get tempfile\n");
- }
- }
-
- procmime_mimeinfo_free_all(mimeinfo);
-
- filepos = 0;
- }
+ return -1;
+ }
if (to_list) {
debug_print("Sending message by mail\n");
} 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 (fseek(fp, filepos, SEEK_SET) < 0) {
+ FILE_OP_ERROR(file, "fseek");
+ mailval = -1;
+ }
+
+ if (newsgroup_list && newsac && (mailval == 0)) {
Folder *folder;
gchar *tmp = NULL;
FILE *tmpfp;
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;
-
debug_print("saving sent message...\n");
- outbox = folder_find_item_from_identifier(savecopyfolder);
- if (!outbox)
- outbox = folder_get_default_outbox();
-
- if (save_clear_text || tmp_enc_file == NULL) {
+ if (!encrypt || !mailac->save_encrypted_as_clear_text) {
+ outbox = folder_find_item_from_identifier(savecopyfolder);
+ if (!outbox)
+ outbox = folder_get_default_outbox();
+
+ /* Mail was not saved to outbox before encrypting, save it now. */
gboolean saved = FALSE;
*queued_removed = FALSE;
if (queue && msgnum > 0) {
procmsg_msginfo_free(queued_mail);
}
if (!saved) {
- debug_print("resaving clear text queued mail to sent folder\n");
+ debug_print("resaving queued mail to sent folder\n");
procmsg_save_to_outbox(outbox, file, TRUE);
}
- } else {
- debug_print("saving encrpyted queued mail to sent folder\n");
- procmsg_save_to_outbox(outbox, tmp_enc_file, FALSE);
}
}
- if (tmp_enc_file != NULL) {
- claws_unlink(tmp_enc_file);
- free(tmp_enc_file);
- tmp_enc_file = NULL;
- }
-
if (replymessageid != NULL || fwdmessageid != NULL) {
gchar **tokens;
FolderItem *item;
}
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);
- g_free(privacy_system);
- g_free(encrypt_data);
return (newsval != 0 ? newsval : mailval);
}
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;
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);
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)