Author: czeidler Date: 2011-03-21 10:13:12 +0100 (Mon, 21 Mar 2011) New Revision: 41062 Changeset: https://dev.haiku-os.org/changeset/41062 Ticket: https://dev.haiku-os.org/ticket/7375 Modified: haiku/trunk/headers/os/mail/E-mail.h haiku/trunk/src/add-ons/mail_daemon/inbound_protocols/pop3/pop3.cpp haiku/trunk/src/apps/mail/MailWindow.cpp haiku/trunk/src/kits/mail/HaikuMailFormatFilter.cpp haiku/trunk/src/kits/mail/HaikuMailFormatFilter.h haiku/trunk/src/kits/mail/MailMessage.cpp haiku/trunk/src/servers/mail/MailDaemon.cpp Log: 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. Modified: haiku/trunk/headers/os/mail/E-mail.h =================================================================== --- haiku/trunk/headers/os/mail/E-mail.h 2011-03-21 05:24:48 UTC (rev 41061) +++ haiku/trunk/headers/os/mail/E-mail.h 2011-03-21 09:13:12 UTC (rev 41062) @@ -29,6 +29,9 @@ #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 Modified: haiku/trunk/src/add-ons/mail_daemon/inbound_protocols/pop3/pop3.cpp =================================================================== --- haiku/trunk/src/add-ons/mail_daemon/inbound_protocols/pop3/pop3.cpp 2011-03-21 05:24:48 UTC (rev 41061) +++ haiku/trunk/src/add-ons/mail_daemon/inbound_protocols/pop3/pop3.cpp 2011-03-21 09:13:12 UTC (rev 41062) @@ -603,7 +603,7 @@ 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); Modified: haiku/trunk/src/apps/mail/MailWindow.cpp =================================================================== --- haiku/trunk/src/apps/mail/MailWindow.cpp 2011-03-21 05:24:48 UTC (rev 41061) +++ haiku/trunk/src/apps/mail/MailWindow.cpp 2011-03-21 09:13:12 UTC (rev 41062) @@ -804,7 +804,7 @@ 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; Modified: haiku/trunk/src/kits/mail/HaikuMailFormatFilter.cpp =================================================================== --- haiku/trunk/src/kits/mail/HaikuMailFormatFilter.cpp 2011-03-21 05:24:48 UTC (rev 41061) +++ haiku/trunk/src/kits/mail/HaikuMailFormatFilter.cpp 2011-03-21 09:13:12 UTC (rev 41062) @@ -35,12 +35,15 @@ { "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 @@ : 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 @@ 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 @@ } } - (*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 @@ fMailProtocol.FileRenamed(ref, to); } + (*file) << attributes; + BNodeInfo info(file); info.SetType(B_PARTIAL_MAIL_TYPE); } @@ -205,3 +212,25 @@ 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; +} Modified: haiku/trunk/src/kits/mail/HaikuMailFormatFilter.h =================================================================== --- haiku/trunk/src/kits/mail/HaikuMailFormatFilter.h 2011-03-21 05:24:48 UTC (rev 41061) +++ haiku/trunk/src/kits/mail/HaikuMailFormatFilter.h 2011-03-21 09:13:12 UTC (rev 41062) @@ -26,8 +26,10 @@ private: status_t _SetFileName(const entry_ref& ref, const BString& name); + BString _ExtractName(const BString& from); int32 fAccountId; + BString fAccountName; BString fOutboundDirectory; }; Modified: haiku/trunk/src/kits/mail/MailMessage.cpp =================================================================== --- haiku/trunk/src/kits/mail/MailMessage.cpp 2011-03-21 05:24:48 UTC (rev 41061) +++ haiku/trunk/src/kits/mail/MailMessage.cpp 2011-03-21 09:13:12 UTC (rev 41062) @@ -636,10 +636,13 @@ 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 @@ 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; Modified: haiku/trunk/src/servers/mail/MailDaemon.cpp =================================================================== --- haiku/trunk/src/servers/mail/MailDaemon.cpp 2011-03-21 05:24:48 UTC (rev 41061) +++ haiku/trunk/src/servers/mail/MailDaemon.cpp 2011-03-21 09:13:12 UTC (rev 41062) @@ -193,7 +193,7 @@ 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 @@ 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 @@ 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;