[balsa] Uncrustify libbalsa/send.c
- From: Peter Bloomfield <peterb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa] Uncrustify libbalsa/send.c
- Date: Wed, 8 Feb 2017 15:03:30 +0000 (UTC)
commit 374f6ab2e6feadcc3f05ee0397916ffb94dc27c7
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date: Wed Feb 8 10:01:34 2017 -0500
Uncrustify libbalsa/send.c
* libbalsa/send.c: uncrustify the whole file, and clean up some other
cosmetic coding issues.
libbalsa/send.c | 1979 +++++++++++++++++++++++++++++--------------------------
1 files changed, 1062 insertions(+), 917 deletions(-)
---
diff --git a/libbalsa/send.c b/libbalsa/send.c
index b7322f4..d579c70 100644
--- a/libbalsa/send.c
+++ b/libbalsa/send.c
@@ -6,20 +6,20 @@
*
* 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, or (at your option)
+ * the Free Software Foundation; either version 2, or (at your option)
* any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* 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, see <http://www.gnu.org/licenses/>.
*/
#if defined(HAVE_CONFIG_H) && HAVE_CONFIG_H
-# include "config.h"
+# include "config.h"
#endif /* HAVE_CONFIG_H */
#define _DEFAULT_SOURCE 1
@@ -66,7 +66,7 @@ struct _SendMessageInfo {
LibBalsaMailbox *outbox;
NetClientSmtp *session;
gchar *mta_name;
- GList *items; /* of MessageQueueItem */
+ GList *items; /* of MessageQueueItem */
gboolean debug;
};
@@ -76,25 +76,32 @@ static int sending_threads = 0; /* how many sending threads are active? */
gboolean
libbalsa_is_sending_mail(void)
{
- return sending_threads>0;
+ return sending_threads > 0;
}
+
/* libbalsa_wait_for_sending_thread:
wait for the sending thread but not longer than max_time seconds.
-1 means wait indefinetely (almost).
-*/
+ */
void
libbalsa_wait_for_sending_thread(gint max_time)
{
gint sleep_time = 0;
-#define DOZE_LENGTH (20*1000)
- static const struct timespec req = { 0, DOZE_LENGTH*1000 };/*nanoseconds*/
+#define DOZE_LENGTH (20 * 1000)
+ static const struct timespec req = {
+ 0, DOZE_LENGTH * 1000
+ }; /*nanoseconds*/
- if(max_time<0) max_time = G_MAXINT;
- else max_time *= 1000000; /* convert to microseconds */
- while(sending_threads>0 && sleep_time<max_time) {
- while(gtk_events_pending())
+ if (max_time < 0) {
+ max_time = G_MAXINT;
+ } else {
+ max_time *= 1000000; /* convert to microseconds */
+ }
+ while (sending_threads > 0 && sleep_time < max_time) {
+ while (gtk_events_pending()) {
gtk_main_iteration_do(FALSE);
+ }
nanosleep(&req, NULL);
sleep_time += DOZE_LENGTH;
}
@@ -111,23 +118,27 @@ msg_queue_item_new(LibBalsaFccboxFinder finder)
return mqi;
}
+
static void
msg_queue_item_destroy(MessageQueueItem *mqi)
{
- if (mqi->smtp_msg != NULL) {
- net_client_smtp_msg_free(mqi->smtp_msg);
- }
+ if (mqi->smtp_msg != NULL) {
+ net_client_smtp_msg_free(mqi->smtp_msg);
+ }
if (mqi->stream != NULL) {
- g_object_unref(G_OBJECT(mqi->stream));
- }
+ g_object_unref(G_OBJECT(mqi->stream));
+ }
if (mqi->orig != NULL) {
- g_object_unref(G_OBJECT(mqi->orig));
- }
+ g_object_unref(G_OBJECT(mqi->orig));
+ }
g_free(mqi);
}
+
static SendMessageInfo *
-send_message_info_new(LibBalsaMailbox *outbox, NetClientSmtp *session, const gchar *name)
+send_message_info_new(LibBalsaMailbox *outbox,
+ NetClientSmtp *session,
+ const gchar *name)
{
SendMessageInfo *smi;
@@ -138,70 +149,81 @@ send_message_info_new(LibBalsaMailbox *outbox, NetClientSmtp *session, const gch
return smi;
}
+
static void
send_message_info_destroy(SendMessageInfo *smi)
{
- if (smi->session != NULL) {
- g_object_unref(G_OBJECT(smi->session));
- }
- if (smi->items != NULL) {
- g_list_free(smi->items);
- }
- g_free(smi->mta_name);
+ if (smi->session != NULL) {
+ g_object_unref(G_OBJECT(smi->session));
+ }
+ if (smi->items != NULL) {
+ g_list_free(smi->items);
+ }
+ g_free(smi->mta_name);
g_free(smi);
}
#if HAVE_GPGME
-static LibBalsaMsgCreateResult
-libbalsa_create_rfc2440_buffer(LibBalsaMessage *message, GMimePart *mime_part,
- GtkWindow * parent, GError ** error);
-static LibBalsaMsgCreateResult
-do_multipart_crypto(LibBalsaMessage * message, GMimeObject ** mime_root,
- GtkWindow * parent, GError ** error);
+static LibBalsaMsgCreateResult libbalsa_create_rfc2440_buffer(LibBalsaMessage *message,
+ GMimePart *mime_part,
+ GtkWindow *parent,
+ GError **error);
+static LibBalsaMsgCreateResult do_multipart_crypto(LibBalsaMessage *message,
+ GMimeObject **mime_root,
+ GtkWindow *parent,
+ GError **error);
+
#endif
-static gboolean balsa_send_message_real(SendMessageInfo* info);
-static LibBalsaMsgCreateResult
-libbalsa_message_create_mime_message(LibBalsaMessage* message,
- gboolean flow, gboolean postponing,
- GError ** error);
-static LibBalsaMsgCreateResult libbalsa_create_msg(LibBalsaMessage * message,
- gboolean flow, GError ** error);
-static LibBalsaMsgCreateResult
-libbalsa_fill_msg_queue_item_from_queu(LibBalsaMessage * message,
- MessageQueueItem *mqi);
+static gboolean balsa_send_message_real(SendMessageInfo *info);
+static LibBalsaMsgCreateResult libbalsa_message_create_mime_message(LibBalsaMessage *message,
+ gboolean flow,
+ gboolean postponing,
+ GError **error);
+static LibBalsaMsgCreateResult libbalsa_create_msg(LibBalsaMessage *message,
+ gboolean flow,
+ GError **error);
+static LibBalsaMsgCreateResult libbalsa_fill_msg_queue_item_from_queu(LibBalsaMessage *message,
+ MessageQueueItem *mqi);
GtkWidget *send_progress_message = NULL;
GtkWidget *send_dialog = NULL;
GtkWidget *send_dialog_bar = NULL;
static void
-send_dialog_response_cb(GtkWidget* w, gint response)
+send_dialog_response_cb(GtkWidget *w,
+ gint response)
{
- if(response == GTK_RESPONSE_CLOSE)
- gtk_widget_destroy(w);
+ if (response == GTK_RESPONSE_CLOSE) {
+ gtk_widget_destroy(w);
+ }
}
+
static void
-send_dialog_destroy_cb(GtkWidget* w)
+send_dialog_destroy_cb(GtkWidget *w)
{
send_dialog = NULL;
send_progress_message = NULL;
send_dialog_bar = NULL;
}
+
+
/* ensure_send_progress_dialog:
ensures that there is send_dialog available.
-*/
+ */
static void
-ensure_send_progress_dialog(GtkWindow * parent)
+ensure_send_progress_dialog(GtkWindow *parent)
{
- GtkWidget* label;
+ GtkWidget *label;
GtkBox *content_box;
- if(send_dialog) return;
+ if (send_dialog != NULL) {
+ return;
+ }
- send_dialog = gtk_dialog_new_with_buttons(_("Sending Mail…"),
+ send_dialog = gtk_dialog_new_with_buttons(_("Sending Mail…"),
parent,
GTK_DIALOG_DESTROY_WITH_PARENT |
libbalsa_dialog_flags(),
@@ -220,15 +242,17 @@ ensure_send_progress_dialog(GtkWindow * parent)
gtk_box_pack_start(content_box, send_dialog_bar, FALSE, FALSE, 0);
gtk_window_set_default_size(GTK_WINDOW(send_dialog), 250, 100);
gtk_widget_show_all(send_dialog);
- g_signal_connect(G_OBJECT(send_dialog), "response",
- G_CALLBACK(send_dialog_response_cb), NULL);
- g_signal_connect(G_OBJECT(send_dialog), "destroy",
- G_CALLBACK(send_dialog_destroy_cb), NULL);
+ g_signal_connect(G_OBJECT(send_dialog), "response",
+ G_CALLBACK(send_dialog_response_cb), NULL);
+ g_signal_connect(G_OBJECT(send_dialog), "destroy",
+ G_CALLBACK(send_dialog_destroy_cb), NULL);
/* Progress bar done */
}
+
static void
-lbs_set_content(GMimePart * mime_part, gchar * content)
+lbs_set_content(GMimePart *mime_part,
+ gchar *content)
{
GMimeStream *stream;
GMimeDataWrapper *wrapper;
@@ -245,34 +269,38 @@ lbs_set_content(GMimePart * mime_part, gchar * content)
g_object_unref(wrapper);
}
+
#ifdef HAVE_GPGME
static GMimeObject *
-add_mime_body_plain(LibBalsaMessageBody *body, gboolean flow, gboolean postpone,
- guint use_gpg_mode,
- LibBalsaMsgCreateResult * crypt_res, GError ** error)
+add_mime_body_plain(LibBalsaMessageBody *body,
+ gboolean flow,
+ gboolean postpone,
+ guint use_gpg_mode,
+ LibBalsaMsgCreateResult *crypt_res,
+ GError **error)
#else
static GMimeObject *
-add_mime_body_plain(LibBalsaMessageBody *body, gboolean flow, gboolean postpone)
+add_mime_body_plain(LibBalsaMessageBody * body, gboolean flow, gboolean postpone)
#endif
{
GMimePart *mime_part;
- const gchar * charset;
+ const gchar *charset;
#ifdef HAVE_GPGME
- GtkWindow * parent = g_object_get_data(G_OBJECT(body->message), "parent-window");
+ GtkWindow *parent = g_object_get_data(G_OBJECT(body->message), "parent-window");
#endif
g_return_val_if_fail(body, NULL);
-
- charset=body->charset;
- if (body->content_type) {
+ charset = body->charset;
+
+ if (body->content_type != NULL) {
/* Use the suplied mime type */
gchar *type, *subtype;
/* FIXME: test sending with different mime types */
g_message("path active");
type = g_strdup (body->content_type);
- if ((subtype = strchr (type, '/'))) {
+ if ((subtype = strchr (type, '/')) != NULL) {
*subtype++ = 0;
mime_part = g_mime_part_new_with_type(type, subtype);
} else {
@@ -285,43 +313,41 @@ add_mime_body_plain(LibBalsaMessageBody *body, gboolean flow, gboolean postpone)
g_mime_object_set_disposition(GMIME_OBJECT(mime_part), GMIME_DISPOSITION_INLINE);
g_mime_part_set_content_encoding(mime_part, GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE);
- g_mime_object_set_content_type_parameter(GMIME_OBJECT(mime_part),
- "charset",
- charset ? charset :
- "us-ascii");
+ g_mime_object_set_content_type_parameter(GMIME_OBJECT(mime_part), "charset",
+ charset != NULL ? charset : "us-ascii");
if (flow) {
- g_mime_object_set_content_type_parameter(GMIME_OBJECT(mime_part),
- "DelSp", "Yes");
g_mime_object_set_content_type_parameter(GMIME_OBJECT(mime_part),
- "Format", "Flowed");
+ "DelSp", "Yes");
+ g_mime_object_set_content_type_parameter(GMIME_OBJECT(mime_part),
+ "Format", "Flowed");
}
- if (charset &&
- g_ascii_strcasecmp(charset, "UTF-8")!=0 &&
- g_ascii_strcasecmp(charset, "UTF8")!=0)
- {
- GMimeStream *stream, *filter_stream;
- GMimeFilter *filter;
- GMimeDataWrapper *wrapper;
+ if ((charset != NULL) &&
+ (g_ascii_strcasecmp(charset, "UTF-8") != 0) &&
+ (g_ascii_strcasecmp(charset, "UTF8") != 0)) {
+ GMimeStream *stream, *filter_stream;
+ GMimeFilter *filter;
+ GMimeDataWrapper *wrapper;
- stream = g_mime_stream_mem_new();
- filter_stream = g_mime_stream_filter_new(stream);
- filter = g_mime_filter_charset_new("UTF-8", charset);
- g_mime_stream_filter_add(GMIME_STREAM_FILTER(filter_stream), filter);
- g_object_unref(G_OBJECT(filter));
+ stream = g_mime_stream_mem_new();
+ filter_stream = g_mime_stream_filter_new(stream);
+ filter = g_mime_filter_charset_new("UTF-8", charset);
+ g_mime_stream_filter_add(GMIME_STREAM_FILTER(filter_stream), filter);
+ g_object_unref(G_OBJECT(filter));
- g_mime_stream_write(filter_stream, body->buffer, strlen(body->buffer));
- g_object_unref(filter_stream);
+ g_mime_stream_write(filter_stream, body->buffer, strlen(body->buffer));
+ g_object_unref(filter_stream);
wrapper =
g_mime_data_wrapper_new_with_stream(stream,
GMIME_CONTENT_ENCODING_DEFAULT);
- g_object_unref(stream);
+ g_object_unref(stream);
- g_mime_part_set_content_object(mime_part, wrapper);
- g_object_unref(G_OBJECT(wrapper));
- } else
- lbs_set_content(mime_part, body->buffer);
+ g_mime_part_set_content_object(mime_part, wrapper);
+ g_object_unref(G_OBJECT(wrapper));
+ } else {
+ lbs_set_content(mime_part, body->buffer);
+ }
#ifdef HAVE_GPGME
/* rfc 2440 sign/encrypt if requested */
@@ -352,11 +378,11 @@ add_mime_body_plain(LibBalsaMessageBody *body, gboolean flow, gboolean postpone)
g_mime_part_set_content_encoding(mime_part, GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE);
g_mime_object_set_content_type_parameter(GMIME_OBJECT(mime_part),
"charset", "UTF-8");
- lbs_set_content(mime_part, body->html_buffer);
+ lbs_set_content(mime_part, body->html_buffer);
#ifdef HAVE_GPGME
- if (use_gpg_mode != 0 &&
- (use_gpg_mode & LIBBALSA_PROTECT_MODE) != LIBBALSA_PROTECT_SIGN) {
+ if ((use_gpg_mode != 0) &&
+ ((use_gpg_mode & LIBBALSA_PROTECT_MODE) != LIBBALSA_PROTECT_SIGN)) {
*crypt_res =
libbalsa_create_rfc2440_buffer(body->message,
GMIME_PART(mime_part),
@@ -370,32 +396,39 @@ add_mime_body_plain(LibBalsaMessageBody *body, gboolean flow, gboolean postpone)
#endif
return GMIME_OBJECT(mpa);
- } else
+ } else {
return GMIME_OBJECT(mime_part);
+ }
}
#if 0
/* you never know when you will need this one... */
-static void dump_queue(const char*msg)
+static void
+dump_queue(const char *msg)
{
MessageQueueItem *mqi = message_queue;
printf("dumping message queue at %s:\n", msg);
- while(mqi) {
- printf("item: %p\n", mqi);
- mqi = mqi->next_message;
+ while (mqi) {
+ printf("item: %p\n", mqi);
+ mqi = mqi->next_message;
}
}
+
+
#endif
/* libbalsa_message_queue:
places given message in the outbox.
-*/
-static void libbalsa_set_message_id(GMimeMessage * mime_message);
+ */
+static void libbalsa_set_message_id(GMimeMessage *mime_message);
+
LibBalsaMsgCreateResult
-libbalsa_message_queue(LibBalsaMessage * message, LibBalsaMailbox * outbox,
- LibBalsaMailbox * fccbox,
- LibBalsaSmtpServer * smtp_server,
- gboolean flow, GError ** error)
+libbalsa_message_queue(LibBalsaMessage *message,
+ LibBalsaMailbox *outbox,
+ LibBalsaMailbox *fccbox,
+ LibBalsaSmtpServer *smtp_server,
+ gboolean flow,
+ GError **error)
{
LibBalsaMsgCreateResult result;
guint big_message;
@@ -405,16 +438,18 @@ libbalsa_message_queue(LibBalsaMessage * message, LibBalsaMailbox * outbox,
g_return_val_if_fail(message, LIBBALSA_MESSAGE_CREATE_ERROR);
if ((result = libbalsa_create_msg(message, flow, error)) !=
- LIBBALSA_MESSAGE_CREATE_OK)
+ LIBBALSA_MESSAGE_CREATE_OK) {
return result;
+ }
- if (fccbox)
+ if (fccbox != NULL) {
g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-Fcc",
- fccbox->url);
+ fccbox->url);
+ }
g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-DSN",
- message->request_dsn ? "1" : "0");
+ message->request_dsn ? "1" : "0");
g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-SmtpServer",
- libbalsa_smtp_server_get_name(smtp_server));
+ libbalsa_smtp_server_get_name(smtp_server));
big_message = libbalsa_smtp_server_get_big_message(smtp_server);
if (big_message > 0) {
@@ -434,8 +469,8 @@ libbalsa_message_queue(LibBalsaMessage * message, LibBalsaMailbox * outbox,
* type "message/partial" must always have a content-
* transfer-encoding of 7bit (the default)" */
g_mime_part_set_content_encoding(GMIME_PART
- (mime_msgs[i]->mime_part),
- GMIME_CONTENT_ENCODING_7BIT);
+ (mime_msgs[i]->mime_part),
+ GMIME_CONTENT_ENCODING_7BIT);
libbalsa_set_message_id(mime_msgs[i]);
}
if (rc) {
@@ -446,330 +481,367 @@ libbalsa_message_queue(LibBalsaMessage * message, LibBalsaMailbox * outbox,
}
g_free(mime_msgs);
message->mime_msg = mime_msg;
- } else
+ } else {
rc = libbalsa_message_copy(message, outbox, error);
+ }
- return rc ? LIBBALSA_MESSAGE_CREATE_OK : LIBBALSA_MESSAGE_QUEUE_ERROR;
+ return rc ? LIBBALSA_MESSAGE_CREATE_OK : LIBBALSA_MESSAGE_QUEUE_ERROR;
}
+
/* libbalsa_message_send:
send the given messsage (if any, it can be NULL) and all the messages
in given outbox.
-*/
-static gboolean lbs_process_queue(LibBalsaMailbox * outbox,
+ */
+static gboolean lbs_process_queue(LibBalsaMailbox *outbox,
LibBalsaFccboxFinder finder,
- LibBalsaSmtpServer * smtp_server,
- gboolean debug,
- GtkWindow * parent);
+ LibBalsaSmtpServer *smtp_server,
+ gboolean debug,
+ GtkWindow *parent);
LibBalsaMsgCreateResult
-libbalsa_message_send(LibBalsaMessage * message, LibBalsaMailbox * outbox,
- LibBalsaMailbox * fccbox,
+libbalsa_message_send(LibBalsaMessage *message,
+ LibBalsaMailbox *outbox,
+ LibBalsaMailbox *fccbox,
LibBalsaFccboxFinder finder,
- LibBalsaSmtpServer * smtp_server,
- GtkWindow * parent,
- gboolean flow, gboolean debug,
- GError ** error)
+ LibBalsaSmtpServer *smtp_server,
+ GtkWindow *parent,
+ gboolean flow,
+ gboolean debug,
+ GError **error)
{
LibBalsaMsgCreateResult result = LIBBALSA_MESSAGE_CREATE_OK;
g_return_val_if_fail(smtp_server != NULL,
LIBBALSA_MESSAGE_SERVER_ERROR);
- if (message != NULL)
+ if (message != NULL) {
result = libbalsa_message_queue(message, outbox, fccbox,
smtp_server, flow, error);
+ }
- if (result == LIBBALSA_MESSAGE_CREATE_OK
- && !lbs_process_queue(outbox, finder, smtp_server, debug, parent))
- return LIBBALSA_MESSAGE_SEND_ERROR;
+ if ((result == LIBBALSA_MESSAGE_CREATE_OK)
+ && !lbs_process_queue(outbox, finder, smtp_server, debug, parent)) {
+ return LIBBALSA_MESSAGE_SEND_ERROR;
+ }
return result;
}
static void
-add_recipients(NetClientSmtpMessage *message, InternetAddressList * recipient_list, gboolean request_dsn)
+add_recipients(NetClientSmtpMessage *message,
+ InternetAddressList *recipient_list,
+ gboolean request_dsn)
{
- if (recipient_list != NULL) {
- const InternetAddress *ia;
- NetClientSmtpDsnMode dsn_mode;
- int i;
-
- /* XXX - It would be cool if LibBalsaAddress could contain DSN options
- for a particular recipient. For the time being, just use a switch */
- if (request_dsn) {
- dsn_mode = NET_CLIENT_SMTP_DSN_SUCCESS + NET_CLIENT_SMTP_DSN_FAILURE +
NET_CLIENT_SMTP_DSN_DELAY;
- } else {
- dsn_mode = NET_CLIENT_SMTP_DSN_NEVER;
- }
-
- for (i = 0; i < internet_address_list_length(recipient_list); i++) {
- ia = internet_address_list_get_address(recipient_list, i);
-
- if (INTERNET_ADDRESS_IS_MAILBOX(ia)) {
- net_client_smtp_msg_add_recipient(message,
INTERNET_ADDRESS_MAILBOX(ia)->addr, dsn_mode);
- } else {
- add_recipients(message, INTERNET_ADDRESS_GROUP(ia)->members, request_dsn);
- }
- }
- }
+ if (recipient_list != NULL) {
+ const InternetAddress *ia;
+ NetClientSmtpDsnMode dsn_mode;
+ int i;
+
+ /* XXX - It would be cool if LibBalsaAddress could contain DSN options
+ for a particular recipient. For the time being, just use a switch */
+ if (request_dsn) {
+ dsn_mode = NET_CLIENT_SMTP_DSN_SUCCESS + NET_CLIENT_SMTP_DSN_FAILURE +
+ NET_CLIENT_SMTP_DSN_DELAY;
+ } else {
+ dsn_mode = NET_CLIENT_SMTP_DSN_NEVER;
+ }
+
+ for (i = 0; i < internet_address_list_length(recipient_list); i++) {
+ ia = internet_address_list_get_address(recipient_list, i);
+
+ if (INTERNET_ADDRESS_IS_MAILBOX(ia)) {
+ net_client_smtp_msg_add_recipient(message,
+ INTERNET_ADDRESS_MAILBOX(ia)->addr,
+ dsn_mode);
+ } else {
+ add_recipients(message, INTERNET_ADDRESS_GROUP(ia)->members, request_dsn);
+ }
+ }
+ }
}
static gssize
-send_message_data_cb(gchar *buffer, gsize count, gpointer user_data, GError **error)
+send_message_data_cb(gchar *buffer,
+ gsize count,
+ gpointer user_data,
+ GError **error)
{
- ssize_t read_res;
- MessageQueueItem *mqi = (MessageQueueItem *) user_data;
-
- read_res = g_mime_stream_read(mqi->stream, buffer, count);
- if ((mqi->message_size > 0) && (read_res > 0)) {
- mqi->acc += read_res;
- if (mqi->acc >= mqi->update) {
- float percent;
- SendThreadMessage *threadmsg;
-
- mqi->sent += mqi->acc;
- mqi->acc = 0;
- percent = (float) mqi->sent / (float) mqi->message_size;
- if (percent > 1.0F) {
- percent = 1.0F;
- }
- MSGSENDTHREAD(threadmsg, MSGSENDTHREADPROGRESS, "", NULL, NULL, percent);
- }
- }
- return read_res;
+ ssize_t read_res;
+ MessageQueueItem *mqi = (MessageQueueItem *) user_data;
+
+ read_res = g_mime_stream_read(mqi->stream, buffer, count);
+ if ((mqi->message_size > 0) && (read_res > 0)) {
+ mqi->acc += read_res;
+ if (mqi->acc >= mqi->update) {
+ float percent;
+ SendThreadMessage *threadmsg;
+
+ mqi->sent += mqi->acc;
+ mqi->acc = 0;
+ percent = (float) mqi->sent / (float) mqi->message_size;
+ if (percent > 1.0F) {
+ percent = 1.0F;
+ }
+ MSGSENDTHREAD(threadmsg, MSGSENDTHREADPROGRESS, "", NULL, NULL, percent);
+ }
+ }
+ return read_res;
}
static gboolean
-check_cert(NetClient *client, GTlsCertificate *peer_cert, GTlsCertificateFlags errors, gpointer user_data)
+check_cert(NetClient *client,
+ GTlsCertificate *peer_cert,
+ GTlsCertificateFlags errors,
+ gpointer user_data)
{
- GByteArray *cert_der = NULL;
- gboolean result = FALSE;
-
- /* FIXME - this a hack, simulating the (OpenSSL based) input for libbalsa_is_cert_known(). If we
switch completely to
- * (GnuTLS based) GTlsCertificate/GTlsClientConnection, we can omit this... */
- g_debug("%s: %p %p %u %p", __func__, client, peer_cert, errors, user_data);
-
- /* create a OpenSSL X509 object from the certificate's DER data */
- g_object_get(G_OBJECT(peer_cert), "certificate", &cert_der, NULL);
- if (cert_der != NULL) {
- X509 *ossl_cert;
- const unsigned char *der_p;
-
- der_p = (const unsigned char *) cert_der->data;
- ossl_cert = d2i_X509(NULL, &der_p, cert_der->len);
- g_byte_array_unref(cert_der);
-
- if (ossl_cert != NULL) {
- long vfy_result;
-
- /* convert the GIO error flags into OpenSSL error flags */
- if ((errors & G_TLS_CERTIFICATE_UNKNOWN_CA) == G_TLS_CERTIFICATE_UNKNOWN_CA) {
- vfy_result = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
- } else if ((errors & G_TLS_CERTIFICATE_BAD_IDENTITY) ==
G_TLS_CERTIFICATE_BAD_IDENTITY) {
- vfy_result = X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
- } else if ((errors & G_TLS_CERTIFICATE_NOT_ACTIVATED) ==
G_TLS_CERTIFICATE_NOT_ACTIVATED) {
- vfy_result = X509_V_ERR_CERT_NOT_YET_VALID;
- } else if ((errors & G_TLS_CERTIFICATE_EXPIRED) == G_TLS_CERTIFICATE_EXPIRED) {
- vfy_result = X509_V_ERR_CERT_HAS_EXPIRED;
- } else if ((errors & G_TLS_CERTIFICATE_REVOKED) == G_TLS_CERTIFICATE_REVOKED) {
- vfy_result = X509_V_ERR_CERT_REVOKED;
- } else {
- vfy_result = X509_V_ERR_APPLICATION_VERIFICATION;
- }
-
- result = libbalsa_is_cert_known(ossl_cert, vfy_result);
- X509_free(ossl_cert);
- }
- }
-
- return result;
+ GByteArray *cert_der = NULL;
+ gboolean result = FALSE;
+
+ /* FIXME - this a hack, simulating the (OpenSSL based) input for libbalsa_is_cert_known().
+ If we switch completely to
+ * (GnuTLS based) GTlsCertificate/GTlsClientConnection, we can omit this... */
+ g_debug("%s: %p %p %u %p", __func__, client, peer_cert, errors, user_data);
+
+ /* create a OpenSSL X509 object from the certificate's DER data */
+ g_object_get(G_OBJECT(peer_cert), "certificate", &cert_der, NULL);
+ if (cert_der != NULL) {
+ X509 *ossl_cert;
+ const unsigned char *der_p;
+
+ der_p = (const unsigned char *) cert_der->data;
+ ossl_cert = d2i_X509(NULL, &der_p, cert_der->len);
+ g_byte_array_unref(cert_der);
+
+ if (ossl_cert != NULL) {
+ long vfy_result;
+
+ /* convert the GIO error flags into OpenSSL error flags */
+ if ((errors & G_TLS_CERTIFICATE_UNKNOWN_CA) == G_TLS_CERTIFICATE_UNKNOWN_CA) {
+ vfy_result = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT;
+ } else if ((errors & G_TLS_CERTIFICATE_BAD_IDENTITY) ==
+ G_TLS_CERTIFICATE_BAD_IDENTITY) {
+ vfy_result = X509_V_ERR_SUBJECT_ISSUER_MISMATCH;
+ } else if ((errors & G_TLS_CERTIFICATE_NOT_ACTIVATED) ==
+ G_TLS_CERTIFICATE_NOT_ACTIVATED) {
+ vfy_result = X509_V_ERR_CERT_NOT_YET_VALID;
+ } else if ((errors & G_TLS_CERTIFICATE_EXPIRED) == G_TLS_CERTIFICATE_EXPIRED) {
+ vfy_result = X509_V_ERR_CERT_HAS_EXPIRED;
+ } else if ((errors & G_TLS_CERTIFICATE_REVOKED) == G_TLS_CERTIFICATE_REVOKED) {
+ vfy_result = X509_V_ERR_CERT_REVOKED;
+ } else {
+ vfy_result = X509_V_ERR_APPLICATION_VERIFICATION;
+ }
+
+ result = libbalsa_is_cert_known(ossl_cert, vfy_result);
+ X509_free(ossl_cert);
+ }
+ }
+
+ return result;
}
static gchar **
-get_auth(NetClient *client, gpointer user_data)
+get_auth(NetClient *client,
+ gpointer user_data)
{
- LibBalsaServer *server = LIBBALSA_SERVER(user_data);
- gchar **result = NULL;
-
- g_debug("%s: %p %p: encrypted = %d", __func__, client, user_data, net_client_is_encrypted(client));
- /* Note: if the usr name is empty, we assume anonymous access */
- if ((server->try_anonymous == 0U) && (server->user != NULL) && (server->user[0] != '\0')) {
- result = g_new0(gchar *, 3U);
- result[0] = g_strdup(server->user);
- if ((server->passwd != NULL) && (server->passwd[0] != '\0')) {
- result[1] = g_strdup(server->passwd);
- } else {
- result[1] = libbalsa_server_get_password(server, NULL);
- }
- }
- return result;
+ LibBalsaServer *server = LIBBALSA_SERVER(user_data);
+ gchar **result = NULL;
+
+ g_debug("%s: %p %p: encrypted = %d", __func__, client, user_data,
+ net_client_is_encrypted(client));
+ /* Note: if the usr name is empty, we assume anonymous access */
+ if ((server->try_anonymous == 0U) && (server->user != NULL) && (server->user[0] != '\0')) {
+ result = g_new0(gchar *, 3U);
+ result[0] = g_strdup(server->user);
+ if ((server->passwd != NULL) && (server->passwd[0] != '\0')) {
+ result[1] = g_strdup(server->passwd);
+ } else {
+ result[1] = libbalsa_server_get_password(server, NULL);
+ }
+ }
+ return result;
}
/* libbalsa_process_queue:
treats given mailbox as a set of messages to send. Loads them up and
launches sending thread/routine.
- NOTE that we do not close outbox after reading. send_real/thread message
+ NOTE that we do not close outbox after reading. send_real/thread message
handler does that.
-*/
-/* This version uses libESMTP. It has slightly different semantics than
- sendmail version so don't get fooled by similar variable names.
*/
static gboolean
-lbs_process_queue(LibBalsaMailbox * outbox, LibBalsaFccboxFinder finder,
- LibBalsaSmtpServer * smtp_server, gboolean debug,
- GtkWindow * parent)
+lbs_process_queue(LibBalsaMailbox *outbox,
+ LibBalsaFccboxFinder finder,
+ LibBalsaSmtpServer *smtp_server,
+ gboolean debug,
+ GtkWindow *parent)
{
- LibBalsaServer *server = LIBBALSA_SERVER(smtp_server);
- SendMessageInfo *send_message_info;
- NetClientSmtp *session;
- guint msgno;
-
- g_mutex_lock(&send_messages_lock);
-
- if (!libbalsa_mailbox_open(outbox, NULL)) {
- g_mutex_unlock(&send_messages_lock);
- return FALSE;
- }
-
- /* create the SMTP session */
- if (server->security == NET_CLIENT_CRYPT_ENCRYPTED) {
- session = net_client_smtp_new(server->host, 465U, server->security);
- } else {
- // FIXME - submission (587) is the standard, but most isp's use 25...
- session = net_client_smtp_new(server->host, 587U, server->security);
- }
- // FIXME - set user cert and connect cert-pass signal if we have a user cert
- g_signal_connect(G_OBJECT(session), "cert-check", G_CALLBACK(check_cert), session); // FIXME!!
- g_signal_connect(G_OBJECT(session), "auth", G_CALLBACK(get_auth), smtp_server);
-
- send_message_info = send_message_info_new(outbox, session,
libbalsa_smtp_server_get_name(smtp_server));
-
- for (msgno = libbalsa_mailbox_total_messages(outbox); msgno > 0U; msgno--) {
- MessageQueueItem *new_message;
- LibBalsaMessage *msg;
- const gchar *smtp_server_name;
- LibBalsaMsgCreateResult created;
-
- /* Skip this message if it either FLAGGED or DELETED: */
- if (!libbalsa_mailbox_msgno_has_flags(outbox, msgno, 0, (LIBBALSA_MESSAGE_FLAG_FLAGGED |
LIBBALSA_MESSAGE_FLAG_DELETED)))
- continue;
-
- msg = libbalsa_mailbox_get_message(outbox, msgno);
- if (!msg) /* error? */
- continue;
- libbalsa_message_body_ref(msg, TRUE, TRUE);
- smtp_server_name = libbalsa_message_get_user_header(msg, "X-Balsa-SmtpServer");
- if (!smtp_server_name)
- smtp_server_name = libbalsa_smtp_server_get_name(NULL);
- if (strcmp(smtp_server_name, libbalsa_smtp_server_get_name(smtp_server)) != 0) {
- libbalsa_message_body_unref(msg);
- g_object_unref(msg);
- continue;
- }
- msg->request_dsn = (atoi(libbalsa_message_get_user_header(msg, "X-Balsa-DSN")) != 0);
-
- new_message = msg_queue_item_new(finder);
- created = libbalsa_fill_msg_queue_item_from_queu(msg, new_message);
- libbalsa_message_body_unref(msg);
-
- if (created != LIBBALSA_MESSAGE_CREATE_OK) {
- msg_queue_item_destroy(new_message);
- } else {
- const InternetAddress *ia;
- const gchar *mailbox;
-
- libbalsa_message_change_flags(msg, LIBBALSA_MESSAGE_FLAG_FLAGGED, 0);
-
- send_message_info->items = g_list_prepend(send_message_info->items, new_message);
- new_message->smtp_msg = net_client_smtp_msg_new(send_message_data_cb, new_message);
-
- if (msg->request_dsn) {
- net_client_smtp_msg_set_dsn_opts(new_message->smtp_msg, msg->message_id,
FALSE);
- }
-
- /* Add the sender info */
- if (msg->headers->from && (ia = internet_address_list_get_address(msg->headers->from,
0))) {
- while (ia && INTERNET_ADDRESS_IS_GROUP(ia)) {
- ia = internet_address_list_get_address
(INTERNET_ADDRESS_GROUP(ia)->members, 0);
- }
- mailbox = ia ? INTERNET_ADDRESS_MAILBOX(ia)->addr : "";
- } else {
- mailbox = "";
- }
- net_client_smtp_msg_set_sender(new_message->smtp_msg, mailbox);
-
- /* Now need to add the recipients to the message. */
- add_recipients(new_message->smtp_msg, msg->headers->to_list, msg->request_dsn);
- add_recipients(new_message->smtp_msg, msg->headers->cc_list, msg->request_dsn);
- add_recipients(new_message->smtp_msg, msg->headers->bcc_list, msg->request_dsn);
-
- /* Estimate the size of the message. This need not be exact but it's better to err
on the large side since some
- * message headers may be altered during the transfer. */
- new_message->message_size = g_mime_stream_length(new_message->stream);
-
- /* Set up counters for the progress bar. Update is the byte count when the progress
bar should be updated. This is
- * capped around 5k so that the progress bar moves about once per second on a slow
line. On small messages it is
- * smaller to allow smooth progress of the bar. */
- new_message->update = new_message->message_size / 20;
- if (new_message->update < 100) {
- new_message->update = 100;
- } else if (new_message->update > 5 * 1024) {
- new_message->update = 5 * 1024;
- }
- new_message->sent = 0;
- new_message->acc = 0;
- }
- g_object_unref(msg);
- }
-
- /* launch the thread for sending the messages only if we collected any */
- if (send_message_info->items != NULL) {
- GThread *send_mail;
-
- ensure_send_progress_dialog(parent);
- sending_threads++;
- send_mail = g_thread_new("balsa_send_message_real", (GThreadFunc) balsa_send_message_real,
send_message_info);
- g_thread_unref(send_mail);
- } else {
- send_message_info_destroy(send_message_info);
- }
-
- g_mutex_unlock(&send_messages_lock);
- return TRUE;
+ LibBalsaServer *server = LIBBALSA_SERVER(smtp_server);
+ SendMessageInfo *send_message_info;
+ NetClientSmtp *session;
+ guint msgno;
+
+ g_mutex_lock(&send_messages_lock);
+
+ if (!libbalsa_mailbox_open(outbox, NULL)) {
+ g_mutex_unlock(&send_messages_lock);
+ return FALSE;
+ }
+
+ /* create the SMTP session */
+ if (server->security == NET_CLIENT_CRYPT_ENCRYPTED) {
+ session = net_client_smtp_new(server->host, 465U, server->security);
+ } else {
+ // FIXME - submission (587) is the standard, but most isp's use 25...
+ session = net_client_smtp_new(server->host, 587U, server->security);
+ }
+ // FIXME - set user cert and connect cert-pass signal if we have a user cert
+ g_signal_connect(G_OBJECT(session), "cert-check", G_CALLBACK(check_cert), session); // FIXME!!
+ g_signal_connect(G_OBJECT(session), "auth", G_CALLBACK(get_auth), smtp_server);
+
+ send_message_info =
+ send_message_info_new(outbox, session, libbalsa_smtp_server_get_name(smtp_server));
+
+ for (msgno = libbalsa_mailbox_total_messages(outbox); msgno > 0U; msgno--) {
+ MessageQueueItem *new_message;
+ LibBalsaMessage *msg;
+ const gchar *smtp_server_name;
+ LibBalsaMsgCreateResult created;
+
+ /* Skip this message if it either FLAGGED or DELETED: */
+ if (!libbalsa_mailbox_msgno_has_flags(outbox, msgno, 0,
+ (LIBBALSA_MESSAGE_FLAG_FLAGGED |
+ LIBBALSA_MESSAGE_FLAG_DELETED))) {
+ continue;
+ }
+
+ msg = libbalsa_mailbox_get_message(outbox, msgno);
+ if (!msg) { /* error? */
+ continue;
+ }
+ libbalsa_message_body_ref(msg, TRUE, TRUE);
+ smtp_server_name = libbalsa_message_get_user_header(msg, "X-Balsa-SmtpServer");
+ if (!smtp_server_name) {
+ smtp_server_name = libbalsa_smtp_server_get_name(NULL);
+ }
+ if (strcmp(smtp_server_name, libbalsa_smtp_server_get_name(smtp_server)) != 0) {
+ libbalsa_message_body_unref(msg);
+ g_object_unref(msg);
+ continue;
+ }
+ msg->request_dsn = (atoi(libbalsa_message_get_user_header(msg, "X-Balsa-DSN")) != 0);
+
+ new_message = msg_queue_item_new(finder);
+ created = libbalsa_fill_msg_queue_item_from_queu(msg, new_message);
+ libbalsa_message_body_unref(msg);
+
+ if (created != LIBBALSA_MESSAGE_CREATE_OK) {
+ msg_queue_item_destroy(new_message);
+ } else {
+ const InternetAddress *ia;
+ const gchar *mailbox;
+
+ libbalsa_message_change_flags(msg, LIBBALSA_MESSAGE_FLAG_FLAGGED, 0);
+
+ send_message_info->items = g_list_prepend(send_message_info->items, new_message);
+ new_message->smtp_msg = net_client_smtp_msg_new(send_message_data_cb, new_message);
+
+ if (msg->request_dsn) {
+ net_client_smtp_msg_set_dsn_opts(new_message->smtp_msg, msg->message_id, FALSE);
+ }
+
+ /* Add the sender info */
+ if (msg->headers->from &&
+ (ia = internet_address_list_get_address(msg->headers->from, 0))) {
+ while (ia != NULL && INTERNET_ADDRESS_IS_GROUP(ia)) {
+ ia = internet_address_list_get_address (INTERNET_ADDRESS_GROUP(
+ ia)->members, 0);
+ }
+ mailbox = ia ? INTERNET_ADDRESS_MAILBOX(ia)->addr : "";
+ } else {
+ mailbox = "";
+ }
+ net_client_smtp_msg_set_sender(new_message->smtp_msg, mailbox);
+
+ /* Now need to add the recipients to the message. */
+ add_recipients(new_message->smtp_msg, msg->headers->to_list, msg->request_dsn);
+ add_recipients(new_message->smtp_msg, msg->headers->cc_list, msg->request_dsn);
+ add_recipients(new_message->smtp_msg, msg->headers->bcc_list, msg->request_dsn);
+
+ /* Estimate the size of the message. This need not be exact but it's better to err
+ on the large side since some
+ * message headers may be altered during the transfer. */
+ new_message->message_size = g_mime_stream_length(new_message->stream);
+
+ /* Set up counters for the progress bar. Update is the byte count when the progress
+ bar should be updated. This is
+ * capped around 5k so that the progress bar moves about once per second on a slow
+ * line. On small messages it is
+ * smaller to allow smooth progress of the bar. */
+ new_message->update = new_message->message_size / 20;
+ if (new_message->update < 100) {
+ new_message->update = 100;
+ } else if (new_message->update > 5 * 1024) {
+ new_message->update = 5 * 1024;
+ }
+ new_message->sent = 0;
+ new_message->acc = 0;
+ }
+ g_object_unref(msg);
+ }
+
+ /* launch the thread for sending the messages only if we collected any */
+ if (send_message_info->items != NULL) {
+ GThread *send_mail;
+
+ ensure_send_progress_dialog(parent);
+ sending_threads++;
+ send_mail = g_thread_new("balsa_send_message_real",
+ (GThreadFunc) balsa_send_message_real,
+ send_message_info);
+ g_thread_unref(send_mail);
+ } else {
+ send_message_info_destroy(send_message_info);
+ }
+
+ g_mutex_unlock(&send_messages_lock);
+ return TRUE;
}
+
gboolean
-libbalsa_process_queue(LibBalsaMailbox * outbox,
+libbalsa_process_queue(LibBalsaMailbox *outbox,
LibBalsaFccboxFinder finder,
- GSList * smtp_servers,
- GtkWindow * parent,
- gboolean debug)
+ GSList *smtp_servers,
+ GtkWindow *parent,
+ gboolean debug)
{
for (; smtp_servers; smtp_servers = smtp_servers->next) {
LibBalsaSmtpServer *smtp_server =
- LIBBALSA_SMTP_SERVER(smtp_servers->data);
- if (!lbs_process_queue(outbox, finder, smtp_server, debug, parent))
+ LIBBALSA_SMTP_SERVER(smtp_servers->data);
+ if (!lbs_process_queue(outbox, finder, smtp_server, debug, parent)) {
return FALSE;
+ }
}
return TRUE;
}
+
/* balsa_send_message_real:
- does the actual message sending.
+ does the actual message sending.
This function may be called as a thread and should therefore do
proper gdk_threads_{enter/leave} stuff around GTK or libbalsa calls.
Also, structure info should be freed before exiting.
-*/
+ */
static gboolean
-balsa_send_message_real_idle_cb(LibBalsaMailbox * outbox)
+balsa_send_message_real_idle_cb(LibBalsaMailbox *outbox)
{
libbalsa_mailbox_close(outbox, TRUE);
g_object_unref(outbox);
@@ -777,184 +849,219 @@ balsa_send_message_real_idle_cb(LibBalsaMailbox * outbox)
return FALSE;
}
+
static gboolean
balsa_send_message_real(SendMessageInfo *info)
{
- gboolean result;
- GError *error = NULL;
- SendThreadMessage *threadmsg;
- gchar *greeting = NULL;
-
- g_debug("%s: starting", __func__);
-
- /* connect the SMTP server */
- result = net_client_smtp_connect(info->session, &greeting, &error);
- g_debug("%s: connect = %d [%p]: '%s'", __func__, result, info->items, greeting);
- if (result) {
- GList *this_msg;
- gchar *msg;
-
- msg = g_strdup_printf(_("Connected to MTA %s: %s"), info->mta_name, greeting);
- MSGSENDTHREAD(threadmsg, MSGSENDTHREADPROGRESS, msg, NULL, NULL, 0);
- g_free(msg);
- for (this_msg = info->items; this_msg != NULL; this_msg = this_msg->next) {
- MessageQueueItem *mqi = (MessageQueueItem *) this_msg->data;
- gboolean send_res;
-
- g_debug("%s: mqi = %p", __func__, mqi);
- /* send the message */
- send_res = net_client_smtp_send_msg(info->session, mqi->smtp_msg, &error);
-
- g_mutex_lock(&send_messages_lock);
- if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
- libbalsa_message_change_flags(mqi->orig, 0, LIBBALSA_MESSAGE_FLAG_FLAGGED);
- } else {
- g_message("mqi: %p mqi->orig: %p mqi->orig->mailbox: %p\n", mqi, mqi ?
mqi->orig : NULL,
- mqi && mqi->orig ? mqi->orig->mailbox : NULL);
- }
-
- if (send_res) {
- /* sending message successful */
- if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
- gboolean remove = TRUE;
- const gchar *fccurl = libbalsa_message_get_user_header(mqi->orig,
"X-Balsa-Fcc");
-
- if (fccurl != NULL) {
- LibBalsaMailbox *fccbox = mqi->finder(fccurl);
- GError *err = NULL;
-
- libbalsa_message_change_flags(mqi->orig, 0,
LIBBALSA_MESSAGE_FLAG_NEW | LIBBALSA_MESSAGE_FLAG_FLAGGED);
- libbalsa_mailbox_sync_storage(mqi->orig->mailbox, FALSE);
- remove = libbalsa_message_copy(mqi->orig, fccbox, &err);
- if (!remove) {
- libbalsa_information(LIBBALSA_INFORMATION_ERROR,
_("Saving sent message to %s failed: %s"),
- fccbox->url,
err ? err->message : "?");
- g_clear_error(&err);
- }
- }
- /* If copy failed, mark the message again as flagged - otherwise it
will get resent again. And again, and
- * again... */
- libbalsa_message_change_flags(mqi->orig,
- remove ?
LIBBALSA_MESSAGE_FLAG_DELETED : LIBBALSA_MESSAGE_FLAG_FLAGGED, 0);
- }
- } else {
- /* sending message failed - mark it as:
- * - flagged, so it will not be sent again until the error is fixed and the
user manually clears the flag;
- * - undeleted, in case it was already deleted. */
- if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
- libbalsa_message_change_flags(mqi->orig,
LIBBALSA_MESSAGE_FLAG_FLAGGED, LIBBALSA_MESSAGE_FLAG_DELETED);
- }
- libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("Sending message failed:
%s\nMessage left in your outbox."),
- error->message);
- g_clear_error(&error);
- }
-
- /* free data */
- msg_queue_item_destroy(mqi);
- g_mutex_unlock(&send_messages_lock);
- }
- } else {
- libbalsa_information(LIBBALSA_INFORMATION_ERROR, _("Connecting MTA %s (%s) failed: %s"),
- info->mta_name,
net_client_get_host(NET_CLIENT(info->session)), error->message);
- g_error_free(error);
- }
- g_free(greeting);
+ gboolean result;
+ GError *error = NULL;
+ SendThreadMessage *threadmsg;
+ gchar *greeting = NULL;
+
+ g_debug("%s: starting", __func__);
+
+ /* connect the SMTP server */
+ result = net_client_smtp_connect(info->session, &greeting, &error);
+ g_debug("%s: connect = %d [%p]: '%s'", __func__, result, info->items, greeting);
+ if (result) {
+ GList *this_msg;
+ gchar *msg;
+
+ msg = g_strdup_printf(_("Connected to MTA %s: %s"), info->mta_name, greeting);
+ MSGSENDTHREAD(threadmsg, MSGSENDTHREADPROGRESS, msg, NULL, NULL, 0);
+ g_free(msg);
+ for (this_msg = info->items; this_msg != NULL; this_msg = this_msg->next) {
+ MessageQueueItem *mqi = (MessageQueueItem *) this_msg->data;
+ gboolean send_res;
+
+ g_debug("%s: mqi = %p", __func__, mqi);
+ /* send the message */
+ send_res = net_client_smtp_send_msg(info->session, mqi->smtp_msg, &error);
+
+ g_mutex_lock(&send_messages_lock);
+ if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
+ libbalsa_message_change_flags(mqi->orig, 0, LIBBALSA_MESSAGE_FLAG_FLAGGED);
+ } else {
+ g_message("mqi: %p mqi->orig: %p mqi->orig->mailbox: %p\n",
+ mqi,
+ mqi ? mqi->orig : NULL,
+ mqi && mqi->orig ? mqi->orig->mailbox : NULL);
+ }
+
+ if (send_res) {
+ /* sending message successful */
+ if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
+ gboolean remove = TRUE;
+ const gchar *fccurl = libbalsa_message_get_user_header(mqi->orig,
+ "X-Balsa-Fcc");
+
+ if (fccurl != NULL) {
+ LibBalsaMailbox *fccbox = mqi->finder(fccurl);
+ GError *err = NULL;
+
+ libbalsa_message_change_flags(mqi->orig,
+ 0,
+ LIBBALSA_MESSAGE_FLAG_NEW |
+ LIBBALSA_MESSAGE_FLAG_FLAGGED);
+ libbalsa_mailbox_sync_storage(mqi->orig->mailbox, FALSE);
+ remove = libbalsa_message_copy(mqi->orig, fccbox, &err);
+ if (!remove) {
+ libbalsa_information(LIBBALSA_INFORMATION_ERROR,
+ _("Saving sent message to %s failed: %s"),
+ fccbox->url, err ? err->message : "?");
+ g_clear_error(&err);
+ }
+ }
+ /* If copy failed, mark the message again as flagged - otherwise it will get
+ resent again. And again, and
+ * again... */
+ libbalsa_message_change_flags(mqi->orig,
+ remove
+ ? LIBBALSA_MESSAGE_FLAG_DELETED
+ : LIBBALSA_MESSAGE_FLAG_FLAGGED,
+ 0);
+ }
+ } else {
+ /* sending message failed - mark it as:
+ * - flagged, so it will not be sent again until the error is fixed and the
+ * user manually clears the flag;
+ * - undeleted, in case it was already deleted. */
+ if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
+ libbalsa_message_change_flags(mqi->orig,
+ LIBBALSA_MESSAGE_FLAG_FLAGGED,
+ LIBBALSA_MESSAGE_FLAG_DELETED);
+ }
+ libbalsa_information(LIBBALSA_INFORMATION_ERROR,
+ _(
+ "Sending message failed: %s\nMessage left in your outbox."),
+ error->message);
+ g_clear_error(&error);
+ }
+
+ /* free data */
+ msg_queue_item_destroy(mqi);
+ g_mutex_unlock(&send_messages_lock);
+ }
+ } else {
+ libbalsa_information(LIBBALSA_INFORMATION_ERROR,
+ _("Connecting MTA %s (%s) failed: %s"),
+ info->mta_name,
+ net_client_get_host(NET_CLIENT(info->session)),
+ error->message);
+ g_error_free(error);
+ }
+ g_free(greeting);
/* close outbox in an idle callback, as it might affect the display */
g_idle_add((GSourceFunc) balsa_send_message_real_idle_cb, g_object_ref(info->outbox));
- /* clean up */
+ /* clean up */
send_message_info_destroy(info);
- g_mutex_lock(&send_messages_lock);
+ g_mutex_lock(&send_messages_lock);
MSGSENDTHREAD(threadmsg, MSGSENDTHREADFINISHED, "", NULL, NULL, 0);
- sending_threads--;
- g_mutex_unlock(&send_messages_lock);
+ sending_threads--;
+ g_mutex_unlock(&send_messages_lock);
- return result;
+ return result;
}
+
static void
-message_add_references(const LibBalsaMessage * message, GMimeMessage * msg)
+message_add_references(const LibBalsaMessage *message,
+ GMimeMessage *msg)
{
/* If the message has references set, add them to the envelope */
if (message->references != NULL) {
- GList *list = message->references;
- GString *str = g_string_new(NULL);
-
- do {
- if (str->len > 0)
- g_string_append_c(str, ' ');
- g_string_append_printf(str, "<%s>", (gchar *) list->data);
- } while ((list = list->next) != NULL);
- g_mime_object_set_header(GMIME_OBJECT(msg), "References", str->str);
- g_string_free(str, TRUE);
- }
-
- if (message->in_reply_to)
- /* There's no specific header function for In-Reply-To */
- g_mime_object_set_header(GMIME_OBJECT(msg), "In-Reply-To",
- message->in_reply_to->data);
+ GList *list = message->references;
+ GString *str = g_string_new(NULL);
+
+ do {
+ if (str->len > 0) {
+ g_string_append_c(str, ' ');
+ }
+ g_string_append_printf(str, "<%s>", (gchar *) list->data);
+ } while ((list = list->next) != NULL);
+ g_mime_object_set_header(GMIME_OBJECT(msg), "References", str->str);
+ g_string_free(str, TRUE);
+ }
+
+ if (message->in_reply_to != NULL) {
+ /* There's no specific header function for In-Reply-To */
+ g_mime_object_set_header(GMIME_OBJECT(msg), "In-Reply-To",
+ message->in_reply_to->data);
+ }
}
+
#ifdef HAVE_GPGME
static GList *
-get_mailbox_names(GList *list, InternetAddressList *address_list)
+get_mailbox_names(GList *list,
+ InternetAddressList *address_list)
{
- gint i;
+ gint i, len;
- for (i = 0; i < internet_address_list_length(address_list); i++) {
- InternetAddress *ia =
+ len = internet_address_list_length(address_list);
+ for (i = 0; i < len; i++) {
+ InternetAddress *ia =
internet_address_list_get_address(address_list, i);
- if (INTERNET_ADDRESS_IS_MAILBOX(ia))
- list = g_list_append(list, g_strdup(((InternetAddressMailbox *) ia)->addr));
- else
- list = get_mailbox_names(list, ((InternetAddressGroup *) ia)->members);
+ if (INTERNET_ADDRESS_IS_MAILBOX(ia)) {
+ list = g_list_append(list, g_strdup(((InternetAddressMailbox *) ia)->addr));
+ } else {
+ list = get_mailbox_names(list, ((InternetAddressGroup *) ia)->members);
+ }
}
return list;
}
+
+
#endif
/* We could have used g_strsplit_set(s, "/;", 3) but it is not
* available in older glib. */
-static gchar**
-parse_content_type(const char* content_type)
+static gchar **
+parse_content_type(const char *content_type)
{
- gchar ** ret = g_new0(gchar*, 3);
+ gchar **ret = g_new0(gchar *, 3);
char *delim, *slash = strchr(content_type, '/');
- if(!slash) {
+ if (!slash) {
ret[0] = g_strdup(content_type);
return ret;
}
- ret[0] = g_strndup(content_type, slash-content_type);
+ ret[0] = g_strndup(content_type, slash - content_type);
slash++;
- for(delim=slash; *delim && *delim != ';' && *delim != ' '; delim++);
- ret[1] = g_strndup(slash, delim-slash);
+ for (delim = slash; *delim && *delim != ';' && *delim != ' '; delim++) {
+ }
+ ret[1] = g_strndup(slash, delim - slash);
return ret;
}
+
/* get_tz_offset() returns tz offset in RFC 5322 format ([-]hhmm) */
static gint
get_tz_offset(time_t t)
{
- GTimeZone *local_tz;
- gint interval;
- gint32 offset;
- gint hours;
-
- local_tz = g_time_zone_new_local();
- interval = g_time_zone_find_interval(local_tz, G_TIME_TYPE_UNIVERSAL, t);
- offset = g_time_zone_get_offset(local_tz, interval);
- g_time_zone_unref(local_tz);
- hours = offset / 3600;
- return (hours * 100) + ((offset - (hours * 3600)) / 60);
+ GTimeZone *local_tz;
+ gint interval;
+ gint32 offset;
+ gint hours;
+
+ local_tz = g_time_zone_new_local();
+ interval = g_time_zone_find_interval(local_tz, G_TIME_TYPE_UNIVERSAL, t);
+ offset = g_time_zone_get_offset(local_tz, interval);
+ g_time_zone_unref(local_tz);
+ hours = offset / 3600;
+ return (hours * 100) + ((offset - (hours * 3600)) / 60);
}
+
static LibBalsaMsgCreateResult
-libbalsa_message_create_mime_message(LibBalsaMessage* message, gboolean flow,
- gboolean postponing, GError ** error)
+libbalsa_message_create_mime_message(LibBalsaMessage *message,
+ gboolean flow,
+ gboolean postponing,
+ GError **error)
{
gchar **mime_type;
GMimeObject *mime_root = NULL;
@@ -964,226 +1071,230 @@ libbalsa_message_create_mime_message(LibBalsaMessage* message, gboolean flow,
gchar *tmp;
GList *list;
#ifdef HAVE_GPGME
- GtkWindow * parent = g_object_get_data(G_OBJECT(message), "parent-window");
+ GtkWindow *parent = g_object_get_data(G_OBJECT(message), "parent-window");
#endif
body = message->body_list;
- if (body && body->next)
- mime_root=GMIME_OBJECT(g_mime_multipart_new_with_subtype(message->subtype));
-
- while (body) {
- GMimeObject *mime_part;
- mime_part=NULL;
-
- if (body->file_uri || body->filename) {
- if (body->content_type) {
- mime_type = parse_content_type(body->content_type);
- } else {
- gchar * mt = g_strdup(libbalsa_vfs_get_mime_type(body->file_uri));
- mime_type = g_strsplit(mt,"/", 2);
- g_free(mt);
- }
-
- if (body->attach_mode == LIBBALSA_ATTACH_AS_EXTBODY) {
- GMimeContentType *content_type =
- g_mime_content_type_new("message", "external-body");
- mime_part=g_mime_object_new_type("message", "external-body");
- g_mime_object_set_content_type(mime_part, content_type);
- g_mime_part_set_content_encoding(GMIME_PART(mime_part),
- GMIME_CONTENT_ENCODING_7BIT);
- if (body->filename && !strncmp(body->filename, "URL", 3)) {
- g_mime_object_set_content_type_parameter(mime_part,
- "access-type", "URL");
- g_mime_object_set_content_type_parameter(mime_part,
- "URL", body->filename + 4);
- } else {
- g_mime_object_set_content_type_parameter(mime_part,
- "access-type", "local-file");
- g_mime_object_set_content_type_parameter(mime_part,
- "name", libbalsa_vfs_get_uri_utf8(body->file_uri));
- }
- lbs_set_content(GMIME_PART(mime_part),
+ if ((body != NULL) && (body->next != NULL)) {
+ mime_root = GMIME_OBJECT(g_mime_multipart_new_with_subtype(message->subtype));
+ }
+
+ while (body != NULL) {
+ GMimeObject *mime_part;
+ mime_part = NULL;
+
+ if ((body->file_uri != NULL) || (body->filename != NULL)) {
+ if (body->content_type != NULL) {
+ mime_type = parse_content_type(body->content_type);
+ } else {
+ gchar *mt = g_strdup(libbalsa_vfs_get_mime_type(body->file_uri));
+ mime_type = g_strsplit(mt, "/", 2);
+ g_free(mt);
+ }
+
+ if (body->attach_mode == LIBBALSA_ATTACH_AS_EXTBODY) {
+ GMimeContentType *content_type =
+ g_mime_content_type_new("message", "external-body");
+ mime_part = g_mime_object_new_type("message", "external-body");
+ g_mime_object_set_content_type(mime_part, content_type);
+ g_mime_part_set_content_encoding(GMIME_PART(mime_part),
+ GMIME_CONTENT_ENCODING_7BIT);
+ if (body->filename && !strncmp(body->filename, "URL", 3)) {
+ g_mime_object_set_content_type_parameter(mime_part,
+ "access-type", "URL");
+ g_mime_object_set_content_type_parameter(mime_part,
+ "URL", body->filename + 4);
+ } else {
+ g_mime_object_set_content_type_parameter(mime_part,
+ "access-type", "local-file");
+ g_mime_object_set_content_type_parameter(mime_part,
+ "name",
+ libbalsa_vfs_get_uri_utf8(body->
+ file_uri));
+ }
+ lbs_set_content(GMIME_PART(mime_part),
"Note: this is _not_ the real body!\n");
- } else if (g_ascii_strcasecmp(mime_type[0], "message") == 0) {
- GMimeStream *stream;
- GMimeParser *parser;
- GMimeMessage *mime_message;
- GError *err = NULL;
-
- stream = libbalsa_vfs_create_stream(body->file_uri, 0, FALSE, &err);
- if(!stream) {
- if(err) {
- gchar *msg =
- err->message
- ? g_strdup_printf(_("Cannot read %s: %s"),
- libbalsa_vfs_get_uri_utf8(body->file_uri),
- err->message)
- : g_strdup_printf(_("Cannot read %s"),
- libbalsa_vfs_get_uri_utf8(body->file_uri));
- g_set_error(error, err->domain, err->code, "%s", msg);
- g_clear_error(&err);
- g_free(msg);
- }
- return LIBBALSA_MESSAGE_CREATE_ERROR;
- }
- parser = g_mime_parser_new_with_stream(stream);
- g_object_unref(stream);
- mime_message = g_mime_parser_construct_message(parser);
- g_object_unref(parser);
+ } else if (g_ascii_strcasecmp(mime_type[0], "message") == 0) {
+ GMimeStream *stream;
+ GMimeParser *parser;
+ GMimeMessage *mime_message;
+ GError *err = NULL;
+
+ stream = libbalsa_vfs_create_stream(body->file_uri, 0, FALSE, &err);
+ if (!stream) {
+ if (err != NULL) {
+ gchar *msg =
+ err->message
+ ? g_strdup_printf(_("Cannot read %s: %s"),
+ libbalsa_vfs_get_uri_utf8(body->file_uri),
+ err->message)
+ : g_strdup_printf(_("Cannot read %s"),
+ libbalsa_vfs_get_uri_utf8(body->file_uri));
+ g_set_error(error, err->domain, err->code, "%s", msg);
+ g_clear_error(&err);
+ g_free(msg);
+ }
+ return LIBBALSA_MESSAGE_CREATE_ERROR;
+ }
+ parser = g_mime_parser_new_with_stream(stream);
+ g_object_unref(stream);
+ mime_message = g_mime_parser_construct_message(parser);
+ g_object_unref(parser);
mime_part =
GMIME_OBJECT(g_mime_message_part_new_with_message
- (mime_type[1], mime_message));
- g_object_unref(mime_message);
- } else {
- const gchar *charset = NULL;
- GMimeStream *stream;
- GMimeDataWrapper *content;
- GError *err = NULL;
-
- if (!g_ascii_strcasecmp(mime_type[0], "text")
- && !(charset = body->charset)) {
- charset = libbalsa_vfs_get_charset(body->file_uri);
- if (!charset) {
- static const gchar default_type[] =
- "application/octet-stream";
-
- libbalsa_information(LIBBALSA_INFORMATION_WARNING,
- _("Cannot determine character set "
- "for text file “%s”; "
- "sending as MIME type “%s”"),
- libbalsa_vfs_get_uri_utf8(body->file_uri),
+ (mime_type[1], mime_message));
+ g_object_unref(mime_message);
+ } else {
+ const gchar *charset = NULL;
+ GMimeStream *stream;
+ GMimeDataWrapper *content;
+ GError *err = NULL;
+
+ if ((g_ascii_strcasecmp(mime_type[0], "text") == 0)
+ && ((charset = body->charset) == NULL)) {
+ charset = libbalsa_vfs_get_charset(body->file_uri);
+ if (charset == NULL) {
+ static const gchar default_type[] =
+ "application/octet-stream";
+
+ libbalsa_information(LIBBALSA_INFORMATION_WARNING,
+ _("Cannot determine character set "
+ "for text file “%s”; "
+ "sending as MIME type “%s”"),
+ libbalsa_vfs_get_uri_utf8(body->file_uri),
default_type);
- g_strfreev(mime_type);
- mime_type = g_strsplit(default_type, "/", 2);
- }
- }
-
- /* use BASE64 encoding for non-text mime types
- use 8BIT for message */
- mime_part =
- GMIME_OBJECT(g_mime_part_new_with_type(mime_type[0],
- mime_type[1]));
- g_mime_object_set_disposition(mime_part,
- body->attach_mode == LIBBALSA_ATTACH_AS_INLINE ?
- GMIME_DISPOSITION_INLINE : GMIME_DISPOSITION_ATTACHMENT);
- if(g_ascii_strcasecmp(mime_type[0],"text") != 0)
- {
- g_mime_part_set_content_encoding(GMIME_PART(mime_part),
- GMIME_CONTENT_ENCODING_BASE64);
- } else {
- /* is text */
- g_mime_object_set_content_type_parameter(mime_part,
- "charset",
- charset);
- }
-
- g_mime_part_set_filename(GMIME_PART(mime_part),
+ g_strfreev(mime_type);
+ mime_type = g_strsplit(default_type, "/", 2);
+ }
+ }
+
+ /* use BASE64 encoding for non-text mime types
+ use 8BIT for message */
+ mime_part =
+ GMIME_OBJECT(g_mime_part_new_with_type(mime_type[0],
+ mime_type[1]));
+ g_mime_object_set_disposition(mime_part,
+ body->attach_mode == LIBBALSA_ATTACH_AS_INLINE ?
+ GMIME_DISPOSITION_INLINE : GMIME_DISPOSITION_ATTACHMENT);
+ if (g_ascii_strcasecmp(mime_type[0], "text") != 0) {
+ g_mime_part_set_content_encoding(GMIME_PART(mime_part),
+ GMIME_CONTENT_ENCODING_BASE64);
+ } else {
+ /* is text */
+ g_mime_object_set_content_type_parameter(mime_part, "charset", charset);
+ }
+
+ g_mime_part_set_filename(GMIME_PART(mime_part),
libbalsa_vfs_get_basename_utf8(body->file_uri));
- stream = libbalsa_vfs_create_stream(body->file_uri, 0, FALSE, &err);
- if(!stream) {
- if(err) {
- gchar *msg =
- err->message
- ? g_strdup_printf(_("Cannot read %s: %s"),
- libbalsa_vfs_get_uri_utf8(body->file_uri),
- err->message)
- : g_strdup_printf(_("Cannot read %s"),
- libbalsa_vfs_get_uri_utf8(body->file_uri));
- g_set_error(error, err->domain, err->code, "%s", msg);
- g_clear_error(&err);
- g_free(msg);
- }
- g_object_unref(G_OBJECT(mime_part));
- return LIBBALSA_MESSAGE_CREATE_ERROR;
- }
- content = g_mime_data_wrapper_new_with_stream(stream,
- GMIME_CONTENT_ENCODING_DEFAULT);
- g_object_unref(stream);
- g_mime_part_set_content_object(GMIME_PART(mime_part),
- content);
- g_object_unref(content);
- }
- g_strfreev(mime_type);
- } else if (body->buffer) {
+ stream = libbalsa_vfs_create_stream(body->file_uri, 0, FALSE, &err);
+ if (!stream) {
+ if (err != NULL) {
+ gchar *msg =
+ err->message
+ ? g_strdup_printf(_("Cannot read %s: %s"),
+ libbalsa_vfs_get_uri_utf8(body->file_uri),
+ err->message)
+ : g_strdup_printf(_("Cannot read %s"),
+ libbalsa_vfs_get_uri_utf8(body->file_uri));
+ g_set_error(error, err->domain, err->code, "%s", msg);
+ g_clear_error(&err);
+ g_free(msg);
+ }
+ g_object_unref(G_OBJECT(mime_part));
+ return LIBBALSA_MESSAGE_CREATE_ERROR;
+ }
+ content = g_mime_data_wrapper_new_with_stream(stream,
+ GMIME_CONTENT_ENCODING_DEFAULT);
+ g_object_unref(stream);
+ g_mime_part_set_content_object(GMIME_PART(mime_part),
+ content);
+ g_object_unref(content);
+ }
+ g_strfreev(mime_type);
+ } else if (body->buffer != NULL) {
#ifdef HAVE_GPGME
guint use_gpg_mode;
LibBalsaMsgCreateResult crypt_res = LIBBALSA_MESSAGE_CREATE_OK;
- /* in '2440 mode, touch *only* the first body! */
- if (!postponing && body == body->message->body_list &&
- message->gpg_mode > 0 &&
- (message->gpg_mode & LIBBALSA_PROTECT_OPENPGP) != 0)
+ /* in '2440 mode, touch *only* the first body! */
+ if (!postponing && (body == body->message->body_list) &&
+ (message->gpg_mode > 0) &&
+ ((message->gpg_mode & LIBBALSA_PROTECT_OPENPGP) != 0)) {
use_gpg_mode = message->gpg_mode;
- else
+ } else {
use_gpg_mode = 0;
+ }
mime_part = add_mime_body_plain(body, flow, postponing, use_gpg_mode,
&crypt_res, error);
if (!mime_part) {
- if (mime_root)
+ if (mime_root != NULL) {
g_object_unref(G_OBJECT(mime_root));
+ }
return crypt_res;
}
#else
mime_part = add_mime_body_plain(body, flow, postponing);
#endif /* HAVE_GPGME */
- }
+ }
- if (mime_root) {
- g_mime_multipart_add(GMIME_MULTIPART(mime_root),
- GMIME_OBJECT(mime_part));
- g_object_unref(G_OBJECT(mime_part));
- } else {
- mime_root = mime_part;
- }
+ if (mime_root != NULL) {
+ g_mime_multipart_add(GMIME_MULTIPART(mime_root),
+ GMIME_OBJECT(mime_part));
+ g_object_unref(G_OBJECT(mime_part));
+ } else {
+ mime_root = mime_part;
+ }
- body = body->next;
+ body = body->next;
}
#ifdef HAVE_GPGME
- if (message->body_list != NULL && !postponing) {
- LibBalsaMsgCreateResult crypt_res =
- do_multipart_crypto(message, &mime_root, parent, error);
- if (crypt_res != LIBBALSA_MESSAGE_CREATE_OK)
- return crypt_res;
+ if ((message->body_list != NULL) && !postponing) {
+ LibBalsaMsgCreateResult crypt_res =
+ do_multipart_crypto(message, &mime_root, parent, error);
+ if (crypt_res != LIBBALSA_MESSAGE_CREATE_OK) {
+ return crypt_res;
+ }
}
#endif
-
+
mime_message = g_mime_message_new(TRUE);
- if (mime_root) {
- GList *param = message->parameters;
-
- while (param) {
- gchar **vals = (gchar **)param->data;
-
- g_mime_object_set_content_type_parameter(GMIME_OBJECT(mime_root),
- vals[0], vals[1]);
- param = param->next;
- }
- g_mime_message_set_mime_part(mime_message, mime_root);
- g_object_unref(G_OBJECT(mime_root));
+ if (mime_root != NULL) {
+ GList *param = message->parameters;
+
+ while (param != NULL) {
+ gchar **vals = (gchar **)param->data;
+
+ g_mime_object_set_content_type_parameter(GMIME_OBJECT(mime_root),
+ vals[0], vals[1]);
+ param = param->next;
+ }
+ g_mime_message_set_mime_part(mime_message, mime_root);
+ g_object_unref(G_OBJECT(mime_root));
}
message_add_references(message, mime_message);
- if (message->headers->from) {
- tmp = internet_address_list_to_string(message->headers->from,
- TRUE);
- if (tmp) {
- g_mime_message_set_sender(mime_message, tmp);
- g_free(tmp);
- }
+ if (message->headers->from != NULL) {
+ tmp = internet_address_list_to_string(message->headers->from,
+ TRUE);
+ if (tmp != NULL) {
+ g_mime_message_set_sender(mime_message, tmp);
+ g_free(tmp);
+ }
}
- if (message->headers->reply_to) {
- tmp = internet_address_list_to_string(message->headers->reply_to,
- TRUE);
- if (tmp) {
- g_mime_message_set_reply_to(mime_message, tmp);
- g_free(tmp);
- }
+ if (message->headers->reply_to != NULL) {
+ tmp = internet_address_list_to_string(message->headers->reply_to,
+ TRUE);
+ if (tmp != NULL) {
+ g_mime_message_set_reply_to(mime_message, tmp);
+ g_free(tmp);
+ }
}
- if (LIBBALSA_MESSAGE_GET_SUBJECT(message))
- g_mime_message_set_subject(mime_message,
- LIBBALSA_MESSAGE_GET_SUBJECT(message));
+ if (LIBBALSA_MESSAGE_GET_SUBJECT(message)) {
+ g_mime_message_set_subject(mime_message,
+ LIBBALSA_MESSAGE_GET_SUBJECT(message));
+ }
g_mime_message_set_date(mime_message, message->headers->date,
get_tz_offset(message->headers->date));
@@ -1209,19 +1320,19 @@ libbalsa_message_create_mime_message(LibBalsaMessage* message, gboolean flow,
internet_address_list_append(recipients, ia_list);
}
- if (message->headers->dispnotify_to) {
+ if (message->headers->dispnotify_to != NULL) {
tmp = internet_address_list_to_string(message->headers->dispnotify_to, TRUE);
- if (tmp) {
- g_mime_object_append_header(GMIME_OBJECT(mime_message),
- "Disposition-Notification-To", tmp);
- g_free(tmp);
- }
+ if (tmp != NULL) {
+ g_mime_object_append_header(GMIME_OBJECT(mime_message),
+ "Disposition-Notification-To", tmp);
+ g_free(tmp);
+ }
}
for (list = message->headers->user_hdrs; list; list = list->next) {
- gchar **pair = list->data;
- g_strchug(pair[1]);
- g_mime_object_append_header(GMIME_OBJECT(mime_message), pair[0], pair[1]);
+ gchar **pair = list->data;
+ g_strchug(pair[1]);
+ g_mime_object_append_header(GMIME_OBJECT(mime_message), pair[0], pair[1]);
#if DEBUG_USER_HEADERS
printf("adding header '%s:%s'\n", pair[0], pair[1]);
#endif
@@ -1236,6 +1347,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage* message, gboolean flow,
return LIBBALSA_MESSAGE_CREATE_OK;
}
+
/* When we postpone a message in the compose window, we lose track of
* the message we were replying to. We *could* save some identifying
* information in a dummy header, but it could still be hard to track it
@@ -1243,24 +1355,27 @@ libbalsa_message_create_mime_message(LibBalsaMessage* message, gboolean flow,
* now, we'll just let it go...
*/
gboolean
-libbalsa_message_postpone(LibBalsaMessage * message,
- LibBalsaMailbox * draftbox,
- LibBalsaMessage * reply_message,
- gchar ** extra_headers, gboolean flow,
- GError **error)
+libbalsa_message_postpone(LibBalsaMessage *message,
+ LibBalsaMailbox *draftbox,
+ LibBalsaMessage *reply_message,
+ gchar **extra_headers,
+ gboolean flow,
+ GError **error)
{
if (!message->mime_msg
- && libbalsa_message_create_mime_message(message, flow,
- TRUE, error) !=
- LIBBALSA_MESSAGE_CREATE_OK)
+ && (libbalsa_message_create_mime_message(message, flow,
+ TRUE, error) !=
+ LIBBALSA_MESSAGE_CREATE_OK)) {
return FALSE;
+ }
- if (extra_headers) {
- gint i;
+ if (extra_headers != NULL) {
+ gint i;
- for (i = 0; extra_headers[i] && extra_headers[i + 1]; i += 2)
- g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), extra_headers[i],
- extra_headers[i + 1]);
+ for (i = 0; extra_headers[i] && extra_headers[i + 1]; i += 2) {
+ g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), extra_headers[i],
+ extra_headers[i + 1]);
+ }
}
return libbalsa_message_copy(message, draftbox, error);
@@ -1270,27 +1385,27 @@ libbalsa_message_postpone(LibBalsaMessage * message,
static inline gchar
base32_char(guint8 val)
{
- val &= 0x1f;
- if (val <= 25) {
- return val + 'A';
- } else {
- return val + '2' - 26;
- }
+ val &= 0x1f;
+ if (val <= 25) {
+ return val + 'A';
+ } else {
+ return val + '2' - 26;
+ }
}
/* Create a message-id and set it on the mime message.
*/
static void
-libbalsa_set_message_id(GMimeMessage * mime_message)
+libbalsa_set_message_id(GMimeMessage *mime_message)
{
- static GMutex mutex; /* as to make me thread-safe... */
+ static GMutex mutex; /* as to make me thread-safe... */
static GRand *rand = NULL;
static struct {
- gint64 now_monotonic;
- gdouble randval;
- char user_name[16];
- char host_name[16];
+ gint64 now_monotonic;
+ gdouble randval;
+ char user_name[16];
+ char host_name[16];
} id_data;
GHmac *msg_id_hash;
guint8 buffer[32];
@@ -1301,11 +1416,11 @@ libbalsa_set_message_id(GMimeMessage * mime_message)
g_mutex_lock(&mutex);
if (rand == NULL) {
- /* initialise some stuff on first-time use... */
- rand = g_rand_new_with_seed((guint32) time(NULL));
- strncpy(id_data.user_name, g_get_user_name(),
+ /* initialise some stuff on first-time use... */
+ rand = g_rand_new_with_seed((guint32) time(NULL));
+ strncpy(id_data.user_name, g_get_user_name(),
sizeof(id_data.user_name));
- strncpy(id_data.host_name, g_get_host_name(),
+ strncpy(id_data.host_name, g_get_host_name(),
sizeof(id_data.host_name));
}
@@ -1325,41 +1440,45 @@ libbalsa_set_message_id(GMimeMessage * mime_message)
/* create a msg id string as base32-encoded string from the first
* 30 bytes of the hashed result, and separate the groups by '.'
* or '@' */
- message_id = dst = g_malloc0(54U); /* = (32 / 5) * 9 */
+ message_id = dst = g_malloc0(54U); /* = (32 / 5) * 9 */
src = buffer;
- while (buflen >= 5U) {
- *dst++ = base32_char(src[0] >> 3);
- *dst++ = base32_char((src[0] << 2) + (src[1] >> 6));
- *dst++ = base32_char(src[1] >> 1);
- *dst++ = base32_char((src[1] << 4) + (src[2] >> 4));
- *dst++ = base32_char((src[2] << 1) + (src[3] >> 7));
- *dst++ = base32_char(src[3] >> 2);
- *dst++ = base32_char((src[3] << 3) + (src[4] >> 5));
- *dst++ = base32_char(src[4]);
- src = &src[5];
- buflen -= 5U;
- if (dst == &message_id[(54U / 2U) - 1U]) {
- *dst++ = '@';
- } else if (buflen >= 5U) {
- *dst++ = '.';
- }
- }
+ while (buflen >= 5U) {
+ *dst++ = base32_char(src[0] >> 3);
+ *dst++ = base32_char((src[0] << 2) + (src[1] >> 6));
+ *dst++ = base32_char(src[1] >> 1);
+ *dst++ = base32_char((src[1] << 4) + (src[2] >> 4));
+ *dst++ = base32_char((src[2] << 1) + (src[3] >> 7));
+ *dst++ = base32_char(src[3] >> 2);
+ *dst++ = base32_char((src[3] << 3) + (src[4] >> 5));
+ *dst++ = base32_char(src[4]);
+ src = &src[5];
+ buflen -= 5U;
+ if (dst == &message_id[(54U / 2U) - 1U]) {
+ *dst++ = '@';
+ } else if (buflen >= 5U) {
+ *dst++ = '.';
+ }
+ }
g_mime_message_set_message_id(mime_message, message_id);
g_free(message_id);
}
+
/* balsa_create_msg:
copies message to msg.
-*/
+ */
static LibBalsaMsgCreateResult
-libbalsa_create_msg(LibBalsaMessage * message, gboolean flow, GError ** error)
+libbalsa_create_msg(LibBalsaMessage *message,
+ gboolean flow,
+ GError **error)
{
if (!message->mime_msg) {
- LibBalsaMsgCreateResult res =
- libbalsa_message_create_mime_message(message, flow,
- FALSE, error);
- if (res != LIBBALSA_MESSAGE_CREATE_OK)
- return res;
+ LibBalsaMsgCreateResult res =
+ libbalsa_message_create_mime_message(message, flow,
+ FALSE, error);
+ if (res != LIBBALSA_MESSAGE_CREATE_OK) {
+ return res;
+ }
}
libbalsa_set_message_id(message->mime_msg);
@@ -1367,51 +1486,53 @@ libbalsa_create_msg(LibBalsaMessage * message, gboolean flow, GError ** error)
return LIBBALSA_MESSAGE_CREATE_OK;
}
+
static LibBalsaMsgCreateResult
-libbalsa_fill_msg_queue_item_from_queu(LibBalsaMessage * message, MessageQueueItem *mqi)
+libbalsa_fill_msg_queue_item_from_queu(LibBalsaMessage *message,
+ MessageQueueItem *mqi)
{
- GMimeStream *msg_stream;
- LibBalsaMsgCreateResult result = LIBBALSA_MESSAGE_CREATE_ERROR;
-
- mqi->orig = message;
- if (message->mime_msg != NULL) {
- msg_stream = g_mime_stream_mem_new();
- libbalsa_mailbox_lock_store(message->mailbox);
- g_mime_object_write_to_stream(GMIME_OBJECT(message->mime_msg), msg_stream);
- libbalsa_mailbox_unlock_store(message->mailbox);
- g_mime_stream_reset(msg_stream);
- } else {
- msg_stream = libbalsa_message_stream(message);
- }
-
- if (msg_stream != NULL) {
- GMimeStream *filter_stream;
- GMimeFilter *filter;
-
- filter_stream = g_mime_stream_filter_new(msg_stream);
-
- /* filter out unwanted headers */
- filter = g_mime_filter_header_new();
- g_mime_stream_filter_add(GMIME_STREAM_FILTER(filter_stream), filter);
- g_object_unref(G_OBJECT(filter));
-
- /* add CRLF, encode dot */
- filter = g_mime_filter_crlf_new(TRUE, TRUE);
- g_mime_stream_filter_add(GMIME_STREAM_FILTER(filter_stream), filter);
- g_object_unref(G_OBJECT(filter));
-
- /* write to a new stream */
- mqi->stream = g_mime_stream_mem_new();
- g_mime_stream_write_to_stream(filter_stream, mqi->stream);
- g_object_unref(G_OBJECT(filter_stream));
- g_mime_stream_reset(mqi->stream);
- g_object_unref(G_OBJECT(msg_stream));
-
- g_object_ref(G_OBJECT(mqi->orig));
- result = LIBBALSA_MESSAGE_CREATE_OK;
- }
-
- return result;
+ GMimeStream *msg_stream;
+ LibBalsaMsgCreateResult result = LIBBALSA_MESSAGE_CREATE_ERROR;
+
+ mqi->orig = message;
+ if (message->mime_msg != NULL) {
+ msg_stream = g_mime_stream_mem_new();
+ libbalsa_mailbox_lock_store(message->mailbox);
+ g_mime_object_write_to_stream(GMIME_OBJECT(message->mime_msg), msg_stream);
+ libbalsa_mailbox_unlock_store(message->mailbox);
+ g_mime_stream_reset(msg_stream);
+ } else {
+ msg_stream = libbalsa_message_stream(message);
+ }
+
+ if (msg_stream != NULL) {
+ GMimeStream *filter_stream;
+ GMimeFilter *filter;
+
+ filter_stream = g_mime_stream_filter_new(msg_stream);
+
+ /* filter out unwanted headers */
+ filter = g_mime_filter_header_new();
+ g_mime_stream_filter_add(GMIME_STREAM_FILTER(filter_stream), filter);
+ g_object_unref(G_OBJECT(filter));
+
+ /* add CRLF, encode dot */
+ filter = g_mime_filter_crlf_new(TRUE, TRUE);
+ g_mime_stream_filter_add(GMIME_STREAM_FILTER(filter_stream), filter);
+ g_object_unref(G_OBJECT(filter));
+
+ /* write to a new stream */
+ mqi->stream = g_mime_stream_mem_new();
+ g_mime_stream_write_to_stream(filter_stream, mqi->stream);
+ g_object_unref(G_OBJECT(filter_stream));
+ g_mime_stream_reset(mqi->stream);
+ g_object_unref(G_OBJECT(msg_stream));
+
+ g_object_ref(G_OBJECT(mqi->orig));
+ result = LIBBALSA_MESSAGE_CREATE_OK;
+ }
+
+ return result;
}
@@ -1422,163 +1543,187 @@ lb_send_from(LibBalsaMessage *message)
InternetAddress *ia =
internet_address_list_get_address(message->headers->from, 0);
- if (message->force_key_id)
+ if (message->force_key_id != NULL) {
return message->force_key_id;
-
- while (INTERNET_ADDRESS_IS_GROUP(ia))
+ }
+
+ while (INTERNET_ADDRESS_IS_GROUP(ia)) {
ia = internet_address_list_get_address(((InternetAddressGroup *)
ia)->members, 0);
+ }
return ((InternetAddressMailbox *) ia)->addr;
}
+
static LibBalsaMsgCreateResult
-libbalsa_create_rfc2440_buffer(LibBalsaMessage *message, GMimePart *mime_part,
- GtkWindow * parent, GError ** error)
+libbalsa_create_rfc2440_buffer(LibBalsaMessage *message,
+ GMimePart *mime_part,
+ GtkWindow *parent,
+ GError **error)
{
gint mode = message->gpg_mode;
gboolean always_trust = (mode & LIBBALSA_PROTECT_ALWAYS_TRUST) != 0;
- switch (mode & LIBBALSA_PROTECT_MODE)
- {
- case LIBBALSA_PROTECT_SIGN: /* sign only */
- if (!libbalsa_rfc2440_sign_encrypt(mime_part,
- lb_send_from(message),
- NULL, FALSE,
- parent, error))
- return LIBBALSA_MESSAGE_SIGN_ERROR;
- break;
- case LIBBALSA_PROTECT_ENCRYPT:
- case LIBBALSA_PROTECT_SIGN | LIBBALSA_PROTECT_ENCRYPT:
- {
- GList *encrypt_for = NULL;
- gboolean result;
-
- /* build a list containing the addresses of all to:, cc:
- and the from: address. Note: don't add bcc: addresses
- as they would be visible in the encrypted block. */
- encrypt_for = get_mailbox_names(encrypt_for,
- message->headers->to_list);
- encrypt_for = get_mailbox_names(encrypt_for,
- message->headers->cc_list);
- encrypt_for = get_mailbox_names(encrypt_for,
- message->headers->from);
- if (message->headers->bcc_list)
- libbalsa_information
- (LIBBALSA_INFORMATION_WARNING,
- ngettext("This message will not be encrypted "
- "for the BCC: recipient.",
- "This message will not be encrypted "
- "for the BCC: recipients.",
- internet_address_list_length
- (message->headers->bcc_list)));
-
- if (mode & LIBBALSA_PROTECT_SIGN)
- result =
- libbalsa_rfc2440_sign_encrypt(mime_part,
- lb_send_from(message),
- encrypt_for,
- always_trust,
- parent, error);
- else
- result =
- libbalsa_rfc2440_sign_encrypt(mime_part,
- NULL,
- encrypt_for,
- always_trust,
- parent, error);
- g_list_foreach(encrypt_for, (GFunc) g_free, NULL);
- g_list_free(encrypt_for);
- if (!result)
- return LIBBALSA_MESSAGE_ENCRYPT_ERROR;
- }
- break;
- default:
- g_assert_not_reached();
- }
+ switch (mode & LIBBALSA_PROTECT_MODE) {
+ case LIBBALSA_PROTECT_SIGN: /* sign only */
+ if (!libbalsa_rfc2440_sign_encrypt(mime_part,
+ lb_send_from(message),
+ NULL, FALSE,
+ parent, error)) {
+ return LIBBALSA_MESSAGE_SIGN_ERROR;
+ }
+ break;
+
+ case LIBBALSA_PROTECT_ENCRYPT:
+ case LIBBALSA_PROTECT_SIGN | LIBBALSA_PROTECT_ENCRYPT:
+ {
+ GList *encrypt_for = NULL;
+ gboolean result;
+
+ /* build a list containing the addresses of all to:, cc:
+ and the from: address. Note: don't add bcc: addresses
+ as they would be visible in the encrypted block. */
+ encrypt_for = get_mailbox_names(encrypt_for,
+ message->headers->to_list);
+ encrypt_for = get_mailbox_names(encrypt_for,
+ message->headers->cc_list);
+ encrypt_for = get_mailbox_names(encrypt_for,
+ message->headers->from);
+ if (message->headers->bcc_list != NULL) {
+ libbalsa_information
+ (LIBBALSA_INFORMATION_WARNING,
+ ngettext("This message will not be encrypted "
+ "for the BCC: recipient.",
+ "This message will not be encrypted "
+ "for the BCC: recipients.",
+ internet_address_list_length
+ (message->headers->bcc_list)));
+ }
+
+ if (mode & LIBBALSA_PROTECT_SIGN) {
+ result =
+ libbalsa_rfc2440_sign_encrypt(mime_part,
+ lb_send_from(message),
+ encrypt_for,
+ always_trust,
+ parent, error);
+ } else {
+ result =
+ libbalsa_rfc2440_sign_encrypt(mime_part,
+ NULL,
+ encrypt_for,
+ always_trust,
+ parent, error);
+ }
+ g_list_foreach(encrypt_for, (GFunc) g_free, NULL);
+ g_list_free(encrypt_for);
+ if (!result) {
+ return LIBBALSA_MESSAGE_ENCRYPT_ERROR;
+ }
+ }
+ break;
+
+ default:
+ g_assert_not_reached();
+ }
return LIBBALSA_MESSAGE_CREATE_OK;
}
-
-
+
+
/* handle rfc2633 and rfc3156 signing and/or encryption of a message */
static LibBalsaMsgCreateResult
-do_multipart_crypto(LibBalsaMessage * message, GMimeObject ** mime_root,
- GtkWindow * parent, GError ** error)
+do_multipart_crypto(LibBalsaMessage *message,
+ GMimeObject **mime_root,
+ GtkWindow *parent,
+ GError **error)
{
gpgme_protocol_t protocol;
gboolean always_trust;
/* check if we shall do any protection */
- if (!(message->gpg_mode & LIBBALSA_PROTECT_MODE))
- return LIBBALSA_MESSAGE_CREATE_OK;
+ if (!(message->gpg_mode & LIBBALSA_PROTECT_MODE)) {
+ return LIBBALSA_MESSAGE_CREATE_OK;
+ }
/* check which protocol should be used */
- if (message->gpg_mode & LIBBALSA_PROTECT_RFC3156)
- protocol = GPGME_PROTOCOL_OpenPGP;
-#ifdef HAVE_SMIME
- else if (message->gpg_mode & LIBBALSA_PROTECT_SMIMEV3)
- protocol = GPGME_PROTOCOL_CMS;
-#endif
- else if (message->gpg_mode & LIBBALSA_PROTECT_OPENPGP)
- return LIBBALSA_MESSAGE_CREATE_OK; /* already done... */
- else
- return LIBBALSA_MESSAGE_ENCRYPT_ERROR; /* hmmm.... */
+ if (message->gpg_mode & LIBBALSA_PROTECT_RFC3156) {
+ protocol = GPGME_PROTOCOL_OpenPGP;
+ }
+# ifdef HAVE_SMIME
+ else if (message->gpg_mode & LIBBALSA_PROTECT_SMIMEV3) {
+ protocol = GPGME_PROTOCOL_CMS;
+ }
+# endif
+ else if (message->gpg_mode & LIBBALSA_PROTECT_OPENPGP) {
+ return LIBBALSA_MESSAGE_CREATE_OK; /* already done... */
+ } else {
+ return LIBBALSA_MESSAGE_ENCRYPT_ERROR; /* hmmm.... */
+ }
always_trust = (message->gpg_mode & LIBBALSA_PROTECT_ALWAYS_TRUST) != 0;
/* sign and/or encrypt */
- switch (message->gpg_mode & LIBBALSA_PROTECT_MODE)
- {
- case LIBBALSA_PROTECT_SIGN: /* sign message */
- if (!libbalsa_sign_mime_object(mime_root,
- lb_send_from(message),
- protocol, parent, error))
- return LIBBALSA_MESSAGE_SIGN_ERROR;
- break;
- case LIBBALSA_PROTECT_ENCRYPT:
- case LIBBALSA_PROTECT_ENCRYPT | LIBBALSA_PROTECT_SIGN:
- {
- GList *encrypt_for = NULL;
- gboolean success;
-
- /* build a list containing the addresses of all to:, cc:
- and the from: address. Note: don't add bcc: addresses
- as they would be visible in the encrypted block. */
- encrypt_for = get_mailbox_names(encrypt_for,
- message->headers->to_list);
- encrypt_for = get_mailbox_names(encrypt_for,
- message->headers->cc_list);
- encrypt_for = g_list_append(encrypt_for,
- g_strdup(lb_send_from(message)));
- if (message->headers->bcc_list
- && internet_address_list_length(message->headers->
- bcc_list) > 0)
- libbalsa_information(LIBBALSA_INFORMATION_WARNING,
- _("This message will not be encrypted for the BCC: recipient(s)."));
-
- if (message->gpg_mode & LIBBALSA_PROTECT_SIGN)
- success =
- libbalsa_sign_encrypt_mime_object(mime_root,
- lb_send_from(message),
- encrypt_for, protocol,
- always_trust, parent,
- error);
- else
- success =
- libbalsa_encrypt_mime_object(mime_root, encrypt_for,
- protocol, always_trust,
- parent, error);
- g_list_free(encrypt_for);
-
- if (!success)
- return LIBBALSA_MESSAGE_ENCRYPT_ERROR;
- break;
- }
- default:
- g_error("illegal gpg_mode %d (" __FILE__ " line %d)",
- message->gpg_mode, __LINE__);
- }
+ switch (message->gpg_mode & LIBBALSA_PROTECT_MODE) {
+ case LIBBALSA_PROTECT_SIGN: /* sign message */
+ if (!libbalsa_sign_mime_object(mime_root,
+ lb_send_from(message),
+ protocol, parent, error)) {
+ return LIBBALSA_MESSAGE_SIGN_ERROR;
+ }
+ break;
+
+ case LIBBALSA_PROTECT_ENCRYPT:
+ case LIBBALSA_PROTECT_ENCRYPT | LIBBALSA_PROTECT_SIGN:
+ {
+ GList *encrypt_for = NULL;
+ gboolean success;
+
+ /* build a list containing the addresses of all to:, cc:
+ and the from: address. Note: don't add bcc: addresses
+ as they would be visible in the encrypted block. */
+ encrypt_for = get_mailbox_names(encrypt_for,
+ message->headers->to_list);
+ encrypt_for = get_mailbox_names(encrypt_for,
+ message->headers->cc_list);
+ encrypt_for = g_list_append(encrypt_for,
+ g_strdup(lb_send_from(message)));
+ if (message->headers->bcc_list
+ && (internet_address_list_length(message->headers->
+ bcc_list) > 0)) {
+ libbalsa_information(LIBBALSA_INFORMATION_WARNING,
+ _(
+ "This message will not be encrypted for the BCC: recipient(s)."));
+ }
+
+ if (message->gpg_mode & LIBBALSA_PROTECT_SIGN) {
+ success =
+ libbalsa_sign_encrypt_mime_object(mime_root,
+ lb_send_from(message),
+ encrypt_for, protocol,
+ always_trust, parent,
+ error);
+ } else {
+ success =
+ libbalsa_encrypt_mime_object(mime_root, encrypt_for,
+ protocol, always_trust,
+ parent, error);
+ }
+ g_list_free(encrypt_for);
+
+ if (!success) {
+ return LIBBALSA_MESSAGE_ENCRYPT_ERROR;
+ }
+ break;
+ }
+
+ default:
+ g_error("illegal gpg_mode %d (" __FILE__ " line %d)",
+ message->gpg_mode, __LINE__);
+ }
return LIBBALSA_MESSAGE_CREATE_OK;
}
+
+
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]