[balsa] message: Declare it final
- From: Peter Bloomfield <peterb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [balsa] message: Declare it final
- Date: Thu, 11 Jul 2019 17:34:10 +0000 (UTC)
commit 76e30816ef7d33bc12924bf015d79d443a8c4ffe
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date: Thu Jul 11 13:32:26 2019 -0400
message: Declare it final
Use G_DECLARE_FINAL_TYPE to declare LibBalsaMessage, make it
private, and provide necessary getters and setters.
* libbalsa/autocrypt.c (autocrypt_from_message):
* libbalsa/body.c (libbalsa_message_body_set_text_rfc822headers),
(libbalsa_message_body_get_part_stream),
(libbalsa_message_body_get_message_part_stream),
(libbalsa_message_body_get_stream),
(libbalsa_message_body_get_content),
(libbalsa_message_body_get_pixbuf),
(libbalsa_message_body_save_stream):
* libbalsa/filter.c (libbalsa_condition_matches),
(libbalsa_condition_can_match):
* libbalsa/mailbox.c (get_from_field),
(lbm_index_entry_populate_from_msg),
(libbalsa_mailbox_real_release_message),
(libbalsa_mailbox_release_message),
(libbalsa_mailbox_set_msg_headers),
(libbalsa_mailbox_get_message_part), (lbm_get_mime_msg),
(lbm_try_reassemble):
* libbalsa/mailbox_imap.c (lbimap_update_flags), (imap_flags_cb),
(imap_expunge_cb), (free_messages_info),
(libbalsa_mailbox_imap_load_envelope),
(libbalsa_mailbox_imap_get_message), (get_struct_from_cache),
(libbalsa_mailbox_imap_fetch_structure),
(libbalsa_mailbox_imap_fetch_headers), (get_section_for),
(lbm_imap_get_msg_part_from_cache):
* libbalsa/mailbox_local.c (lbm_local_get_message_with_msg_info),
(message_match_real), (libbalsa_mailbox_local_cache_message),
(libbalsa_mailbox_local_fetch_structure),
(libbalsa_mailbox_local_fetch_headers),
(libbalsa_mailbox_local_messages_change_flags):
* libbalsa/mailbox_maildir.c (libbalsa_mailbox_maildir_check),
(free_message_info), (libbalsa_mailbox_maildir_sync),
(libbalsa_mailbox_maildir_fetch_message_structure):
* libbalsa/mailbox_mbox.c (parse_mailbox), (free_message_info),
(libbalsa_mailbox_mbox_sync),
(libbalsa_mailbox_mbox_fetch_message_structure),
(lbm_mbox_add_message):
* libbalsa/mailbox_mh.c (lbm_mh_free_message_info),
(libbalsa_mailbox_mh_check), (libbalsa_mailbox_mh_sync),
(libbalsa_mailbox_mh_fetch_message_structure):
* libbalsa/message.c (libbalsa_message_class_init),
(libbalsa_message_dispose), (libbalsa_message_finalize),
(lb_message_headers_extra_destroy),
(libbalsa_message_headers_destroy),
(libbalsa_message_body_charset),
(libbalsa_message_header_get_helper),
ChangeLog | 145 +++++
libbalsa/autocrypt.c | 37 +-
libbalsa/body.c | 39 +-
libbalsa/filter.c | 43 +-
libbalsa/mailbox.c | 92 +--
libbalsa/mailbox_imap.c | 184 +++---
libbalsa/mailbox_local.c | 78 ++-
libbalsa/mailbox_maildir.c | 26 +-
libbalsa/mailbox_mbox.c | 48 +-
libbalsa/mailbox_mh.c | 38 +-
libbalsa/message.c | 1270 ++++++++++++++++++++++++++-----------
libbalsa/message.h | 232 +++----
libbalsa/rfc3156.c | 14 +-
libbalsa/send.c | 217 ++++---
libbalsa/source-viewer.c | 18 +-
src/balsa-message.c | 151 +++--
src/balsa-mime-widget-message.c | 8 +-
src/balsa-mime-widget-text.c | 2 +-
src/balsa-mime-widget-vcalendar.c | 40 +-
src/balsa-mime-widget.c | 2 +-
src/balsa-print-object-header.c | 6 +-
src/main-window.c | 5 +-
src/message-window.c | 41 +-
src/print-gtk.c | 9 +-
src/sendmsg-window.c | 243 ++++---
src/store-address.c | 13 +-
26 files changed, 1932 insertions(+), 1069 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 2158d7b4f..6eeaa5ca3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,148 @@
+2019-07-11 Peter Bloomfield <pbloomfield bellsouth net>
+
+ message: Declare it final
+
+ Use G_DECLARE_FINAL_TYPE to declare LibBalsaMessage, make it
+ private, and provide necessary getters and setters.
+
+ * libbalsa/autocrypt.c (autocrypt_from_message):
+ * libbalsa/body.c (libbalsa_message_body_set_text_rfc822headers),
+ (libbalsa_message_body_get_part_stream),
+ (libbalsa_message_body_get_message_part_stream),
+ (libbalsa_message_body_get_stream),
+ (libbalsa_message_body_get_content),
+ (libbalsa_message_body_get_pixbuf),
+ (libbalsa_message_body_save_stream):
+ * libbalsa/filter.c (libbalsa_condition_matches),
+ (libbalsa_condition_can_match):
+ * libbalsa/mailbox.c (get_from_field),
+ (lbm_index_entry_populate_from_msg),
+ (libbalsa_mailbox_real_release_message),
+ (libbalsa_mailbox_release_message),
+ (libbalsa_mailbox_set_msg_headers),
+ (libbalsa_mailbox_get_message_part), (lbm_get_mime_msg),
+ (lbm_try_reassemble):
+ * libbalsa/mailbox_imap.c (lbimap_update_flags), (imap_flags_cb),
+ (imap_expunge_cb), (free_messages_info),
+ (libbalsa_mailbox_imap_load_envelope),
+ (libbalsa_mailbox_imap_get_message), (get_struct_from_cache),
+ (libbalsa_mailbox_imap_fetch_structure),
+ (libbalsa_mailbox_imap_fetch_headers), (get_section_for),
+ (lbm_imap_get_msg_part_from_cache):
+ * libbalsa/mailbox_local.c (lbm_local_get_message_with_msg_info),
+ (message_match_real), (libbalsa_mailbox_local_cache_message),
+ (libbalsa_mailbox_local_fetch_structure),
+ (libbalsa_mailbox_local_fetch_headers),
+ (libbalsa_mailbox_local_messages_change_flags):
+ * libbalsa/mailbox_maildir.c (libbalsa_mailbox_maildir_check),
+ (free_message_info), (libbalsa_mailbox_maildir_sync),
+ (libbalsa_mailbox_maildir_fetch_message_structure):
+ * libbalsa/mailbox_mbox.c (parse_mailbox), (free_message_info),
+ (libbalsa_mailbox_mbox_sync),
+ (libbalsa_mailbox_mbox_fetch_message_structure),
+ (lbm_mbox_add_message):
+ * libbalsa/mailbox_mh.c (lbm_mh_free_message_info),
+ (libbalsa_mailbox_mh_check), (libbalsa_mailbox_mh_sync),
+ (libbalsa_mailbox_mh_fetch_message_structure):
+ * libbalsa/message.c (libbalsa_message_class_init),
+ (libbalsa_message_dispose), (libbalsa_message_finalize),
+ (lb_message_headers_extra_destroy),
+ (libbalsa_message_headers_destroy),
+ (libbalsa_message_body_charset),
+ (libbalsa_message_header_get_helper),
+ (libbalsa_message_find_user_hdr),
+ (libbalsa_message_header_get_one),
+ (libbalsa_message_header_get_all),
+ (libbalsa_message_get_user_header),
+ (libbalsa_message_set_user_header), (prepend_header_misc),
+ (libbalsa_message_user_hdrs_from_gmime),
+ (libbalsa_message_get_part_by_id), (libbalsa_message_save),
+ (libbalsa_message_get_attach_icon), (libbalsa_message_reply),
+ (libbalsa_message_body_ref), (libbalsa_message_body_unref),
+ (libbalsa_message_is_multipart), (libbalsa_message_is_partial),
+ (has_attached_part), (libbalsa_message_has_attachment),
+ (libbalsa_message_get_subject), (libbalsa_message_get_lines),
+ (libbalsa_message_get_length), (lb_message_recipients),
+ (lb_message_headers_basic_from_gmime),
+ (lb_message_headers_extra_from_gmime),
+ (libbalsa_message_init_from_gmime),
+ (libbalsa_message_refs_for_threading), (references_decode),
+ (libbalsa_message_set_references_from_string),
+ (libbalsa_message_set_in_reply_to_from_string), (lbmsg_set_header),
+ (lb_message_set_headers_from_string),
+ (libbalsa_message_load_envelope_from_stream),
+ (libbalsa_message_load_envelope), (libbalsa_message_stream),
+ (libbalsa_message_copy), (libbalsa_message_set_subject),
+ (libbalsa_message_set_subject_from_header),
+ (libbalsa_message_get_tempdir), (libbalsa_message_get_mailbox),
+ (libbalsa_message_get_headers), (libbalsa_message_get_body_list),
+ (libbalsa_message_get_mime_message), (libbalsa_message_get_flags),
+ (libbalsa_message_get_message_id), (libbalsa_message_get_msgno),
+ (libbalsa_message_get_has_all_headers),
+ (libbalsa_message_get_sender), (libbalsa_message_get_request_dsn),
+ (libbalsa_message_get_references), (libbalsa_message_get_identity),
+ (libbalsa_message_get_parameters), (libbalsa_message_get_subtype),
+ (libbalsa_message_get_gpg_mode),
+ (libbalsa_message_get_in_reply_to),
+ (libbalsa_message_get_attach_pubkey),
+ (libbalsa_message_get_protect_state),
+ (libbalsa_message_get_body_ref), (libbalsa_message_set_flags),
+ (libbalsa_message_set_mailbox), (libbalsa_message_set_msgno),
+ (libbalsa_message_set_has_all_headers),
+ (libbalsa_message_set_length), (libbalsa_message_set_mime_message),
+ (libbalsa_message_set_sender), (libbalsa_message_set_message_id),
+ (libbalsa_message_set_protect_state),
+ (libbalsa_message_set_request_dsn), (libbalsa_message_set_subtype),
+ (libbalsa_message_set_body_list),
+ (libbalsa_message_set_references),
+ (libbalsa_message_set_in_reply_to),
+ (libbalsa_message_set_gpg_mode),
+ (libbalsa_message_set_attach_pubkey),
+ (libbalsa_message_set_identity), (libbalsa_message_add_parameters):
+ * libbalsa/message.h:
+ * libbalsa/rfc3156.c (libbalsa_body_check_signature),
+ (libbalsa_body_decrypt):
+ * libbalsa/send.c (lbs_message_queue_real),
+ (lbs_process_queue_msg), (balsa_send_message_success),
+ (balsa_send_message_error), (balsa_send_message_real),
+ (message_add_references), (libbalsa_message_create_mime_message),
+ (libbalsa_message_postpone), (libbalsa_create_msg),
+ (libbalsa_fill_msg_queue_item_from_queu), (lb_send_from),
+ (libbalsa_create_rfc2440_buffer), (do_multipart_crypto):
+ * libbalsa/source-viewer.c (lsv_escape_change_state),
+ (libbalsa_show_message_source):
+ * src/balsa-message.c (balsa_message_set),
+ (balsa_message_set_displayed_headers), (balsa_message_set_wrap),
+ (display_headers), (display_content), (handle_mdn_request),
+ (create_mdn_reply), (balsa_message_scan_signatures),
+ (libbalsa_msg_try_decrypt), (libbalsa_msg_part_2440),
+ (balsa_message_perform_crypto), (message_recheck_crypto_cb):
+ * src/balsa-mime-widget-message.c (extbody_send_mail):
+ * src/balsa-mime-widget-text.c (check_text_encoding):
+ * src/balsa-mime-widget-vcalendar.c
+ (balsa_mime_widget_new_vcalendar), (vevent_reply):
+ * src/balsa-mime-widget.c (balsa_mime_widget_new_unknown):
+ * src/balsa-print-object-header.c
+ (balsa_print_object_header_from_message):
+ * src/main-window.c (bw_index_changed_cb):
+ * src/message-window.c (message_window_idle_handler),
+ (mw_set_buttons_sensitive), (mw_expunged_cb), (mw_reply_activated),
+ (mw_reply_all_activated), (mw_reply_group_activated),
+ (mw_forward_attached_activated), (mw_forward_inline_activated),
+ (mw_forward_default_activated):
+ * src/print-gtk.c (begin_print):
+ * src/sendmsg-window.c (sw_delete_draft),
+ (balsa_sendmsg_destroy_handler), (update_bsmsg_identity),
+ (create_info_pane), (continue_body), (message_part_get_subject),
+ (quote_message_body), (fill_body_from_message),
+ (bsmsg_set_subject_from_body), (sw_save_draft),
+ (setup_headers_from_message), (set_identity_from_mailbox),
+ (guess_identity), (bsm_prepare_for_setup), (bsm_finish_setup),
+ (bsmsg2message), (check_autocrypt_recommendation),
+ (send_message_handler), (sendmsg_window_reply),
+ (sendmsg_window_forward), (sendmsg_window_continue):
+ * src/store-address.c (store_address_note_frame):
+
2019-07-11 Peter Bloomfield <pbloomfield bellsouth net>
Rename LIBBALSA_MAILBOX_REMOTE_SERVER() to
diff --git a/libbalsa/autocrypt.c b/libbalsa/autocrypt.c
index 739cd62aa..368f9c492 100644
--- a/libbalsa/autocrypt.c
+++ b/libbalsa/autocrypt.c
@@ -201,41 +201,46 @@ autocrypt_from_message(LibBalsaMessage *message,
{
const gchar *from_addr;
AutocryptData *autocrypt;
+ LibBalsaMessageHeaders *headers;
- g_return_if_fail(LIBBALSA_IS_MESSAGE(message) && (message->headers != NULL) &&
(message->headers->from != NULL) &&
- (message->headers->content_type != NULL) && (autocrypt_db != NULL));
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+ headers = libbalsa_message_get_headers(message);
+ g_return_if_fail(headers != NULL);
+ g_return_if_fail(headers->from != NULL);
+ g_return_if_fail(headers->content_type != NULL);
+ g_return_if_fail(autocrypt_db != NULL);
// FIXME - we should ignore spam - how can we detect it?
/* check for content types which shall be ignored
* Note: see Autocrypt Level 1 standard, section 2.3
(https://autocrypt.org/level1.html#updating-autocrypt-peer-state) for
* details about this and the following checks which may result in completely ignoring the
message. */
- if (autocrypt_ignore(message->headers->content_type)) {
- g_debug("ignore %s/%s", g_mime_content_type_get_media_type(message->headers->content_type),
- g_mime_content_type_get_media_subtype(message->headers->content_type));
+ if (autocrypt_ignore(headers->content_type)) {
+ g_debug("ignore %s/%s", g_mime_content_type_get_media_type(headers->content_type),
+ g_mime_content_type_get_media_subtype(headers->content_type));
return;
}
/* check for exactly one From: mailbox address - others shall be ignored */
- if ((internet_address_list_length(message->headers->from) != 1) ||
- !INTERNET_ADDRESS_IS_MAILBOX(internet_address_list_get_address(message->headers->from, 0))) {
+ if ((internet_address_list_length(headers->from) != 1) ||
+ !INTERNET_ADDRESS_IS_MAILBOX(internet_address_list_get_address(headers->from, 0))) {
g_debug("require exactly one From: address, ignored");
return;
}
/* ignore messages without a Date: header or with a date in the future */
- if ((message->headers->date == 0) || (message->headers->date > time(NULL))) {
+ if ((headers->date == 0) || (headers->date > time(NULL))) {
g_debug("no Date: header or value in the future, ignored");
return;
}
/* get the From: address (is a mailbox, checked above) */
from_addr =
-
internet_address_mailbox_get_addr(INTERNET_ADDRESS_MAILBOX(internet_address_list_get_address(message->headers->from,
0)));
- g_debug("message from '%s', date %ld", from_addr, message->headers->date);
+
internet_address_mailbox_get_addr(INTERNET_ADDRESS_MAILBOX(internet_address_list_get_address(headers->from,
0)));
+ g_debug("message from '%s', date %ld", from_addr, headers->date);
/* scan for Autocrypt headers */
- autocrypt = scan_autocrypt_headers(message->headers->user_hdrs, from_addr);
+ autocrypt = scan_autocrypt_headers(headers->user_hdrs, from_addr);
/* update the database */
G_LOCK(db_mutex);
@@ -244,19 +249,19 @@ autocrypt_from_message(LibBalsaMessage *message,
db_info = autocrypt_user_info(autocrypt->addr, error);
if (db_info != NULL) {
- if (message->headers->date > db_info->ac_timestamp) {
- add_or_update_user_info(autocrypt, message->headers->date, TRUE, error);
+ if (headers->date > db_info->ac_timestamp) {
+ add_or_update_user_info(autocrypt, headers->date, TRUE, error);
} else {
g_info("message timestamp %ld not newer than autocrypt db timestamp %ld, ignore
message",
- (long) message->headers->date, (long) db_info->ac_timestamp);
+ (long) headers->date, (long) db_info->ac_timestamp);
}
autocrypt_free(db_info);
} else {
- add_or_update_user_info(autocrypt, message->headers->date, FALSE, error);
+ add_or_update_user_info(autocrypt, headers->date, FALSE, error);
}
autocrypt_free(autocrypt);
} else {
- update_last_seen(from_addr, message->headers->date, error);
+ update_last_seen(from_addr, headers->date, error);
}
G_UNLOCK(db_mutex);
}
diff --git a/libbalsa/body.c b/libbalsa/body.c
index ffcd9738b..65be001bd 100644
--- a/libbalsa/body.c
+++ b/libbalsa/body.c
@@ -213,9 +213,11 @@ libbalsa_message_body_set_multipart(LibBalsaMessageBody * body,
static void
libbalsa_message_body_set_text_rfc822headers(LibBalsaMessageBody *body)
{
+ LibBalsaMailbox *mailbox;
GMimeStream *headers;
- libbalsa_mailbox_lock_store(body->message->mailbox);
+ mailbox = libbalsa_message_get_mailbox(body->message);
+ libbalsa_mailbox_lock_store(mailbox);
headers = libbalsa_message_body_get_stream(body, NULL);
if (headers != NULL) {
@@ -232,7 +234,7 @@ libbalsa_message_body_set_text_rfc822headers(LibBalsaMessageBody *body)
g_object_unref(dummy_msg);
}
- libbalsa_mailbox_unlock_store(body->message->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
}
static void
@@ -510,6 +512,8 @@ libbalsa_message_body_get_part_stream(LibBalsaMessageBody * body,
GMimeStream *stream_null;
GMimeStream *stream_filter;
GMimeFilter *filter_windows;
+ LibBalsaMailbox *mailbox;
+
stream_null = g_mime_stream_null_new();
stream_filter = g_mime_stream_filter_new(stream_null);
@@ -519,10 +523,11 @@ libbalsa_message_body_get_part_stream(LibBalsaMessageBody * body,
g_mime_stream_filter_add(GMIME_STREAM_FILTER(stream_filter),
filter_windows);
- libbalsa_mailbox_lock_store(body->message->mailbox);
+ mailbox = libbalsa_message_get_mailbox(body->message);
+ libbalsa_mailbox_lock_store(mailbox);
g_mime_stream_reset(stream);
g_mime_stream_write_to_stream(stream, stream_filter);
- libbalsa_mailbox_unlock_store(body->message->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
g_object_unref(stream_filter);
charset = g_mime_filter_windows_real_charset(GMIME_FILTER_WINDOWS
@@ -546,15 +551,17 @@ libbalsa_message_body_get_message_part_stream(LibBalsaMessageBody * body,
GError ** err)
{
GMimeStream *stream;
+ LibBalsaMailbox *mailbox;
ssize_t bytes_written;
GMimeMessage *msg = g_mime_message_part_get_message
(GMIME_MESSAGE_PART(body->mime_part));
stream = g_mime_stream_mem_new();
- libbalsa_mailbox_lock_store(body->message->mailbox);
+ mailbox = libbalsa_message_get_mailbox(body->message);
+ libbalsa_mailbox_lock_store(mailbox);
bytes_written =
g_mime_object_write_to_stream(GMIME_OBJECT(msg), stream);
- libbalsa_mailbox_unlock_store(body->message->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
printf("Written %ld bytes of embedded message\n",
(long) bytes_written);
@@ -576,7 +583,7 @@ libbalsa_message_body_get_stream(LibBalsaMessageBody * body, GError **err)
g_return_val_if_fail(body != NULL, NULL);
g_return_val_if_fail(body->message != NULL, NULL);
- if (!body->message->mailbox) {
+ if (libbalsa_message_get_mailbox(body->message) == NULL) {
if (err != NULL && *err == NULL) {
g_set_error(err, LIBBALSA_MAILBOX_ERROR,
LIBBALSA_MAILBOX_ACCESS_ERROR,
@@ -622,6 +629,7 @@ libbalsa_message_body_get_content(LibBalsaMessageBody * body, gchar ** buf,
{
GMimeStream *stream, *stream_mem;
GByteArray *array;
+ LibBalsaMailbox *mailbox;
gssize len;
g_return_val_if_fail(body != NULL, -1);
@@ -637,10 +645,11 @@ libbalsa_message_body_get_content(LibBalsaMessageBody * body, gchar ** buf,
stream_mem = g_mime_stream_mem_new_with_byte_array(array);
g_mime_stream_mem_set_owner(GMIME_STREAM_MEM(stream_mem), FALSE);
- libbalsa_mailbox_lock_store(body->message->mailbox);
+ mailbox = libbalsa_message_get_mailbox(body->message);
+ libbalsa_mailbox_lock_store(mailbox);
g_mime_stream_reset(stream);
len = g_mime_stream_write_to_stream(stream, stream_mem);
- libbalsa_mailbox_unlock_store(body->message->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
g_object_unref(stream);
g_object_unref(stream_mem);
@@ -664,6 +673,7 @@ GdkPixbuf *
libbalsa_message_body_get_pixbuf(LibBalsaMessageBody * body, GError ** err)
{
GMimeStream *stream;
+ LibBalsaMailbox *mailbox;
gchar *mime_type;
GdkPixbufLoader *loader;
GdkPixbuf *pixbuf = NULL;
@@ -672,7 +682,8 @@ libbalsa_message_body_get_pixbuf(LibBalsaMessageBody * body, GError ** err)
if (!stream)
return pixbuf;
- libbalsa_mailbox_lock_store(body->message->mailbox);
+ mailbox = libbalsa_message_get_mailbox(body->message);
+ libbalsa_mailbox_lock_store(mailbox);
g_mime_stream_reset(stream);
mime_type = libbalsa_message_body_get_mime_type(body);
@@ -706,7 +717,7 @@ libbalsa_message_body_get_pixbuf(LibBalsaMessageBody * body, GError ** err)
g_object_unref(loader);
}
- libbalsa_mailbox_unlock_store(body->message->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
g_object_unref(stream);
return pixbuf;
@@ -718,6 +729,7 @@ libbalsa_message_body_save_stream(LibBalsaMessageBody * body,
GError ** err)
{
GMimeStream *stream;
+ LibBalsaMailbox *mailbox;
ssize_t len;
stream = libbalsa_message_body_get_stream(body, err);
@@ -725,7 +737,8 @@ libbalsa_message_body_save_stream(LibBalsaMessageBody * body,
return FALSE;
g_clear_error(err);
- libbalsa_mailbox_lock_store(body->message->mailbox);
+ mailbox = libbalsa_message_get_mailbox(body->message);
+ libbalsa_mailbox_lock_store(mailbox);
if (stream) {
g_mime_stream_reset(stream);
@@ -742,7 +755,7 @@ libbalsa_message_body_save_stream(LibBalsaMessageBody * body,
/* body->mime_part is neither a GMimePart nor a GMimeMessagePart. */
len = g_mime_object_write_to_stream(body->mime_part, dest);
- libbalsa_mailbox_unlock_store(body->message->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
g_object_unref(dest);
if (len < 0)
diff --git a/libbalsa/filter.c b/libbalsa/filter.c
index 51e48d7c6..e85d36e09 100644
--- a/libbalsa/filter.c
+++ b/libbalsa/filter.c
@@ -104,13 +104,15 @@ gboolean
libbalsa_condition_matches(LibBalsaCondition* cond,
LibBalsaMessage * message)
{
+ LibBalsaMessageHeaders *headers;
gboolean match = FALSE;
gchar * str;
GString * body;
gboolean will_ref;
- g_return_val_if_fail(cond, FALSE);
- g_return_val_if_fail(message->headers != NULL, FALSE);
+ g_return_val_if_fail(cond != NULL, FALSE);
+ headers = libbalsa_message_get_headers(message);
+ g_return_val_if_fail(headers != NULL, FALSE);
switch (cond->type) {
case CONDITION_STRING:
@@ -128,20 +130,14 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
}
}
/* do the work */
- if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_TO)
- && message->headers->to_list) {
- str =
- internet_address_list_to_string(message->headers->to_list,
- FALSE);
- match=libbalsa_utf8_strstr(str,cond->match.string.string);
+ if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_TO) && headers->to_list != NULL) {
+ str = internet_address_list_to_string(headers->to_list, FALSE);
+ match = libbalsa_utf8_strstr(str,cond->match.string.string);
g_free(str);
if(match) break;
}
- if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_FROM)
- && message->headers->from) {
- str =
- internet_address_list_to_string(message->headers->from,
- FALSE);
+ if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_FROM) && headers->from != NULL) {
+ str = internet_address_list_to_string(headers->from, FALSE);
match=libbalsa_utf8_strstr(str,cond->match.string.string);
g_free(str);
if (match) break;
@@ -153,11 +149,8 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
break;
}
}
- if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_CC)
- && message->headers->cc_list) {
- str =
- internet_address_list_to_string(message->headers->cc_list,
- FALSE);
+ if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_CC) && headers->cc_list != NULL) {
+ str = internet_address_list_to_string(headers->cc_list, FALSE);
match=libbalsa_utf8_strstr(str,cond->match.string.string);
g_free(str);
if (match) break;
@@ -177,10 +170,10 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
}
}
if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_BODY)) {
- if (!message->mailbox)
+ if (libbalsa_message_get_mailbox(message) == NULL)
return FALSE; /* We don't want to match if an error occurred */
- body =
- content2reply(message->body_list, NULL, 0, FALSE, FALSE);
+ body = content2reply(libbalsa_message_get_body_list(message),
+ NULL, 0, FALSE, FALSE);
if (body) {
if (body->str)
match = libbalsa_utf8_strstr(body->str,
@@ -193,9 +186,9 @@ libbalsa_condition_matches(LibBalsaCondition* cond,
case CONDITION_REGEX:
break;
case CONDITION_DATE:
- match = message->headers->date>=cond->match.date.date_low
+ match = headers->date >= cond->match.date.date_low
&& (cond->match.date.date_high==0 ||
- message->headers->date<=cond->match.date.date_high);
+ headers->date <= cond->match.date.date_high);
break;
case CONDITION_FLAG:
match = LIBBALSA_MESSAGE_HAS_FLAG(message, cond->match.flags);
@@ -373,9 +366,9 @@ libbalsa_condition_can_match(LibBalsaCondition * cond,
switch (cond->type) {
case CONDITION_STRING:
return !(CONDITION_CHKMATCH(cond, CONDITION_MATCH_BODY)
- && message->body_list == NULL)
+ && libbalsa_message_get_body_list(message) == NULL)
&& !(CONDITION_CHKMATCH(cond, CONDITION_MATCH_US_HEAD)
- && message->mime_msg == NULL);
+ && libbalsa_message_get_mime_message(message) == NULL);
case CONDITION_AND:
case CONDITION_OR:
return libbalsa_condition_can_match(cond->match.andor.left,
diff --git a/libbalsa/mailbox.c b/libbalsa/mailbox.c
index 6d9152bc7..a273ba0ef 100644
--- a/libbalsa/mailbox.c
+++ b/libbalsa/mailbox.c
@@ -295,26 +295,26 @@ libbalsa_mailbox_dispose(GObject * object)
static gchar*
-get_from_field(LibBalsaMessage *message)
+get_from_field(LibBalsaMailbox *mailbox, LibBalsaMessage *message)
{
- LibBalsaMailbox *mailbox = message->mailbox;
LibBalsaMailboxPrivate *priv = libbalsa_mailbox_get_instance_private(mailbox);
+ LibBalsaMessageHeaders *headers;
InternetAddressList *address_list = NULL;
const gchar *name_str = NULL;
gboolean append_dots = FALSE;
gchar *from;
- g_return_val_if_fail(message->mailbox, NULL);
+ headers = libbalsa_message_get_headers(message);
- if (message->headers) {
+ if (headers != NULL) {
if (priv->view &&
priv->view->show == LB_MAILBOX_SHOW_TO)
- address_list = message->headers->to_list;
+ address_list = headers->to_list;
else
- address_list = message->headers->from;
+ address_list = headers->from;
}
- if (address_list) {
+ if (address_list != NULL) {
gint i, len = internet_address_list_length(address_list);
for (i = 0; i < len && name_str == NULL; i++) {
@@ -360,22 +360,25 @@ get_from_field(LibBalsaMessage *message)
static void
lbm_index_entry_populate_from_msg(LibBalsaMailboxIndexEntry * entry,
- LibBalsaMessage * msg)
+ LibBalsaMessage * message)
{
- entry->from = get_from_field(msg);
- entry->subject = g_strdup(LIBBALSA_MESSAGE_GET_SUBJECT(msg));
- entry->msg_date = msg->headers->date;
+ LibBalsaMailbox *mailbox = libbalsa_message_get_mailbox(message);
+
+ entry->from = get_from_field(mailbox, message);
+ entry->subject = g_strdup(LIBBALSA_MESSAGE_GET_SUBJECT(message));
+ entry->msg_date = libbalsa_message_get_headers(message)->date;
entry->internal_date = 0; /* FIXME */
- entry->status_icon = libbalsa_get_icon_from_flags(msg->flags);
- entry->attach_icon = libbalsa_message_get_attach_icon(msg);
- entry->size = msg->length;
+ entry->status_icon = libbalsa_get_icon_from_flags(libbalsa_message_get_flags(message));
+ entry->attach_icon = libbalsa_message_get_attach_icon(message);
+ entry->size = libbalsa_message_get_length(message);
entry->foreground = NULL;
entry->background = NULL;
entry->foreground_set = 0;
entry->background_set = 0;
- entry->unseen = LIBBALSA_MESSAGE_IS_UNREAD(msg);
+ entry->unseen = LIBBALSA_MESSAGE_IS_UNREAD(message);
entry->idle_pending = 0;
- libbalsa_mailbox_msgno_changed(msg->mailbox, msg->msgno);
+
+ libbalsa_mailbox_msgno_changed(mailbox, libbalsa_message_get_msgno(message));
}
static LibBalsaMailboxIndexEntry*
@@ -982,10 +985,7 @@ static void
libbalsa_mailbox_real_release_message(LibBalsaMailbox * mailbox,
LibBalsaMessage * message)
{
- if (message->mime_msg) {
- g_object_unref(message->mime_msg);
- message->mime_msg = NULL;
- }
+ libbalsa_message_set_mime_message(message, NULL);
}
struct MsgCopyData {
@@ -2057,10 +2057,9 @@ libbalsa_mailbox_release_message(LibBalsaMailbox * mailbox,
g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
g_return_if_fail(message != NULL);
g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
- g_return_if_fail(mailbox == message->mailbox);
+ g_return_if_fail(mailbox == libbalsa_message_get_mailbox(message));
- LIBBALSA_MAILBOX_GET_CLASS(mailbox)
- ->release_message(mailbox, message);
+ LIBBALSA_MAILBOX_GET_CLASS(mailbox)->release_message(mailbox, message);
}
void
@@ -2070,10 +2069,11 @@ libbalsa_mailbox_set_msg_headers(LibBalsaMailbox *mailbox,
g_return_if_fail(mailbox != NULL);
g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
g_return_if_fail(message != NULL);
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
- if(!message->has_all_headers) {
+ if(!libbalsa_message_get_has_all_headers(message)) {
LIBBALSA_MAILBOX_GET_CLASS(mailbox)->fetch_headers(mailbox, message);
- message->has_all_headers = 1;
+ libbalsa_message_set_has_all_headers(message, TRUE);
}
}
@@ -2082,13 +2082,16 @@ libbalsa_mailbox_get_message_part(LibBalsaMessage *message,
LibBalsaMessageBody *part,
GError **err)
{
- g_return_val_if_fail(message != NULL, FALSE);
- g_return_val_if_fail(message->mailbox != NULL, FALSE);
- g_return_val_if_fail(LIBBALSA_IS_MAILBOX(message->mailbox), FALSE);
+ LibBalsaMailbox *mailbox;
+
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
+
+ mailbox = libbalsa_message_get_mailbox(message);
+ g_return_val_if_fail(mailbox != NULL, FALSE);
+ g_return_val_if_fail(LIBBALSA_IS_MAILBOX(mailbox), FALSE);
g_return_val_if_fail(part != NULL, FALSE);
- return LIBBALSA_MAILBOX_GET_CLASS(message->mailbox)
- ->get_message_part(message, part, err);
+ return LIBBALSA_MAILBOX_GET_CLASS(mailbox)->get_message_part(message, part, err);
}
GMimeStream *
@@ -4177,28 +4180,32 @@ libbalsa_mailbox_set_msg_tree(LibBalsaMailbox * mailbox, GNode * new_tree)
}
static GMimeMessage *
-lbm_get_mime_msg(LibBalsaMailbox * mailbox, LibBalsaMessage * msg)
+lbm_get_mime_msg(LibBalsaMailbox * mailbox, LibBalsaMessage *message)
{
GMimeMessage *mime_msg;
- if (!msg->mime_msg)
- libbalsa_mailbox_fetch_message_structure(mailbox, msg,
+ mime_msg = libbalsa_message_get_mime_message(message);
+ if (mime_msg == NULL) {
+ libbalsa_mailbox_fetch_message_structure(mailbox, message,
LB_FETCH_RFC822_HEADERS);
- mime_msg = msg->mime_msg;
- if (mime_msg)
+ }
+ mime_msg = libbalsa_message_get_mime_message(message);
+
+ if (mime_msg != NULL) {
g_object_ref(mime_msg);
- else {
+ } else {
GMimeStream *stream;
GMimeParser *parser;
- stream = libbalsa_mailbox_get_message_stream(mailbox, msg->msgno,
+ stream = libbalsa_mailbox_get_message_stream(mailbox,
+ libbalsa_message_get_msgno(message),
TRUE);
parser = g_mime_parser_new_with_stream(stream);
g_object_unref(stream);
mime_msg = g_mime_parser_construct_message(parser);
g_object_unref(parser);
}
- libbalsa_mailbox_release_message(mailbox, msg);
+ libbalsa_mailbox_release_message(mailbox, message);
return mime_msg;
}
@@ -4316,16 +4323,21 @@ lbm_try_reassemble(LibBalsaMailbox * mailbox, const gchar * id)
}
if (partials->len == total) {
+ GMimeMessage *mime_message;
LibBalsaMessage *message = libbalsa_message_new();
- message->flags |= LIBBALSA_MESSAGE_FLAG_NEW;
+ libbalsa_message_set_flags(message, LIBBALSA_MESSAGE_FLAG_NEW);
libbalsa_information(LIBBALSA_INFORMATION_MESSAGE,
_("Reconstructing message"));
libbalsa_mailbox_lock_store(mailbox);
- message->mime_msg =
+
+ mime_message =
g_mime_message_partial_reconstruct_message((GMimeMessagePartial
**) partials->
pdata, total);
+ libbalsa_message_set_mime_message(message, mime_message);
+ g_object_unref(mime_message);
+
libbalsa_message_copy(message, mailbox, NULL);
libbalsa_mailbox_unlock_store(mailbox);
diff --git a/libbalsa/mailbox_imap.c b/libbalsa/mailbox_imap.c
index 15d675063..d87bd6247 100644
--- a/libbalsa/mailbox_imap.c
+++ b/libbalsa/mailbox_imap.c
@@ -637,17 +637,20 @@ libbalsa_mailbox_imap_get_handle(LibBalsaMailboxImap *mimap, GError **err)
static void
lbimap_update_flags(LibBalsaMessage *message, ImapMessage *imsg)
{
- message->flags = 0;
+ LibBalsaMessageFlag flags = 0;
+
if (!IMSG_FLAG_SEEN(imsg->flags))
- message->flags |= LIBBALSA_MESSAGE_FLAG_NEW;
+ flags |= LIBBALSA_MESSAGE_FLAG_NEW;
if (IMSG_FLAG_DELETED(imsg->flags))
- message->flags |= LIBBALSA_MESSAGE_FLAG_DELETED;
+ flags |= LIBBALSA_MESSAGE_FLAG_DELETED;
if (IMSG_FLAG_FLAGGED(imsg->flags))
- message->flags |= LIBBALSA_MESSAGE_FLAG_FLAGGED;
+ flags |= LIBBALSA_MESSAGE_FLAG_FLAGGED;
if (IMSG_FLAG_ANSWERED(imsg->flags))
- message->flags |= LIBBALSA_MESSAGE_FLAG_REPLIED;
+ flags |= LIBBALSA_MESSAGE_FLAG_REPLIED;
if (IMSG_FLAG_RECENT(imsg->flags))
- message->flags |= LIBBALSA_MESSAGE_FLAG_RECENT;
+ flags |= LIBBALSA_MESSAGE_FLAG_RECENT;
+
+ libbalsa_message_set_flags(message, flags);
}
/* mi_get_imsg is a thin wrapper around imap_mbox_handle_get_msg().
@@ -774,6 +777,7 @@ imap_flags_cb(unsigned cnt, const unsigned seqno[], LibBalsaMailboxImap *mimap)
message_info_from_msgno(mimap, seqno[i]);
if(msg_info && msg_info->message) {
LibBalsaMessageFlag flags;
+ LibBalsaMessageFlag new_flags;
/* since we are talking here about updating just received,
usually unsolicited flags from the server, we do not
need to go to great lengths to assure that the
@@ -782,17 +786,17 @@ imap_flags_cb(unsigned cnt, const unsigned seqno[], LibBalsaMailboxImap *mimap)
imap_mbox_handle_get_msg(mimap->handle, seqno[i]);
if(!imsg) continue;
- flags = msg_info->message->flags;
+ flags = libbalsa_message_get_flags(msg_info->message);
lbimap_update_flags(msg_info->message, imsg);
- if (flags == msg_info->message->flags)
+ new_flags = libbalsa_message_get_flags(msg_info->message);
+ if (flags == new_flags)
continue;
- libbalsa_mailbox_index_set_flags(mailbox, seqno[i],
- msg_info->message->flags);
+ libbalsa_mailbox_index_set_flags(mailbox, seqno[i], new_flags);
++mimap->search_stamp;
}
}
- if(!mimap->unread_update_id)
+ if (mimap->unread_update_id == 0)
mimap->unread_update_id =
g_idle_add((GSourceFunc)idle_unread_update_cb, mailbox);
libbalsa_unlock_mailbox(mailbox);
@@ -924,8 +928,8 @@ imap_expunge_cb(ImapMboxHandle *handle, unsigned seqno,
&g_array_index(mimap->messages_info, struct message_info, i);
g_assert(info != NULL);
- if (info->message)
- info->message->msgno = i + 1;
+ if (info->message != NULL)
+ libbalsa_message_set_msgno(info->message, i + 1);
}
libbalsa_unlock_mailbox(mailbox);
@@ -1122,8 +1126,8 @@ free_messages_info(LibBalsaMailboxImap * mbox)
gchar *msgid;
struct message_info *msg_info =
&g_array_index(messages_info, struct message_info, i);
- if (msg_info->message) {
- msg_info->message->mailbox = NULL;
+ if (msg_info->message != NULL) {
+ libbalsa_message_set_mailbox(msg_info->message, NULL);
g_object_unref(msg_info->message);
}
msgid = g_ptr_array_index(mbox->msgids, i);
@@ -1997,7 +2001,7 @@ libbalsa_mailbox_imap_load_envelope(LibBalsaMailboxImap *mimap,
gchar *hdr;
g_return_val_if_fail(mimap->opened, FALSE);
- imsg = mi_get_imsg(mimap, message->msgno);
+ imsg = mi_get_imsg(mimap, libbalsa_message_get_msgno(message));
if(!imsg || !imsg->envelope) {/* Connection severed and and restore
* failed - deal with it! */
@@ -2007,19 +2011,21 @@ libbalsa_mailbox_imap_load_envelope(LibBalsaMailboxImap *mimap,
lbimap_update_flags(message, imsg);
- lb_set_headers(message->headers, imsg->envelope, FALSE);
+ lb_set_headers(libbalsa_message_get_headers(message), imsg->envelope, FALSE);
+
if ((hdr = imsg->fetched_header_fields) && *hdr && *hdr != '\r')
libbalsa_message_set_headers_from_string(message, hdr);
- envelope = imsg->envelope;
- message->length = imsg->rfc822size;
+
+ libbalsa_message_set_length(message, imsg->rfc822size);
+ envelope = imsg->envelope;
libbalsa_message_set_subject_from_header(message, envelope->subject);
- message->sender =
- internet_address_new_list_from_imap_address_list(envelope->sender);
- libbalsa_message_set_in_reply_to_from_string(message,
- envelope->in_reply_to);
- if (envelope->message_id) {
- message->message_id =
- g_mime_utils_decode_message_id(envelope->message_id);
+ libbalsa_message_set_sender(message,
+ internet_address_new_list_from_imap_address_list(envelope->sender));
+ libbalsa_message_set_in_reply_to_from_string(message, envelope->in_reply_to);
+ if (envelope->message_id != NULL) {
+ gchar *message_id = g_mime_utils_decode_message_id(envelope->message_id);
+ libbalsa_message_set_message_id(message, message_id);
+ g_free(message_id);
}
return TRUE;
@@ -2040,18 +2046,20 @@ libbalsa_mailbox_imap_get_message(LibBalsaMailbox * mailbox, guint msgno)
}
if (!msg_info->message) {
- LibBalsaMessage *msg = libbalsa_message_new();
- msg->msgno = msgno;
- msg->mailbox = mailbox;
- if (libbalsa_mailbox_imap_load_envelope(mimap, msg)) {
+ LibBalsaMessage *message;
+
+ message = libbalsa_message_new();
+ libbalsa_message_set_msgno(message, msgno);
+ libbalsa_message_set_mailbox(message, mailbox);
+ if (libbalsa_mailbox_imap_load_envelope(mimap, message)) {
gchar *id;
- msg_info->message = msg;
- if (libbalsa_message_is_partial(msg, &id)) {
+ msg_info->message = message;
+ if (libbalsa_message_is_partial(message, &id)) {
libbalsa_mailbox_try_reassemble(mailbox, id);
g_free(id);
}
- } else
- g_object_unref(G_OBJECT(msg));
+ } else
+ g_object_unref(G_OBJECT(message));
}
if (msg_info->message)
g_object_ref(msg_info->message); /* we want to keep one copy */
@@ -2133,16 +2141,19 @@ static gboolean
get_struct_from_cache(LibBalsaMailbox *mailbox, LibBalsaMessage *message,
LibBalsaFetchFlag flags)
{
- if (!message->mime_msg) {
+ GMimeMessage *mime_msg;
+ LibBalsaMessageHeaders *headers;
+
+ if ((mime_msg = libbalsa_message_get_mime_message(message)) == NULL) {
gchar **pair, *filename;
int fd;
GMimeStream *stream, *fstream;
GMimeFilter *filter;
GMimeParser *mime_parser;
LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
- ImapMessage *imsg = mi_get_imsg(mimap, message->msgno);
+ ImapMessage *imsg = mi_get_imsg(mimap, libbalsa_message_get_msgno(message));
- if (!imsg)
+ if (imsg == NULL)
return FALSE;
pair = get_cache_name_pair(mimap, "body", imsg->uid);
@@ -2166,25 +2177,25 @@ get_struct_from_cache(LibBalsaMailbox *mailbox, LibBalsaMessage *message,
g_object_unref(fstream);
g_mime_parser_set_scan_from(mime_parser, FALSE);
- message->mime_msg = g_mime_parser_construct_message(mime_parser);
+ mime_msg = g_mime_parser_construct_message(mime_parser);
g_object_unref(mime_parser);
+
+ libbalsa_message_set_mime_message(message, mime_msg);
}
-
+
/* follow libbalsa_mailbox_local_fetch_structure here;
* perhaps create common helper */
- if(flags & LB_FETCH_STRUCTURE) {
+ headers = libbalsa_message_get_headers(message);
+ if (flags & LB_FETCH_STRUCTURE) {
LibBalsaMessageBody *body = libbalsa_message_body_new(message);
libbalsa_message_body_set_mime_body(body,
- message->mime_msg->mime_part);
+ mime_msg->mime_part);
libbalsa_message_append_part(message, body);
- libbalsa_message_headers_from_gmime(message->headers,
- message->mime_msg);
+ libbalsa_message_headers_from_gmime(headers, mime_msg);
}
- if(flags & LB_FETCH_RFC822_HEADERS) {
- g_assert(message->headers != NULL);
- message->headers->user_hdrs =
- libbalsa_message_user_hdrs_from_gmime(message->mime_msg);
- message->has_all_headers = 1;
+ if (flags & LB_FETCH_RFC822_HEADERS) {
+ headers->user_hdrs = libbalsa_message_user_hdrs_from_gmime(mime_msg);
+ libbalsa_message_set_has_all_headers(message, TRUE);
}
return TRUE;
}
@@ -2197,7 +2208,10 @@ libbalsa_mailbox_imap_fetch_structure(LibBalsaMailbox *mailbox,
ImapResponse rc;
LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
LibBalsaServer *server;
+ LibBalsaMessageHeaders *headers;
+ glong msgno;
ImapFetchType ift = 0;
+
g_return_val_if_fail(mimap->opened, FALSE);
/* Work around some server bugs by fetching the RFC2822 form of
@@ -2209,19 +2223,19 @@ libbalsa_mailbox_imap_fetch_structure(LibBalsaMailbox *mailbox,
parts yet. Also, we save some RTTS for very small messages by
fetching them in their entirety. */
server = LIBBALSA_MAILBOX_REMOTE_GET_SERVER(mailbox);
+ headers = libbalsa_message_get_headers(message);
+ msgno = libbalsa_message_get_msgno(message);
if(!imap_mbox_handle_can_do(mimap->handle, IMCAP_FETCHBODY) ||
libbalsa_imap_server_has_bug(LIBBALSA_IMAP_SERVER(server),
ISBUG_FETCH) ||
LIBBALSA_MESSAGE_GET_LENGTH(message)<8192 ||
- (message->headers &&
- (!message->headers->content_type ||
- !g_mime_content_type_is_type(message->headers->content_type,
- "multipart", "*"))) ){
+ (headers != NULL &&
+ (headers->content_type == NULL ||
+ !g_mime_content_type_is_type(headers->content_type, "multipart", "*"))) ){
/* we could optimize this part a little bit: we do not need to
* keep reopening the stream. */
GMimeStream *stream =
- libbalsa_mailbox_imap_get_message_stream(mailbox, message->msgno,
- FALSE);
+ libbalsa_mailbox_imap_get_message_stream(mailbox, msgno, FALSE);
if(!stream) /* oops, connection broken or the message disappeared? */
return FALSE;
g_object_unref(stream);
@@ -2234,12 +2248,10 @@ libbalsa_mailbox_imap_fetch_structure(LibBalsaMailbox *mailbox,
if(flags & LB_FETCH_STRUCTURE) ift |= IMFETCH_BODYSTRUCT;
II(rc, mimap->handle,
- imap_mbox_handle_fetch_range(mimap->handle, message->msgno,
- message->msgno, ift));
+ imap_mbox_handle_fetch_range(mimap->handle, msgno, msgno, ift));
if(rc == IMR_OK) { /* translate ImapData to LibBalsaMessage */
gchar *hdr;
- ImapMessage *im = imap_mbox_handle_get_msg(mimap->handle,
- message->msgno);
+ ImapMessage *im = imap_mbox_handle_get_msg(mimap->handle, msgno);
/* in case of msg number discrepancies: */
g_return_val_if_fail(im != NULL, FALSE);
if(flags & LB_FETCH_STRUCTURE) {
@@ -2250,7 +2262,7 @@ libbalsa_mailbox_imap_fetch_structure(LibBalsaMailbox *mailbox,
if( (flags & LB_FETCH_RFC822_HEADERS) &&
(hdr = im->fetched_header_fields) && *hdr && *hdr != '\r') {
libbalsa_message_set_headers_from_string(message, hdr);
- message->has_all_headers = 1;
+ libbalsa_message_set_has_all_headers(message, TRUE);
}
return TRUE;
}
@@ -2264,16 +2276,16 @@ libbalsa_mailbox_imap_fetch_headers(LibBalsaMailbox *mailbox,
{
LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
ImapResponse rc;
+ glong msgno;
+
+ msgno = libbalsa_message_get_msgno(message);
II(rc,mimap->handle,
- imap_mbox_handle_fetch_range(mimap->handle,
- message->msgno,
- message->msgno,
+ imap_mbox_handle_fetch_range(mimap->handle, msgno, msgno,
IMFETCH_RFC822HEADERS_SELECTED));
if(rc == IMR_OK) { /* translate ImapData to LibBalsaMessage */
const gchar *hdr;
- ImapMessage *im = imap_mbox_handle_get_msg(mimap->handle,
- message->msgno);
+ ImapMessage *im = imap_mbox_handle_get_msg(mimap->handle, msgno);
if ((hdr = im->fetched_header_fields) && *hdr && *hdr != '\r')
libbalsa_message_set_headers_from_string(message, hdr);
}
@@ -2334,27 +2346,26 @@ print_structure(LibBalsaMessageBody *part, LibBalsaMessageBody* m, int ind)
}
#endif
static gchar*
-get_section_for(LibBalsaMessage *msg, LibBalsaMessageBody *part)
+get_section_for(LibBalsaMessage *message, LibBalsaMessageBody *part)
{
GString *section = g_string_new("");
LibBalsaMessageBody *parent;
- parent = msg->body_list;
+ parent = libbalsa_message_get_body_list(message);
if (libbalsa_message_body_is_multipart(parent))
parent = parent->parts;
- if(!is_child_of(parent, part, section, TRUE)) {
- g_warning("Internal error, part %p not found in msg %p.\n",
- part, msg);
+ if (!is_child_of(parent, part, section, TRUE)) {
+ g_warning("Internal error, part %p not found in message %p.\n",
+ part, message);
g_string_free(section, TRUE);
+
return g_strdup("1");
}
-#if 0
- print_structure(msg->body_list, part, 0);
- printf("section: %s\n", section->str);
-#endif
+
return g_string_free(section, FALSE);
}
+
struct part_data { char *block; unsigned pos; ImapBody *body; };
static void
append_str(unsigned seqno, const char *buf, size_t buflen, void *arg)
@@ -2400,19 +2411,20 @@ get_parent(LibBalsaMessageBody *root, LibBalsaMessageBody *part,
return NULL;
}
static gboolean
-lbm_imap_get_msg_part_from_cache(LibBalsaMessage * msg,
+lbm_imap_get_msg_part_from_cache(LibBalsaMessage * message,
LibBalsaMessageBody * part,
GError **err)
{
GMimeStream *partstream = NULL;
-
- gchar **pair, *part_name;
- LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(msg->mailbox);
+ gchar **pair, *part_name;
+ LibBalsaMailbox *mailbox = libbalsa_message_get_mailbox(message);
+ LibBalsaMailboxImap *mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
FILE *fp;
gchar *section;
- ImapMessage *imsg = mi_get_imsg(mimap, msg->msgno);
+ glong msgno = libbalsa_message_get_msgno(message);
+ ImapMessage *imsg = mi_get_imsg(mimap, msgno);
- if (!imsg) {
+ if (imsg == NULL) {
g_set_error(err,
LIBBALSA_MAILBOX_ERROR, LIBBALSA_MAILBOX_ACCESS_ERROR,
_("Error fetching message from IMAP server: %s"),
@@ -2421,7 +2433,7 @@ lbm_imap_get_msg_part_from_cache(LibBalsaMessage * msg,
}
/* look for a part cache */
- section = get_section_for(msg, part);
+ section = get_section_for(message, part);
pair = get_cache_name_pair(mimap, "part", imsg->uid);
part_name = g_strconcat(pair[0], G_DIR_SEPARATOR_S,
pair[1], "-", section, NULL);
@@ -2433,8 +2445,8 @@ lbm_imap_get_msg_part_from_cache(LibBalsaMessage * msg,
ImapResponse rc;
LibBalsaMessageBody *parent;
- libbalsa_lock_mailbox(msg->mailbox);
- mimap = LIBBALSA_MAILBOX_IMAP(msg->mailbox);
+ libbalsa_lock_mailbox(mailbox);
+ mimap = LIBBALSA_MAILBOX_IMAP(mailbox);
dt.body = imap_message_get_body_from_section(imsg, section);
if(!dt.body) {
@@ -2458,7 +2470,7 @@ lbm_imap_get_msg_part_from_cache(LibBalsaMessage * msg,
* which has no headers. In this case, we have to fake them.
* We could and probably should dump there first the headers
* that we have already fetched... */
- parent = get_parent(msg->body_list, part, NULL);
+ parent = get_parent(libbalsa_message_get_body_list(message), part, NULL);
if(parent == NULL)
ifbo = IMFB_NONE;
else {
@@ -2470,12 +2482,12 @@ lbm_imap_get_msg_part_from_cache(LibBalsaMessage * msg,
rc = IMR_OK;
if (dt.body->octets > 0)
II(rc,mimap->handle,
- imap_mbox_handle_fetch_body(mimap->handle, msg->msgno,
+ imap_mbox_handle_fetch_body(mimap->handle, msgno,
section, FALSE, ifbo, append_str, &dt));
- libbalsa_unlock_mailbox(msg->mailbox);
+ libbalsa_unlock_mailbox(mailbox);
if(rc != IMR_OK) {
fprintf(stderr, "Error fetching imap message no %lu section %s\n",
- msg->msgno, section);
+ msgno, section);
g_set_error(err,
LIBBALSA_MAILBOX_ERROR, LIBBALSA_MAILBOX_ACCESS_ERROR,
_("Error fetching message from IMAP server: %s"),
diff --git a/libbalsa/mailbox_local.c b/libbalsa/mailbox_local.c
index c7040e4dd..cb5fc4bde 100644
--- a/libbalsa/mailbox_local.c
+++ b/libbalsa/mailbox_local.c
@@ -306,9 +306,9 @@ lbm_local_get_message_with_msg_info(LibBalsaMailboxLocal * local,
g_object_add_weak_pointer(G_OBJECT(message),
(gpointer *) & msg_info->message);
- message->flags = msg_info->flags & LIBBALSA_MESSAGE_FLAGS_REAL;
- message->mailbox = LIBBALSA_MAILBOX(local);
- message->msgno = msgno;
+ libbalsa_message_set_flags(message, msg_info->flags & LIBBALSA_MESSAGE_FLAGS_REAL);
+ libbalsa_message_set_mailbox(message, LIBBALSA_MAILBOX(local));
+ libbalsa_message_set_msgno(message, msgno);
libbalsa_message_load_envelope(message);
lbml_message_pool_take_message(local, message);
}
@@ -869,11 +869,13 @@ message_match_real(LibBalsaMailbox *mailbox, guint msgno,
/* do the work */
if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_TO)) {
+ LibBalsaMessageHeaders *headers;
+
g_assert(is_refed);
- if (message->headers->to_list) {
+ headers = libbalsa_message_get_headers(message);
+ if (headers->to_list != NULL) {
gchar *str =
- internet_address_list_to_string(message->headers->
- to_list, FALSE);
+ internet_address_list_to_string(headers->to_list, FALSE);
match =
libbalsa_utf8_strstr(str, cond->match.string.string);
g_free(str);
@@ -896,11 +898,13 @@ message_match_real(LibBalsaMailbox *mailbox, guint msgno,
}
}
if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_CC)) {
+ LibBalsaMessageHeaders *headers;
+
g_assert(is_refed);
- if (message->headers->cc_list) {
+ headers = libbalsa_message_get_headers(message);
+ if (headers->cc_list != NULL) {
gchar *str =
- internet_address_list_to_string(message->headers->
- cc_list, FALSE);
+ internet_address_list_to_string(headers->cc_list, FALSE);
match =
libbalsa_utf8_strstr(str, cond->match.string.string);
g_free(str);
@@ -930,12 +934,13 @@ message_match_real(LibBalsaMailbox *mailbox, guint msgno,
if (CONDITION_CHKMATCH(cond,CONDITION_MATCH_BODY)) {
GString *body;
g_assert(is_refed);
- if (!message->mailbox) {
+ if (libbalsa_message_get_mailbox(message) == NULL) {
/* No need to body-unref */
g_object_unref(message);
return FALSE; /* We don't want to match if an error occurred */
}
- body = content2reply(message->body_list, NULL, 0, FALSE, FALSE);
+ body = content2reply(libbalsa_message_get_body_list(message),
+ NULL, 0, FALSE, FALSE);
if (body) {
if (body->str)
match = libbalsa_utf8_strstr(body->str,
@@ -1005,8 +1010,9 @@ libbalsa_mailbox_local_cache_message(LibBalsaMailboxLocal * local,
libbalsa_mailbox_local_get_instance_private(local);
gpointer *entry;
LibBalsaMailboxLocalInfo *info;
+ LibBalsaMessageHeaders *headers;
- if (!message)
+ if (message == NULL)
return;
libbalsa_mailbox_cache_message(LIBBALSA_MAILBOX(local), msgno,
@@ -1023,15 +1029,15 @@ libbalsa_mailbox_local_cache_message(LibBalsaMailboxLocal * local,
return;
*entry = info = g_new(LibBalsaMailboxLocalInfo, 1);
- info->message_id = g_strdup(message->message_id);
+ info->message_id = g_strdup(libbalsa_message_get_message_id(message));
info->refs_for_threading =
libbalsa_message_refs_for_threading(message);
info->sender = NULL;
- if (message->headers->from)
- info->sender =
- internet_address_list_to_string(message->headers->from, FALSE);
- if (!info->sender)
+ headers = libbalsa_message_get_headers(message);
+ if (headers->from != NULL)
+ info->sender = internet_address_list_to_string(headers->from, FALSE);
+ if (info->sender == NULL)
info->sender = g_strdup("");
}
@@ -1384,22 +1390,26 @@ libbalsa_mailbox_local_fetch_structure(LibBalsaMailbox *mailbox,
LibBalsaMessage *message,
LibBalsaFetchFlag flags)
{
- GMimeMessage *mime_message = message->mime_msg;
+ GMimeMessage *mime_message;
+ LibBalsaMessageHeaders *headers;
- if (!mime_message || !mime_message->mime_part)
+ mime_message = libbalsa_message_get_mime_message(message);
+ if (mime_message == NULL || mime_message->mime_part == NULL)
return FALSE;
- if(flags & LB_FETCH_STRUCTURE) {
+ headers = libbalsa_message_get_headers(message);
+
+ if ((flags & LB_FETCH_STRUCTURE) != 0) {
LibBalsaMessageBody *body = libbalsa_message_body_new(message);
libbalsa_message_body_set_mime_body(body,
mime_message->mime_part);
libbalsa_message_append_part(message, body);
- libbalsa_message_headers_from_gmime(message->headers, mime_message);
+ libbalsa_message_headers_from_gmime(headers, mime_message);
}
- if(flags & LB_FETCH_RFC822_HEADERS) {
- message->headers->user_hdrs =
- libbalsa_message_user_hdrs_from_gmime(mime_message);
- message->has_all_headers = 1;
+
+ if ((flags & LB_FETCH_RFC822_HEADERS) != 0) {
+ headers->user_hdrs = libbalsa_message_user_hdrs_from_gmime(mime_message);
+ libbalsa_message_set_has_all_headers(message, TRUE);
}
return TRUE;
@@ -1409,12 +1419,16 @@ static void
libbalsa_mailbox_local_fetch_headers(LibBalsaMailbox * mailbox,
LibBalsaMessage * message)
{
- g_return_if_fail(message->headers->user_hdrs == NULL);
+ LibBalsaMessageHeaders *headers;
+ GMimeMessage *mime_msg;
- if (message->mime_msg)
- message->headers->user_hdrs =
- libbalsa_message_user_hdrs_from_gmime(message->mime_msg);
- else {
+ headers = libbalsa_message_get_headers(message);
+ g_return_if_fail(headers->user_hdrs == NULL);
+
+ mime_msg = libbalsa_message_get_mime_message(message);
+ if (mime_msg != NULL) {
+ headers->user_hdrs = libbalsa_message_user_hdrs_from_gmime(mime_msg);
+ } else {
libbalsa_mailbox_fetch_message_structure(mailbox, message,
LB_FETCH_RFC822_HEADERS);
libbalsa_mailbox_release_message(mailbox, message);
@@ -2226,8 +2240,8 @@ libbalsa_mailbox_local_messages_change_flags(LibBalsaMailbox * mailbox,
continue;
++changed;
- if (msg_info->message)
- msg_info->message->flags = msg_info->flags;
+ if (msg_info->message != NULL)
+ libbalsa_message_set_flags(msg_info->message, msg_info->flags);
libbalsa_mailbox_index_set_flags(mailbox, msgno, msg_info->flags);
diff --git a/libbalsa/mailbox_maildir.c b/libbalsa/mailbox_maildir.c
index 817151c95..0e56d0b14 100644
--- a/libbalsa/mailbox_maildir.c
+++ b/libbalsa/mailbox_maildir.c
@@ -578,8 +578,8 @@ libbalsa_mailbox_maildir_check(LibBalsaMailbox * mailbox)
}
for (msgno = renumber; msgno <= mdir->msgno_2_msg_info->len; msgno++) {
msg_info = message_info_from_msgno(mdir, msgno);
- if (msg_info->local_info.message)
- msg_info->local_info.message->msgno = msgno;
+ if (msg_info->local_info.message != NULL)
+ libbalsa_message_set_msgno(msg_info->local_info.message, msgno);
}
msgno = mdir->msgno_2_msg_info->len;
@@ -594,9 +594,9 @@ free_message_info(struct message_info *msg_info)
return;
g_free(msg_info->key);
g_free(msg_info->filename);
- if (msg_info->local_info.message) {
- msg_info->local_info.message->mailbox = NULL;
- msg_info->local_info.message->msgno = 0;
+ if (msg_info->local_info.message != NULL) {
+ libbalsa_message_set_mailbox(msg_info->local_info.message, NULL);
+ libbalsa_message_set_msgno(msg_info->local_info.message, 0);
g_object_remove_weak_pointer(G_OBJECT(msg_info->local_info.message),
(gpointer *) & msg_info->local_info.message);
}
@@ -790,8 +790,8 @@ libbalsa_mailbox_maildir_sync(LibBalsaMailbox * mailbox, gboolean expunge)
g_slist_free(removed_list);
for (msgno = renumber; msgno <= mdir->msgno_2_msg_info->len; msgno++) {
msg_info = message_info_from_msgno(mdir, msgno);
- if (msg_info->local_info.message)
- msg_info->local_info.message->msgno = msgno;
+ if (msg_info->local_info.message != NULL)
+ libbalsa_message_set_msgno(msg_info->local_info.message, msgno);
}
if (changes) { /* Record mtime of dir. */
@@ -824,14 +824,20 @@ libbalsa_mailbox_maildir_fetch_message_structure(LibBalsaMailbox * mailbox,
LibBalsaMessage * message,
LibBalsaFetchFlag flags)
{
- if (!message->mime_msg) {
+ GMimeMessage *mime_message;
+
+ mime_message = libbalsa_message_get_mime_message(message);
+
+ if (mime_message == NULL) {
struct message_info *msg_info =
message_info_from_msgno((LibBalsaMailboxMaildir *) mailbox,
- message->msgno);
- message->mime_msg =
+ libbalsa_message_get_msgno(message));
+ mime_message =
libbalsa_mailbox_local_get_mime_message(mailbox,
msg_info->subdir,
msg_info->filename);
+ libbalsa_message_set_mime_message(message, mime_message);
+ g_object_unref(mime_message);
}
return LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_maildir_parent_class)->
diff --git a/libbalsa/mailbox_mbox.c b/libbalsa/mailbox_mbox.c
index df68cd650..9f20b4a54 100644
--- a/libbalsa/mailbox_mbox.c
+++ b/libbalsa/mailbox_mbox.c
@@ -1,7 +1,7 @@
/* -*-mode:c; c-style:k&r; c-basic-offset:4; -*- */
/* Balsa E-Mail Client
*
- * Copyright (C) 1997-2016 Stuart Parmenter and others,
+ * Copyright (C) 1997-2019 Stuart Parmenter and others,
* See the file AUTHORS for a list.
*
* This program is free software; you can redistribute it and/or modify
@@ -508,10 +508,10 @@ parse_mailbox(LibBalsaMailboxMbox * mbox)
g_memdup(&msg_info, sizeof(msg_info)));
mbox->messages_info_changed = TRUE;
- msg->flags = msg_info.orig_flags;
- msg->length = msg_info.end - (msg_info.start + msg_info.from_len);
- msg->mailbox = LIBBALSA_MAILBOX(mbox);
- msg->msgno = ++msgno;
+ libbalsa_message_set_flags(msg, msg_info.orig_flags);
+ libbalsa_message_set_length(msg, msg_info.end - (msg_info.start + msg_info.from_len));
+ libbalsa_message_set_mailbox(msg, LIBBALSA_MAILBOX(mbox));
+ libbalsa_message_set_msgno(msg, ++msgno);
/* We must drop the mime-stream lock to call
* libbalsa_mailbox_local_cache_message, which calls
* libbalsa_mailbox_cache_message(), as it may grab the
@@ -635,12 +635,13 @@ free_message_info(struct message_info *msg_info)
LibBalsaMessage *message;
if ((message = msg_info->local_info.message) != NULL) {
- message->mailbox = NULL;
- message->msgno = 0;
+ libbalsa_message_set_mailbox(message, NULL);
+ libbalsa_message_set_msgno(message, 0);
g_object_remove_weak_pointer(G_OBJECT(message),
(gpointer *) &msg_info->local_info.message);
msg_info->local_info.message = NULL;
}
+
g_free(msg_info);
}
@@ -1666,8 +1667,8 @@ libbalsa_mailbox_mbox_sync(LibBalsaMailbox * mailbox, gboolean expunge)
mbox->messages_info_changed = TRUE;
continue;
}
- if (msg_info->local_info.message)
- msg_info->local_info.message->msgno = j + 1;
+ if (msg_info->local_info.message != NULL)
+ libbalsa_message_set_msgno(msg_info->local_info.message, j + 1);
msg_info->status = msg_info->x_status = msg_info->mime_version = -1;
mime_msg = g_mime_parser_construct_message(gmime_parser);
@@ -1696,18 +1697,19 @@ libbalsa_mailbox_mbox_sync(LibBalsaMailbox * mailbox, gboolean expunge)
msg_info->end = g_mime_parser_tell(gmime_parser);
msg_info->orig_flags = REAL_FLAGS(msg_info->local_info.flags);
g_assert(mime_msg->mime_part != NULL);
- if (!msg_info->local_info.message || !msg_info->local_info.message->mime_msg)
- g_object_unref(mime_msg);
- else {
- g_object_unref(msg_info->local_info.message->mime_msg);
- msg_info->local_info.message->mime_msg = mime_msg;
+
+ if (msg_info->local_info.message != NULL &&
+ libbalsa_message_get_mime_message(msg_info->local_info.message) != NULL) {
+ libbalsa_message_set_mime_message(msg_info->local_info.message, mime_msg);
/*
* reinit the message parts info
*/
- libbalsa_message_body_set_mime_body(msg_info->local_info.message->body_list,
+ libbalsa_message_body_set_mime_body(libbalsa_message_get_body_list(msg_info->local_info.message),
mime_msg->mime_part);
}
+ g_object_unref(mime_msg);
+
j++;
}
libbalsa_mime_stream_shared_unlock(mbox_stream);
@@ -1732,8 +1734,12 @@ libbalsa_mailbox_mbox_fetch_message_structure(LibBalsaMailbox * mailbox,
LibBalsaMessage * message,
LibBalsaFetchFlag flags)
{
- if (!message->mime_msg)
- message->mime_msg = lbm_mbox_get_mime_message(mailbox, message->msgno);
+ if (libbalsa_message_get_mime_message(message) == NULL) {
+ GMimeMessage *mime_msg =
+ lbm_mbox_get_mime_message(mailbox, libbalsa_message_get_msgno(message));
+ libbalsa_message_set_mime_message(message, mime_msg);
+ g_object_unref(mime_msg);
+ }
return LIBBALSA_MAILBOX_CLASS(libbalsa_mailbox_mbox_parent_class)->
fetch_message_structure(mailbox, message, flags);
@@ -1854,6 +1860,7 @@ lbm_mbox_add_message(LibBalsaMailboxLocal * local,
{
LibBalsaMailbox *mailbox = (LibBalsaMailbox *) local;
LibBalsaMessage *message;
+ LibBalsaMessageHeaders *headers;
gchar date_string[27];
gchar *sender;
gchar *address;
@@ -1870,10 +1877,11 @@ lbm_mbox_add_message(LibBalsaMailboxLocal * local,
message = libbalsa_message_new();
libbalsa_message_load_envelope_from_stream(message, stream);
- ctime_r(&(message->headers->date), date_string);
+ headers = libbalsa_message_get_headers(message);
+ ctime_r(&(headers->date), date_string);
- sender = message->headers->from ?
- internet_address_list_to_string(message->headers->from, FALSE) :
+ sender = headers->from != NULL ?
+ internet_address_list_to_string(headers->from, FALSE) :
g_strdup("none");
g_object_unref(message);
diff --git a/libbalsa/mailbox_mh.c b/libbalsa/mailbox_mh.c
index f22129e62..4ccd821ad 100644
--- a/libbalsa/mailbox_mh.c
+++ b/libbalsa/mailbox_mh.c
@@ -481,14 +481,16 @@ lbm_mh_parse_both(LibBalsaMailboxMh * mh)
static void
lbm_mh_free_message_info(struct message_info *msg_info)
{
- if (!msg_info)
+ if (msg_info == NULL)
return;
- if (msg_info->local_info.message) {
- msg_info->local_info.message->mailbox = NULL;
- msg_info->local_info.message->msgno = 0;
+
+ if (msg_info->local_info.message != NULL) {
+ libbalsa_message_set_mailbox(msg_info->local_info.message, NULL);
+ libbalsa_message_set_msgno(msg_info->local_info.message, 0);
g_object_remove_weak_pointer(G_OBJECT(msg_info->local_info.message),
(gpointer *) &msg_info->local_info.message);
}
+
g_free(msg_info);
}
@@ -674,8 +676,8 @@ libbalsa_mailbox_mh_check(LibBalsaMailbox * mailbox)
}
for (msgno = renumber; msgno <= mh->msgno_2_msg_info->len; msgno++) {
msg_info = lbm_mh_message_info_from_msgno(mh, msgno);
- if (msg_info->local_info.message)
- msg_info->local_info.message->msgno = msgno;
+ if (msg_info->local_info.message != NULL)
+ libbalsa_message_set_msgno(msg_info->local_info.message, msgno);
}
msgno = mh->msgno_2_msg_info->len;
@@ -871,8 +873,8 @@ libbalsa_mailbox_mh_sync(LibBalsaMailbox * mailbox, gboolean expunge)
/* Renumber */
for (msgno = 1; msgno <= mh->msgno_2_msg_info->len; msgno++) {
msg_info = lbm_mh_message_info_from_msgno(mh, msgno);
- if (msg_info->local_info.message)
- msg_info->local_info.message->msgno = msgno;
+ if (msg_info->local_info.message != NULL)
+ libbalsa_message_set_msgno(msg_info->local_info.message, msgno);
}
/* open tempfile */
@@ -987,24 +989,30 @@ libbalsa_mailbox_mh_fetch_message_structure(LibBalsaMailbox * mailbox,
LibBalsaMessage * message,
LibBalsaFetchFlag flags)
{
- if (!message->mime_msg) {
+ GMimeMessage *mime_msg;
+
+ mime_msg = libbalsa_message_get_mime_message(message);
+
+ if (mime_msg == NULL) {
struct message_info *msg_info;
gchar *base_name;
msg_info =
lbm_mh_message_info_from_msgno(LIBBALSA_MAILBOX_MH(mailbox),
- message->msgno);
+ libbalsa_message_get_msgno(message));
base_name = MH_BASENAME(msg_info);
- message->mime_msg =
- libbalsa_mailbox_local_get_mime_message(mailbox, base_name, NULL);
+ mime_msg = libbalsa_mailbox_local_get_mime_message(mailbox, base_name, NULL);
g_free(base_name);
- if (message->mime_msg) {
- g_mime_object_remove_header(GMIME_OBJECT(message->mime_msg),
+ libbalsa_message_set_mime_message(message, mime_msg);
+
+ if (mime_msg != NULL) {
+ g_mime_object_remove_header(GMIME_OBJECT(mime_msg),
"Status");
- g_mime_object_remove_header(GMIME_OBJECT(message->mime_msg),
+ g_mime_object_remove_header(GMIME_OBJECT(mime_msg),
"X-Status");
+ g_object_unref(mime_msg);
}
}
diff --git a/libbalsa/message.c b/libbalsa/message.c
index fc061cbfe..8a2101fd4 100644
--- a/libbalsa/message.c
+++ b/libbalsa/message.c
@@ -5,14 +5,14 @@
*
* 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/>.
*/
@@ -26,10 +26,10 @@
- Lack of inline functions in C increases program complexity. This cost
can be accepted.
- thorough analysis of memory usage is needed.
-*/
-
+ */
+
#if defined(HAVE_CONFIG_H) && HAVE_CONFIG_H
-# include "config.h"
+# include "config.h"
#endif /* HAVE_CONFIG_H */
#include <ctype.h>
@@ -40,6 +40,7 @@
#include "libbalsa.h"
#include "libbalsa_private.h"
+#include "identity.h"
/* needed for truncate_string */
#include "misc.h"
@@ -49,39 +50,92 @@
#include <gmime/gmime.h>
-static void libbalsa_message_class_init(LibBalsaMessageClass * klass);
-static void libbalsa_message_init(LibBalsaMessage * message);
-
+static void libbalsa_message_dispose(GObject * object);
static void libbalsa_message_finalize(GObject * object);
+struct _LibBalsaMessageClass {
+ GObjectClass parent_class;
-static GObjectClass *parent_class = NULL;
+ /* deal with flags being set/unset */
+ /* Signal: */
+ void (*status_changed) (LibBalsaMessage *message,
+ LibBalsaMessageFlag flag,
+ gboolean);
+};
-GType
-libbalsa_message_get_type()
-{
- static GType libbalsa_message_type = 0;
+struct _LibBalsaMessage {
+ GObject object;
- if (!libbalsa_message_type) {
- static const GTypeInfo libbalsa_message_info = {
- sizeof(LibBalsaMessageClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) libbalsa_message_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof(LibBalsaMessage),
- 0, /* n_preallocs */
- (GInstanceInitFunc) libbalsa_message_init
- };
+ /* the mailbox this message belongs to */
+ LibBalsaMailbox *mailbox;
- libbalsa_message_type =
- g_type_register_static(G_TYPE_OBJECT, "LibBalsaMessage",
- &libbalsa_message_info, 0);
- }
+ /* flags */
+ LibBalsaMessageFlag flags;
- return libbalsa_message_type;
-}
+ /* headers */
+ LibBalsaMessageHeaders *headers;
+ int updated; /** whether complete headers have been fetched */
+
+ GMimeMessage *mime_msg;
+
+ /* sender address */
+ InternetAddressList *sender;
+
+ /* subject line; we still need it here for sending;
+ * although _SET_SUBJECT might resolve it(?)
+ * but we can set to to NULL unless there is no mailbox, like
+ * on sending. */
+ gchar *subj;
+
+ /* replied message ID's */
+ GList *references;
+
+ /* replied message ID; from address on date */
+ GList *in_reply_to;
+
+ /* message ID */
+ gchar *message_id;
+
+ /* GPG sign and/or encrypt message (sending) */
+ guint gpg_mode;
+
+ /* attach the GnuPG public key to the message (sending) */
+ gboolean att_pubkey;
+
+ /* protection (i.e. sign/encrypt) status (received message) */
+ LibBalsaMsgProtectState prot_state;
+
+ /* sender identity, required for choosing a forced GnuPG or S/MIME key */
+ LibBalsaIdentity *ident;
+
+ /* request a DSN (sending) */
+ gboolean request_dsn;
+
+ /* a forced multipart subtype or NULL for mixed; used only for
+ * sending */
+ gchar *subtype;
+
+ /* additional message content type parameters; used only for sending */
+ GList *parameters;
+
+ /* message body */
+ guint body_ref;
+ LibBalsaMessageBody *body_list;
+
+ glong msgno; /* message no; always copy for faster sorting;
+ * counting starts at 1. */
+#if MESSAGE_COPY_CONTENT
+ glong length; /* byte len */
+#endif /* MESSAGE_COPY_CONTENT */
+
+ gchar *tempdir; /* to hold named parts */
+
+ unsigned has_all_headers : 1;
+};
+
+G_DEFINE_TYPE(LibBalsaMessage,
+ libbalsa_message,
+ G_TYPE_OBJECT)
static void
libbalsa_message_init(LibBalsaMessage * message)
@@ -109,8 +163,7 @@ libbalsa_message_class_init(LibBalsaMessageClass * klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
- parent_class = g_type_class_peek_parent(klass);
-
+ object_class->dispose = libbalsa_message_dispose;
object_class->finalize = libbalsa_message_finalize;
}
@@ -124,74 +177,56 @@ libbalsa_message_new(void)
return message;
}
-/* libbalsa_message_finalize:
- finalize methods must leave object in 'sane' state.
+/* libbalsa_message_dispose:
+ dispose methods must leave object in 'sane' state.
This means NULLifing released pointers.
*/
static void
-libbalsa_message_finalize(GObject * object)
+libbalsa_message_dispose(GObject * object)
{
- LibBalsaMessage *message;
+ LibBalsaMessage *message = LIBBALSA_MESSAGE(object);
- g_return_if_fail(object != NULL);
- g_return_if_fail(LIBBALSA_IS_MESSAGE(object));
+ g_clear_object(&message->sender);
+ g_clear_object(&message->mime_msg);
+ g_clear_object(&message->ident);
- message = LIBBALSA_MESSAGE(object);
+ G_OBJECT_CLASS(libbalsa_message_parent_class)->dispose(object);
+}
- libbalsa_message_headers_destroy(message->headers);
- message->headers = NULL;
+/* libbalsa_message_finalize: */
+static void
+libbalsa_message_finalize(GObject * object)
+{
+ LibBalsaMessage *message = LIBBALSA_MESSAGE(object);
- if (message->sender) {
- g_object_unref(message->sender);
- message->sender = NULL;
- }
+ libbalsa_message_headers_destroy(message->headers);
-#if MESSAGE_COPY_CONTENT
- g_free(message->subj);
- message->subj = NULL;
-#endif
g_list_free_full(message->references, g_free);
- message->references = NULL;
-
g_list_free_full(message->in_reply_to, g_free);
- message->in_reply_to = NULL;
+ g_list_free_full(message->parameters, (GDestroyNotify) g_strfreev);
g_free(message->message_id);
- message->message_id = NULL;
-
g_free(message->subtype);
- message->subtype = NULL;
-
- g_list_free_full(message->parameters, (GDestroyNotify) g_strfreev);
- message->parameters = NULL;
-
+#if MESSAGE_COPY_CONTENT
+ g_free(message->subj);
+#endif /* MESSAGE_COPY_CONTENT */
libbalsa_message_body_free(message->body_list);
- message->body_list = NULL;
-
- if (message->mime_msg) {
- g_object_unref(message->mime_msg);
- message->mime_msg = NULL;
- }
-
- if (message->ident != NULL) {
- g_object_unref(message->ident);
- }
if (message->tempdir) {
- if (rmdir(message->tempdir))
+ if (rmdir(message->tempdir) != 0)
g_warning("Could not remove %s", message->tempdir);
g_free(message->tempdir);
- message->tempdir = NULL;
}
- G_OBJECT_CLASS(parent_class)->finalize(object);
+ G_OBJECT_CLASS(libbalsa_message_parent_class)->finalize(object);
}
+
static void
-lb_message_headers_extra_destroy(LibBalsaMessageHeaders * headers)
+lb_message_headers_extra_destroy(LibBalsaMessageHeaders *headers)
{
- if (!headers)
+ if (headers == NULL)
return;
FREE_HEADER_LIST(headers->user_hdrs);
@@ -201,11 +236,13 @@ lb_message_headers_extra_destroy(LibBalsaMessageHeaders * headers)
headers->fcc_url = NULL;
}
-void
-libbalsa_message_headers_destroy(LibBalsaMessageHeaders * headers)
+
+void
+libbalsa_message_headers_destroy(LibBalsaMessageHeaders *headers)
{
- if (!headers)
- return;
+ if (headers == NULL)
+ return;
+
g_free(headers->subject);
headers->subject = NULL;
@@ -250,17 +287,22 @@ libbalsa_message_headers_destroy(LibBalsaMessageHeaders * headers)
g_free(headers);
}
+
const gchar *
-libbalsa_message_body_charset(LibBalsaMessageBody * body)
+libbalsa_message_body_charset(LibBalsaMessageBody *body)
{
const gchar *charset;
- if (!body)
- return NULL;
+ if (body == NULL)
+ return NULL;
+
- if (body->charset) /* This overrides all! Important for non
- * us-ascii messages over IMAP. */
+ if (body->charset) {
+ /* This overrides all! Important for non
+ * us-ascii messages over IMAP. */
return body->charset;
+ }
+
if (GMIME_IS_PART(body->mime_part)) {
GMimeContentType *type;
@@ -273,9 +315,11 @@ libbalsa_message_body_charset(LibBalsaMessageBody * body)
if (charset)
return charset;
+
return libbalsa_message_body_charset(body->next);
}
+
/* UTF-8-aware header cleaning by Albrecht */
static void
canonize_header_value(gchar *value)
@@ -318,89 +362,101 @@ libbalsa_create_hdr_pair(const gchar * name, gchar * value)
return item;
}
-static GList*
-libbalsa_message_header_get_helper(LibBalsaMessageHeaders* headers,
- const gchar *find)
+
+static GList *
+libbalsa_message_header_get_helper(LibBalsaMessageHeaders *headers,
+ const gchar *find)
{
GList *list;
for (list = headers->user_hdrs; list; list = list->next) {
- const gchar * const *tmp = list->data;
-
- if (g_ascii_strcasecmp(tmp[0], find) == 0)
+ const gchar *const *tmp = list->data;
+
+ if (g_ascii_strcasecmp(tmp[0], find) == 0)
return list;
}
return NULL;
}
+
/** libbalsa_message_find_user_hdr:
returns.... list element matching given header.
-*/
+ */
static GList *
-libbalsa_message_find_user_hdr(LibBalsaMessage * message, const gchar * find)
+libbalsa_message_find_user_hdr(LibBalsaMessage *message,
+ const gchar *find)
{
LibBalsaMessageHeaders *headers = message->headers;
-
+
g_return_val_if_fail(headers, NULL);
- if (!headers->user_hdrs && message->mailbox)
+ if (headers->user_hdrs == NULL && message->mailbox)
libbalsa_mailbox_set_msg_headers(message->mailbox, message);
return libbalsa_message_header_get_helper(headers, find);
}
-/*
+
+/*
* Public user header methods
*/
-const gchar*
-libbalsa_message_header_get_one(LibBalsaMessageHeaders* headers,
- const gchar *find)
+const gchar *
+libbalsa_message_header_get_one(LibBalsaMessageHeaders *headers,
+ const gchar *find)
{
GList *header;
const gchar *const *pair;
-
- if (!(header = libbalsa_message_header_get_helper(headers, find)))
+
+ if ((header = libbalsa_message_header_get_helper(headers, find)) == NULL)
return NULL;
+
pair = header->data;
return pair[1];
}
-GList*
-libbalsa_message_header_get_all(LibBalsaMessageHeaders* headers,
- const gchar *find)
+
+GList *
+libbalsa_message_header_get_all(LibBalsaMessageHeaders *headers,
+ const gchar *find)
{
GList *header;
const gchar *const *pair;
GList *res = NULL;
-
- if (!(header = libbalsa_message_header_get_helper(headers, find)))
+
+ if ((header = libbalsa_message_header_get_helper(headers, find)) == NULL)
return NULL;
+
pair = header->data;
- for(pair++; *pair; pair++)
+ for (pair++; *pair; pair++) {
res = g_list_append(res, g_strdup(*pair));
-
+ }
+
return res;
}
+
const gchar *
-libbalsa_message_get_user_header(LibBalsaMessage * message,
- const gchar * name)
+libbalsa_message_get_user_header(LibBalsaMessage *message,
+ const gchar *name)
{
GList *header;
const gchar *const *pair;
-
+
g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
g_return_val_if_fail(name != NULL, NULL);
- if (!(header = libbalsa_message_find_user_hdr(message, name)))
+ if ((header = libbalsa_message_find_user_hdr(message, name)) == NULL)
return NULL;
+
pair = header->data;
return pair[1];
}
+
void
-libbalsa_message_set_user_header(LibBalsaMessage * message,
- const gchar * name, const gchar * value)
+libbalsa_message_set_user_header(LibBalsaMessage *message,
+ const gchar *name,
+ const gchar *value)
{
LibBalsaMessageHeaders *headers;
GList *header;
@@ -417,13 +473,15 @@ libbalsa_message_set_user_header(LibBalsaMessage * message,
FREE_HEADER_LIST(header);
}
- if (value && *value)
+ if (value && *value) {
headers->user_hdrs =
g_list_prepend(headers->user_hdrs,
libbalsa_create_hdr_pair(name,
g_strdup(value)));
+ }
}
+
static GList *
prepend_header_misc(GList *res,
const char *name,
@@ -436,17 +494,18 @@ prepend_header_misc(GList *res,
"disposition-notification-to";
unsigned i;
- if (value[0] == '\0')
+ if (value[0] == '\0') {
/* Empty header */
return res;
+ }
/* Standard Headers*/
- for(i = 0; i < sizeof(lcname) - 1 && name[i] != '\0'; i++) {
+ for (i = 0; i < sizeof(lcname) - 1 && name[i] != '\0'; i++) {
lcname[i] = tolower(name[i]);
}
lcname[i] = '\0';
- if(strstr(ignored_headers, lcname) != NULL)
+ if (strstr(ignored_headers, lcname) != NULL)
return res;
return
@@ -478,30 +537,31 @@ libbalsa_message_user_hdrs_from_gmime(GMimeMessage * message)
g_return_val_if_fail(message != NULL, NULL);
value = g_mime_message_get_message_id(message);
- if (value)
- res = g_list_prepend(res, libbalsa_create_hdr_pair("Message-ID",
- g_strdup_printf("<%s>", value)));
+ if (value) {
+ res = g_list_prepend(res, libbalsa_create_hdr_pair("Message-ID",
+ g_strdup_printf("<%s>", value)));
+ }
/* FIXME: This duplicates References headers since they are
already present in LibBalsaMessage::references field. FWIW,
mailbox driver does not copy references to user_headers.
- */
+ */
value = g_mime_object_get_header(GMIME_OBJECT(message), "References");
if (value) {
#if BALSA_NEEDS_SEPARATE_USER_HEADERS
- GMimeReferences *references, *reference;
- reference = references = g_mime_references_decode(value);
- while (reference) {
- res =
- g_list_prepend(res,
- libbalsa_create_hdr_pair("References",
- g_strdup_printf
- ("<%s>",
- reference->
- msgid)));
- reference = reference->next;
- }
- g_mime_references_clear(&references);
+ GMimeReferences *references, *reference;
+ reference = references = g_mime_references_decode(value);
+ while (reference) {
+ res =
+ g_list_prepend(res,
+ libbalsa_create_hdr_pair("References",
+ g_strdup_printf
+ ("<%s>",
+ reference->
+ msgid)));
+ reference = reference->next;
+ }
+ g_mime_references_clear(&references);
#else
res = g_list_prepend(res,
libbalsa_create_hdr_pair("References",
@@ -514,37 +574,41 @@ libbalsa_message_user_hdrs_from_gmime(GMimeMessage * message)
res =
g_list_prepend(res,
libbalsa_create_hdr_pair
- ("In-Reply-To",
- g_mime_utils_header_decode_text(value)));
+ ("In-Reply-To",
+ g_mime_utils_header_decode_text(value)));
}
hdrlist = g_mime_object_get_header_list (GMIME_OBJECT(message));
if (g_mime_header_list_get_iter (hdrlist, &iter)) {
- do {
+ do {
res = prepend_header_misc(res,
g_mime_header_iter_get_name (&iter),
g_mime_header_iter_get_value (&iter));
- } while (g_mime_header_iter_next (&iter));
+ } while (g_mime_header_iter_next (&iter));
}
-
+
return g_list_reverse(res);
}
+
/* libbalsa_message_get_part_by_id:
return a message part identified by Content-ID=id
message must be referenced. (FIXME?)
-*/
+ */
LibBalsaMessageBody *
-libbalsa_message_get_part_by_id(LibBalsaMessage* msg, const gchar* id)
+libbalsa_message_get_part_by_id(LibBalsaMessage *msg,
+ const gchar *id)
{
return libbalsa_message_body_get_by_id(msg->body_list, id);
}
+
/* libbalsa_message_save:
return TRUE on success and FALSE on failure.
-*/
+ */
gboolean
-libbalsa_message_save(LibBalsaMessage * message, const gchar *filename)
+libbalsa_message_save(LibBalsaMessage *message,
+ const gchar *filename)
{
FILE *outfile;
int res;
@@ -553,12 +617,15 @@ libbalsa_message_save(LibBalsaMessage * message, const gchar *filename)
g_return_val_if_fail(message->mailbox, FALSE);
- if( (outfile = fopen(filename, "w")) == NULL) return FALSE;
+ if ((outfile = fopen(filename, "w")) == NULL)
+ return FALSE;
+
g_return_val_if_fail(outfile, FALSE);
msg_stream = libbalsa_message_stream(message);
if (msg_stream == NULL)
- return FALSE;
+ return FALSE;
+
out_stream = g_mime_stream_file_new(outfile);
libbalsa_mailbox_lock_store(message->mailbox);
res = g_mime_stream_write_to_stream(msg_stream, out_stream);
@@ -573,27 +640,36 @@ libbalsa_message_save(LibBalsaMessage * message, const gchar *filename)
LibBalsaMessageAttach
libbalsa_message_get_attach_icon(LibBalsaMessage * message)
{
- if (libbalsa_message_is_pgp_encrypted(message))
- return LIBBALSA_MESSAGE_ATTACH_ENCR;
- else if (message->prot_state != LIBBALSA_MSG_PROTECT_NONE ||
+ LibBalsaMessageAttach attach_icon;
+
+ if (libbalsa_message_is_pgp_encrypted(message)) {
+ attach_icon = LIBBALSA_MESSAGE_ATTACH_ENCR;
+ } else if (message->prot_state != LIBBALSA_MSG_PROTECT_NONE ||
libbalsa_message_is_pgp_signed(message)) {
switch (message->prot_state) {
case LIBBALSA_MSG_PROTECT_SIGN_GOOD:
- return LIBBALSA_MESSAGE_ATTACH_GOOD;
+ attach_icon = LIBBALSA_MESSAGE_ATTACH_GOOD;
+ break;
case LIBBALSA_MSG_PROTECT_SIGN_NOTRUST:
- return LIBBALSA_MESSAGE_ATTACH_NOTRUST;
+ attach_icon = LIBBALSA_MESSAGE_ATTACH_NOTRUST;
+ break;
case LIBBALSA_MSG_PROTECT_SIGN_BAD:
- return LIBBALSA_MESSAGE_ATTACH_BAD;
+ attach_icon = LIBBALSA_MESSAGE_ATTACH_BAD;
+ break;
case LIBBALSA_MSG_PROTECT_CRYPT:
- return LIBBALSA_MESSAGE_ATTACH_ENCR;
+ attach_icon = LIBBALSA_MESSAGE_ATTACH_ENCR;
+ break;
default:
- return LIBBALSA_MESSAGE_ATTACH_SIGN;
+ attach_icon = LIBBALSA_MESSAGE_ATTACH_SIGN;
+ break;
}
- } else
- if (libbalsa_message_has_attachment(message))
- return LIBBALSA_MESSAGE_ATTACH_ATTACH;
- else
- return LIBBALSA_MESSAGE_ATTACH_ICONS_NUM;
+ } else if (libbalsa_message_has_attachment(message)) {
+ attach_icon = LIBBALSA_MESSAGE_ATTACH_ATTACH;
+ } else {
+ attach_icon = LIBBALSA_MESSAGE_ATTACH_ICONS_NUM;
+ }
+
+ return attach_icon;
}
/* Tell the mailbox driver to change flags. */
@@ -618,8 +694,9 @@ libbalsa_message_change_flags(LibBalsaMessage * message,
set, clear);
}
+
void
-libbalsa_message_reply(LibBalsaMessage * message)
+libbalsa_message_reply(LibBalsaMessage *message)
{
g_return_if_fail(message->mailbox);
libbalsa_lock_mailbox(message->mailbox);
@@ -630,93 +707,107 @@ libbalsa_message_reply(LibBalsaMessage * message)
/* libbalsa_message_body_ref:
references the structure of given message possibly fetching also all
- headers.
+ headers.
message parts can be fetched later on.
-*/
+ */
gboolean
-libbalsa_message_body_ref(LibBalsaMessage * message, gboolean read,
- gboolean fetch_all_headers)
+libbalsa_message_body_ref(LibBalsaMessage *message,
+ gboolean read,
+ gboolean fetch_all_headers)
{
LibBalsaFetchFlag flags = 0;
- gboolean retval = TRUE;
+ gboolean retval = TRUE;
g_return_val_if_fail(message, FALSE);
- if (!message->mailbox) return FALSE;
+ if (message->mailbox == NULL)
+ return FALSE;
+
g_return_val_if_fail(MAILBOX_OPEN(message->mailbox), FALSE);
libbalsa_lock_mailbox(message->mailbox);
- if(fetch_all_headers && !message->has_all_headers)
- flags |= LB_FETCH_RFC822_HEADERS;
+ if (fetch_all_headers && !message->has_all_headers)
+ flags |= LB_FETCH_RFC822_HEADERS;
- if (message->body_ref == 0 && !message->body_list)
+ if ((message->body_ref == 0) && !message->body_list) {
/* not fetched yet */
flags |= LB_FETCH_STRUCTURE;
+ }
- if (flags)
+ if (flags) {
retval =
libbalsa_mailbox_fetch_message_structure(message->mailbox,
message, flags);
+ }
+
if (retval)
- message->body_ref++;
+ message->body_ref++;
libbalsa_unlock_mailbox(message->mailbox);
-
+
return retval;
}
void
-libbalsa_message_body_unref(LibBalsaMessage * message)
+libbalsa_message_body_unref(LibBalsaMessage *message)
{
g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
if (message->body_ref == 0)
- return;
+ return;
- if(message->mailbox) { libbalsa_lock_mailbox(message->mailbox); }
- if (--message->body_ref == 0) {
- libbalsa_message_body_free(message->body_list);
- message->body_list = NULL;
- if (message->mailbox)
- libbalsa_mailbox_release_message(message->mailbox, message);
- /* Free headers that we no longer need. */
- lb_message_headers_extra_destroy(message->headers);
- message->has_all_headers = 0;
- }
- if(message->mailbox) { libbalsa_unlock_mailbox(message->mailbox); }
+ if (message->mailbox)
+ libbalsa_lock_mailbox(message->mailbox);
+ if (--message->body_ref == 0) {
+ libbalsa_message_body_free(message->body_list);
+ message->body_list = NULL;
+ if (message->mailbox)
+ libbalsa_mailbox_release_message(message->mailbox, message);
+
+ /* Free headers that we no longer need. */
+ lb_message_headers_extra_destroy(message->headers);
+ message->has_all_headers = 0;
+ }
+ if (message->mailbox)
+ libbalsa_unlock_mailbox(message->mailbox);
}
+
gboolean
-libbalsa_message_is_multipart(LibBalsaMessage * message)
+libbalsa_message_is_multipart(LibBalsaMessage *message)
{
g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
return message->headers->content_type ?
- g_mime_content_type_is_type(message->headers->content_type,
- "multipart", "*") : FALSE;
+ g_mime_content_type_is_type(message->headers->content_type,
+ "multipart", "*") : FALSE;
}
+
gboolean
-libbalsa_message_is_partial(LibBalsaMessage * message, gchar ** id)
+libbalsa_message_is_partial(LibBalsaMessage *message,
+ gchar **id)
{
GMimeContentType *content_type;
g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
content_type = message->headers->content_type;
- if (!content_type
- || !g_mime_content_type_is_type(content_type,
- "message", "partial"))
- return FALSE;
+ if (content_type == NULL
+ || !g_mime_content_type_is_type(content_type,
+ "message", "partial"))
+ return FALSE;
+
if (id)
- *id = g_strdup(g_mime_content_type_get_parameter(content_type,
- "id"));
+ *id = g_strdup(g_mime_content_type_get_parameter(content_type,
+ "id"));
return TRUE;
}
+
/* Go through all parts and try to figure out whether it is a message
with attachments or not. It still yields insatsfactory
results... */
@@ -725,23 +816,25 @@ has_attached_part(LibBalsaMessageBody *body)
{
LibBalsaMessageBody *lbbody;
/* the condition matches the one used in add_multipart_mixed() */
- for(lbbody=body; lbbody; lbbody = lbbody->next) {
+ for (lbbody = body; lbbody; lbbody = lbbody->next) {
/* printf("part %s has disposition %s\n",
lbbody->content_type, lbbody->content_dsp); */
- if(!libbalsa_message_body_is_multipart(lbbody) &&
- !libbalsa_message_body_is_inline(lbbody) ) {
+ if (!libbalsa_message_body_is_multipart(lbbody) &&
+ !libbalsa_message_body_is_inline(lbbody)) {
/* puts("Attachment found!"); */
return TRUE;
}
- if(lbbody->parts && has_attached_part(lbbody->parts))
+
+ if (lbbody->parts && has_attached_part(lbbody->parts))
return TRUE;
}
/* no part was an attachment */
return FALSE;
}
+
gboolean
-libbalsa_message_has_attachment(LibBalsaMessage * message)
+libbalsa_message_has_attachment(LibBalsaMessage *message)
{
g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
@@ -749,7 +842,7 @@ libbalsa_message_has_attachment(LibBalsaMessage * message)
has Content-type: multipart/mixed AND members with
Content-disposition: attachment. Unfortunately, part list may
not be available at this stage. */
- if(!message->body_list) {
+ if (message->body_list == NULL) {
return message->headers->content_type &&
g_mime_content_type_is_type(message->headers->content_type,
"multipart", "mixed");
@@ -820,16 +913,24 @@ libbalsa_message_set_dispnotify(LibBalsaMessage * message,
}
}
-#ifndef MESSAGE_COPY_CONTENT
/* libbalsa_message_get_subject:
get constant pointer to the subject of the message;
*/
+#ifdef MESSAGE_COPY_CONTENT
+const gchar *
+libbalsa_message_get_subject(LibBalsaMessage *message)
+{
+ return message->subj != NULL ? message->subj : _("(No subject)");
+}
+
+
+#else /* MESSAGE_COPY_CONTENT */
const gchar *
libbalsa_message_get_subject(LibBalsaMessage* msg)
{
const gchar *ret;
- if(!msg->subj &&
- msg->mime_msg && msg->mailbox) { /* a message in a mailbox... */
+ if(msg->subj == NULL &&
+ msg->mime_msg != NULL && msg->mailbox != NULL) { /* a message in a mailbox... */
g_return_val_if_fail(MAILBOX_OPEN(msg->mailbox), NULL);
ret = g_mime_message_get_subject(msg->mime_msg);
libbalsa_message_set_subject_from_header(msg, ret);
@@ -845,10 +946,10 @@ libbalsa_message_get_lines(LibBalsaMessage* msg)
{
/* set the line count */
const char *value;
- if (!msg->mime_msg)
+ if (msg->mime_msg == NULL)
return 0;
value = g_mime_object_get_header(msg->mime_msg, "Lines");
- if (!value)
+ if (value == NULL)
return 0;
return atoi(value);
}
@@ -857,10 +958,10 @@ libbalsa_message_get_length(LibBalsaMessage* msg)
{
/* set the length */
const char *value;
- if (!msg->mime_msg)
+ if (msg->mime_msg == NULL)
return 0;
value = g_mime_object_get_header(msg->mime_msg, "Content-Length");
- if (!value)
+ if (value == NULL)
return 0;
return atoi(value);
}
@@ -872,104 +973,115 @@ libbalsa_message_get_no(LibBalsaMessage* msg)
}
-#endif
+#endif /* MESSAGE_COPY_CONTENT */
/* Populate headers from mime_msg, but only the members that are needed
* all the time. */
static InternetAddressList *
-lb_message_recipients(GMimeMessage * message, GMimeRecipientType type)
+lb_message_recipients(GMimeMessage *message,
+ GMimeRecipientType type)
{
const InternetAddressList *list;
InternetAddressList *copy = NULL;
if ((list = g_mime_message_get_recipients (message, type))) {
- copy = internet_address_list_new ();
- internet_address_list_append (copy, (InternetAddressList *) list);
+ copy = internet_address_list_new ();
+ internet_address_list_append (copy, (InternetAddressList *) list);
}
-
+
return copy;
}
+
static void
lb_message_headers_basic_from_gmime(LibBalsaMessageHeaders *headers,
- GMimeMessage *mime_msg)
+ GMimeMessage *mime_msg)
{
g_return_if_fail(headers);
g_return_if_fail(mime_msg != NULL);
- if (!headers->from)
+ if (headers->from == NULL)
headers->from = internet_address_list_parse_string(mime_msg->from);
- if (!headers->date)
- g_mime_message_get_date(mime_msg, &headers->date, NULL);
+ if (headers->date == 0)
+ g_mime_message_get_date(mime_msg, &headers->date, NULL);
- if (!headers->to_list)
+ if (headers->to_list == NULL) {
headers->to_list =
lb_message_recipients(mime_msg, GMIME_RECIPIENT_TYPE_TO);
+ }
- if (!headers->content_type) {
- /* If we could:
- * headers->content_type =
- * g_mime_content_type_copy
- * (g_mime_object_get_content_type(mime_msg->mime_part));
- */
- GMimeContentType *content_type;
- gchar *str;
- g_return_if_fail(headers->content_type == NULL);
- content_type = g_mime_object_get_content_type(mime_msg->mime_part);
- str = g_mime_content_type_to_string(content_type);
- headers->content_type = g_mime_content_type_new_from_string(str);
- g_free(str);
+ if (headers->content_type == NULL) {
+ /* If we could:
+ * headers->content_type =
+ * g_mime_content_type_copy
+ * (g_mime_object_get_content_type(mime_msg->mime_part));
+ */
+ GMimeContentType *content_type;
+ gchar *str;
+ g_return_if_fail(headers->content_type == NULL);
+ content_type = g_mime_object_get_content_type(mime_msg->mime_part);
+ str = g_mime_content_type_to_string(content_type);
+ headers->content_type = g_mime_content_type_new_from_string(str);
+ g_free(str);
}
}
+
/* Populate headers from mime_msg, but only the members not handled in
* lb_message_headers_basic_from_gmime. */
static void
lb_message_headers_extra_from_gmime(LibBalsaMessageHeaders *headers,
- GMimeMessage *mime_msg)
+ GMimeMessage *mime_msg)
{
g_return_if_fail(headers);
g_return_if_fail(mime_msg != NULL);
- if (!headers->reply_to)
+ if (headers->reply_to == NULL) {
headers->reply_to =
- internet_address_list_parse_string(mime_msg->reply_to);
+ internet_address_list_parse_string(mime_msg->reply_to);
+ }
- if (!headers->dispnotify_to)
+ if (headers->dispnotify_to == NULL) {
headers->dispnotify_to =
internet_address_list_parse_string(g_mime_object_get_header
- (GMIME_OBJECT(mime_msg),
- "Disposition-Notification-To"));
+ (GMIME_OBJECT(mime_msg),
+ "Disposition-Notification-To"));
+ }
- if (!headers->cc_list)
+ if (headers->cc_list == NULL) {
headers->cc_list =
lb_message_recipients(mime_msg, GMIME_RECIPIENT_TYPE_CC);
+ }
- if (!headers->bcc_list)
+ if (headers->bcc_list == NULL) {
headers->bcc_list =
lb_message_recipients(mime_msg, GMIME_RECIPIENT_TYPE_BCC);
+ }
/* Get fcc from message */
- if (!headers->fcc_url)
- headers->fcc_url =
- g_strdup(g_mime_object_get_header(GMIME_OBJECT(mime_msg), "X-Balsa-Fcc"));
+ if (headers->fcc_url == NULL) {
+ headers->fcc_url =
+ g_strdup(g_mime_object_get_header(GMIME_OBJECT(mime_msg), "X-Balsa-Fcc"));
+ }
}
+
/* Populate headers from the info in mime_msg. */
void
libbalsa_message_headers_from_gmime(LibBalsaMessageHeaders *headers,
- GMimeMessage *mime_msg)
+ GMimeMessage *mime_msg)
{
lb_message_headers_basic_from_gmime(headers, mime_msg);
lb_message_headers_extra_from_gmime(headers, mime_msg);
}
+
/* Populate message and message->headers from the info in mime_msg,
* but only the members that are needed all the time. */
void
-libbalsa_message_init_from_gmime(LibBalsaMessage * message,
- GMimeMessage *mime_msg)
+libbalsa_message_init_from_gmime(LibBalsaMessage *message,
+ GMimeMessage *mime_msg)
{
const gchar *header;
@@ -982,28 +1094,30 @@ libbalsa_message_init_from_gmime(LibBalsaMessage * message,
header = g_mime_object_get_header(GMIME_OBJECT(mime_msg), "Content-Length");
if (header)
- message->length = atoi(header);
-#endif
+ message->length = atoi(header);
+
+#endif /* MESSAGE_COPY_CONTENT */
header = g_mime_message_get_message_id(mime_msg);
if (header)
- message->message_id = g_strdup(header);
+ message->message_id = g_strdup(header);
header = g_mime_object_get_header(GMIME_OBJECT(mime_msg), "References");
if (header)
- libbalsa_message_set_references_from_string(message, header);
+ libbalsa_message_set_references_from_string(message, header);
header = g_mime_object_get_header(GMIME_OBJECT(mime_msg), "In-Reply-To");
if (header)
- libbalsa_message_set_in_reply_to_from_string(message, header);
+ libbalsa_message_set_in_reply_to_from_string(message, header);
lb_message_headers_basic_from_gmime(message->headers, mime_msg);
}
+
/* Create a newly allocated list of references for threading.
* This is a deep copy, with its own strings: deallocate with
* g_free and g_list_free. */
GList *
-libbalsa_message_refs_for_threading(LibBalsaMessage * message)
+libbalsa_message_refs_for_threading(LibBalsaMessage *message)
{
GList *tmp;
GList *foo;
@@ -1011,71 +1125,77 @@ libbalsa_message_refs_for_threading(LibBalsaMessage * message)
g_return_val_if_fail(message != NULL, NULL);
if (message->in_reply_to && message->in_reply_to->next)
- return NULL;
+ return NULL;
+
tmp = g_list_copy(message->references);
if (message->in_reply_to) {
- /* some mailers provide in_reply_to but no references, and
- * some apparently provide both but with the references in
- * the wrong order; we'll just make sure it's the last item
- * of this list */
- foo = g_list_find_custom(tmp, message->in_reply_to->data,
- (GCompareFunc) strcmp);
-
- if (foo) {
- tmp = g_list_remove_link(tmp, foo);
- g_list_free_1(foo);
- }
- tmp = g_list_append(tmp, message->in_reply_to->data);
+ /* some mailers provide in_reply_to but no references, and
+ * some apparently provide both but with the references in
+ * the wrong order; we'll just make sure it's the last item
+ * of this list */
+ foo = g_list_find_custom(tmp, message->in_reply_to->data,
+ (GCompareFunc) strcmp);
+
+ if (foo) {
+ tmp = g_list_remove_link(tmp, foo);
+ g_list_free_1(foo);
+ }
+ tmp = g_list_append(tmp, message->in_reply_to->data);
}
- for (foo = tmp; foo; foo = foo->next)
- foo->data = g_strdup((gchar *) foo->data);
+ for (foo = tmp; foo; foo = foo->next) {
+ foo->data = g_strdup((gchar *) foo->data);
+ }
return tmp;
}
+
static GList *
-references_decode(const gchar * str)
+references_decode(const gchar *str)
{
GMimeReferences *references, *reference;
GList *list = NULL;
reference = references = g_mime_references_decode(str);
while (reference) {
- list = g_list_prepend(list, g_strdup(reference->msgid));
- reference = reference->next;
+ list = g_list_prepend(list, g_strdup(reference->msgid));
+ reference = reference->next;
}
g_mime_references_clear(&references);
return g_list_reverse(list);
}
+
void
-libbalsa_message_set_references_from_string(LibBalsaMessage * message,
- const gchar *str)
+libbalsa_message_set_references_from_string(LibBalsaMessage *message,
+ const gchar *str)
{
- /* Empty references are acceptable but require no action. Similarly,
- if references were set already, there is not reason to set them
- again - they are immutable anyway. */
- if(!message->references && str)
+ /* Empty references are acceptable but require no action. Similarly,
+ if references were set already, there is not reason to set them
+ again - they are immutable anyway. */
+ if (message->references == NULL && str != NULL)
message->references = references_decode(str);
}
+
void
-libbalsa_message_set_in_reply_to_from_string(LibBalsaMessage * message,
- const gchar * str)
-{
- if (!message->in_reply_to && str) {
- /* FIXME for Balsa's old non-compliant header */
- gchar *p = strrchr(str, ';');
- p = p ? g_strndup(str, p - str) : g_strdup(str);
- message->in_reply_to = references_decode(p);
- g_free(p);
+libbalsa_message_set_in_reply_to_from_string(LibBalsaMessage *message,
+ const gchar *str)
+{
+ if (message->in_reply_to == NULL && str != NULL) {
+ /* FIXME for Balsa's old non-compliant header */
+ gchar *p = strrchr(str, ';');
+ p = p ? g_strndup(str, p - str) : g_strdup(str);
+ message->in_reply_to = references_decode(p);
+ g_free(p);
}
}
+
/* set a header, if (all) or if it's needed all the time:
* headers->from
* headers->date
@@ -1090,8 +1210,10 @@ libbalsa_message_set_in_reply_to_from_string(LibBalsaMessage * message,
* in_reply_to
*/
static gboolean
-lbmsg_set_header(LibBalsaMessage *message, const gchar *name,
- const gchar* value, gboolean all)
+lbmsg_set_header(LibBalsaMessage *message,
+ const gchar *name,
+ const gchar *value,
+ gboolean all)
{
gchar *val = NULL;
@@ -1111,99 +1233,99 @@ lbmsg_set_header(LibBalsaMessage *message, const gchar *name,
}
if (g_ascii_strcasecmp(name, "Subject") == 0) {
- if (!strcmp(value,
- "DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA")) {
+ if (strcmp(value,
+ "DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA") == 0) {
g_free(val);
- return FALSE;
+ return FALSE;
}
#if MESSAGE_COPY_CONTENT
libbalsa_message_set_subject_from_header(message, value);
-#endif
- } else
- if (g_ascii_strcasecmp(name, "Date") == 0) {
- message->headers->date = g_mime_utils_header_decode_date(value, NULL);
- } else
- if (message->headers->from == NULL &&
- g_ascii_strcasecmp(name, "From") == 0) {
+#endif /* MESSAGE_COPY_CONTENT */
+ } else if (g_ascii_strcasecmp(name, "Date") == 0) {
+ message->headers->date = g_mime_utils_header_decode_date(value, NULL);
+ } else if ((message->headers->from == NULL) &&
+ (g_ascii_strcasecmp(name, "From") == 0)) {
message->headers->from = internet_address_list_parse_string(value);
- } else
- if (message->headers->to_list == NULL &&
- g_ascii_strcasecmp(name, "To") == 0) {
- message->headers->to_list = internet_address_list_parse_string(value);
- } else
- if (g_ascii_strcasecmp(name, "In-Reply-To") == 0) {
- libbalsa_message_set_in_reply_to_from_string(message, value);
- } else
- if (message->message_id == NULL &&
- g_ascii_strcasecmp(name, "Message-ID") == 0) {
- message->message_id = g_mime_utils_decode_message_id(value);
- } else
- if (g_ascii_strcasecmp(name, "References") == 0) {
- libbalsa_message_set_references_from_string(message, value);
- } else
- if (message->headers->content_type == NULL &&
- g_ascii_strcasecmp(name, "Content-Type") == 0) {
- message->headers->content_type =
- g_mime_content_type_new_from_string(value);
- } else
- if (message->headers->dispnotify_to == NULL &&
- g_ascii_strcasecmp(name, "Disposition-Notification-To") == 0) {
- message->headers->dispnotify_to =
- internet_address_list_parse_string(value);
+ } else if ((message->headers->to_list == NULL) &&
+ (g_ascii_strcasecmp(name, "To") == 0)) {
+ message->headers->to_list = internet_address_list_parse_string(value);
+ } else if (g_ascii_strcasecmp(name, "In-Reply-To") == 0) {
+ libbalsa_message_set_in_reply_to_from_string(message, value);
+ } else if ((message->message_id == NULL) &&
+ (g_ascii_strcasecmp(name, "Message-ID") == 0)) {
+ message->message_id = g_mime_utils_decode_message_id(value);
+ } else if (g_ascii_strcasecmp(name, "References") == 0) {
+ libbalsa_message_set_references_from_string(message, value);
+ } else if ((message->headers->content_type == NULL) &&
+ (g_ascii_strcasecmp(name, "Content-Type") == 0)) {
+ message->headers->content_type = g_mime_content_type_new_from_string(value);
+ } else if ((message->headers->dispnotify_to == NULL) &&
+ (g_ascii_strcasecmp(name, "Disposition-Notification-To") == 0)) {
+ message->headers->dispnotify_to = internet_address_list_parse_string(value);
} else
#ifdef MESSAGE_COPY_CONTENT
if (g_ascii_strcasecmp(name, "Content-Length") == 0) {
- message->length = atoi(value);
+ message->length = atoi(value);
} else
-#endif
- if (all)
+#endif /* MESSAGE_COPY_CONTENT */
+ if (all) {
message->headers->user_hdrs =
g_list_prepend(message->headers->user_hdrs,
- libbalsa_create_hdr_pair(name,
- g_strdup(value)));
+ libbalsa_create_hdr_pair(name, g_strdup(value)));
+ }
g_free(val);
return TRUE;
}
+
static gboolean
lb_message_set_headers_from_string(LibBalsaMessage *message,
- const gchar *lines, gboolean all)
+ const gchar *lines,
+ gboolean all)
{
gchar *header, *value;
const gchar *val, *eoh;
do {
- for(val = lines; *val && *val >32 && *val<127 && *val != ':'; val++)
- ;
- if(*val != ':') /* parsing error */
+ for (val = lines; *val && *val > 32 && *val < 127 && *val != ':'; val++) {
+ }
+ if (*val != ':') /* parsing error */
return FALSE;
- for(eoh = val+1; *eoh && (eoh[0] != '\n' || isspace(eoh[1])); eoh++)
- ;
- header = g_strndup(lines, val-lines);
- lines = eoh;
- for(val=val+1; *val && isspace(*val); val++)
- ; /* strip spaces at front... */
- while(eoh>val && isspace(*eoh)) eoh--; /* .. and at the end */
- value = g_strndup(val, eoh-val+1);
-
+
+ for (eoh = val + 1; *eoh && (eoh[0] != '\n' || isspace(eoh[1])); eoh++) {
+ }
+ header = g_strndup(lines, val - lines);
+ lines = eoh;
+ for (val = val + 1; *val && isspace(*val); val++) {
+ /* strip spaces at front... */
+ }
+ while (eoh > val && isspace(*eoh)) {
+ eoh--; /* .. and at the end */
+ }
+ value = g_strndup(val, eoh - val + 1);
+
lbmsg_set_header(message, header, value, all);
- g_free(header); g_free(value);
- if(!*lines || !*++lines) break;
- } while(1);
+ g_free(header);
+ g_free(value);
+ if (*lines == '\0' || *++lines == '\0')
+ break;
+ } while (1);
return TRUE;
}
+
gboolean
libbalsa_message_set_headers_from_string(LibBalsaMessage *message,
- const gchar *lines)
+ const gchar *lines)
{
return lb_message_set_headers_from_string(message, lines, TRUE);
}
+
void
-libbalsa_message_load_envelope_from_stream(LibBalsaMessage * message,
- GMimeStream *gmime_stream)
+libbalsa_message_load_envelope_from_stream(LibBalsaMessage *message,
+ GMimeStream *gmime_stream)
{
GMimeStream *gmime_stream_filter;
GMimeFilter *gmime_filter_crlf;
@@ -1223,7 +1345,7 @@ libbalsa_message_load_envelope_from_stream(LibBalsaMessage * message,
g_mime_filter_crlf_new(FALSE,
FALSE);
g_mime_stream_filter_add(GMIME_STREAM_FILTER(gmime_stream_filter),
- gmime_filter_crlf);
+ gmime_filter_crlf);
g_object_unref(gmime_filter_crlf);
/* Buffer the message stream, so we can read it line by line. */
@@ -1238,30 +1360,28 @@ libbalsa_message_load_envelope_from_stream(LibBalsaMessage * message,
*/
line = g_byte_array_new();
do {
- g_mime_stream_buffer_readln(gmime_stream_buffer, line);
- while (g_mime_stream_read(gmime_stream_buffer,
- (char *) &lookahead, 1) == 1
+ g_mime_stream_buffer_readln(gmime_stream_buffer, line);
+ while (g_mime_stream_read(gmime_stream_buffer,
+ (char *) &lookahead, 1) == 1
&& (lookahead == ' ' || lookahead == '\t')) {
g_byte_array_append(line, &lookahead, 1);
g_mime_stream_buffer_readln(gmime_stream_buffer, line);
- }
- if (line->len == 0 || line->data[line->len-1]!='\n') {
- /* EOF or read error; in either case, message has no body. */
- break;
- }
- line->data[line->len-1]='\0'; /* terminate line by overwriting '\n' */
- if (!lb_message_set_headers_from_string(message,
- (gchar *) line->data,
- FALSE)) {
- /* Ignore error return caused by malformed header. */
- }
- if (lookahead == '\n') {/* end of header */
+ }
+ if ((line->len == 0) || (line->data[line->len - 1] != '\n')) {
+ /* EOF or read error; in either case, message has no body. */
+ break;
+ }
+ line->data[line->len - 1] = '\0'; /* terminate line by overwriting '\n' */
+ if (!lb_message_set_headers_from_string(message, (gchar *) line->data, FALSE)) {
+ /* Ignore error return caused by malformed header. */
+ }
+ if (lookahead == '\n') {/* end of header */
/* Message looks valid--set its length. */
message->length = g_mime_stream_length(gmime_stream);
- break;
- }
- line->len = 0;
- g_byte_array_append(line, &lookahead, 1);
+ break;
+ }
+ line->len = 0;
+ g_byte_array_append(line, &lookahead, 1);
} while (TRUE);
g_byte_array_free(line, TRUE);
@@ -1270,21 +1390,24 @@ libbalsa_message_load_envelope_from_stream(LibBalsaMessage * message,
libbalsa_mime_stream_shared_unlock(gmime_stream);
}
+
void
libbalsa_message_load_envelope(LibBalsaMessage *message)
{
GMimeStream *gmime_stream;
gmime_stream = libbalsa_message_stream(message);
- if (!gmime_stream)
- return;
+ if (gmime_stream == NULL)
+ return;
+
libbalsa_message_load_envelope_from_stream(message, gmime_stream);
g_object_unref(gmime_stream);
}
+
GMimeStream *
-libbalsa_message_stream(LibBalsaMessage * message)
+libbalsa_message_stream(LibBalsaMessage *message)
{
LibBalsaMailbox *mailbox;
GMimeStream *mime_stream;
@@ -1298,6 +1421,7 @@ libbalsa_message_stream(LibBalsaMessage * message)
return libbalsa_mailbox_get_message_stream(mailbox,
message->msgno, FALSE);
+
mime_stream = g_mime_stream_mem_new();
g_mime_object_write_to_stream(GMIME_OBJECT(message->mime_msg),
mime_stream);
@@ -1306,9 +1430,11 @@ libbalsa_message_stream(LibBalsaMessage * message)
return mime_stream;
}
+
gboolean
-libbalsa_message_copy(LibBalsaMessage * message, LibBalsaMailbox * dest,
- GError ** err)
+libbalsa_message_copy(LibBalsaMessage *message,
+ LibBalsaMailbox *dest,
+ GError **err)
{
LibBalsaMailbox *mailbox;
gboolean retval;
@@ -1335,9 +1461,10 @@ libbalsa_message_copy(LibBalsaMessage * message, LibBalsaMailbox * dest,
return retval;
}
+
void
-libbalsa_message_set_subject(LibBalsaMessage * message,
- const gchar * subject)
+libbalsa_message_set_subject(LibBalsaMessage *message,
+ const gchar *subject)
{
g_free(message->subj);
message->subj = g_strdup(subject);
@@ -1345,10 +1472,13 @@ libbalsa_message_set_subject(LibBalsaMessage * message,
canonize_header_value(message->subj);
}
+
void
-libbalsa_message_set_subject_from_header(LibBalsaMessage * message,
- const gchar * header)
+libbalsa_message_set_subject_from_header(LibBalsaMessage *message,
+ const gchar *header)
{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
if (header) {
gchar *subject =
g_mime_utils_header_decode_text(header);
@@ -1357,13 +1487,397 @@ libbalsa_message_set_subject_from_header(LibBalsaMessage * message,
}
}
+
const gchar *
-libbalsa_message_get_tempdir(LibBalsaMessage * message)
+libbalsa_message_get_tempdir(LibBalsaMessage *message)
{
- if (!message->tempdir) {
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ if (message->tempdir == NULL)
if (!libbalsa_mktempdir(&message->tempdir))
g_warning("Could not make tempdir");
- }
return message->tempdir;
}
+
+
+/*
+ * Getters
+ */
+
+LibBalsaMailbox *
+libbalsa_message_get_mailbox(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ return message->mailbox;
+}
+
+
+LibBalsaMessageHeaders *
+libbalsa_message_get_headers(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ return message->headers;
+}
+
+
+LibBalsaMessageBody *
+libbalsa_message_get_body_list(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ return message->body_list;
+}
+
+
+GMimeMessage *
+libbalsa_message_get_mime_message(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ return message->mime_msg;
+}
+
+
+LibBalsaMessageFlag
+libbalsa_message_get_flags(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), 0);
+
+ return message->flags;
+}
+
+
+const gchar *
+libbalsa_message_get_message_id(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ return message->message_id;
+}
+
+
+glong
+libbalsa_message_get_msgno(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), 0);
+
+ return message->msgno;
+}
+
+
+glong
+libbalsa_message_get_length(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), 0);
+
+ return message->length;
+}
+
+
+gboolean
+libbalsa_message_get_has_all_headers(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
+
+ return message->has_all_headers;
+}
+
+
+InternetAddressList *
+libbalsa_message_get_sender(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), 0);
+
+ return message->sender;
+}
+
+
+gboolean
+libbalsa_message_get_request_dsn(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
+
+ return message->request_dsn;
+}
+
+
+GList *
+libbalsa_message_get_references(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ return message->references;
+}
+
+
+LibBalsaIdentity *
+libbalsa_message_get_identity(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ return message->ident;
+}
+
+
+
+GList *
+libbalsa_message_get_parameters(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ return message->parameters;
+}
+
+
+const gchar *
+libbalsa_message_get_subtype(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ return message->subtype;
+}
+
+
+guint
+libbalsa_message_get_gpg_mode(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), 0);
+
+ return message->gpg_mode;
+}
+
+
+GList *
+libbalsa_message_get_in_reply_to(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), NULL);
+
+ return message->in_reply_to;
+}
+
+
+gboolean
+libbalsa_message_get_attach_pubkey(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), FALSE);
+
+ return message->att_pubkey;
+}
+
+
+LibBalsaMsgProtectState
+libbalsa_message_get_protect_state(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), 0);
+
+ return message->prot_state;
+}
+
+
+guint
+libbalsa_message_get_body_ref(LibBalsaMessage *message)
+{
+ g_return_val_if_fail(LIBBALSA_IS_MESSAGE(message), 0);
+
+ return message->body_ref;
+}
+
+
+/*
+ * Setters
+ */
+
+void
+libbalsa_message_set_flags(LibBalsaMessage *message,
+ LibBalsaMessageFlag flags)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ message->flags = flags;
+}
+
+
+void
+libbalsa_message_set_mailbox(LibBalsaMessage *message,
+ LibBalsaMailbox *mailbox)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+ g_return_if_fail(mailbox == NULL || LIBBALSA_IS_MAILBOX(mailbox));
+
+ message->mailbox = mailbox;
+}
+
+
+void
+libbalsa_message_set_msgno(LibBalsaMessage *message,
+ glong msgno)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ message->msgno = msgno;
+}
+
+
+void
+libbalsa_message_set_has_all_headers(LibBalsaMessage *message,
+ gboolean has_all_headers)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ message->has_all_headers = has_all_headers;
+}
+
+
+#if MESSAGE_COPY_CONTENT
+void
+libbalsa_message_set_length(LibBalsaMessage *message,
+ glong length)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ message->length = length;
+}
+
+
+#endif /* MESSAGE_COPY_CONTENT */
+
+void
+libbalsa_message_set_mime_message(LibBalsaMessage *message,
+ GMimeMessage *mime_message)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+ g_return_if_fail(mime_message == NULL || GMIME_IS_MESSAGE(mime_message));
+
+ g_set_object(&message->mime_msg, mime_message);
+}
+
+
+void
+libbalsa_message_set_sender(LibBalsaMessage *message,
+ InternetAddressList *sender)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+ g_return_if_fail(sender == NULL || IS_INTERNET_ADDRESS_LIST(sender));
+
+ g_set_object(&message->sender, sender);
+}
+
+
+void
+libbalsa_message_set_message_id(LibBalsaMessage *message,
+ const gchar *message_id)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ g_free(message->message_id);
+ message->message_id = g_strdup(message_id);
+}
+
+
+void
+libbalsa_message_set_protect_state(LibBalsaMessage *message,
+ LibBalsaMsgProtectState prot_state)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ message->prot_state = prot_state;
+}
+
+
+void
+libbalsa_message_set_request_dsn(LibBalsaMessage *message,
+ gboolean request_dsn)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ message->request_dsn = request_dsn;
+}
+
+
+void
+libbalsa_message_set_subtype(LibBalsaMessage *message,
+ const gchar *subtype)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ g_free(message->subtype);
+ message->subtype = g_strdup(subtype);
+}
+
+
+void
+libbalsa_message_set_body_list(LibBalsaMessage *message,
+ LibBalsaMessageBody *body_list)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ message->body_list = body_list;
+}
+
+
+void
+libbalsa_message_set_references(LibBalsaMessage *message,
+ GList *references)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ g_list_free_full(message->references, g_free);
+ /* We steal the GList and its data; see libbalsa_message_finalize */
+ message->references = references;
+}
+
+
+void
+libbalsa_message_set_in_reply_to(LibBalsaMessage *message,
+ GList *in_reply_to)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ g_list_free_full(message->in_reply_to, g_free);
+ /* We steal the GList and its data; see libbalsa_message_finalize */
+ message->in_reply_to = in_reply_to;
+}
+
+
+void
+libbalsa_message_set_gpg_mode(LibBalsaMessage *message,
+ guint mode)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ message->gpg_mode = mode;
+}
+
+
+void
+libbalsa_message_set_attach_pubkey(LibBalsaMessage *message,
+ gboolean att_pubkey)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ message->att_pubkey = att_pubkey;
+}
+
+
+void
+libbalsa_message_set_identity(LibBalsaMessage *message,
+ LibBalsaIdentity *ident)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+ g_return_if_fail(ident == NULL || LIBBALSA_IS_IDENTITY(ident));
+
+ g_set_object(&message->ident, ident);
+}
+
+
+void
+libbalsa_message_add_parameters(LibBalsaMessage *message,
+ gchar **parameters)
+{
+ g_return_if_fail(LIBBALSA_IS_MESSAGE(message));
+
+ message->parameters = g_list_prepend(message->parameters, parameters);
+}
diff --git a/libbalsa/message.h b/libbalsa/message.h
index a45362dc6..7841a90d7 100644
--- a/libbalsa/message.h
+++ b/libbalsa/message.h
@@ -5,14 +5,14 @@
*
* 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/>.
*/
@@ -21,7 +21,7 @@
#define __LIBBALSA_MESSAGE_H__
#ifndef BALSA_VERSION
-# error "Include config.h before this file."
+# error "Include config.h before this file."
#endif
#include <glib.h>
@@ -34,19 +34,15 @@
#include "rfc3156.h"
#define MESSAGE_COPY_CONTENT 1
-#define LIBBALSA_TYPE_MESSAGE \
- (libbalsa_message_get_type())
-#define LIBBALSA_MESSAGE(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST(obj, LIBBALSA_TYPE_MESSAGE, LibBalsaMessage))
-#define LIBBALSA_MESSAGE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST(klass, LIBBALSA_TYPE_MESSAGE, \
- LibBalsaMessageClass))
-#define LIBBALSA_IS_MESSAGE(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE(obj, LIBBALSA_TYPE_MESSAGE))
-#define LIBBALSA_IS_MESSAGE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE(klass, LIBBALSA_TYPE_MESSAGE))
-
-typedef struct _LibBalsaMessageClass LibBalsaMessageClass;
+
+#define LIBBALSA_TYPE_MESSAGE libbalsa_message_get_type()
+
+G_DECLARE_FINAL_TYPE(LibBalsaMessage,
+ libbalsa_message,
+ LIBBALSA,
+ MESSAGE,
+ GObject)
+
typedef enum _LibBalsaMessageFlag LibBalsaMessageFlag;
enum _LibBalsaMessageFlag {
@@ -55,16 +51,16 @@ enum _LibBalsaMessageFlag {
LIBBALSA_MESSAGE_FLAG_REPLIED = 1 << 2,
LIBBALSA_MESSAGE_FLAG_FLAGGED = 1 << 3,
LIBBALSA_MESSAGE_FLAG_RECENT = 1 << 4,
- LIBBALSA_MESSAGE_FLAG_SELECTED= 1 << 5, /* pseudo flag */
- LIBBALSA_MESSAGE_FLAG_INVALID = 1 << 6 /* pseudo flag */
+ LIBBALSA_MESSAGE_FLAG_SELECTED= 1 << 5, /* pseudo flag */
+ LIBBALSA_MESSAGE_FLAG_INVALID = 1 << 6 /* pseudo flag */
};
#define LIBBALSA_MESSAGE_FLAGS_REAL \
- (LIBBALSA_MESSAGE_FLAG_NEW | \
- LIBBALSA_MESSAGE_FLAG_DELETED | \
- LIBBALSA_MESSAGE_FLAG_REPLIED | \
- LIBBALSA_MESSAGE_FLAG_FLAGGED | \
- LIBBALSA_MESSAGE_FLAG_RECENT)
+ (LIBBALSA_MESSAGE_FLAG_NEW | \
+ LIBBALSA_MESSAGE_FLAG_DELETED | \
+ LIBBALSA_MESSAGE_FLAG_REPLIED | \
+ LIBBALSA_MESSAGE_FLAG_FLAGGED | \
+ LIBBALSA_MESSAGE_FLAG_RECENT)
typedef enum _LibBalsaMessageStatus LibBalsaMessageStatus;
enum _LibBalsaMessageStatus {
@@ -153,90 +149,8 @@ struct _LibBalsaMessageHeaders {
/** FREE_HEADER_LIST() frees user_hdrs */
#define FREE_HEADER_LIST(l) do{g_list_free_full((l),(GDestroyNotify)g_strfreev);}while(0)
-struct _LibBalsaMessage {
- GObject object;
-
- /* the mailbox this message belongs to */
- LibBalsaMailbox *mailbox;
-
- /* flags */
- LibBalsaMessageFlag flags;
-
- /* headers */
- LibBalsaMessageHeaders *headers;
- int updated; /** whether complete headers have been fetched */
-
- GMimeMessage *mime_msg;
-
- /* sender address */
- InternetAddressList *sender;
-
- /* subject line; we still need it here for sending;
- * although _SET_SUBJECT might resolve it(?)
- * but we can set to to NULL unless there is no mailbox, like
- * on sending. */
- gchar *subj;
-#ifdef MESSAGE_COPY_CONTENT
-#define LIBBALSA_MESSAGE_GET_SUBJECT(m) \
- ((m)->subj ? (m)->subj : _("(No subject)"))
-#else
-#define LIBBALSA_MESSAGE_GET_SUBJECT(m) libbalsa_message_get_subject(m)
-#endif
-
- /* replied message ID's */
- GList *references;
-
- /* replied message ID; from address on date */
- GList *in_reply_to;
-
- /* message ID */
- gchar *message_id;
-
- /* GPG sign and/or encrypt message (sending) */
- guint gpg_mode;
-
- /* attach the GnuPG public key to the message (sending) */
- gboolean att_pubkey;
-
- /* protection (i.e. sign/encrypt) status (received message) */
- LibBalsaMsgProtectState prot_state;
-
- /* sender identity, required for choosing a forced GnuPG or S/MIME key */
- LibBalsaIdentity *ident;
-
- /* request a DSN (sending) */
- gboolean request_dsn;
-
- /* a forced multipart subtype or NULL for mixed; used only for
- * sending */
- gchar *subtype;
-
- /* additional message content type parameters; used only for sending */
- GList *parameters;
-
- /* message body */
- guint body_ref;
- LibBalsaMessageBody *body_list;
- /* GList *body_list; */
-
- glong msgno; /* message no; always copy for faster sorting;
- * counting starts at 1. */
-#if MESSAGE_COPY_CONTENT
-#define LIBBALSA_MESSAGE_GET_NO(m) ((m)->msgno)
- glong length; /* byte len */
-#define LIBBALSA_MESSAGE_GET_LENGTH(m) ((m)->length)
-#else
-#define LIBBALSA_MESSAGE_GET_LENGTH(m) libbalsa_message_get_length(m)
-#define LIBBALSA_MESSAGE_GET_NO(m) libbalsa_message_get_no(m)
-#endif
-
- gchar *tempdir; /* to hold named parts */
-
- unsigned has_all_headers:1;
-};
-
#define LIBBALSA_MESSAGE_HAS_FLAG(message, mask) \
- ((LIBBALSA_MESSAGE(message)->flags & mask) != 0)
+ ((libbalsa_message_get_flags(LIBBALSA_MESSAGE(message)) & mask) != 0)
#define LIBBALSA_MESSAGE_IS_UNREAD(message) \
LIBBALSA_MESSAGE_HAS_FLAG(message, LIBBALSA_MESSAGE_FLAG_NEW)
#define LIBBALSA_MESSAGE_IS_DELETED(message) \
@@ -248,26 +162,18 @@ struct _LibBalsaMessage {
#define LIBBALSA_MESSAGE_IS_RECENT(message) \
LIBBALSA_MESSAGE_HAS_FLAG(message, LIBBALSA_MESSAGE_FLAG_RECENT)
-struct _LibBalsaMessageClass {
- GObjectClass parent_class;
-
- /* deal with flags being set/unset */
- /* Signal: */
- void (*status_changed) (LibBalsaMessage * message,
- LibBalsaMessageFlag flag, gboolean);
-};
-
-
-GType libbalsa_message_get_type(void);
+#define LIBBALSA_MESSAGE_GET_SUBJECT(m) libbalsa_message_get_subject(m)
+#define LIBBALSA_MESSAGE_GET_NO(m) libbalsa_message_get_msgno(m)
+#define LIBBALSA_MESSAGE_GET_LENGTH(m) libbalsa_message_get_length(m)
/*
* message headers
*/
-void libbalsa_message_headers_destroy(LibBalsaMessageHeaders * headers);
-void libbalsa_message_headers_from_gmime(LibBalsaMessageHeaders *headers,
- GMimeMessage *msg);
-void libbalsa_message_init_from_gmime(LibBalsaMessage * message,
- GMimeMessage * msg);
+void libbalsa_message_headers_destroy(LibBalsaMessageHeaders *headers);
+void libbalsa_message_headers_from_gmime(LibBalsaMessageHeaders *headers,
+ GMimeMessage *msg);
+void libbalsa_message_init_from_gmime(LibBalsaMessage *message,
+ GMimeMessage *msg);
GList *libbalsa_message_user_hdrs_from_gmime(GMimeMessage *msg);
@@ -324,15 +230,16 @@ void libbalsa_message_set_subject_from_header(LibBalsaMessage * message,
/* use LIBBALSA_MESSAGE_GET_SUBJECT() macro, we may optimize this
function out if we find a way.
*/
-#ifndef MESSAGE_COPY_CONTENT
const gchar* libbalsa_message_get_subject(LibBalsaMessage* message);
+#ifndef MESSAGE_COPY_CONTENT
guint libbalsa_message_get_lines(LibBalsaMessage* msg);
glong libbalsa_message_get_length(LibBalsaMessage* msg);
-#endif
+#endif /* !MESSAGE_COPY_CONTENT */
glong libbalsa_message_get_no(LibBalsaMessage* msg);
LibBalsaMessageAttach libbalsa_message_get_attach_icon(LibBalsaMessage *
message);
-#define libbalsa_message_date_to_utf8(m, f) libbalsa_date_to_utf8((m)->headers->date, (f))
+#define libbalsa_message_date_to_utf8(m, f) \
+ libbalsa_date_to_utf8(libbalsa_message_get_headers(m)->date, (f))
#define libbalsa_message_headers_date_to_utf8(h, f) libbalsa_date_to_utf8((h)->date, (f))
GList *libbalsa_message_refs_for_threading(LibBalsaMessage* msg);
@@ -354,4 +261,73 @@ void libbalsa_message_change_flags(LibBalsaMessage * message,
LibBalsaMessageFlag clear);
const gchar *libbalsa_message_get_tempdir(LibBalsaMessage * message);
+/*
+ * Getters
+ */
+LibBalsaMailbox *libbalsa_message_get_mailbox(LibBalsaMessage *message);
+LibBalsaMessageHeaders *libbalsa_message_get_headers(LibBalsaMessage *message);
+LibBalsaMessageBody *libbalsa_message_get_body_list(LibBalsaMessage *message);
+GMimeMessage *libbalsa_message_get_mime_message(LibBalsaMessage *message);
+LibBalsaMessageFlag libbalsa_message_get_flags(LibBalsaMessage *message);
+const gchar *libbalsa_message_get_message_id(LibBalsaMessage *message);
+glong libbalsa_message_get_msgno(LibBalsaMessage *message);
+glong libbalsa_message_get_length(LibBalsaMessage *message);
+gboolean libbalsa_message_get_has_all_headers(LibBalsaMessage *message);
+InternetAddressList *libbalsa_message_get_sender(LibBalsaMessage *message);
+gboolean libbalsa_message_get_request_dsn(LibBalsaMessage *message);
+GList *libbalsa_message_get_references(LibBalsaMessage *message);
+LibBalsaIdentity *libbalsa_message_get_identity(LibBalsaMessage *message);
+GList *libbalsa_message_get_parameters(LibBalsaMessage *message);
+const gchar *libbalsa_message_get_subtype(LibBalsaMessage *message);
+guint libbalsa_message_get_gpg_mode(LibBalsaMessage *message);
+GList *libbalsa_message_get_in_reply_to(LibBalsaMessage *message);
+gboolean libbalsa_message_get_attach_pubkey(LibBalsaMessage *message);
+LibBalsaMsgProtectState libbalsa_message_get_protect_state(LibBalsaMessage *message);
+guint libbalsa_message_get_body_ref(LibBalsaMessage *message);
+
+/*
+ * Setters
+ */
+void libbalsa_message_set_flags(LibBalsaMessage *message,
+ LibBalsaMessageFlag flags);
+void libbalsa_message_set_mailbox(LibBalsaMessage *message,
+ LibBalsaMailbox *mailbox);
+void libbalsa_message_set_msgno(LibBalsaMessage *message,
+ glong msgno);
+void libbalsa_message_set_has_all_headers(LibBalsaMessage *message,
+ gboolean has_all_headers);
+
+#if MESSAGE_COPY_CONTENT
+void libbalsa_message_set_length(LibBalsaMessage *message,
+ glong length);
+
+#endif /* MESSAGE_COPY_CONTENT */
+
+void libbalsa_message_set_mime_message(LibBalsaMessage *message,
+ GMimeMessage *mime_message);
+void libbalsa_message_set_sender(LibBalsaMessage *message,
+ InternetAddressList *sender);
+void libbalsa_message_set_message_id(LibBalsaMessage *message,
+ const gchar *message_id);
+void libbalsa_message_set_protect_state(LibBalsaMessage *message,
+ LibBalsaMsgProtectState prot_state);
+void libbalsa_message_set_request_dsn(LibBalsaMessage *message,
+ gboolean request_dsn);
+void libbalsa_message_set_subtype(LibBalsaMessage *message,
+ const gchar *subtype);
+void libbalsa_message_set_body_list(LibBalsaMessage *message,
+ LibBalsaMessageBody *body_list);
+void libbalsa_message_set_references(LibBalsaMessage *message,
+ GList *references);
+void libbalsa_message_set_in_reply_to(LibBalsaMessage *message,
+ GList *in_reply_to);
+void libbalsa_message_set_gpg_mode(LibBalsaMessage *message,
+ guint mode);
+void libbalsa_message_set_attach_pubkey(LibBalsaMessage *message,
+ gboolean att_pubkey);
+void libbalsa_message_set_identity(LibBalsaMessage *message,
+ LibBalsaIdentity *identity);
+void libbalsa_message_add_parameters(LibBalsaMessage *message,
+ gchar **parameters);
+
#endif /* __LIBBALSA_MESSAGE_H__ */
diff --git a/libbalsa/rfc3156.c b/libbalsa/rfc3156.c
index d31fbd171..81d002daf 100644
--- a/libbalsa/rfc3156.c
+++ b/libbalsa/rfc3156.c
@@ -338,6 +338,7 @@ gboolean
libbalsa_body_check_signature(LibBalsaMessageBody * body,
gpgme_protocol_t protocol)
{
+ LibBalsaMailbox *mailbox;
GError *error = NULL;
GMimeGpgmeSigstat *result;
@@ -359,7 +360,8 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
g_object_unref(G_OBJECT(body->parts->next->sig_info));
/* verify the signature */
- libbalsa_mailbox_lock_store(body->message->mailbox);
+ mailbox = libbalsa_message_get_mailbox(body->message);
+ libbalsa_mailbox_lock_store(mailbox);
result = g_mime_gpgme_mps_verify(GMIME_MULTIPART_SIGNED(body->mime_part), &error);
if (!result) {
if (error) {
@@ -373,7 +375,7 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
}
body->parts->next->sig_info = result;
- libbalsa_mailbox_unlock_store(body->message->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
return TRUE;
}
@@ -386,6 +388,7 @@ libbalsa_body_check_signature(LibBalsaMessageBody * body,
LibBalsaMessageBody *
libbalsa_body_decrypt(LibBalsaMessageBody *body, gpgme_protocol_t protocol, GtkWindow *parent)
{
+ LibBalsaMailbox *mailbox;
GMimeObject *mime_obj = NULL;
GError *error = NULL;
LibBalsaMessage *message;
@@ -418,7 +421,8 @@ libbalsa_body_decrypt(LibBalsaMessageBody *body, gpgme_protocol_t protocol, GtkW
smime_encrypted = body->was_encrypted;
}
- libbalsa_mailbox_lock_store(body->message->mailbox);
+ mailbox = libbalsa_message_get_mailbox(body->message);
+ libbalsa_mailbox_lock_store(mailbox);
if (protocol == GPGME_PROTOCOL_OpenPGP) {
mime_obj =
g_mime_gpgme_mpe_decrypt(GMIME_MULTIPART_ENCRYPTED(body->mime_part),
@@ -428,7 +432,7 @@ libbalsa_body_decrypt(LibBalsaMessageBody *body, gpgme_protocol_t protocol, GtkW
g_mime_application_pkcs7_decrypt_verify(GMIME_PART(body->mime_part),
&sig_state, parent, &error);
}
- libbalsa_mailbox_unlock_store(body->message->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
/* check the result */
if (mime_obj == NULL) {
@@ -454,7 +458,7 @@ libbalsa_body_decrypt(LibBalsaMessageBody *body, gpgme_protocol_t protocol, GtkW
body->was_encrypted = smime_encrypted;
}
if (body->was_encrypted)
- body->message->prot_state = LIBBALSA_MSG_PROTECT_CRYPT;
+ libbalsa_message_set_protect_state(body->message, LIBBALSA_MSG_PROTECT_CRYPT);
libbalsa_message_body_set_mime_body(body, mime_obj);
if (sig_state) {
diff --git a/libbalsa/send.c b/libbalsa/send.c
index e83846dc0..07753a65d 100644
--- a/libbalsa/send.c
+++ b/libbalsa/send.c
@@ -424,6 +424,7 @@ lbs_message_queue_real(LibBalsaMessage *message,
GError **error)
{
LibBalsaMsgCreateResult result;
+ GMimeMessage *mime_msg;
guint big_message;
gboolean rc;
@@ -435,23 +436,22 @@ lbs_message_queue_real(LibBalsaMessage *message,
return result;
}
+ mime_msg = libbalsa_message_get_mime_message(message);
if (fccbox != NULL) {
- g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-Fcc",
+ g_mime_object_set_header(GMIME_OBJECT(mime_msg), "X-Balsa-Fcc",
libbalsa_mailbox_get_url(fccbox));
}
- g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-DSN",
- message->request_dsn ? "1" : "0");
- g_mime_object_set_header(GMIME_OBJECT(message->mime_msg), "X-Balsa-SmtpServer",
+ g_mime_object_set_header(GMIME_OBJECT(mime_msg), "X-Balsa-DSN",
+ libbalsa_message_get_request_dsn(message) ? "1" : "0");
+ g_mime_object_set_header(GMIME_OBJECT(mime_msg), "X-Balsa-SmtpServer",
libbalsa_smtp_server_get_name(smtp_server));
big_message = libbalsa_smtp_server_get_big_message(smtp_server);
if (big_message > 0) {
- GMimeMessage *mime_msg;
GMimeMessage **mime_msgs;
size_t nparts;
guint i;
- mime_msg = message->mime_msg;
mime_msgs =
g_mime_message_partial_split_message(mime_msg, big_message,
&nparts);
@@ -467,13 +467,15 @@ lbs_message_queue_real(LibBalsaMessage *message,
libbalsa_set_message_id(mime_msgs[i]);
}
if (rc) {
- message->mime_msg = mime_msgs[i];
+ /* Temporarily modify message by changing its mime_msg: */
+ libbalsa_message_set_mime_message(message, mime_msgs[i]);
rc = libbalsa_message_copy(message, outbox, error);
}
g_object_unref(mime_msgs[i]);
}
g_free(mime_msgs);
- message->mime_msg = mime_msg;
+ /* Restore message's original mime_msg: */
+ libbalsa_message_set_mime_message(message, mime_msg);
} else {
rc = libbalsa_message_copy(message, outbox, error);
}
@@ -711,7 +713,7 @@ lbs_process_queue_msg(guint msgno,
}
dsn_header = libbalsa_message_get_user_header(msg, "X-Balsa-DSN");
- msg->request_dsn = dsn_header != NULL ? atoi(dsn_header) != 0 : FALSE;
+ libbalsa_message_set_request_dsn(msg, dsn_header != NULL ? atoi(dsn_header) != 0 : FALSE);
new_message = msg_queue_item_new(send_message_info);
created = libbalsa_fill_msg_queue_item_from_queu(msg, new_message);
libbalsa_message_body_unref(msg);
@@ -719,18 +721,27 @@ lbs_process_queue_msg(guint msgno,
if (created != LIBBALSA_MESSAGE_CREATE_OK) {
msg_queue_item_destroy(new_message);
} else {
+ gboolean request_dsn;
+ LibBalsaMessageHeaders *headers;
+ InternetAddressList *from;
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);
+ request_dsn = libbalsa_message_get_request_dsn(msg);
+ if (request_dsn) {
+ const gchar *message_id = libbalsa_message_get_message_id(msg);
+ net_client_smtp_msg_set_dsn_opts(new_message->smtp_msg,
+ message_id, FALSE);
}
/* Add the sender info */
- if (msg->headers->from && (ia = internet_address_list_get_address(msg->headers->from, 0))) {
+ headers = libbalsa_message_get_headers(msg);
+ from = headers->from;
+ if (from != NULL &&
+ (ia = internet_address_list_get_address(from, 0)) != NULL) {
while (ia != NULL && INTERNET_ADDRESS_IS_GROUP(ia)) {
ia = internet_address_list_get_address(INTERNET_ADDRESS_GROUP(
ia)->members, 0);
@@ -743,9 +754,9 @@ lbs_process_queue_msg(guint msgno,
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);
+ add_recipients(new_message->smtp_msg, headers->to_list, request_dsn);
+ add_recipients(new_message->smtp_msg, headers->cc_list, request_dsn);
+ add_recipients(new_message->smtp_msg, headers->bcc_list, 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. */
@@ -930,8 +941,12 @@ static inline void
balsa_send_message_success(MessageQueueItem *mqi,
SendMessageInfo *info)
{
+ LibBalsaMailbox *mailbox;
+
+ mailbox = mqi->orig != NULL ? libbalsa_message_get_mailbox(mqi->orig) : NULL;
+
/* sending message successful */
- if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
+ if (mailbox != NULL) {
gboolean remove = TRUE;
const gchar *fccurl = libbalsa_message_get_user_header(mqi->orig, "X-Balsa-Fcc");
@@ -946,7 +961,7 @@ balsa_send_message_success(MessageQueueItem *mqi,
}
libbalsa_message_change_flags(mqi->orig, 0, LIBBALSA_MESSAGE_FLAG_NEW |
LIBBALSA_MESSAGE_FLAG_FLAGGED);
- libbalsa_mailbox_sync_storage(mqi->orig->mailbox, FALSE);
+ libbalsa_mailbox_sync_storage(mailbox, FALSE);
remove = libbalsa_message_copy(mqi->orig, fccbox, &err);
if (!remove) {
libbalsa_information(LIBBALSA_INFORMATION_ERROR,
@@ -967,8 +982,12 @@ static inline void
balsa_send_message_error(MessageQueueItem *mqi,
GError *error)
{
+ LibBalsaMailbox *mailbox;
+
+ mailbox = mqi->orig != NULL ? libbalsa_message_get_mailbox(mqi->orig) : NULL;
+
/* sending message failed */
- if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
+ if (mailbox != NULL) {
if (ERROR_IS_TRANSIENT(error)) {
/* Mark it as:
* - neither flagged nor deleted, so it can be resent later
@@ -1014,6 +1033,9 @@ balsa_send_message_real(SendMessageInfo *info)
for (this_msg = info->items; this_msg != NULL; this_msg = this_msg->next) {
MessageQueueItem *mqi = (MessageQueueItem *) this_msg->data;
gboolean send_res;
+ LibBalsaMailbox *mailbox;
+
+ mailbox = mqi->orig != NULL ? libbalsa_message_get_mailbox(mqi->orig) : NULL;
info->curr_msg++;
g_debug("%s: %u/%u mqi = %p", __func__, info->msg_count, info->curr_msg, mqi);
@@ -1021,13 +1043,11 @@ balsa_send_message_real(SendMessageInfo *info)
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)) {
+ if (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);
+ g_message("mqi: %p mqi->orig: %p mailbox: %p\n",
+ mqi, mqi->orig, mailbox);
}
if (send_res) {
@@ -1051,8 +1071,12 @@ balsa_send_message_real(SendMessageInfo *info)
* without changing flags. */
for (this_msg = info->items; this_msg != NULL; this_msg = this_msg->next) {
MessageQueueItem *mqi = (MessageQueueItem *) this_msg->data;
+ LibBalsaMailbox *mailbox;
+
+ mailbox = mqi->orig != NULL ?
+ libbalsa_message_get_mailbox(mqi->orig) : NULL;
- if ((mqi->orig != NULL) && (mqi->orig->mailbox != NULL)) {
+ if (mailbox != NULL) {
libbalsa_message_change_flags(mqi->orig,
0,
LIBBALSA_MESSAGE_FLAG_FLAGGED |
@@ -1099,12 +1123,14 @@ balsa_send_message_real(SendMessageInfo *info)
static void
-message_add_references(const LibBalsaMessage *message,
+message_add_references(LibBalsaMessage *message,
GMimeMessage *msg)
{
+ GList *list;
+
/* If the message has references set, add them to the envelope */
- if (message->references != NULL) {
- GList *list = message->references;
+ list = libbalsa_message_get_references(message);
+ if (list != NULL) {
GString *str = g_string_new(NULL);
do {
@@ -1117,10 +1143,10 @@ message_add_references(const LibBalsaMessage *message,
g_string_free(str, TRUE);
}
- if (message->in_reply_to != NULL) {
+ list = libbalsa_message_get_in_reply_to(message);
+ if (list != 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);
+ g_mime_object_set_header(GMIME_OBJECT(msg), "In-Reply-To", list->data);
}
}
@@ -1194,20 +1220,25 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
GMimeObject *mime_root = NULL;
GMimeMessage *mime_message;
LibBalsaMessageBody *body;
+ LibBalsaMessageHeaders *headers;
InternetAddressList *ia_list;
gchar *tmp;
GList *list;
gboolean attach_pubkey = FALSE;
GtkWindow *parent = g_object_get_data(G_OBJECT(message), "parent-window");
+ LibBalsaIdentity *identity;
/* attach the public key only if we send the message, not if we just postpone it */
- if (!postponing && message->att_pubkey && ((message->gpg_mode & LIBBALSA_PROTECT_PROTOCOL) != 0)) {
+ if (!postponing &&
+ libbalsa_message_get_attach_pubkey(message) &&
+ ((libbalsa_message_get_gpg_mode(message) & LIBBALSA_PROTECT_PROTOCOL) != 0)) {
attach_pubkey = TRUE;
}
- body = message->body_list;
+ body = libbalsa_message_get_body_list(message);
if ((body != NULL) && ((body->next != NULL) || attach_pubkey)) {
- mime_root = GMIME_OBJECT(g_mime_multipart_new_with_subtype(message->subtype));
+ mime_root =
+ GMIME_OBJECT(g_mime_multipart_new_with_subtype(libbalsa_message_get_subtype(message)));
}
while (body != NULL) {
@@ -1346,14 +1377,16 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
}
g_strfreev(mime_type);
} else if (body->buffer != NULL) {
+ guint gpg_mode;
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)) {
- use_gpg_mode = message->gpg_mode;
+ if (!postponing &&
+ (body == libbalsa_message_get_body_list(body->message)) &&
+ ((gpg_mode = libbalsa_message_get_gpg_mode(message)) > 0) &&
+ ((gpg_mode & LIBBALSA_PROTECT_OPENPGP) != 0)) {
+ use_gpg_mode = gpg_mode;
} else {
use_gpg_mode = 0;
}
@@ -1396,7 +1429,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
}
}
- if ((message->body_list != NULL) && !postponing) {
+ if ((libbalsa_message_get_body_list(message) != NULL) && !postponing) {
LibBalsaMsgCreateResult crypt_res =
do_multipart_crypto(message, &mime_root, parent, error);
if (crypt_res != LIBBALSA_MESSAGE_CREATE_OK) {
@@ -1406,7 +1439,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
mime_message = g_mime_message_new(TRUE);
if (mime_root != NULL) {
- GList *param = message->parameters;
+ GList *param = libbalsa_message_get_parameters(message);
while (param != NULL) {
gchar **vals = (gchar **)param->data;
@@ -1420,17 +1453,16 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
}
message_add_references(message, mime_message);
- if (message->headers->from != NULL) {
- tmp = internet_address_list_to_string(message->headers->from,
- TRUE);
+ headers = libbalsa_message_get_headers(message);
+ if (headers->from != NULL) {
+ tmp = internet_address_list_to_string(headers->from, TRUE);
if (tmp != NULL) {
g_mime_message_set_sender(mime_message, tmp);
g_free(tmp);
}
}
- if (message->headers->reply_to != NULL) {
- tmp = internet_address_list_to_string(message->headers->reply_to,
- TRUE);
+ if (headers->reply_to != NULL) {
+ tmp = internet_address_list_to_string(headers->reply_to, TRUE);
if (tmp != NULL) {
g_mime_message_set_reply_to(mime_message, tmp);
g_free(tmp);
@@ -1442,32 +1474,31 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
LIBBALSA_MESSAGE_GET_SUBJECT(message));
}
- g_mime_message_set_date(mime_message, message->headers->date,
- get_tz_offset(message->headers->date));
+ g_mime_message_set_date(mime_message, headers->date, get_tz_offset(headers->date));
- if ((ia_list = message->headers->to_list)) {
+ if ((ia_list = headers->to_list) != NULL) {
InternetAddressList *recipients =
g_mime_message_get_recipients(mime_message,
GMIME_RECIPIENT_TYPE_TO);
internet_address_list_append(recipients, ia_list);
}
- if ((ia_list = message->headers->cc_list)) {
+ if ((ia_list = headers->cc_list) != NULL) {
InternetAddressList *recipients =
g_mime_message_get_recipients(mime_message,
GMIME_RECIPIENT_TYPE_CC);
internet_address_list_append(recipients, ia_list);
}
- if ((ia_list = message->headers->bcc_list)) {
+ if ((ia_list = headers->bcc_list) != NULL) {
InternetAddressList *recipients =
g_mime_message_get_recipients(mime_message,
GMIME_RECIPIENT_TYPE_BCC);
internet_address_list_append(recipients, ia_list);
}
- if (message->headers->dispnotify_to != NULL) {
- tmp = internet_address_list_to_string(message->headers->dispnotify_to, TRUE);
+ if (headers->dispnotify_to != NULL) {
+ tmp = internet_address_list_to_string(headers->dispnotify_to, TRUE);
if (tmp != NULL) {
g_mime_object_append_header(GMIME_OBJECT(mime_message),
"Disposition-Notification-To", tmp);
@@ -1475,7 +1506,7 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
}
}
- for (list = message->headers->user_hdrs; list; list = list->next) {
+ for (list = 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]);
@@ -1490,10 +1521,10 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
#ifdef ENABLE_AUTOCRYPT
/* add Autocrypt header if requested */
- if (!postponing && (message->ident != NULL) &&
- (libbalsa_identity_get_autocrypt_mode(message->ident) != AUTOCRYPT_DISABLE) &&
+ if (!postponing && ((identity = libbalsa_message_get_identity(message)) != NULL) &&
+ (libbalsa_identity_get_autocrypt_mode(identity) != AUTOCRYPT_DISABLE) &&
!autocrypt_ignore(g_mime_object_get_content_type(mime_root))) {
- tmp = autocrypt_header(message->ident, error);
+ tmp = autocrypt_header(identity, error);
if (tmp == NULL) {
g_object_unref(G_OBJECT(mime_message));
return LIBBALSA_MESSAGE_CREATE_ERROR;
@@ -1503,7 +1534,8 @@ libbalsa_message_create_mime_message(LibBalsaMessage *message,
}
#endif
- message->mime_msg = mime_message;
+ libbalsa_message_set_mime_message(message, mime_message);
+ g_object_unref(mime_message);
return LIBBALSA_MESSAGE_CREATE_OK;
}
@@ -1523,7 +1555,7 @@ libbalsa_message_postpone(LibBalsaMessage *message,
gboolean flow,
GError **error)
{
- if (!message->mime_msg
+ if (!libbalsa_message_get_mime_message(message)
&& (libbalsa_message_create_mime_message(message, flow,
TRUE, error) !=
LIBBALSA_MESSAGE_CREATE_OK)) {
@@ -1534,7 +1566,7 @@ libbalsa_message_postpone(LibBalsaMessage *message,
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],
+ g_mime_object_set_header(GMIME_OBJECT(libbalsa_message_get_mime_message(message)),
extra_headers[i],
extra_headers[i + 1]);
}
}
@@ -1635,7 +1667,7 @@ libbalsa_create_msg(LibBalsaMessage *message,
gboolean flow,
GError **error)
{
- if (!message->mime_msg) {
+ if (libbalsa_message_get_mime_message(message) == NULL) {
LibBalsaMsgCreateResult res =
libbalsa_message_create_mime_message(message, flow,
FALSE, error);
@@ -1644,7 +1676,7 @@ libbalsa_create_msg(LibBalsaMessage *message,
}
}
- libbalsa_set_message_id(message->mime_msg);
+ libbalsa_set_message_id(libbalsa_message_get_mime_message(message));
return LIBBALSA_MESSAGE_CREATE_OK;
}
@@ -1658,11 +1690,13 @@ libbalsa_fill_msg_queue_item_from_queu(LibBalsaMessage *message,
LibBalsaMsgCreateResult result = LIBBALSA_MESSAGE_CREATE_ERROR;
mqi->orig = message;
- if (message->mime_msg != NULL) {
+ if (libbalsa_message_get_mime_message(message) != NULL) {
+ LibBalsaMailbox *mailbox = libbalsa_message_get_mailbox(message);
+
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);
+ libbalsa_mailbox_lock_store(mailbox);
+ g_mime_object_write_to_stream(GMIME_OBJECT(libbalsa_message_get_mime_message(message)), msg_stream);
+ libbalsa_mailbox_unlock_store(mailbox);
g_mime_stream_reset(msg_stream);
} else {
msg_stream = libbalsa_message_stream(message);
@@ -1711,18 +1745,17 @@ lb_send_from(LibBalsaMessage * message, gpgme_protocol_t protocol)
if ((protocol == GPGME_PROTOCOL_OpenPGP) &&
((key_id =
- libbalsa_identity_get_force_gpg_key_id(message->ident)) != NULL)
+ libbalsa_identity_get_force_gpg_key_id(libbalsa_message_get_identity(message))) != NULL)
&& (key_id[0] != '\0')) {
from_id = key_id;
} else if ((protocol == GPGME_PROTOCOL_CMS) &&
((key_id =
- libbalsa_identity_get_force_smime_key_id(message->
- ident)) != NULL)
+ libbalsa_identity_get_force_smime_key_id(libbalsa_message_get_identity(message))) != NULL)
&& (key_id[0] != '\0')) {
from_id = key_id;
} else {
InternetAddress *ia =
- internet_address_list_get_address(message->headers->from, 0);
+ internet_address_list_get_address(libbalsa_message_get_headers(message)->from, 0);
while (INTERNET_ADDRESS_IS_GROUP(ia)) {
ia = internet_address_list_get_address(((InternetAddressGroup
@@ -1779,7 +1812,7 @@ libbalsa_create_rfc2440_buffer(LibBalsaMessage *message,
GtkWindow *parent,
GError **error)
{
- gint mode = message->gpg_mode;
+ gint mode = libbalsa_message_get_gpg_mode(message);
gboolean always_trust = (mode & LIBBALSA_PROTECT_ALWAYS_TRUST) != 0;
switch (mode & LIBBALSA_PROTECT_MODE) {
@@ -1795,6 +1828,7 @@ libbalsa_create_rfc2440_buffer(LibBalsaMessage *message,
case LIBBALSA_PROTECT_ENCRYPT:
case LIBBALSA_PROTECT_SIGN | LIBBALSA_PROTECT_ENCRYPT:
{
+ LibBalsaMessageHeaders *headers = libbalsa_message_get_headers(message);
GList *encrypt_for = NULL;
gboolean result;
@@ -1802,13 +1836,13 @@ libbalsa_create_rfc2440_buffer(LibBalsaMessage *message,
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);
+ headers->to_list);
encrypt_for = get_mailbox_names(encrypt_for,
- message->headers->cc_list);
+ headers->cc_list);
encrypt_for = get_mailbox_names(encrypt_for,
- message->headers->from);
- if ((message->headers->bcc_list != NULL) &&
- (internet_address_list_length(message->headers->bcc_list) > 0)) {
+ headers->from);
+ if ((headers->bcc_list != NULL) &&
+ (internet_address_list_length(headers->bcc_list) > 0)) {
libbalsa_information
(LIBBALSA_INFORMATION_WARNING,
ngettext("This message will not be encrypted "
@@ -1816,7 +1850,7 @@ libbalsa_create_rfc2440_buffer(LibBalsaMessage *message,
"This message will not be encrypted "
"for the BCC: recipients.",
internet_address_list_length
- (message->headers->bcc_list)));
+ (headers->bcc_list)));
}
if (mode & LIBBALSA_PROTECT_SIGN) {
@@ -1856,27 +1890,30 @@ do_multipart_crypto(LibBalsaMessage *message,
GtkWindow *parent,
GError **error)
{
+ guint mode;
gpgme_protocol_t protocol;
gboolean always_trust;
+ mode = libbalsa_message_get_gpg_mode(message);
+
/* check if we shall do any protection */
- if (!(message->gpg_mode & LIBBALSA_PROTECT_MODE)) {
+ if ((mode & LIBBALSA_PROTECT_MODE) == 0) {
return LIBBALSA_MESSAGE_CREATE_OK;
}
/* check which protocol should be used */
- if (message->gpg_mode & LIBBALSA_PROTECT_RFC3156) {
+ if (mode & LIBBALSA_PROTECT_RFC3156) {
protocol = GPGME_PROTOCOL_OpenPGP;
- } else if (message->gpg_mode & LIBBALSA_PROTECT_SMIMEV3) {
+ } else if (mode & LIBBALSA_PROTECT_SMIMEV3) {
protocol = GPGME_PROTOCOL_CMS;
- } else if (message->gpg_mode & LIBBALSA_PROTECT_OPENPGP) {
+ } else if (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;
+ always_trust = (mode & LIBBALSA_PROTECT_ALWAYS_TRUST) != 0;
/* sign and/or encrypt */
- switch (message->gpg_mode & LIBBALSA_PROTECT_MODE) {
+ switch (mode & LIBBALSA_PROTECT_MODE) {
case LIBBALSA_PROTECT_SIGN: /* sign message */
if (!libbalsa_sign_mime_object(mime_root,
lb_send_from(message, protocol),
@@ -1888,6 +1925,7 @@ do_multipart_crypto(LibBalsaMessage *message,
case LIBBALSA_PROTECT_ENCRYPT:
case LIBBALSA_PROTECT_ENCRYPT | LIBBALSA_PROTECT_SIGN:
{
+ LibBalsaMessageHeaders *headers = libbalsa_message_get_headers(message);
GList *encrypt_for = NULL;
gboolean success;
@@ -1895,13 +1933,13 @@ do_multipart_crypto(LibBalsaMessage *message,
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);
+ headers->to_list);
encrypt_for = get_mailbox_names(encrypt_for,
- message->headers->cc_list);
+ headers->cc_list);
encrypt_for = g_list_append(encrypt_for,
g_strdup(lb_send_from(message, protocol)));
- if (message->headers->bcc_list
- && (internet_address_list_length(message->headers->
+ if (headers->bcc_list
+ && (internet_address_list_length(headers->
bcc_list) > 0)) {
libbalsa_information
(LIBBALSA_INFORMATION_WARNING,
@@ -1910,10 +1948,10 @@ do_multipart_crypto(LibBalsaMessage *message,
"This message will not be encrypted "
"for the BCC: recipients.",
internet_address_list_length
- (message->headers->bcc_list)));
+ (headers->bcc_list)));
}
- if (message->gpg_mode & LIBBALSA_PROTECT_SIGN) {
+ if ((libbalsa_message_get_gpg_mode(message) & LIBBALSA_PROTECT_SIGN) != 0) {
success =
libbalsa_sign_encrypt_mime_object(mime_root,
lb_send_from(message, protocol),
@@ -1935,8 +1973,7 @@ do_multipart_crypto(LibBalsaMessage *message,
}
default:
- g_error("illegal gpg_mode %d (" __FILE__ " line %d)",
- message->gpg_mode, __LINE__);
+ g_error("illegal gpg_mode %d (" __FILE__ " line %d)", mode, __LINE__);
}
return LIBBALSA_MESSAGE_CREATE_OK;
diff --git a/libbalsa/source-viewer.c b/libbalsa/source-viewer.c
index bec50f9c8..f0aa3a179 100644
--- a/libbalsa/source-viewer.c
+++ b/libbalsa/source-viewer.c
@@ -118,24 +118,28 @@ lsv_escape_change_state(GSimpleAction * action,
LibBalsaSourceViewerInfo *lsvi =
g_object_get_data(G_OBJECT(user_data), "lsvi");
LibBalsaMessage *msg = lsvi->msg;
+ LibBalsaMailbox *mailbox;
GMimeStream *msg_stream;
GMimeStream *mem_stream;
char *raw_message;
- if (!msg->mailbox) {
+ mailbox = libbalsa_message_get_mailbox(msg);
+ if (mailbox == NULL) {
libbalsa_information(LIBBALSA_INFORMATION_WARNING,
_("Mailbox closed"));
return;
}
- msg_stream = libbalsa_mailbox_get_message_stream(msg->mailbox, msg->msgno,
- TRUE);
+ msg_stream =
+ libbalsa_mailbox_get_message_stream(mailbox,
+ libbalsa_message_get_msgno(msg),
+ TRUE);
if (msg_stream == NULL)
return;
mem_stream = g_mime_stream_mem_new();
- libbalsa_mailbox_lock_store(msg->mailbox);
+ libbalsa_mailbox_lock_store(mailbox);
g_mime_stream_write_to_stream(msg_stream, mem_stream);
- libbalsa_mailbox_unlock_store(msg->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
g_mime_stream_write(mem_stream, "", 1); /* close string */
raw_message = (char *) GMIME_STREAM_MEM(mem_stream)->buffer->data;
@@ -186,8 +190,8 @@ libbalsa_show_message_source(GtkApplication * application,
LibBalsaSourceViewerInfo *lsvi;
GAction *escape_action;
- g_return_if_fail(msg);
- g_return_if_fail(MAILBOX_OPEN(msg->mailbox));
+ g_return_if_fail(msg != NULL);
+ g_return_if_fail(MAILBOX_OPEN(libbalsa_message_get_mailbox(msg)));
text = gtk_text_view_new();
diff --git a/src/balsa-message.c b/src/balsa-message.c
index de456b3b5..323bed37b 100644
--- a/src/balsa-message.c
+++ b/src/balsa-message.c
@@ -1145,6 +1145,7 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
BalsaPartInfo *info;
gboolean has_focus;
LibBalsaMessage *message;
+ LibBalsaMsgProtectState prot_state;
g_return_val_if_fail(bm != NULL, FALSE);
has_focus = bm->focus_state != BALSA_MESSAGE_FOCUS_STATE_NO;
@@ -1186,7 +1187,8 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
balsa_information(LIBBALSA_INFORMATION_WARNING,
_("Could not access message %u "
"in mailbox ā%sā."),
- (unsigned int) message->msgno, libbalsa_mailbox_get_name(mailbox));
+ (guint) libbalsa_message_get_msgno(message),
+ libbalsa_mailbox_get_name(mailbox));
return FALSE;
}
@@ -1194,16 +1196,17 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
libbalsa_mailbox_get_crypto_mode(mailbox),
FALSE, 1);
/* calculate the signature summary state if not set earlier */
- if(message->prot_state == LIBBALSA_MSG_PROTECT_NONE) {
- LibBalsaMsgProtectState prot_state =
- balsa_message_scan_signatures(message->body_list, message);
+ prot_state = libbalsa_message_get_protect_state(message);
+ if (prot_state == LIBBALSA_MSG_PROTECT_NONE) {
+ LibBalsaMsgProtectState new_prot_state =
+ balsa_message_scan_signatures(libbalsa_message_get_body_list(message), message);
/* update the icon if necessary */
- if (message->prot_state != prot_state)
- message->prot_state = prot_state;
+ if (prot_state != new_prot_state)
+ libbalsa_message_set_protect_state(message, new_prot_state);
}
/* may update the icon */
- libbalsa_mailbox_msgno_update_attach(mailbox, message->msgno, message);
+ libbalsa_mailbox_msgno_update_attach(mailbox, libbalsa_message_get_msgno(message), message);
display_headers(bm);
display_content(bm);
@@ -1221,7 +1224,7 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
* present.
*
*/
- if (is_new && message->headers->dispnotify_to) {
+ if (is_new && (libbalsa_message_get_headers(message)->dispnotify_to != NULL)) {
handle_mdn_request (balsa_get_parent_window(GTK_WIDGET(bm)), message);
}
@@ -1253,8 +1256,9 @@ balsa_message_set(BalsaMessage * bm, LibBalsaMailbox * mailbox, guint msgno)
* emit read message
*/
if (is_new && !libbalsa_mailbox_get_readonly(mailbox))
- libbalsa_mailbox_msgno_change_flags(mailbox, message->msgno, 0,
- LIBBALSA_MESSAGE_FLAG_NEW);
+ libbalsa_mailbox_msgno_change_flags(mailbox,
+ libbalsa_message_get_msgno(message),
+ 0, LIBBALSA_MESSAGE_FLAG_NEW);
/* restore keyboard focus to the content, if it was there before */
if (has_focus)
@@ -1304,10 +1308,11 @@ balsa_message_set_displayed_headers(BalsaMessage * bmessage,
bmessage->shown_headers = sh;
- if (bmessage->message) {
- if(sh == HEADERS_ALL)
- libbalsa_mailbox_set_msg_headers(bmessage->message->mailbox,
+ if (bmessage->message != NULL) {
+ if (sh == HEADERS_ALL) {
+ libbalsa_mailbox_set_msg_headers(libbalsa_message_get_mailbox(bmessage->message),
bmessage->message);
+ }
display_headers(bmessage);
gtk_tree_model_foreach
(gtk_tree_view_get_model(GTK_TREE_VIEW(bmessage->treeview)),
@@ -1331,9 +1336,11 @@ balsa_message_set_wrap(BalsaMessage * bm, gboolean wrap)
bm->wrap_text = wrap;
/* This is easier than reformating all the widgets... */
- if (bm->message) {
+ if (bm->message != NULL) {
LibBalsaMessage *msg = bm->message;
- balsa_message_set(bm, msg->mailbox, msg->msgno);
+ balsa_message_set(bm,
+ libbalsa_message_get_mailbox(msg),
+ libbalsa_message_get_msgno(msg));
}
}
@@ -1342,8 +1349,8 @@ static void
display_headers(BalsaMessage * bm)
{
balsa_mime_widget_message_set_headers_d(bm, bm->bm_widget,
- bm->message->headers,
- bm->message->body_list,
+ libbalsa_message_get_headers(bm->message),
+ libbalsa_message_get_body_list(bm->message),
LIBBALSA_MESSAGE_GET_SUBJECT(bm->message));
}
@@ -1629,7 +1636,7 @@ display_content(BalsaMessage * bm)
g_object_unref(bm->parts_popup);
bm->parts_popup = gtk_menu_new();
g_object_ref_sink(bm->parts_popup);
- display_parts(bm, bm->message->body_list, NULL, NULL);
+ display_parts(bm, libbalsa_message_get_body_list(bm->message), NULL, NULL);
if (bm->info_count > 1) {
gtk_widget_show_all(bm->parts_popup);
gtk_widget_show_all
@@ -2406,8 +2413,9 @@ bm_get_mailbox(InternetAddressList * list)
static void
handle_mdn_request(GtkWindow *parent, LibBalsaMessage *message)
{
+ LibBalsaMessageHeaders *headers;
gboolean suspicious;
- InternetAddressList *use_from;
+ InternetAddressList *use_from = NULL;
InternetAddressList *list;
InternetAddress *from, *dn;
BalsaMDNReply action;
@@ -2415,24 +2423,34 @@ handle_mdn_request(GtkWindow *parent, LibBalsaMessage *message)
LibBalsaIdentity *mdn_ident = NULL;
gint i, len;
+ headers = libbalsa_message_get_headers(message);
+
/* Check if the dispnotify_to address is equal to the (in this order,
if present) reply_to, from or sender address. */
- if (message->headers->reply_to)
- use_from = message->headers->reply_to;
- else if (message->headers->from)
- use_from = message->headers->from;
- else if (message->sender)
- use_from = message->sender;
- else
- use_from = NULL;
+ if (headers != NULL) {
+ if (headers->reply_to != NULL) {
+ use_from = headers->reply_to;
+ } else if (headers->from != NULL) {
+ use_from = headers->from;
+ }
+ }
+ if (use_from == NULL) {
+ InternetAddressList *sender;
+
+ sender = libbalsa_message_get_sender(message);
+ if (sender != NULL)
+ use_from = sender;
+ else
+ use_from = NULL;
+ }
/* note: neither Disposition-Notification-To: nor Reply-To:, From: or
Sender: may be address groups */
from = use_from ? internet_address_list_get_address (use_from, 0) : NULL;
- dn = internet_address_list_get_address (message->headers->dispnotify_to, 0);
+ dn = internet_address_list_get_address (headers->dispnotify_to, 0);
suspicious = !libbalsa_ia_rfc2821_equal(dn, from);
/* Try to find "my" identity first in the to, then in the cc list */
- list = message->headers->to_list;
+ list = headers->to_list;
len = list ? internet_address_list_length(list) : 0;
for (i = 0; i < len && !mdn_ident; i++) {
GList * id_list;
@@ -2448,7 +2466,7 @@ handle_mdn_request(GtkWindow *parent, LibBalsaMessage *message)
}
}
- list = message->headers->cc_list;
+ list = headers->cc_list;
for (i = 0; i < len && !mdn_ident; i++) {
GList * id_list;
@@ -2487,7 +2505,7 @@ handle_mdn_request(GtkWindow *parent, LibBalsaMessage *message)
gchar *reply_to;
sender = from ? internet_address_to_string (from, FALSE) : NULL;
reply_to =
- internet_address_list_to_string (message->headers->dispnotify_to,
+ internet_address_list_to_string (headers->dispnotify_to,
FALSE);
gtk_widget_show_all (create_mdn_dialog (parent, sender, reply_to, mdn,
mdn_ident));
@@ -2517,6 +2535,8 @@ static LibBalsaMessage *create_mdn_reply (const LibBalsaIdentity *mdn_ident,
gboolean manual)
{
LibBalsaMessage *message;
+ LibBalsaMessageHeaders *headers;
+ LibBalsaMessageHeaders *for_msg_headers;
LibBalsaMessageBody *body;
gchar *date, *dummy;
GString *report;
@@ -2526,27 +2546,28 @@ static LibBalsaMessage *create_mdn_reply (const LibBalsaIdentity *mdn_ident,
/* create a message with the header set from the incoming message */
message = libbalsa_message_new();
- message->headers->from = internet_address_list_new();
- internet_address_list_add(message->headers->from,
+ headers = libbalsa_message_get_headers(message);
+ headers->from = internet_address_list_new();
+ internet_address_list_add(headers->from,
libbalsa_identity_get_address(balsa_app.current_ident));
- message->headers->date = time(NULL);
+ headers->date = time(NULL);
libbalsa_message_set_subject(message, "Message Disposition Notification");
- message->headers->to_list = internet_address_list_new ();
- internet_address_list_append(message->headers->to_list,
- for_msg->headers->dispnotify_to);
+ headers->to_list = internet_address_list_new ();
+ for_msg_headers = libbalsa_message_get_headers(for_msg);
+ internet_address_list_append(headers->to_list, for_msg_headers->dispnotify_to);
/* RFC 2298 requests this mime type... */
- message->subtype = g_strdup("report");
+ libbalsa_message_set_subtype(message, "report");
params = g_new(gchar *, 3);
params[0] = g_strdup("report-type");
params[1] = g_strdup("disposition-notification");
params[2] = NULL;
- message->parameters = g_list_prepend(message->parameters, params);
+ libbalsa_message_add_parameters(message, params);
/* the first part of the body is an informational note */
body = libbalsa_message_body_new(message);
date = libbalsa_message_date_to_utf8(for_msg, balsa_app.date_string);
- dummy = internet_address_list_to_string(for_msg->headers->to_list, FALSE);
+ dummy = internet_address_list_to_string(for_msg_headers->to_list, FALSE);
body->buffer = g_strdup_printf(
"The message sent on %s to %s with subject ā%sā has been displayed.\n"
"There is no guarantee that the message has been read or understood.\n\n",
@@ -2576,18 +2597,18 @@ static LibBalsaMessage *create_mdn_reply (const LibBalsaIdentity *mdn_ident,
INTERNET_ADDRESS_MAILBOX
(libbalsa_identity_get_address
(balsa_app.current_ident))->addr);
- if (for_msg->message_id)
+ if (libbalsa_message_get_message_id(for_msg) != NULL)
g_string_append_printf(report, "Original-Message-ID: <%s>\n",
- for_msg->message_id);
+ libbalsa_message_get_message_id(for_msg));
g_string_append_printf(report,
"Disposition: %s-action/MDN-sent-%sly; displayed",
manual ? "manual" : "automatic",
manual ? "manual" : "automatical");
- body->buffer = report->str;
- g_string_free(report, FALSE);
+ body->buffer = g_string_free(report, FALSE);
body->content_type = g_strdup("message/disposition-notification");
body->charset = g_strdup ("US-ASCII");
libbalsa_message_append_part(message, body);
+
return message;
}
@@ -2706,7 +2727,7 @@ balsa_message_scan_signatures(LibBalsaMessageBody *body,
{
LibBalsaMsgProtectState result = LIBBALSA_MSG_PROTECT_NONE;
- g_return_val_if_fail(message->headers != NULL, result);
+ g_return_val_if_fail(libbalsa_message_get_headers(message) != NULL, result);
while (body) {
LibBalsaMsgProtectState this_part_state =
@@ -2818,7 +2839,7 @@ libbalsa_msg_try_decrypt(LibBalsaMessage * message, LibBalsaMessageBody * body,
* adds an extra ref) leads to a crash if we have both the encrypted and
* the unencrypted version open as the body chain of the first one will be
* unref'd. */
- if (message->body_ref > chk_crypto->max_ref) {
+ if (libbalsa_message_get_body_ref(message) > chk_crypto->max_ref) {
if (chk_crypto->chk_mode == LB_MAILBOX_CHK_CRYPT_ALWAYS) {
libbalsa_information
(LIBBALSA_INFORMATION_ERROR,
@@ -3034,6 +3055,7 @@ static void
libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
chk_crypto_t * chk_crypto)
{
+ LibBalsaMailbox *mailbox;
gpgme_error_t sig_res;
GMimePartRfc2440Mode rfc2440mode;
@@ -3064,9 +3086,11 @@ libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
/* check if this is a RFC2440 part */
if (!GMIME_IS_PART(body->mime_part))
return;
- libbalsa_mailbox_lock_store(body->message->mailbox);
+
+ mailbox = libbalsa_message_get_mailbox(body->message);
+ libbalsa_mailbox_lock_store(mailbox);
rfc2440mode = g_mime_part_check_rfc2440(GMIME_PART(body->mime_part));
- libbalsa_mailbox_unlock_store(body->message->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
/* if not, or if we have more than one instance of this message open, eject
(see remark for libbalsa_msg_try_decrypt above) - remember that
@@ -3074,7 +3098,7 @@ libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
(i.e. RFC2440 stuff removed) one! */
if (rfc2440mode == GMIME_PART_RFC2440_NONE)
return;
- if (message->body_ref > chk_crypto->max_ref) {
+ if (libbalsa_message_get_body_ref(message) > chk_crypto->max_ref) {
if (chk_crypto->chk_mode == LB_MAILBOX_CHK_CRYPT_ALWAYS) {
libbalsa_information
(LIBBALSA_INFORMATION_ERROR, "%s\n%s",
@@ -3093,7 +3117,7 @@ libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
}
/* do the rfc2440 stuff */
- libbalsa_mailbox_lock_store(body->message->mailbox);
+ libbalsa_mailbox_lock_store(mailbox);
if (rfc2440mode == GMIME_PART_RFC2440_SIGNED)
sig_res =
libbalsa_rfc2440_verify(GMIME_PART(body->mime_part),
@@ -3111,7 +3135,7 @@ libbalsa_msg_part_2440(LibBalsaMessage * message, LibBalsaMessageBody * body,
body->charset = NULL;
}
}
- libbalsa_mailbox_unlock_store(body->message->mailbox);
+ libbalsa_mailbox_unlock_store(mailbox);
if (body->sig_info && sig_res == GPG_ERR_NO_ERROR) {
if ((g_mime_gpgme_sigstat_summary(body->sig_info) & GPGME_SIGSUM_VALID) == GPGME_SIGSUM_VALID) {
@@ -3196,9 +3220,11 @@ balsa_message_perform_crypto(LibBalsaMessage * message,
LibBalsaChkCryptoMode chk_mode,
gboolean no_mp_signed, guint max_ref)
{
+ LibBalsaMessageBody *body_list;
chk_crypto_t chk_crypto;
- if (!message->body_list)
+ body_list = libbalsa_message_get_body_list(message);
+ if (body_list == NULL)
return;
/* check if the user requested to ignore any crypto stuff */
@@ -3209,15 +3235,15 @@ balsa_message_perform_crypto(LibBalsaMessage * message,
chk_crypto.chk_mode = chk_mode;
chk_crypto.no_mp_signed = no_mp_signed;
chk_crypto.max_ref = max_ref;
- chk_crypto.sender = balsa_message_sender_to_gchar(message->headers->from, -1);
+ chk_crypto.sender =
+ balsa_message_sender_to_gchar(libbalsa_message_get_headers(message)->from, -1);
chk_crypto.subject = g_strdup(LIBBALSA_MESSAGE_GET_SUBJECT(message));
libbalsa_utf8_sanitize(&chk_crypto.subject, balsa_app.convert_unknown_8bit,
NULL);
/* do the real work */
- message->body_list =
- libbalsa_msg_perform_crypto_real(message, message->body_list,
- &chk_crypto);
+ body_list = libbalsa_msg_perform_crypto_real(message, body_list, &chk_crypto);
+ libbalsa_message_set_body_list(message, body_list);
/* clean up */
g_free(chk_crypto.subject);
@@ -3234,6 +3260,7 @@ balsa_message_perform_crypto(LibBalsaMessage * message,
static void
message_recheck_crypto_cb(GtkWidget * button, BalsaMessage * bm)
{
+ LibBalsaMessageBody *body_list;
LibBalsaMsgProtectState prot_state;
LibBalsaMessage * message;
GtkTreeIter iter;
@@ -3258,16 +3285,16 @@ message_recheck_crypto_cb(GtkWidget * button, BalsaMessage * bm)
balsa_message_perform_crypto(message, LB_MAILBOX_CHK_CRYPT_ALWAYS, FALSE, 2);
/* calculate the signature summary state */
- prot_state =
- balsa_message_scan_signatures(message->body_list, message);
+ body_list = libbalsa_message_get_body_list(message);
+ prot_state = balsa_message_scan_signatures(body_list, message);
/* update the icon if necessary */
- if (message->prot_state != prot_state)
- message->prot_state = prot_state;
+ libbalsa_message_set_protect_state(message, prot_state);
/* may update the icon */
- libbalsa_mailbox_msgno_update_attach(bm->message->mailbox,
- bm->message->msgno, bm->message);
+ libbalsa_mailbox_msgno_update_attach(libbalsa_message_get_mailbox(bm->message),
+ libbalsa_message_get_msgno(bm->message),
+ bm->message);
display_headers(bm);
display_content(bm);
diff --git a/src/balsa-mime-widget-message.c b/src/balsa-mime-widget-message.c
index 2fb251c10..f85d2a261 100644
--- a/src/balsa-mime-widget-message.c
+++ b/src/balsa-mime-widget-message.c
@@ -327,6 +327,7 @@ static void
extbody_send_mail(GtkWidget * button, LibBalsaMessageBody * mime_body)
{
LibBalsaMessage *message;
+ LibBalsaMessageHeaders *headers;
LibBalsaMessageBody *body;
gchar *data;
GError *err = NULL;
@@ -334,8 +335,9 @@ extbody_send_mail(GtkWidget * button, LibBalsaMessageBody * mime_body)
/* create a message */
message = libbalsa_message_new();
- message->headers->from = internet_address_list_new();
- internet_address_list_add(message->headers->from,
+ headers = libbalsa_message_get_headers(message);
+ headers->from = internet_address_list_new();
+ internet_address_list_add(headers->from,
libbalsa_identity_get_address(balsa_app.current_ident));
data = libbalsa_message_body_get_parameter(mime_body, "subject");
@@ -345,7 +347,7 @@ extbody_send_mail(GtkWidget * button, LibBalsaMessageBody * mime_body)
}
data = libbalsa_message_body_get_parameter(mime_body, "server");
- message->headers->to_list = internet_address_list_parse_string(data);
+ headers->to_list = internet_address_list_parse_string(data);
g_free(data);
/* the original body my have some data to be returned as commands... */
diff --git a/src/balsa-mime-widget-text.c b/src/balsa-mime-widget-text.c
index fd2f6251d..14ecd1be1 100644
--- a/src/balsa-mime-widget-text.c
+++ b/src/balsa-mime-widget-text.c
@@ -1264,7 +1264,7 @@ check_text_encoding(BalsaMessage * bm, gchar *text_buf)
&& !g_object_get_data(G_OBJECT(bm->message),
BALSA_MIME_WIDGET_NEW_TEXT_NOTIFIED)) {
gchar *from =
- balsa_message_sender_to_gchar(bm->message->headers->from, 0);
+ balsa_message_sender_to_gchar(libbalsa_message_get_headers(bm->message)->from, 0);
gchar *subject =
g_strdup(LIBBALSA_MESSAGE_GET_SUBJECT(bm->message));
diff --git a/src/balsa-mime-widget-vcalendar.c b/src/balsa-mime-widget-vcalendar.c
index 0ee021fe7..01b8c2036 100644
--- a/src/balsa-mime-widget-vcalendar.c
+++ b/src/balsa-mime-widget-vcalendar.c
@@ -73,18 +73,24 @@ balsa_mime_widget_new_vcalendar(BalsaMessage * bm,
/* a reply may be created only for unread requests */
if ((libbalsa_vcal_method(vcal_obj) == ITIP_REQUEST) &&
LIBBALSA_MESSAGE_IS_UNREAD(lbm)) {
+ LibBalsaMessageHeaders *headers;
+
may_reply = TRUE;
- if (lbm->headers) {
- if (lbm->headers->reply_to)
- sender =
- internet_address_list_get_address(lbm->headers->
- reply_to, 0);
- else if (lbm->headers && lbm->headers->from)
- sender =
- internet_address_list_get_address(lbm->headers->from,
- 0);
- } else if (lbm->sender)
- sender = internet_address_list_get_address(lbm->sender, 0);
+ headers = libbalsa_message_get_headers(lbm);
+ if (headers != NULL) {
+ if (headers->reply_to != NULL)
+ sender = internet_address_list_get_address(headers->reply_to, 0);
+ else if (headers->from != NULL)
+ sender = internet_address_list_get_address(headers->from, 0);
+ }
+ if (sender == NULL) {
+ InternetAddressList *ia_list;
+
+ ia_list = libbalsa_message_get_sender(lbm);
+
+ if (ia_list != NULL)
+ sender = internet_address_list_get_address(ia_list, 0);
+ }
}
/* add events */
@@ -277,6 +283,7 @@ vevent_reply(GObject * button, GtkWidget * box)
GPOINTER_TO_INT(g_object_get_data(button, "mode"));
gchar *rcpt;
LibBalsaMessage *message;
+ LibBalsaMessageHeaders *headers;
LibBalsaMessageBody *body;
const gchar *summary;
gchar *dummy;
@@ -298,10 +305,11 @@ vevent_reply(GObject * button, GtkWidget * box)
/* create a message with the header set from the incoming message */
message = libbalsa_message_new();
- message->headers->from = internet_address_list_new();
- internet_address_list_add(message->headers->from, ia);
- message->headers->to_list = internet_address_list_parse_string(rcpt);
- message->headers->date = time(NULL);
+ headers = libbalsa_message_get_headers(message);
+ headers->from = internet_address_list_new();
+ internet_address_list_add(headers->from, ia);
+ headers->to_list = internet_address_list_parse_string(rcpt);
+ headers->date = time(NULL);
/* create the message subject */
summary = libbalsa_vevent_summary(event);
@@ -326,7 +334,7 @@ vevent_reply(GObject * button, GtkWidget * box)
params[0] = g_strdup("method");
params[1] = g_strdup("reply");
params[2] = NULL;
- message->parameters = g_list_prepend(message->parameters, params);
+ libbalsa_message_add_parameters(message, params);
result = libbalsa_message_send(message, balsa_app.outbox, NULL,
balsa_find_sentbox_by_url,
diff --git a/src/balsa-mime-widget.c b/src/balsa-mime-widget.c
index 1f5c360e0..982b00bef 100644
--- a/src/balsa-mime-widget.c
+++ b/src/balsa-mime-widget.c
@@ -225,7 +225,7 @@ balsa_mime_widget_new_unknown(BalsaMessage * bm,
/* on local mailboxes only, to avoid possibly long downloads */
if ((content_type == NULL ||
g_ascii_strcasecmp(content_type, "application/octet-stream") == 0)
- && LIBBALSA_IS_MAILBOX_LOCAL(mime_body->message->mailbox)) {
+ && LIBBALSA_IS_MAILBOX_LOCAL(libbalsa_message_get_mailbox(mime_body->message))) {
GError *err = NULL;
GMimeStream *stream =
libbalsa_message_body_get_stream(mime_body, &err);
diff --git a/src/balsa-print-object-header.c b/src/balsa-print-object-header.c
index 39921fc5b..b255fe27d 100644
--- a/src/balsa-print-object-header.c
+++ b/src/balsa-print-object-header.c
@@ -299,9 +299,9 @@ balsa_print_object_header_from_message(GList *list,
BalsaPrintSetup * psetup)
{
return balsa_print_object_header_new_real(list, context,
- message->body_list,
- message->headers, subject,
- psetup, FALSE);
+ libbalsa_message_get_body_list(message),
+ libbalsa_message_get_headers(message),
+ subject, psetup, FALSE);
}
diff --git a/src/main-window.c b/src/main-window.c
index 36ff76e27..1d295b74f 100644
--- a/src/main-window.c
+++ b/src/main-window.c
@@ -4179,6 +4179,7 @@ bw_index_changed_cb(GtkWidget * widget, gpointer data)
{
BalsaWindow *window = data;
BalsaIndex *index;
+ LibBalsaMessage *message;
guint current_msgno;
if (widget != window->current_index)
@@ -4188,8 +4189,8 @@ bw_index_changed_cb(GtkWidget * widget, gpointer data)
bw_enable_message_menus(window, index->current_msgno);
bw_enable_mailbox_menus(window, index);
- current_msgno = BALSA_MESSAGE(window->preview)->message ?
- BALSA_MESSAGE(window->preview)->message->msgno : 0;
+ message = BALSA_MESSAGE(window->preview)->message;
+ current_msgno = message != NULL ? libbalsa_message_get_msgno(message) : 0;
if (current_msgno != index->current_msgno)
bw_idle_replace(window, index);
diff --git a/src/message-window.c b/src/message-window.c
index aec53beac..c89b8d1a0 100644
--- a/src/message-window.c
+++ b/src/message-window.c
@@ -116,7 +116,9 @@ message_window_idle_handler(MessageWindow * mw)
mw->idle_handler_id = 0;
msg = BALSA_MESSAGE(mw->bmessage);
- if (!balsa_message_set(msg, mw->message->mailbox, mw->message->msgno)) {
+ if (!balsa_message_set(msg,
+ libbalsa_message_get_mailbox(mw->message),
+ libbalsa_message_get_msgno(mw->message))) {
gtk_widget_destroy(mw->window);
return FALSE;
}
@@ -304,9 +306,9 @@ mw_menubar_foreach(GtkWidget *widget, gpointer data)
static void
mw_set_buttons_sensitive(MessageWindow * mw)
{
- LibBalsaMailbox *mailbox = mw->message->mailbox;
+ LibBalsaMailbox *mailbox = libbalsa_message_get_mailbox(mw->message);
BalsaIndex *index = mw->bindex;
- guint current_msgno = mw->message->msgno;
+ guint current_msgno = libbalsa_message_get_msgno(mw->message);
gboolean enable;
if (!mailbox) {
@@ -387,7 +389,7 @@ destroy_message_window(GtkWidget * widget, MessageWindow * mw)
static void
mw_expunged_cb(LibBalsaMailbox * mailbox, guint msgno, MessageWindow * mw)
{
- if (mw->message && (guint) mw->message->msgno == msgno)
+ if (mw->message != NULL && (guint) libbalsa_message_get_msgno(mw->message) == msgno)
gtk_widget_destroy(mw->window);
}
@@ -399,7 +401,8 @@ mw_reply_activated(GSimpleAction * action, GVariant * parameter,
g_return_if_fail(mw != NULL);
- sendmsg_window_reply(mw->message->mailbox, mw->message->msgno,
+ sendmsg_window_reply(libbalsa_message_get_mailbox(mw->message),
+ libbalsa_message_get_msgno(mw->message),
SEND_REPLY);
}
@@ -411,7 +414,8 @@ mw_reply_all_activated(GSimpleAction * action, GVariant * parameter,
g_return_if_fail(mw != NULL);
- sendmsg_window_reply(mw->message->mailbox, mw->message->msgno,
+ sendmsg_window_reply(libbalsa_message_get_mailbox(mw->message),
+ libbalsa_message_get_msgno(mw->message),
SEND_REPLY_ALL);
}
@@ -423,7 +427,8 @@ mw_reply_group_activated(GSimpleAction * action, GVariant * parameter,
g_return_if_fail(mw != NULL);
- sendmsg_window_reply(mw->message->mailbox, mw->message->msgno,
+ sendmsg_window_reply(libbalsa_message_get_mailbox(mw->message),
+ libbalsa_message_get_msgno(mw->message),
SEND_REPLY_GROUP);
}
@@ -435,7 +440,9 @@ mw_forward_attached_activated(GSimpleAction * action, GVariant * parameter,
g_return_if_fail(mw != NULL);
- sendmsg_window_forward(mw->message->mailbox, mw->message->msgno, TRUE);
+ sendmsg_window_forward(libbalsa_message_get_mailbox(mw->message),
+ libbalsa_message_get_msgno(mw->message),
+ TRUE);
}
static void
@@ -446,7 +453,8 @@ mw_forward_inline_activated(GSimpleAction * action, GVariant * parameter,
g_return_if_fail(mw != NULL);
- sendmsg_window_forward(mw->message->mailbox, mw->message->msgno,
+ sendmsg_window_forward(libbalsa_message_get_mailbox(mw->message),
+ libbalsa_message_get_msgno(mw->message),
FALSE);
}
@@ -459,7 +467,8 @@ mw_forward_default_activated(GSimpleAction * action, GVariant * parameter,
g_return_if_fail(mw != NULL);
- sendmsg_window_forward(mw->message->mailbox, mw->message->msgno,
+ sendmsg_window_forward(libbalsa_message_get_mailbox(mw->message),
+ libbalsa_message(get_msgno(mw->message),
balsa_app.forward_attached);
}
#endif
@@ -548,10 +557,10 @@ mw_set_selected(MessageWindow * mw, void (*select_func) (BalsaIndex *))
LibBalsaMessage *message;
MessageWindow *tmp;
- balsa_index_set_next_msgno(mw->bindex, mw->message->msgno);
+ balsa_index_set_next_msgno(mw->bindex, libbalsa_message_get_msgno(mw->message));
select_func(mw->bindex);
msgno = balsa_index_get_next_msgno(mw->bindex);
- message = libbalsa_mailbox_get_message(mw->message->mailbox, msgno);
+ message = libbalsa_mailbox_get_message(libbalsa_message_get_mailbox(mw->message), msgno);
if (!message)
return;
@@ -574,16 +583,18 @@ static void
message_window_move_message(MessageWindow * mw, LibBalsaMailbox * mailbox)
{
GArray *messages;
+ guint msgno;
LibBalsaMessage *original = mw->message;
g_return_if_fail(mailbox != NULL);
/* Transferring to same mailbox? */
- if (mw->message->mailbox == mailbox)
+ if (libbalsa_message_get_mailbox(mw->message) == mailbox)
return;
messages = g_array_new(FALSE, FALSE, sizeof(guint));
- g_array_append_val(messages, mw->message->msgno);
+ msgno = libbalsa_message_get_msgno(mw->message);
+ g_array_append_val(messages, msgno);
if (balsa_app.mw_action_after_move == NEXT_UNREAD)
/* Try selecting the next unread message. */
@@ -720,7 +731,7 @@ mw_select_part_cb(BalsaMessage * bm, gpointer data)
/* set window title */
if (bm && bm->message) {
- from = internet_address_list_to_string(bm->message->headers->from,
+ from = internet_address_list_to_string(libbalsa_message_get_headers(bm->message)->from,
FALSE);
title = g_strdup_printf(_("Message from %s: %s"), from,
LIBBALSA_MESSAGE_GET_SUBJECT(bm->message));
diff --git a/src/print-gtk.c b/src/print-gtk.c
index 53fccf530..bc515d4bb 100644
--- a/src/print-gtk.c
+++ b/src/print-gtk.c
@@ -276,6 +276,7 @@ begin_print(GtkPrintOperation * operation, GtkPrintContext * context,
gchar *subject;
gchar *date;
GString *footer_string;
+ InternetAddressList *from_list;
/* initialise the context */
page_setup = gtk_print_context_get_page_setup(context);
@@ -340,9 +341,9 @@ begin_print(GtkPrintOperation * operation, GtkPrintContext * context,
g_free(date);
}
- if (pdata->message->headers->from) {
- gchar *from =
- internet_address_list_to_string(pdata->message->headers->from, FALSE);
+ from_list = libbalsa_message_get_headers(pdata->message)->from;
+ if (from_list != NULL) {
+ gchar *from = internet_address_list_to_string(from_list, FALSE);
libbalsa_utf8_sanitize(&from, balsa_app.convert_unknown_8bit,
NULL);
@@ -388,7 +389,7 @@ begin_print(GtkPrintOperation * operation, GtkPrintContext * context,
/* add the mime bodies */
pdata->print_parts =
scan_body(pdata->print_parts, context, &pdata->setup,
- pdata->message->body_list, FALSE);
+ libbalsa_message_get_body_list(pdata->message), FALSE);
/* done */
gtk_print_operation_set_n_pages(operation, pdata->setup.page_count);
diff --git a/src/sendmsg-window.c b/src/sendmsg-window.c
index f0293ad85..dfce2950b 100644
--- a/src/sendmsg-window.c
+++ b/src/sendmsg-window.c
@@ -487,10 +487,12 @@ static void
sw_delete_draft(BalsaSendmsg * bsmsg)
{
LibBalsaMessage *message;
+ LibBalsaMailbox *mailbox;
message = bsmsg->draft_message;
- if (message != NULL && message->mailbox != NULL
- && !libbalsa_mailbox_get_readonly(message->mailbox))
+ if (message != NULL &&
+ (mailbox = libbalsa_message_get_mailbox(message)) != NULL &&
+ !libbalsa_mailbox_get_readonly(mailbox))
libbalsa_message_change_flags(message,
LIBBALSA_MESSAGE_FLAG_DELETED, 0);
}
@@ -608,20 +610,26 @@ balsa_sendmsg_destroy_handler(BalsaSendmsg * bsmsg)
}
if(balsa_app.debug) g_message("balsa_sendmsg_destroy()_handler: Start.");
- if (bsmsg->parent_message) {
- if (bsmsg->parent_message->mailbox)
- libbalsa_mailbox_close(bsmsg->parent_message->mailbox,
+ if (bsmsg->parent_message != NULL) {
+ LibBalsaMailbox *mailbox;
+
+ mailbox = libbalsa_message_get_mailbox(bsmsg->parent_message);
+ if (mailbox != NULL)
+ libbalsa_mailbox_close(mailbox,
/* Respect pref setting: */
balsa_app.expunge_on_close);
g_object_unref(G_OBJECT(bsmsg->parent_message));
bsmsg->parent_message = NULL;
}
- if (bsmsg->draft_message) {
+ if (bsmsg->draft_message != NULL) {
+ LibBalsaMailbox *mailbox;
+
+ mailbox = libbalsa_message_get_mailbox(bsmsg->draft_message);
g_object_set_data(G_OBJECT(bsmsg->draft_message),
BALSA_SENDMSG_WINDOW_KEY, NULL);
- if (bsmsg->draft_message->mailbox)
- libbalsa_mailbox_close(bsmsg->draft_message->mailbox,
+ if (mailbox != NULL)
+ libbalsa_mailbox_close(mailbox,
/* Respect pref setting: */
balsa_app.expunge_on_close);
g_object_unref(G_OBJECT(bsmsg->draft_message));
@@ -1204,11 +1212,11 @@ update_bsmsg_identity(BalsaSendmsg* bsmsg, LibBalsaIdentity* ident)
gtk_entry_set_text(GTK_ENTRY(bsmsg->subject[1]), tmpstr);
g_free(tmpstr);
} else {
- if ( (replen == 0 && reply_type) ||
- (fwdlen == 0 && forward_type) ) {
+ if ((replen == 0 && reply_type) ||
+ (fwdlen == 0 && forward_type) ) {
LibBalsaMessage *msg = bsmsg->parent_message ?
bsmsg->parent_message : bsmsg->draft_message;
- bsmsg_set_subject_from_body(bsmsg, msg->body_list, ident);
+ bsmsg_set_subject_from_body(bsmsg, libbalsa_message_get_body_list(msg), ident);
}
}
@@ -2602,10 +2610,13 @@ create_info_pane(BalsaSendmsg * bsmsg)
balsa_mblist_mru_add(&balsa_app.fcc_mru, "");
balsa_app.fcc_mru = g_list_reverse(balsa_app.fcc_mru);
}
- if (bsmsg->draft_message && bsmsg->draft_message->headers &&
- bsmsg->draft_message->headers->fcc_url)
- balsa_mblist_mru_add(&balsa_app.fcc_mru,
- bsmsg->draft_message->headers->fcc_url);
+ if (bsmsg->draft_message != NULL) {
+ LibBalsaMessageHeaders *headers;
+
+ headers = libbalsa_message_get_headers(bsmsg->draft_message);
+ if (headers != NULL && headers->fcc_url != NULL)
+ balsa_mblist_mru_add(&balsa_app.fcc_mru, headers->fcc_url);
+ }
bsmsg->fcc[1] =
balsa_mblist_mru_option_menu(GTK_WINDOW(bsmsg->window),
&balsa_app.fcc_mru);
@@ -2982,7 +2993,7 @@ continue_body(BalsaSendmsg * bsmsg, LibBalsaMessage * message)
{
LibBalsaMessageBody *body;
- body = message->body_list;
+ body = libbalsa_message_get_body_list(message);
if (body) {
if (libbalsa_message_body_type(body) == LIBBALSA_MESSAGE_BODY_TYPE_MULTIPART)
body = body->parts;
@@ -3053,13 +3064,19 @@ static gchar*
message_part_get_subject(LibBalsaMessageBody *part)
{
gchar *subject = NULL;
- if(part->embhdrs && part->embhdrs->subject)
+
+ if (part->embhdrs != NULL && part->embhdrs->subject != NULL)
subject = g_strdup(part->embhdrs->subject);
- else if(part->message && part->message->subj)
- subject = g_strdup(part->message->subj);
- else subject = g_strdup(_("No subject"));
+
+ if (subject == NULL && part->message != NULL)
+ subject = g_strdup(LIBBALSA_MESSAGE_GET_SUBJECT(part->message));
+
+ if (subject == NULL)
+ subject = g_strdup(_("No subject"));
+
libbalsa_utf8_sanitize(&subject, balsa_app.convert_unknown_8bit,
NULL);
+
return subject;
}
@@ -3735,9 +3752,14 @@ quote_message_body(BalsaSendmsg * bsmsg,
QuoteType qtype)
{
GString *res;
- if(libbalsa_message_body_ref(message, FALSE, FALSE)) {
- res = quote_body(bsmsg, message->headers, message->message_id,
- message->references, message->body_list, qtype);
+
+ if (libbalsa_message_body_ref(message, FALSE, FALSE)) {
+ res = quote_body(bsmsg,
+ libbalsa_message_get_headers(message),
+ libbalsa_message_get_message_id(message),
+ libbalsa_message_get_references(message),
+ libbalsa_message_get_body_list(message),
+ qtype);
libbalsa_message_body_unref(message);
} else res = g_string_new("");
return res;
@@ -3747,8 +3769,12 @@ static void
fill_body_from_message(BalsaSendmsg *bsmsg, LibBalsaMessage *message,
QuoteType qtype)
{
- fill_body_from_part(bsmsg, message->headers, message->message_id,
- message->references, message->body_list, qtype);
+ fill_body_from_part(bsmsg,
+ libbalsa_message_get_headers(message),
+ libbalsa_message_get_message_id(message),
+ libbalsa_message_get_references(message),
+ libbalsa_message_get_body_list(message),
+ qtype);
}
@@ -3896,7 +3922,7 @@ bsmsg_set_subject_from_body(BalsaSendmsg * bsmsg,
case SEND_FORWARD_ATTACH:
case SEND_FORWARD_INLINE:
headers =
- part->embhdrs ? part->embhdrs : part->message->headers;
+ part->embhdrs ? part->embhdrs : libbalsa_message_get_headers(part->message);
newsubject =
generate_forwarded_subject(subject, headers, ident);
break;
@@ -3935,13 +3961,17 @@ sw_save_draft(BalsaSendmsg * bsmsg)
return FALSE;
}
- if (bsmsg->draft_message) {
+ if (bsmsg->draft_message != NULL) {
+ LibBalsaMailbox *mailbox;
+
g_object_set_data(G_OBJECT(bsmsg->draft_message),
BALSA_SENDMSG_WINDOW_KEY, NULL);
- if (bsmsg->draft_message->mailbox)
- libbalsa_mailbox_close(bsmsg->draft_message->mailbox,
+ mailbox = libbalsa_message_get_mailbox(bsmsg->draft_message);
+ if (mailbox != NULL) {
+ libbalsa_mailbox_close(mailbox,
/* Respect pref setting: */
balsa_app.expunge_on_close);
+ }
g_object_unref(G_OBJECT(bsmsg->draft_message));
}
bsmsg->state = SENDMSG_STATE_CLEAN;
@@ -3973,7 +4003,9 @@ sw_autosave_timeout_cb(BalsaSendmsg * bsmsg)
static void
setup_headers_from_message(BalsaSendmsg* bsmsg, LibBalsaMessage *message)
{
- g_return_if_fail(message->headers);
+ LibBalsaMessageHeaders *headers;
+
+ headers = libbalsa_message_get_headers(message);
/* Try to make the blank line in the address view useful;
* - never make it a Bcc: line;
@@ -3983,13 +4015,13 @@ setup_headers_from_message(BalsaSendmsg* bsmsg, LibBalsaMessage *message)
* will be a To: line */
libbalsa_address_view_set_from_list(bsmsg->recipient_view,
"BCC:",
- message->headers->bcc_list);
+ headers->bcc_list);
libbalsa_address_view_set_from_list(bsmsg->recipient_view,
"To:",
- message->headers->to_list);
+ headers->to_list);
libbalsa_address_view_set_from_list(bsmsg->recipient_view,
"CC:",
- message->headers->cc_list);
+ headers->cc_list);
}
@@ -4002,13 +4034,18 @@ setup_headers_from_message(BalsaSendmsg* bsmsg, LibBalsaMessage *message)
static gboolean
set_identity_from_mailbox(BalsaSendmsg *bsmsg, LibBalsaMessage *message)
{
+ LibBalsaMailbox *mailbox;
const gchar *identity;
GList *ilist;
- if (message == NULL || message->mailbox == NULL)
+ if (message == NULL)
return FALSE;
- identity = libbalsa_mailbox_get_identity_name(message->mailbox);
+ mailbox = libbalsa_message_get_mailbox(message);
+ if (mailbox == NULL)
+ return FALSE;
+
+ identity = libbalsa_mailbox_get_identity_name(mailbox);
if (identity == NULL)
return FALSE;
@@ -4074,21 +4111,24 @@ guess_identity_from_list(BalsaSendmsg * bsmsg, InternetAddressList * list,
static gboolean
guess_identity(BalsaSendmsg* bsmsg, LibBalsaMessage * message)
{
- if (!message || !message->headers || !balsa_app.identities)
+ LibBalsaMessageHeaders *headers;
+
+ if (message == NULL || balsa_app.identities == NULL)
+ return FALSE; /* use default */
+
+ headers = libbalsa_message_get_headers(message);
+ if (headers == NULL)
return FALSE; /* use default */
if (bsmsg->is_continue)
- return guess_identity_from_list(bsmsg, message->headers->from,
- FALSE);
+ return guess_identity_from_list(bsmsg, headers->from, FALSE);
if (bsmsg->type != SEND_NORMAL)
/* bsmsg->type == SEND_REPLY || bsmsg->type == SEND_REPLY_ALL ||
* bsmsg->type == SEND_REPLY_GROUP || bsmsg->type == SEND_FORWARD_ATTACH ||
* bsmsg->type == SEND_FORWARD_INLINE */
- return guess_identity_from_list(bsmsg, message->headers->to_list,
- TRUE)
- || guess_identity_from_list(bsmsg, message->headers->cc_list,
- TRUE);
+ return guess_identity_from_list(bsmsg, headers->to_list, TRUE)
+ || guess_identity_from_list(bsmsg, headers->cc_list, TRUE);
return FALSE;
}
@@ -4373,8 +4413,11 @@ insert_initial_sig(BalsaSendmsg *bsmsg)
static void
bsm_prepare_for_setup(LibBalsaMessage *message)
{
- if (message->mailbox)
- libbalsa_mailbox_open(message->mailbox, NULL);
+ LibBalsaMailbox *mailbox;
+
+ mailbox = libbalsa_message_get_mailbox(message);
+ if (mailbox != NULL)
+ libbalsa_mailbox_open(mailbox, NULL);
/* fill in that info:
* ref the message so that we have all needed headers */
libbalsa_message_body_ref(message, TRUE, TRUE);
@@ -4389,12 +4432,12 @@ bsm_prepare_for_setup(LibBalsaMessage *message)
static void
bsm_finish_setup(BalsaSendmsg *bsmsg, LibBalsaMessageBody *part)
{
- g_return_if_fail(part != NULL);
- g_return_if_fail(part->message != NULL);
+ LibBalsaMailbox *mailbox;
- if (part->message->mailbox &&
- !bsmsg->parent_message && !bsmsg->draft_message)
- libbalsa_mailbox_close(part->message->mailbox, FALSE);
+ mailbox = libbalsa_message_get_mailbox(part->message);
+ if (mailbox != NULL &&
+ bsmsg->parent_message == NULL && bsmsg->draft_message == NULL)
+ libbalsa_mailbox_close(mailbox, FALSE);
/* ...but mark it as unmodified. */
bsmsg->state = SENDMSG_STATE_CLEAN;
bsmsg_set_subject_from_body(bsmsg, part, bsmsg->ident);
@@ -4944,6 +4987,7 @@ static LibBalsaMessage *
bsmsg2message(BalsaSendmsg * bsmsg)
{
LibBalsaMessage *message;
+ LibBalsaMessageHeaders *headers;
LibBalsaMessageBody *body;
gchar *tmp;
GtkTextIter start, end;
@@ -4953,22 +4997,23 @@ bsmsg2message(BalsaSendmsg * bsmsg)
GtkTextBuffer *new_buffer = NULL;
message = libbalsa_message_new();
+ headers = libbalsa_message_get_headers(message);
- message->headers->from = internet_address_list_new ();
- internet_address_list_add(message->headers->from, ia);
+ headers->from = internet_address_list_new ();
+ internet_address_list_add(headers->from, ia);
tmp = gtk_editable_get_chars(GTK_EDITABLE(bsmsg->subject[1]), 0, -1);
strip_chars(tmp, "\r\n");
libbalsa_message_set_subject(message, tmp);
g_free(tmp);
- message->headers->to_list =
+ headers->to_list =
libbalsa_address_view_get_list(bsmsg->recipient_view, "To:");
- message->headers->cc_list =
+ headers->cc_list =
libbalsa_address_view_get_list(bsmsg->recipient_view, "CC:");
- message->headers->bcc_list =
+ headers->bcc_list =
libbalsa_address_view_get_list(bsmsg->recipient_view, "BCC:");
@@ -4976,12 +5021,13 @@ bsmsg2message(BalsaSendmsg * bsmsg)
bsmsg->fcc_url =
g_strdup(balsa_mblist_mru_option_menu_get(bsmsg->fcc[1]));
- message->headers->reply_to =
+ headers->reply_to =
libbalsa_address_view_get_list(bsmsg->replyto_view, "Reply To:");
if (bsmsg->req_mdn)
libbalsa_message_set_dispnotify(message, ia);
- message->request_dsn = bsmsg->req_dsn;
+ libbalsa_message_set_request_dsn(message, bsmsg->req_dsn);
+
sw_set_header_from_path(message, "Face", libbalsa_identity_get_face_path(ident),
/* Translators: please do not translate Face. */
@@ -4990,12 +5036,14 @@ bsmsg2message(BalsaSendmsg * bsmsg)
/* Translators: please do not translate Face. */
_("Could not load X-Face header file %s: %s"));
- message->references = bsmsg->references;
+ libbalsa_message_set_references(message, bsmsg->references);
bsmsg->references = NULL; /* steal it */
- if (bsmsg->in_reply_to)
- message->in_reply_to =
- g_list_prepend(NULL, g_strdup(bsmsg->in_reply_to));
+ if (bsmsg->in_reply_to != NULL) {
+ libbalsa_message_set_in_reply_to(message,
+ g_list_prepend(NULL,
+ g_strdup(bsmsg->in_reply_to)));
+ }
body = libbalsa_message_body_new(message);
@@ -5026,7 +5074,7 @@ bsmsg2message(BalsaSendmsg * bsmsg)
if (bsmsg->send_mp_alt)
body->html_buffer =
- libbalsa_text_to_html(message->subj, body->buffer,
+ libbalsa_text_to_html(LIBBALSA_MESSAGE_GET_SUBJECT(message), body->buffer,
bsmsg->spell_check_lang);
if (bsmsg->flow)
body->buffer =
@@ -5049,15 +5097,15 @@ bsmsg2message(BalsaSendmsg * bsmsg)
gtk_tree_model_foreach(BALSA_MSG_ATTACH_MODEL(bsmsg),
attachment2message, message);
- message->headers->date = time(NULL);
+ headers->date = time(NULL);
if (balsa_app.has_openpgp || balsa_app.has_smime) {
- message->gpg_mode =
- (bsmsg->gpg_mode & LIBBALSA_PROTECT_MODE) != 0 ? bsmsg->gpg_mode : 0;
- message->att_pubkey = bsmsg->attach_pubkey;
- message->ident = g_object_ref(ident);
+ libbalsa_message_set_gpg_mode(message,
+ (bsmsg->gpg_mode & LIBBALSA_PROTECT_MODE) != 0 ? bsmsg->gpg_mode : 0);
+ libbalsa_message_set_attach_pubkey(message, bsmsg->attach_pubkey);
+ libbalsa_message_set_identity(message, ident);
} else {
- message->gpg_mode = 0;
- message->att_pubkey = FALSE;
+ libbalsa_message_set_gpg_mode(message, 0);
+ libbalsa_message_set_attach_pubkey(message, FALSE);
}
/* remember the parent window */
@@ -5355,7 +5403,7 @@ check_autocrypt_recommendation(BalsaSendmsg *bsmsg)
if (((autocrypt_mode == AUTOCRYPT_ENCR_AVAIL_MUTUAL) &&
(libbalsa_identity_get_autocrypt_mode(bsmsg->ident) == AUTOCRYPT_PREFER_ENCRYPT)) ||
((bsmsg->parent_message != NULL) &&
- (bsmsg->parent_message->prot_state == LIBBALSA_MSG_PROTECT_CRYPT))) {
+ (libbalsa_message_get_protect_state(bsmsg->parent_message) == LIBBALSA_MSG_PROTECT_CRYPT))) {
default_choice = GTK_RESPONSE_YES;
} else if (autocrypt_mode == AUTOCRYPT_ENCR_AVAIL) {
default_choice = GTK_RESPONSE_NO;
@@ -5500,7 +5548,7 @@ send_message_handler(BalsaSendmsg * bsmsg, gboolean queue_only)
balsa_information_parented(GTK_WINDOW(bsmsg->window),
LIBBALSA_INFORMATION_DEBUG,
_("sending message with GPG mode %d"),
- message->gpg_mode);
+ libbalsa_message_get_gpg_mode(message));
if(queue_only)
result = libbalsa_message_queue(message, balsa_app.outbox, fcc,
@@ -5514,9 +5562,11 @@ send_message_handler(BalsaSendmsg * bsmsg, gboolean queue_only)
GTK_WINDOW(balsa_app.main_window),
bsmsg->flow, &error);
if (result == LIBBALSA_MESSAGE_CREATE_OK) {
- if (bsmsg->parent_message && bsmsg->parent_message->mailbox
- && !libbalsa_mailbox_get_readonly(bsmsg->parent_message->mailbox))
- libbalsa_message_reply(bsmsg->parent_message);
+ if (bsmsg->parent_message != NULL) {
+ LibBalsaMailbox *mailbox = libbalsa_message_get_mailbox(bsmsg->parent_message);
+ if (mailbox != NULL && !libbalsa_mailbox_get_readonly(mailbox))
+ libbalsa_message_reply(bsmsg->parent_message);
+ }
sw_delete_draft(bsmsg);
}
@@ -5539,18 +5589,19 @@ send_message_handler(BalsaSendmsg * bsmsg, gboolean queue_only)
case LIBBALSA_MESSAGE_ENCRYPT_ERROR:
msg = _("Message could not be encrypted"); break;
}
- if (error)
+ if (error) {
balsa_information_parented(GTK_WINDOW(bsmsg->window),
LIBBALSA_INFORMATION_ERROR,
_("Send failed: %s\n%s"), msg,
error->message);
- else
+ g_error_free(error);
+ } else {
balsa_information_parented(GTK_WINDOW(bsmsg->window),
LIBBALSA_INFORMATION_ERROR,
_("Send failed: %s"), msg);
+ }
return FALSE;
}
- g_clear_error(&error);
gtk_widget_destroy(bsmsg->window);
@@ -7019,6 +7070,9 @@ sendmsg_window_reply(LibBalsaMailbox * mailbox, guint msgno,
LibBalsaMessage *message =
libbalsa_mailbox_get_message(mailbox, msgno);
BalsaSendmsg *bsmsg;
+ LibBalsaMessageHeaders *headers;
+ const gchar *message_id;
+ GList *in_reply_to;
g_assert(message);
switch(reply_type) {
@@ -7038,21 +7092,24 @@ sendmsg_window_reply(LibBalsaMailbox * mailbox, guint msgno,
bsm_prepare_for_setup(message);
- set_to(bsmsg, message->headers);
+ headers = libbalsa_message_get_headers(message);
+ set_to(bsmsg, headers);
- if (message->message_id)
- set_in_reply_to(bsmsg, message->message_id, message->headers);
+ message_id = libbalsa_message_get_message_id(message);
+ if (message_id != NULL)
+ set_in_reply_to(bsmsg, message_id, headers);
if (reply_type == SEND_REPLY_ALL)
- set_cc_from_all_recipients(bsmsg, message->headers);
- set_references_reply(bsmsg, message->references,
- message->in_reply_to
- ? message->in_reply_to->data : NULL,
- message->message_id);
+ set_cc_from_all_recipients(bsmsg, headers);
+
+ in_reply_to = libbalsa_message_get_in_reply_to(message);
+ set_references_reply(bsmsg, libbalsa_message_get_references(message),
+ in_reply_to != NULL ? in_reply_to->data : NULL,
+ message_id);
if(balsa_app.autoquote)
fill_body_from_message(bsmsg, message, QUOTE_ALL);
if (libbalsa_identity_get_sig_whenreply(bsmsg->ident))
insert_initial_sig(bsmsg);
- bsm_finish_setup(bsmsg, message->body_list);
+ bsm_finish_setup(bsmsg, libbalsa_message_get_body_list(message));
g_idle_add((GSourceFunc) sw_grab_focus_to_text,
g_object_ref(bsmsg->text));
return bsmsg;
@@ -7124,11 +7181,11 @@ sendmsg_window_forward(LibBalsaMailbox *mailbox, guint msgno,
_("Attaching message failed.\n"
"Possible reason: not enough temporary space"));
bsmsg->state = SENDMSG_STATE_CLEAN;
- bsmsg_set_subject_from_body(bsmsg, message->body_list, bsmsg->ident);
+ bsmsg_set_subject_from_body(bsmsg, libbalsa_message_get_body_list(message), bsmsg->ident);
} else {
bsm_prepare_for_setup(message);
fill_body_from_message(bsmsg, message, QUOTE_NOPREFIX);
- bsm_finish_setup(bsmsg, message->body_list);
+ bsm_finish_setup(bsmsg, libbalsa_message_get_body_list(message));
}
if (libbalsa_identity_get_sig_whenforward(bsmsg->ident))
insert_initial_sig(bsmsg);
@@ -7153,6 +7210,7 @@ sendmsg_window_continue(LibBalsaMailbox * mailbox, guint msgno)
BalsaSendmsg *bsmsg;
const gchar *postpone_hdr;
GList *list, *refs = NULL;
+ GList *in_reply_to;
g_assert(message);
@@ -7174,10 +7232,11 @@ sendmsg_window_continue(LibBalsaMailbox * mailbox, guint msgno)
libbalsa_address_view_set_from_list(bsmsg->replyto_view,
"Reply To:",
- message->headers->reply_to);
- if (message->in_reply_to)
+ libbalsa_message_get_headers(message)->reply_to);
+ in_reply_to = libbalsa_message_get_in_reply_to(message);
+ if (in_reply_to != NULL)
bsmsg->in_reply_to =
- g_strconcat("<", message->in_reply_to->data, ">", NULL);
+ g_strconcat("<", in_reply_to->data, ">", NULL);
if ((postpone_hdr =
libbalsa_message_get_user_header(message, "X-Balsa-Crypto")))
@@ -7221,12 +7280,12 @@ sendmsg_window_continue(LibBalsaMailbox * mailbox, guint msgno)
libbalsa_message_get_user_header(message, "X-Balsa-Send-Type")))
bsmsg->type = atoi(postpone_hdr);
- for (list = message->references; list; list = list->next)
+ for (list = libbalsa_message_get_references(message); list != NULL; list = list->next)
refs = g_list_prepend(refs, g_strdup(list->data));
bsmsg->references = g_list_reverse(refs);
continue_body(bsmsg, message);
- bsm_finish_setup(bsmsg, message->body_list);
+ bsm_finish_setup(bsmsg, libbalsa_message_get_body_list(message));
g_idle_add((GSourceFunc) sw_grab_focus_to_text,
g_object_ref(bsmsg->text));
return bsmsg;
diff --git a/src/store-address.c b/src/store-address.c
index 6eaffe48e..26f46917f 100644
--- a/src/store-address.c
+++ b/src/store-address.c
@@ -331,12 +331,15 @@ store_address_note_frame(StoreAddressInfo *info)
gtk_container_set_border_width(GTK_CONTAINER(info->notebook), 4);
for (list = info->message_list; list; list = list->next) {
+ LibBalsaMessageHeaders *headers;
+
message = LIBBALSA_MESSAGE(list->data);
- if (message->headers) {
- store_address_add_list(info, _("From: "), message->headers->from);
- store_address_add_list(info, _("To: "), message->headers->to_list);
- store_address_add_list(info, _("CC: "), message->headers->cc_list);
- store_address_add_list(info, _("BCC: "), message->headers->bcc_list);
+ headers = libbalsa_message_get_headers(message);
+ if (headers != NULL) {
+ store_address_add_list(info, _("From: "), headers->from);
+ store_address_add_list(info, _("To: "), headers->to_list);
+ store_address_add_list(info, _("CC: "), headers->cc_list);
+ store_address_add_list(info, _("BCC: "), headers->bcc_list);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]