diff --git a/headers/os/add-ons/mail_daemon/MailProtocol.h b/headers/os/add-ons/mail_daemon/MailProtocol.h index d4c3b2ca4e..19f2250b7b 100644 --- a/headers/os/add-ons/mail_daemon/MailProtocol.h +++ b/headers/os/add-ons/mail_daemon/MailProtocol.h @@ -1,5 +1,5 @@ /* - * Copyright 2004-2013, Haiku, Inc. All Rights Reserved. + * Copyright 2004-2015, Haiku, Inc. All Rights Reserved. * Copyright 2001 Dr. Zoidberg Enterprises. All rights reserved. * Copyright 2011 Clemens Zeidler. All rights reserved. * @@ -52,7 +52,7 @@ typedef status_t BMailFilterAction; class BMailProtocol : public BLooper { public: - BMailProtocol( + BMailProtocol(const char* name, const BMailAccountSettings& settings); virtual ~BMailProtocol(); @@ -109,6 +109,8 @@ protected: const BMailProtocolSettings& settings); private: + static BString _LooperName(const char* name, + const BMailAccountSettings& settings); BMailFilter* _LoadFilter(const BMailAddOnSettings& settings); BMailFilterAction _ProcessHeaderFetched(entry_ref& ref, BFile& mail, BMessage& attributes); @@ -127,7 +129,7 @@ private: class BInboundMailProtocol : public BMailProtocol { public: - BInboundMailProtocol( + BInboundMailProtocol(const char* name, const BMailAccountSettings& settings); virtual ~BInboundMailProtocol(); @@ -147,13 +149,17 @@ protected: class BOutboundMailProtocol : public BMailProtocol { public: - BOutboundMailProtocol( + BOutboundMailProtocol(const char* name, const BMailAccountSettings& settings); virtual ~BOutboundMailProtocol(); + virtual status_t SendMessages(const BMessage& message, + off_t totalBytes); + virtual void MessageReceived(BMessage* message); - virtual status_t SendMessages(const BMessage& message, +protected: + virtual status_t HandleSendMessages(const BMessage& message, off_t totalBytes) = 0; }; diff --git a/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPProtocol.cpp b/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPProtocol.cpp index a93cbdf908..ad29830598 100644 --- a/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPProtocol.cpp +++ b/src/add-ons/mail_daemon/inbound_protocols/imap/IMAPProtocol.cpp @@ -15,7 +15,7 @@ IMAPProtocol::IMAPProtocol(const BMailAccountSettings& settings) : - BInboundMailProtocol(settings), + BInboundMailProtocol("IMAP", settings), fSettings(settings.Name(), settings.InboundSettings()), fWorkers(5, false) { diff --git a/src/add-ons/mail_daemon/inbound_protocols/pop3/POP3.cpp b/src/add-ons/mail_daemon/inbound_protocols/pop3/POP3.cpp index 51a3d28b89..f06dd9f11c 100644 --- a/src/add-ons/mail_daemon/inbound_protocols/pop3/POP3.cpp +++ b/src/add-ons/mail_daemon/inbound_protocols/pop3/POP3.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2007-2013, Haiku, Inc. All rights reserved. + * Copyright 2007-2015, Haiku, Inc. All rights reserved. * Copyright 2001-2002 Dr. Zoidberg Enterprises. All rights reserved. * Copyright 2011, Clemens Zeidler * @@ -69,7 +69,7 @@ NotHere(BStringList& that, BStringList& otherList, BStringList* results) POP3Protocol::POP3Protocol(const BMailAccountSettings& settings) : - BInboundMailProtocol(settings), + BInboundMailProtocol("POP3", settings), fNumMessages(-1), fMailDropSize(0), fServerConnection(NULL) diff --git a/src/add-ons/mail_daemon/outbound_protocols/smtp/SMTP.cpp b/src/add-ons/mail_daemon/outbound_protocols/smtp/SMTP.cpp index b0cb38c14a..59e2c5a39a 100644 --- a/src/add-ons/mail_daemon/outbound_protocols/smtp/SMTP.cpp +++ b/src/add-ons/mail_daemon/outbound_protocols/smtp/SMTP.cpp @@ -248,7 +248,7 @@ SplitChallengeIntoMap(BString str, map& m) SMTPProtocol::SMTPProtocol(const BMailAccountSettings& settings) : - BOutboundMailProtocol(settings), + BOutboundMailProtocol("SMTP", settings), fAuthType(0) { fSettingsMessage = settings.OutboundSettings(); @@ -329,7 +329,7 @@ SMTPProtocol::Disconnect() //! Process EMail to be sent status_t -SMTPProtocol::SendMessages(const BMessage& message, off_t totalBytes) +SMTPProtocol::HandleSendMessages(const BMessage& message, off_t totalBytes) { type_code type; int32 count; @@ -337,6 +337,9 @@ SMTPProtocol::SendMessages(const BMessage& message, off_t totalBytes) if (status != B_OK) return status; + // TODO: sort out already sent messages -- the request could + // be issued while we're busy sending them already + SetTotalItems(count); SetTotalItemsSize(totalBytes); diff --git a/src/add-ons/mail_daemon/outbound_protocols/smtp/SMTP.h b/src/add-ons/mail_daemon/outbound_protocols/smtp/SMTP.h index 1bf47baf8d..331043e632 100644 --- a/src/add-ons/mail_daemon/outbound_protocols/smtp/SMTP.h +++ b/src/add-ons/mail_daemon/outbound_protocols/smtp/SMTP.h @@ -27,10 +27,11 @@ public: const BMailAccountSettings& settings); virtual ~SMTPProtocol(); +protected: status_t Connect(); void Disconnect(); - virtual status_t SendMessages(const BMessage& message, + virtual status_t HandleSendMessages(const BMessage& message, off_t totalBytes); status_t Open(const char *server, int port, bool esmtp); diff --git a/src/kits/mail/MailProtocol.cpp b/src/kits/mail/MailProtocol.cpp index 446e142fb6..f73d959cad 100644 --- a/src/kits/mail/MailProtocol.cpp +++ b/src/kits/mail/MailProtocol.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2011-2013, Haiku, Inc. All rights reserved. + * Copyright 2011-2015, Haiku, Inc. All rights reserved. * Copyright 2001-2003 Dr. Zoidberg Enterprises. All rights reserved. */ @@ -43,11 +43,11 @@ using namespace BPrivate; const uint32 kMsgDeleteMessage = '&DeM'; const uint32 kMsgAppendMessage = '&ApM'; -const uint32 kMsgSendMessage = '&SeM'; - -BMailProtocol::BMailProtocol(const BMailAccountSettings& settings) +BMailProtocol::BMailProtocol(const char* name, + const BMailAccountSettings& settings) : + BLooper(_LooperName(name, settings)), fAccountSettings(settings), fMailNotifier(NULL) { @@ -273,6 +273,20 @@ BMailProtocol::LoadFilters(const BMailProtocolSettings& settings) } +/*static*/ BString +BMailProtocol::_LooperName(const char* addOnName, + const BMailAccountSettings& settings) +{ + BString name = addOnName; + + const char* accountName = settings.Name(); + if (accountName != NULL && accountName[0] != '\0') + name << " " << accountName; + + return name; +} + + BMailFilter* BMailProtocol::_LoadFilter(const BMailAddOnSettings& settings) { @@ -374,9 +388,10 @@ BMailProtocol::_NotifyBodyFetched(const entry_ref& ref, BFile& file, // #pragma mark - -BInboundMailProtocol::BInboundMailProtocol(const BMailAccountSettings& settings) +BInboundMailProtocol::BInboundMailProtocol(const char* name, + const BMailAccountSettings& settings) : - BMailProtocol(settings) + BMailProtocol(name, settings) { LoadFilters(fAccountSettings.InboundSettings()); } @@ -472,10 +487,10 @@ BInboundMailProtocol::NotiyMailboxSynchronized(status_t status) // #pragma mark - -BOutboundMailProtocol::BOutboundMailProtocol( +BOutboundMailProtocol::BOutboundMailProtocol(const char* name, const BMailAccountSettings& settings) : - BMailProtocol(settings) + BMailProtocol(name, settings) { LoadFilters(fAccountSettings.OutboundSettings()); } @@ -486,12 +501,23 @@ BOutboundMailProtocol::~BOutboundMailProtocol() } +status_t +BOutboundMailProtocol::SendMessages(const BMessage& files, off_t totalBytes) +{ + BMessage message(kMsgSendMessages); + message.Append(files); + message.AddInt64("bytes", totalBytes); + + return BMessenger(this).SendMessage(&message); +} + + void BOutboundMailProtocol::MessageReceived(BMessage* message) { switch (message->what) { - case kMsgSendMessage: - SendMessages(*message, message->FindInt64("bytes")); + case kMsgSendMessages: + HandleSendMessages(*message, message->FindInt64("bytes")); break; default: diff --git a/src/servers/mail/MailDaemonApplication.cpp b/src/servers/mail/MailDaemonApplication.cpp index 8a15376f59..df50b1056f 100644 --- a/src/servers/mail/MailDaemonApplication.cpp +++ b/src/servers/mail/MailDaemonApplication.cpp @@ -94,25 +94,6 @@ public: }; -class OutboundMessenger : public BMessenger { -public: - OutboundMessenger(BOutboundMailProtocol* protocol) - : - BMessenger(protocol) - { - } - - status_t SendMessages(const BMessage& files, off_t totalBytes) - { - BMessage message(kMsgSendMessages); - message.Append(files); - message.AddInt64("bytes", totalBytes); - - return SendMessage(&message); - } -}; - - // #pragma mark - @@ -498,12 +479,8 @@ MailDaemonApplication::SendPendingMessages(BMessage* msg) { BVolumeRoster roster; BVolume volume; - std::map messages; - - int32 account = -1; - if (msg->FindInt32("account", &account) != B_OK) - account = -1; + int32 account = msg->GetInt32("account", -1); if (!msg->HasString("message_path")) { while (roster.GetNextVolume(&volume) == B_OK) { @@ -564,7 +541,7 @@ MailDaemonApplication::SendPendingMessages(BMessage* msg) if (info.bytes == 0) continue; - OutboundMessenger(protocol).SendMessages(info.files, info.bytes); + protocol->SendMessages(info.files, info.bytes); } }