SMTP works again.

* The message to send the mails never made it to the add-on looper.
* Mail protocol threads now have names.
* Added a "public" BOutboundMailProtocol::SendMessages() call that sends
  itself a message (even the correct one this time).
This commit is contained in:
Axel Dörfler
2015-11-22 11:35:17 +01:00
parent 44d78872df
commit 62eec60079
7 changed files with 59 additions and 46 deletions
+11 -5
View File
@@ -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 2001 Dr. Zoidberg Enterprises. All rights reserved.
* Copyright 2011 Clemens Zeidler. All rights reserved. * Copyright 2011 Clemens Zeidler. All rights reserved.
* *
@@ -52,7 +52,7 @@ typedef status_t BMailFilterAction;
class BMailProtocol : public BLooper { class BMailProtocol : public BLooper {
public: public:
BMailProtocol( BMailProtocol(const char* name,
const BMailAccountSettings& settings); const BMailAccountSettings& settings);
virtual ~BMailProtocol(); virtual ~BMailProtocol();
@@ -109,6 +109,8 @@ protected:
const BMailProtocolSettings& settings); const BMailProtocolSettings& settings);
private: private:
static BString _LooperName(const char* name,
const BMailAccountSettings& settings);
BMailFilter* _LoadFilter(const BMailAddOnSettings& settings); BMailFilter* _LoadFilter(const BMailAddOnSettings& settings);
BMailFilterAction _ProcessHeaderFetched(entry_ref& ref, BMailFilterAction _ProcessHeaderFetched(entry_ref& ref,
BFile& mail, BMessage& attributes); BFile& mail, BMessage& attributes);
@@ -127,7 +129,7 @@ private:
class BInboundMailProtocol : public BMailProtocol { class BInboundMailProtocol : public BMailProtocol {
public: public:
BInboundMailProtocol( BInboundMailProtocol(const char* name,
const BMailAccountSettings& settings); const BMailAccountSettings& settings);
virtual ~BInboundMailProtocol(); virtual ~BInboundMailProtocol();
@@ -147,13 +149,17 @@ protected:
class BOutboundMailProtocol : public BMailProtocol { class BOutboundMailProtocol : public BMailProtocol {
public: public:
BOutboundMailProtocol( BOutboundMailProtocol(const char* name,
const BMailAccountSettings& settings); const BMailAccountSettings& settings);
virtual ~BOutboundMailProtocol(); virtual ~BOutboundMailProtocol();
virtual status_t SendMessages(const BMessage& message,
off_t totalBytes);
virtual void MessageReceived(BMessage* message); virtual void MessageReceived(BMessage* message);
virtual status_t SendMessages(const BMessage& message, protected:
virtual status_t HandleSendMessages(const BMessage& message,
off_t totalBytes) = 0; off_t totalBytes) = 0;
}; };
@@ -15,7 +15,7 @@
IMAPProtocol::IMAPProtocol(const BMailAccountSettings& settings) IMAPProtocol::IMAPProtocol(const BMailAccountSettings& settings)
: :
BInboundMailProtocol(settings), BInboundMailProtocol("IMAP", settings),
fSettings(settings.Name(), settings.InboundSettings()), fSettings(settings.Name(), settings.InboundSettings()),
fWorkers(5, false) fWorkers(5, false)
{ {
@@ -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 2001-2002 Dr. Zoidberg Enterprises. All rights reserved.
* Copyright 2011, Clemens Zeidler <[email protected]> * Copyright 2011, Clemens Zeidler <[email protected]>
* *
@@ -69,7 +69,7 @@ NotHere(BStringList& that, BStringList& otherList, BStringList* results)
POP3Protocol::POP3Protocol(const BMailAccountSettings& settings) POP3Protocol::POP3Protocol(const BMailAccountSettings& settings)
: :
BInboundMailProtocol(settings), BInboundMailProtocol("POP3", settings),
fNumMessages(-1), fNumMessages(-1),
fMailDropSize(0), fMailDropSize(0),
fServerConnection(NULL) fServerConnection(NULL)
@@ -248,7 +248,7 @@ SplitChallengeIntoMap(BString str, map<BString,BString>& m)
SMTPProtocol::SMTPProtocol(const BMailAccountSettings& settings) SMTPProtocol::SMTPProtocol(const BMailAccountSettings& settings)
: :
BOutboundMailProtocol(settings), BOutboundMailProtocol("SMTP", settings),
fAuthType(0) fAuthType(0)
{ {
fSettingsMessage = settings.OutboundSettings(); fSettingsMessage = settings.OutboundSettings();
@@ -329,7 +329,7 @@ SMTPProtocol::Disconnect()
//! Process EMail to be sent //! Process EMail to be sent
status_t status_t
SMTPProtocol::SendMessages(const BMessage& message, off_t totalBytes) SMTPProtocol::HandleSendMessages(const BMessage& message, off_t totalBytes)
{ {
type_code type; type_code type;
int32 count; int32 count;
@@ -337,6 +337,9 @@ SMTPProtocol::SendMessages(const BMessage& message, off_t totalBytes)
if (status != B_OK) if (status != B_OK)
return status; return status;
// TODO: sort out already sent messages -- the request could
// be issued while we're busy sending them already
SetTotalItems(count); SetTotalItems(count);
SetTotalItemsSize(totalBytes); SetTotalItemsSize(totalBytes);
@@ -27,10 +27,11 @@ public:
const BMailAccountSettings& settings); const BMailAccountSettings& settings);
virtual ~SMTPProtocol(); virtual ~SMTPProtocol();
protected:
status_t Connect(); status_t Connect();
void Disconnect(); void Disconnect();
virtual status_t SendMessages(const BMessage& message, virtual status_t HandleSendMessages(const BMessage& message,
off_t totalBytes); off_t totalBytes);
status_t Open(const char *server, int port, bool esmtp); status_t Open(const char *server, int port, bool esmtp);
+36 -10
View File
@@ -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. * Copyright 2001-2003 Dr. Zoidberg Enterprises. All rights reserved.
*/ */
@@ -43,11 +43,11 @@ using namespace BPrivate;
const uint32 kMsgDeleteMessage = '&DeM'; const uint32 kMsgDeleteMessage = '&DeM';
const uint32 kMsgAppendMessage = '&ApM'; const uint32 kMsgAppendMessage = '&ApM';
const uint32 kMsgSendMessage = '&SeM';
BMailProtocol::BMailProtocol(const char* name,
BMailProtocol::BMailProtocol(const BMailAccountSettings& settings) const BMailAccountSettings& settings)
: :
BLooper(_LooperName(name, settings)),
fAccountSettings(settings), fAccountSettings(settings),
fMailNotifier(NULL) 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* BMailFilter*
BMailProtocol::_LoadFilter(const BMailAddOnSettings& settings) BMailProtocol::_LoadFilter(const BMailAddOnSettings& settings)
{ {
@@ -374,9 +388,10 @@ BMailProtocol::_NotifyBodyFetched(const entry_ref& ref, BFile& file,
// #pragma mark - // #pragma mark -
BInboundMailProtocol::BInboundMailProtocol(const BMailAccountSettings& settings) BInboundMailProtocol::BInboundMailProtocol(const char* name,
const BMailAccountSettings& settings)
: :
BMailProtocol(settings) BMailProtocol(name, settings)
{ {
LoadFilters(fAccountSettings.InboundSettings()); LoadFilters(fAccountSettings.InboundSettings());
} }
@@ -472,10 +487,10 @@ BInboundMailProtocol::NotiyMailboxSynchronized(status_t status)
// #pragma mark - // #pragma mark -
BOutboundMailProtocol::BOutboundMailProtocol( BOutboundMailProtocol::BOutboundMailProtocol(const char* name,
const BMailAccountSettings& settings) const BMailAccountSettings& settings)
: :
BMailProtocol(settings) BMailProtocol(name, settings)
{ {
LoadFilters(fAccountSettings.OutboundSettings()); 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 void
BOutboundMailProtocol::MessageReceived(BMessage* message) BOutboundMailProtocol::MessageReceived(BMessage* message)
{ {
switch (message->what) { switch (message->what) {
case kMsgSendMessage: case kMsgSendMessages:
SendMessages(*message, message->FindInt64("bytes")); HandleSendMessages(*message, message->FindInt64("bytes"));
break; break;
default: default:
+2 -25
View File
@@ -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 - // #pragma mark -
@@ -498,12 +479,8 @@ MailDaemonApplication::SendPendingMessages(BMessage* msg)
{ {
BVolumeRoster roster; BVolumeRoster roster;
BVolume volume; BVolume volume;
std::map<int32, send_mails_info> messages; std::map<int32, send_mails_info> messages;
int32 account = msg->GetInt32("account", -1);
int32 account = -1;
if (msg->FindInt32("account", &account) != B_OK)
account = -1;
if (!msg->HasString("message_path")) { if (!msg->HasString("message_path")) {
while (roster.GetNextVolume(&volume) == B_OK) { while (roster.GetNextVolume(&volume) == B_OK) {
@@ -564,7 +541,7 @@ MailDaemonApplication::SendPendingMessages(BMessage* msg)
if (info.bytes == 0) if (info.bytes == 0)
continue; continue;
OutboundMessenger(protocol).SendMessages(info.files, info.bytes); protocol->SendMessages(info.files, info.bytes);
} }
} }