geary/src/engine/sqlite/MessageRow.vala
Jim Nelson 4ccabcbd3e Further work toward persisting messages locally (#3742).
This iteration now stores headers locally and fetches them first before going to the network.  Work done in the database to deal with IMAPisms.  More work on the GMime bindings (couple of mistakes in prior commit).
2011-06-21 17:48:40 -07:00

151 lines
5.5 KiB
Vala

/* Copyright 2011 Yorba Foundation
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
*/
public class Geary.Sqlite.MessageRow : Geary.Sqlite.Row {
public int64 id { get; set; default = INVALID_ID; }
public string? date { get; set; }
public time_t date_time_t { get; set; default = -1; }
public string? from { get; set; }
public string? sender { get; set; }
public string? reply_to { get; set; }
public string? to { get; set; }
public string? cc { get; set; }
public string? bcc { get; set; }
public string? message_id { get; set; }
public string? in_reply_to { get; set; }
public string? subject { get; set; }
public string? header { get; set; }
public string? body { get; set; }
public MessageRow(Table table) {
base (table);
}
public MessageRow.from_email(MessageTable table, Geary.Email email) {
base (table);
date = (email.date != null) ? email.date.original : null;
date_time_t = (email.date != null) ? email.date.as_time_t : -1;
from = flatten_addresses(email.from);
sender = flatten_addresses(email.sender);
reply_to = flatten_addresses(email.reply_to);
to = flatten_addresses(email.to);
cc = flatten_addresses(email.cc);
bcc = flatten_addresses(email.bcc);
message_id = (email.message_id != null) ? email.message_id.value : null;
in_reply_to = (email.in_reply_to != null) ? email.in_reply_to.value : null;
subject = (email.subject != null) ? email.subject.value : null;
header = (email.header != null) ? email.header.buffer.to_ascii_string() : null;
body = (email.body != null) ? email.body.buffer.to_ascii_string() : null;
}
public MessageRow.from_query_result(Table table, Geary.Email.Field fields, SQLHeavy.QueryResult result)
throws Error {
base (table);
id = fetch_int64_for(result, MessageTable.Column.ID);
if ((fields & Geary.Email.Field.DATE) != 0) {
date = fetch_string_for(result, MessageTable.Column.DATE_FIELD);
date_time_t = (time_t) fetch_int64_for(result, MessageTable.Column.DATE_INT64);
}
if ((fields & Geary.Email.Field.ORIGINATORS) != 0) {
from = fetch_string_for(result, MessageTable.Column.FROM_FIELD);
sender = fetch_string_for(result, MessageTable.Column.SENDER);
reply_to = fetch_string_for(result, MessageTable.Column.REPLY_TO);
}
if ((fields & Geary.Email.Field.RECEIVERS) != 0) {
to = fetch_string_for(result, MessageTable.Column.TO_FIELD);
cc = fetch_string_for(result, MessageTable.Column.CC);
bcc = fetch_string_for(result, MessageTable.Column.BCC);
}
if ((fields & Geary.Email.Field.REFERENCES) != 0) {
message_id = fetch_string_for(result, MessageTable.Column.MESSAGE_ID);
in_reply_to = fetch_string_for(result, MessageTable.Column.IN_REPLY_TO);
}
if ((fields & Geary.Email.Field.SUBJECT) != 0)
subject = fetch_string_for(result, MessageTable.Column.SUBJECT);
if ((fields & Geary.Email.Field.HEADER) != 0)
header = fetch_string_for(result, MessageTable.Column.HEADER);
if ((fields & Geary.Email.Field.BODY) != 0)
body = fetch_string_for(result, MessageTable.Column.BODY);
}
public Geary.Email to_email(Geary.EmailLocation location) throws Error {
Geary.Email email = new Geary.Email(location);
email.date = (date != null) ? new RFC822.Date(date) : null;
email.from = unflatten_addresses(from);
email.sender = unflatten_addresses(sender);
email.reply_to = unflatten_addresses(reply_to);
email.to = unflatten_addresses(to);
email.cc = unflatten_addresses(cc);
email.bcc = unflatten_addresses(bcc);
email.message_id = (message_id != null) ? new RFC822.MessageID(message_id) : null;
email.in_reply_to = (in_reply_to != null) ? new RFC822.MessageID(in_reply_to) : null;
email.subject = (subject != null) ? new RFC822.Subject(subject) : null;
email.header = (header != null) ? new RFC822.Header(new Geary.Memory.StringBuffer(header))
: null;
email.body = (body != null) ? new RFC822.Text(new Geary.Memory.StringBuffer(body))
: null;
return email;
}
public string? flatten_addresses(RFC822.MailboxAddresses? addrs) {
if (addrs == null)
return null;
switch (addrs.size) {
case 0:
return null;
case 1:
return addrs[0].get_full_address();
default:
StringBuilder builder = new StringBuilder();
foreach (RFC822.MailboxAddress addr in addrs) {
if (!String.is_empty(builder.str))
builder.append(", ");
builder.append(addr.get_full_address());
}
return builder.str;
}
}
public RFC822.MailboxAddresses? unflatten_addresses(string? str) {
return String.is_empty(str) ? null : new RFC822.MailboxAddresses.from_rfc822_string(str);
}
}