Write MAIL:name, MAIL:thread and MAIL:account attribute. The account id is now stored in MAIL:account_id. This requires to re-download all mails to write the correct attribute (sorry).

Fixes #7375.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41062 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Clemens Zeidler 2011-03-21 09:13:12 +00:00
parent a694218113
commit a64bd5649d
7 changed files with 57 additions and 20 deletions

View File

@ -29,6 +29,9 @@ struct entry_ref;
#define B_MAIL_ATTR_HEADER "MAIL:header_length" // int32
#define B_MAIL_ATTR_CONTENT "MAIL:content_length" // int32
#define B_MAIL_ATTR_READ "MAIL:read" // int32
#define B_MAIL_ATTR_THREAD "MAIL:thread" // string
#define B_MAIL_ATTR_ACCOUNT "MAIL:account" // string
#define B_MAIL_ATTR_ACCOUNT_ID "MAIL:account_id" // int32
// read flags

View File

@ -603,7 +603,7 @@ POP3Protocol::CheckForDeletedMessages()
entry_ref entry;
fido.SetVolume(&volume);
fido.PushAttr("MAIL:account");
fido.PushAttr(B_MAIL_ATTR_ACCOUNT_ID);
fido.PushInt32(fAccountSettings.AccountID());
fido.PushOp(B_EQ);

View File

@ -804,7 +804,7 @@ TMailWindow::MarkMessageRead(entry_ref* message, read_flags flag)
return;
int32 account;
if (node.ReadAttr("MAIL:account", B_INT32_TYPE, 0, &account,
if (node.ReadAttr(B_MAIL_ATTR_ACCOUNT_ID, B_INT32_TYPE, 0, &account,
sizeof(account)) < 0)
account = -1;

View File

@ -35,12 +35,15 @@ static const mail_header_field gDefaultFields[] =
{ "Delivery-Date", B_MAIL_ATTR_WHEN, B_TIME_TYPE },
{ "Reply-To", B_MAIL_ATTR_REPLY, B_STRING_TYPE },
{ "Subject", B_MAIL_ATTR_SUBJECT, B_STRING_TYPE },
{ "X-Priority", B_MAIL_ATTR_PRIORITY, B_STRING_TYPE }, // Priorities with prefered
{ "Priority", B_MAIL_ATTR_PRIORITY, B_STRING_TYPE }, // one first - the numeric
{ "X-Msmail-Priority", B_MAIL_ATTR_PRIORITY, B_STRING_TYPE }, // one (has more levels).
{ "X-Priority", B_MAIL_ATTR_PRIORITY, B_STRING_TYPE },
// Priorities with prefered
{ "Priority", B_MAIL_ATTR_PRIORITY, B_STRING_TYPE },
// one first - the numeric
{ "X-Msmail-Priority", B_MAIL_ATTR_PRIORITY, B_STRING_TYPE },
// one (has more levels).
{ "Mime-Version", B_MAIL_ATTR_MIME, B_STRING_TYPE },
{ "STATUS", B_MAIL_ATTR_STATUS, B_STRING_TYPE },
{ "THREAD", "MAIL:thread", B_STRING_TYPE }, //---Not supposed to be used for this (we add it in Parser), but why not?
{ "THREAD", B_MAIL_ATTR_THREAD, B_STRING_TYPE },
{ "NAME", B_MAIL_ATTR_NAME, B_STRING_TYPE },
{ NULL, NULL, 0 }
};
@ -51,7 +54,8 @@ HaikuMailFormatFilter::HaikuMailFormatFilter(MailProtocol& protocol,
:
MailFilter(protocol, NULL),
fAccountId(settings->AccountID())
fAccountId(settings->AccountID()),
fAccountName(settings->Name())
{
const BMessage* outboundSettings = &settings->OutboundSettings().Settings();
if (outboundSettings->FindString("destination", &fOutboundDirectory)
@ -68,7 +72,8 @@ HaikuMailFormatFilter::HeaderFetched(const entry_ref& ref, BFile* file)
BMessage attributes;
// TODO attributes.AddInt32(B_MAIL_ATTR_CONTENT, length);
attributes.AddInt32("MAIL:account", fAccountId);
attributes.AddInt32(B_MAIL_ATTR_ACCOUNT_ID, fAccountId);
attributes.AddString(B_MAIL_ATTR_ACCOUNT, fAccountName);
BString header;
off_t size;
@ -102,16 +107,16 @@ HaikuMailFormatFilter::HeaderFetched(const entry_ref& ref, BFile* file)
}
}
(*file) << attributes;
BString senderName = _ExtractName(attributes.FindString(B_MAIL_ATTR_FROM));
attributes.AddString(B_MAIL_ATTR_NAME, senderName);
// Generate a file name for the incoming message. See also
// Message::RenderTo which does a similar thing for outgoing messages.
BString name = attributes.FindString("MAIL:subject");
BString name = attributes.FindString(B_MAIL_ATTR_SUBJECT);
SubjectToThread(name); // Extract the core subject words.
if (name.Length() <= 0)
name = "No Subject";
attributes.AddString(B_MAIL_ATTR_THREAD, name);
if (name[0] == '.')
name.Prepend ("_"); // Avoid hidden files, starting with a dot.
@ -171,6 +176,8 @@ HaikuMailFormatFilter::HeaderFetched(const entry_ref& ref, BFile* file)
fMailProtocol.FileRenamed(ref, to);
}
(*file) << attributes;
BNodeInfo info(file);
info.SetType(B_PARTIAL_MAIL_TYPE);
}
@ -205,3 +212,25 @@ HaikuMailFormatFilter::_SetFileName(const entry_ref& ref, const BString& name)
BEntry entry(&ref);
return entry.Rename(name);
}
BString
HaikuMailFormatFilter::_ExtractName(const BString& from)
{
BString name;
int32 emailStart = from.FindFirst("<");
if (emailStart < 0)
name = from;
from.CopyInto(name, 0, emailStart);
name.Trim();
if (name.Length() < 2)
return from;
if (name[name.Length() - 1] == '\"')
name.Truncate(name.Length() - 1, true);
if (name[0] == '\"')
name.Remove(0, 1);
return name;
}

View File

@ -26,8 +26,10 @@ public:
private:
status_t _SetFileName(const entry_ref& ref,
const BString& name);
BString _ExtractName(const BString& from);
int32 fAccountId;
BString fAccountName;
BString fOutboundDirectory;
};

View File

@ -636,10 +636,13 @@ BEmailMessage::RetrieveTextBody(BMailComponent *component)
status_t
BEmailMessage::SetToRFC822(BPositionIO *mail_file, size_t length, bool parse_now)
BEmailMessage::SetToRFC822(BPositionIO *mail_file, size_t length,
bool parse_now)
{
if (BFile *file = dynamic_cast<BFile *>(mail_file))
file->ReadAttr("MAIL:account",B_INT32_TYPE,0,&_account_id,sizeof(_account_id));
if (BFile *file = dynamic_cast<BFile *>(mail_file)) {
file->ReadAttr(B_MAIL_ATTR_ACCOUNT_ID, B_INT32_TYPE, 0, &_account_id,
sizeof(_account_id));
}
mail_file->Seek(0,SEEK_END);
length = mail_file->Position();
@ -806,8 +809,8 @@ BEmailMessage::RenderToRFC822(BPositionIO *file)
attributed->WriteAttr(B_MAIL_ATTR_FLAGS, B_INT32_TYPE, 0, &flags,
sizeof(int32));
attributed->WriteAttr("MAIL:account", B_INT32_TYPE, 0, &_account_id,
sizeof(int32));
attributed->WriteAttr(B_MAIL_ATTR_ACCOUNT_ID, B_INT32_TYPE, 0,
&_account_id, sizeof(int32));
}
return B_OK;

View File

@ -193,7 +193,7 @@ MailDaemonApp::RefsReceived(BMessage* message)
continue;
int32 account;
if (node.ReadAttr("MAIL:account", B_INT32_TYPE, 0, &account,
if (node.ReadAttr(B_MAIL_ATTR_ACCOUNT_ID, B_INT32_TYPE, 0, &account,
sizeof(account)) < 0)
continue;
@ -724,7 +724,7 @@ MailDaemonApp::SendPendingMessages(BMessage* msg)
query.PushOp(B_EQ);
if (account >= 0) {
query.PushAttr("MAIL:account");
query.PushAttr(B_MAIL_ATTR_ACCOUNT_ID);
query.PushInt32(account);
query.PushOp(B_EQ);
query.PushOp(B_AND);
@ -744,7 +744,7 @@ MailDaemonApp::SendPendingMessages(BMessage* msg)
continue;
int32 messageAccount;
if (node.ReadAttr("MAIL:account", B_INT32_TYPE, 0,
if (node.ReadAttr(B_MAIL_ATTR_ACCOUNT_ID, B_INT32_TYPE, 0,
&messageAccount, sizeof(int32)) < 0)
messageAccount = -1;