From df0ad9c12a92a83718b4442e87034a8a2951efff Mon Sep 17 00:00:00 2001 From: Clemens Zeidler Date: Tue, 15 Feb 2011 02:19:49 +0000 Subject: [PATCH] Fix account name in mail. Work in progress: fetch next partial downloaded message. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40504 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/mail/E-mail.h | 1 + headers/os/mail/MailDaemon.h | 3 +- headers/os/mail/MailMessage.h | 3 +- src/apps/mail/Header.cpp | 5 +-- src/apps/mail/MailWindow.cpp | 14 +++++--- src/kits/mail/MailDaemon.cpp | 17 ++++++++- src/kits/mail/MailMessage.cpp | 64 +++++++++++++++------------------ src/kits/mail/MailProtocol.cpp | 6 ++-- src/servers/mail/MailDaemon.cpp | 4 +++ 9 files changed, 69 insertions(+), 48 deletions(-) diff --git a/headers/os/mail/E-mail.h b/headers/os/mail/E-mail.h index 5b9252c747..bfac0c1499 100644 --- a/headers/os/mail/E-mail.h +++ b/headers/os/mail/E-mail.h @@ -41,6 +41,7 @@ enum mail_flags { }; #define B_MAIL_TYPE "text/x-email" // mime type +#define B_PARTIAL_MAIL_TYPE "text/x-partial-email" // mime type // WARNING: Everything past this point is deprecated. See MailMessage.h, diff --git a/headers/os/mail/MailDaemon.h b/headers/os/mail/MailDaemon.h index 2ec4317843..46eca98816 100644 --- a/headers/os/mail/MailDaemon.h +++ b/headers/os/mail/MailDaemon.h @@ -15,6 +15,7 @@ const uint32 kMsgAccountsChanged = 'macc'; const uint32 kMsgSetStatusWindowMode = 'shst'; const uint32 kMsgCountNewMessages = 'mnum'; const uint32 kMsgMarkMessageAsRead = 'mmar'; +const uint32 kMsgFetchBody = 'mfeb'; class BMailDaemon { @@ -27,7 +28,7 @@ public: bool waitForFetchCompletion = false); static status_t MarkAsRead(int32 account, const entry_ref& ref, bool read = true); - + static status_t FetchBody(const entry_ref& ref); static status_t Quit(); }; diff --git a/headers/os/mail/MailMessage.h b/headers/os/mail/MailMessage.h index db44191271..dcca852b0e 100644 --- a/headers/os/mail/MailMessage.h +++ b/headers/os/mail/MailMessage.h @@ -63,8 +63,7 @@ class BEmailMessage : public BMailContainer { void SendViaAccount(const char *account_name); void SendViaAccount(int32 account); int32 Account() const; - status_t GetAccountName(char *account,int32 maxLength) const; - status_t GetAccountName(BString *account) const; + status_t GetAccountName(BString& accountName) const; virtual status_t AddComponent(BMailComponent *component); virtual status_t RemoveComponent(BMailComponent *component); diff --git a/src/apps/mail/Header.cpp b/src/apps/mail/Header.cpp index 4eb279a76d..da214a27ae 100644 --- a/src/apps/mail/Header.cpp +++ b/src/apps/mail/Header.cpp @@ -730,8 +730,9 @@ THeaderView::LoadMessage(BEmailMessage *mail) if (fAccountTo != NULL) fAccountTo->SetText(mail->To()); - if (fAccount != NULL && mail->GetAccountName(string,sizeof(string)) == B_OK) - fAccount->SetText(string); + BString accountName; + if (fAccount != NULL && mail->GetAccountName(accountName) == B_OK) + fAccount->SetText(accountName); return B_OK; } diff --git a/src/apps/mail/MailWindow.cpp b/src/apps/mail/MailWindow.cpp index dff58746ac..fc31aaffb5 100644 --- a/src/apps/mail/MailWindow.cpp +++ b/src/apps/mail/MailWindow.cpp @@ -788,7 +788,8 @@ TMailWindow::GetTrackerWindowFile(entry_ref *ref, bool next) const if (BNodeInfo(&node).GetType(fileType) != B_OK) return false; - if (strcasecmp(fileType,"text/x-email") == 0) + if (strcasecmp(fileType, B_MAIL_TYPE) == 0 + || strcasecmp(fileType, B_PARTIAL_MAIL_TYPE) == 0) foundRef = true; } @@ -1504,8 +1505,8 @@ TMailWindow::MessageReceived(BMessage *msg) if (fRef != NULL) { entry_ref nextRef = *fRef; if (GetTrackerWindowFile(&nextRef, (msg->what == M_NEXTMSG))) { - TMailWindow *window - = static_cast(be_app)->FindWindow(nextRef); + TMailWindow *window = static_cast(be_app) + ->FindWindow(nextRef); if (window == NULL) { if (fAutoMarkRead) SetCurrentMessageRead(); @@ -2820,9 +2821,14 @@ TMailWindow::OpenMessage(entry_ref *ref, uint32 characterSetForDecoding) BNodeInfo fileInfo(&file); fileInfo.GetType(mimeType); + if (strcmp(mimeType, B_PARTIAL_MAIL_TYPE) == 0) { + BMailDaemon::FetchBody(*ref); + fileInfo.GetType(mimeType); + } + // Check if it's a draft file, which contains only the text, and has the // from, to, bcc, attachments listed as attributes. - if (!strcmp(kDraftType, mimeType)) { + if (strcmp(kDraftType, mimeType) == 0) { BNode node(fRef); off_t size; BString string; diff --git a/src/kits/mail/MailDaemon.cpp b/src/kits/mail/MailDaemon.cpp index 1e42eb78e4..3a3fd1dc34 100644 --- a/src/kits/mail/MailDaemon.cpp +++ b/src/kits/mail/MailDaemon.cpp @@ -82,7 +82,22 @@ BMailDaemon::MarkAsRead(int32 account, const entry_ref& ref, bool read) message.AddRef("ref", &ref); message.AddBool("read", read); - return daemon.SendMessage(&message); + return daemon.SendMessage(&message); +} + + +status_t +BMailDaemon::FetchBody(const entry_ref& ref) +{ + BMessenger daemon("application/x-vnd.Be-POST"); + if (!daemon.IsValid()) + return B_MAIL_NO_DAEMON; + + BMessage message(kMsgFetchBody); + message.AddRef("refs", &ref); + + BMessage reply; + return daemon.SendMessage(&message, &reply); } diff --git a/src/kits/mail/MailMessage.cpp b/src/kits/mail/MailMessage.cpp index 51da5c00c6..f210ff13d6 100644 --- a/src/kits/mail/MailMessage.cpp +++ b/src/kits/mail/MailMessage.cpp @@ -389,8 +389,8 @@ BEmailMessage::GetName(BString *name) const void BEmailMessage::SendViaAccountFrom(BEmailMessage *message) { - char name[B_FILE_NAME_LENGTH]; - if (message->GetAccountName(name, B_FILE_NAME_LENGTH) < B_OK) { + BString name; + if (message->GetAccountName(name) < B_OK) { // just return the message with the default account return; } @@ -435,31 +435,26 @@ BEmailMessage::Account() const status_t -BEmailMessage::GetAccountName(char *account,int32 maxLength) const +BEmailMessage::GetAccountName(BString& accountName) const { - if (account == NULL || maxLength <= 0) - return B_BAD_VALUE; + BFile *file = dynamic_cast(fData); + if (!file) + return B_ERROR; - if (BFile *file = dynamic_cast(fData)) { - status_t status = file->ReadAttr(B_MAIL_ATTR_ACCOUNT,B_STRING_TYPE,0,account,maxLength); - account[maxLength - 1] = '\0'; + int32 accountId; + size_t read = file->ReadAttr(B_MAIL_ATTR_ACCOUNT, B_INT32_TYPE, 0, + &accountId, sizeof(int32)); + if (read < sizeof(int32)) + return B_ERROR; - return status >= 0 ? B_OK : status; - } + BMailAccounts accounts; + BMailAccountSettings* account = accounts.AccountByID(accountId); + if (account) + accountName = account->Name(); + else + accountName = ""; - // ToDo: try to get account name out of the chain lists - return B_ERROR; -} - - -status_t -BEmailMessage::GetAccountName(BString *account) const -{ - char *buffer = account->LockBuffer(B_FILE_NAME_LENGTH); - status_t status = GetAccountName(buffer,B_FILE_NAME_LENGTH); - account->UnlockBuffer(); - - return status; + return B_OK; } @@ -798,22 +793,21 @@ BEmailMessage::RenderToRFC822(BPositionIO *file) attributed->WriteAttrString(B_MAIL_ATTR_PRIORITY,&attr); } attr = "Pending"; - attributed->WriteAttrString(B_MAIL_ATTR_STATUS,&attr); + attributed->WriteAttrString(B_MAIL_ATTR_STATUS, &attr); attr = "1.0"; - attributed->WriteAttrString(B_MAIL_ATTR_MIME,&attr); - BMailAccounts accounts; - BMailAccountSettings* account = accounts.AccountByID(_account_id); - if (account) - attr = account->Name(); - else - attr = ""; - attributed->WriteAttrString(B_MAIL_ATTR_ACCOUNT,&attr); + attributed->WriteAttrString(B_MAIL_ATTR_MIME, &attr); + + attributed->WriteAttr(B_MAIL_ATTR_ACCOUNT, B_INT32_TYPE, 0, + &_account_id, sizeof(int32)); - attributed->WriteAttr(B_MAIL_ATTR_WHEN,B_TIME_TYPE,0,&creationTime,sizeof(int32)); + attributed->WriteAttr(B_MAIL_ATTR_WHEN, B_TIME_TYPE, 0, &creationTime, + sizeof(int32)); int32 flags = B_MAIL_PENDING | B_MAIL_SAVE; - attributed->WriteAttr(B_MAIL_ATTR_FLAGS,B_INT32_TYPE,0,&flags,sizeof(int32)); + 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("MAIL:account", B_INT32_TYPE, 0, &_account_id, + sizeof(int32)); } return B_OK; diff --git a/src/kits/mail/MailProtocol.cpp b/src/kits/mail/MailProtocol.cpp index 6b1674383a..23882d6f25 100644 --- a/src/kits/mail/MailProtocol.cpp +++ b/src/kits/mail/MailProtocol.cpp @@ -406,9 +406,9 @@ status_t InboundProtocol::MarkMessageAsRead(const entry_ref& ref, bool read) { BNode node(&ref); - BString statusString = (read == true) ? "Read" : "New"; - if (node.WriteAttr("MAIL:status", B_STRING_TYPE, 0, statusString.String(), - statusString.Length()) < 0) + const char* statusString = (read == true) ? "Read" : "New"; + if (node.WriteAttr(B_MAIL_ATTR_STATUS, B_STRING_TYPE, 0, statusString, + strlen(statusString)) < 0) return B_ERROR; return B_OK; } diff --git a/src/servers/mail/MailDaemon.cpp b/src/servers/mail/MailDaemon.cpp index d1c318f7b4..6d8d69d8e4 100644 --- a/src/servers/mail/MailDaemon.cpp +++ b/src/servers/mail/MailDaemon.cpp @@ -437,6 +437,10 @@ MailDaemonApp::MessageReceived(BMessage* msg) break; } + case kMsgFetchBody: + RefsReceived(msg); + break; + case 'lkch': // status window look changed case 'wsch': // workspace changed fMailStatusWindow->PostMessage(msg);