diff options
| author | Don Sanders <don.sanders@nokia.com> | 2010-07-04 02:32:29 +1000 |
|---|---|---|
| committer | Don Sanders <don.sanders@nokia.com> | 2010-07-04 02:32:29 +1000 |
| commit | bf63c51efbf1c5030216eb5d917dd89770a07b0e (patch) | |
| tree | c24a024fff408136da89c42ca75a0fc7ebe79a6e | |
| parent | f4ab1dd4e12586d36868cdc2384e29fac63734a3 (diff) | |
When sending of a message fails
A) leave it in the outbox and continue sending other messages in the outbox.
B) emit a messagesFailedTransmitted signal.
API change QMailTransmitAction has new messagesFailedTransmitted signal.
Task: NB#177952 NB#153703
| -rw-r--r-- | examples/qtmail/app/emailclient.cpp | 47 | ||||
| -rw-r--r-- | examples/qtmail/app/emailclient.h | 3 | ||||
| -rw-r--r-- | src/libraries/messageserver/qmailmessageservice.cpp | 10 | ||||
| -rw-r--r-- | src/libraries/messageserver/qmailmessageservice.h | 1 | ||||
| -rw-r--r-- | src/libraries/qtopiamail/qmailmessageserver.cpp | 13 | ||||
| -rw-r--r-- | src/libraries/qtopiamail/qmailmessageserver.h | 1 | ||||
| -rw-r--r-- | src/libraries/qtopiamail/qmailserviceaction.cpp | 23 | ||||
| -rw-r--r-- | src/libraries/qtopiamail/qmailserviceaction.h | 5 | ||||
| -rw-r--r-- | src/libraries/qtopiamail/qmailserviceaction_p.h | 7 | ||||
| -rw-r--r-- | src/plugins/messageservices/smtp/smtpservice.cpp | 26 | ||||
| -rw-r--r-- | src/tools/messageserver/mailmessageclient.cpp | 2 | ||||
| -rw-r--r-- | src/tools/messageserver/mailmessageclient.h | 1 | ||||
| -rw-r--r-- | src/tools/messageserver/messageserver.cpp | 2 | ||||
| -rw-r--r-- | src/tools/messageserver/servicehandler.cpp | 11 | ||||
| -rw-r--r-- | src/tools/messageserver/servicehandler.h | 2 |
15 files changed, 107 insertions, 47 deletions
diff --git a/examples/qtmail/app/emailclient.cpp b/examples/qtmail/app/emailclient.cpp index b43eff8d..416f69a1 100644 --- a/examples/qtmail/app/emailclient.cpp +++ b/examples/qtmail/app/emailclient.cpp @@ -470,6 +470,7 @@ EmailClient::EmailClient(QWidget *parent, Qt::WindowFlags f) enableMessageActions(false), closeAfterTransmissions(false), closeAfterWrite(false), + transmissionFailure(false), fetchTimer(this), autoGetMail(false), initialAction(None), @@ -1096,10 +1097,7 @@ void EmailClient::enqueueMail(QMailMessage& mail) mail.setStatus(QMailMessage::TransmitFromExternal, true); } - // This message should be marked as a draft, and flagged for transmission - // Don't use flagMessages - we don't want this to be transmitted to a server - // as a draft unless transmission fails - mail.setStatus((QMailMessage::Outbox | QMailMessage::Draft), true); + mail.setStatus(QMailMessage::Outbox, true); bool inserted(false); if (!mail.id().isValid()) { @@ -1178,6 +1176,7 @@ void EmailClient::mailResponded() // each message that belongs to the current found account void EmailClient::sendAllQueuedMail(bool userRequest) { + transmissionFailure = false; QMailMessageKey outboxFilter(QMailMessageKey::status(QMailMessage::Outbox)); if (transmitAccountIds.isEmpty()) { @@ -1214,14 +1213,6 @@ void EmailClient::sendAllQueuedMail(bool userRequest) setSendingInProgress(true); transmitAction("Sending messages")->transmitMessages(transmitId); return; - } else { - // Move this account's outbox messages to Drafts - QMailMessageKey accountFilter(QMailMessageKey::parentAccountId(transmitId)); - QMailMessageIdList unsentIds(QMailStore::instance()->queryMessages(accountFilter & outboxFilter)); - - moveToStandardFolder(unsentIds,QMailFolder::DraftsFolder); - flagMessages(unsentIds,QMailMessage::Draft,QMailMessage::Outbox,"Moving messages to drafts"); - } } } @@ -1410,6 +1401,15 @@ bool EmailClient::verifyAccount(const QMailAccountId &accountId, bool outgoing) void EmailClient::transmitCompleted() { + // Check for messages that could nto be sent, e.g. due to bad recipients + if (transmissionFailure) { + transmissionFailure = false; + const QMailServiceAction::Status status(m_transmitAction->status()); + transferFailure(status.accountId, + tr("Some messages could not be sent and have been left in the outbox. Verify that recipient addresses are well formed."), + QMailServiceAction::Status::ErrInvalidAddress); + } + // If there are more SMTP accounts to service, continue if (!transmitAccountIds.isEmpty()) { sendAllQueuedMail(); @@ -2053,6 +2053,12 @@ void EmailClient::progressChanged(uint progress, uint total) // emit updateProgress(progress, total); } +void EmailClient::messagesFailedTransmission() +{ + transmissionFailure = true; +} + + void EmailClient::flagRetrievalActivityChanged(QMailServiceAction::Activity activity) { if (QMailServiceAction *action = static_cast<QMailServiceAction*>(sender())) { @@ -2547,9 +2553,6 @@ void EmailClient::setSendingInProgress(bool set) } else { if (primaryActivity == Sending) primaryActivity = Inactive; - - // Anything we could not send should move back to the drafts folder - clearOutboxFolder(); } if (isSending() != set) { @@ -2594,18 +2597,6 @@ void EmailClient::transferStatusUpdate(int status) } -void EmailClient::clearOutboxFolder() -{ - QMailMessageKey outboxFilter(QMailMessageKey::status(QMailMessage::Outbox)); - QMailMessageIdList unsentIds(QMailStore::instance()->queryMessages(outboxFilter)); - - // Set any unsent messages back to draft, and remove Outbox status - if (!unsentIds.isEmpty()) { - moveToStandardFolder(unsentIds,QMailFolder::DraftsFolder); - flagMessages(unsentIds, QMailMessage::Draft, QMailMessage::Outbox,"Clearing outbox folder"); - } -} - void EmailClient::contextStatusUpdate() { if (isTransmitting()) @@ -2794,6 +2785,8 @@ QMailTransmitAction* EmailClient::transmitAction(const QString& description) { m_transmitAction = new QMailTransmitAction(this); connectServiceAction(m_transmitAction); + connect(m_transmitAction, SIGNAL(messagesFailedTransmission(QMailMessageIdList, QMailServiceAction::Status::ErrorCode)), + this, SLOT(messagesFailedTransmission())); } ServiceActionStatusItem* newItem = new ServiceActionStatusItem(m_transmitAction,description); diff --git a/examples/qtmail/app/emailclient.h b/examples/qtmail/app/emailclient.h index b9b8c7d9..d467a1d7 100644 --- a/examples/qtmail/app/emailclient.h +++ b/examples/qtmail/app/emailclient.h @@ -213,6 +213,7 @@ protected slots: void activityChanged(QMailServiceAction::Activity activity); void statusChanged(const QMailServiceAction::Status &status); void progressChanged(uint progress, uint total); + void messagesFailedTransmission(); void flagRetrievalActivityChanged(QMailServiceAction::Activity activity); @@ -328,7 +329,6 @@ private: void transferStatusUpdate(int status); void setSuspendPermitted(bool y); - void clearOutboxFolder(); void updateGetMailButton(); void updateGetAccountButton(); @@ -416,6 +416,7 @@ private: bool closeAfterTransmissions; bool closeAfterWrite; + bool transmissionFailure; QTimer fetchTimer; bool autoGetMail; diff --git a/src/libraries/messageserver/qmailmessageservice.cpp b/src/libraries/messageserver/qmailmessageservice.cpp index fae7f4c8..0617f10e 100644 --- a/src/libraries/messageserver/qmailmessageservice.cpp +++ b/src/libraries/messageserver/qmailmessageservice.cpp @@ -1116,6 +1116,8 @@ QMailMessageSink::~QMailMessageSink() Successfully transmitted messages should be progressively reported via messagesTransmitted(). + Messages for which for which an unsuccessful attempt to transmit has been made should be progressively reported via messagesFailedTransmission(). + Return true if an operation is initiated. */ bool QMailMessageSink::transmitMessages(const QMailMessageIdList &ids) @@ -1139,6 +1141,14 @@ void QMailMessageSink::notImplemented() Signal emitted by the sink to report the successful transmission of the messages listed in \a ids. */ +/*! + \fn void QMailMessageSink::messagesFailedTransmission(const QMailMessageIdList &ids, QMailServiceAction::Status::ErrorCode error); + + Signal emitted by the sink to report the failure of an attempt at transmission of the messages listed in \a ids. + + The failure is of type \a error. +*/ + /*! \class QMailMessageService diff --git a/src/libraries/messageserver/qmailmessageservice.h b/src/libraries/messageserver/qmailmessageservice.h index 6541a3b2..6be1eed2 100644 --- a/src/libraries/messageserver/qmailmessageservice.h +++ b/src/libraries/messageserver/qmailmessageservice.h @@ -204,6 +204,7 @@ public slots: signals: void messagesTransmitted(const QMailMessageIdList &ids); + void messagesFailedTransmission(const QMailMessageIdList &ids, QMailServiceAction::Status::ErrorCode); protected: QMailMessageSink(QMailMessageService *service); diff --git a/src/libraries/qtopiamail/qmailmessageserver.cpp b/src/libraries/qtopiamail/qmailmessageserver.cpp index 30bcd446..5870b503 100644 --- a/src/libraries/qtopiamail/qmailmessageserver.cpp +++ b/src/libraries/qtopiamail/qmailmessageserver.cpp @@ -198,6 +198,8 @@ QMailMessageServerPrivate::QMailMessageServerPrivate(QMailMessageServer* parent) parent, SIGNAL(retrievalCompleted(quint64))); connectIpc(adaptor, MESSAGE(messagesTransmitted(quint64, QMailMessageIdList)), parent, SIGNAL(messagesTransmitted(quint64, QMailMessageIdList))); + connectIpc(adaptor, MESSAGE(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)), + parent, SIGNAL(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode))); connectIpc(adaptor, MESSAGE(transmissionCompleted(quint64)), parent, SIGNAL(transmissionCompleted(quint64))); connectIpc(adaptor, MESSAGE(matchingMessageIds(quint64, QMailMessageIdList)), @@ -322,6 +324,17 @@ QMailMessageServerPrivate::~QMailMessageServerPrivate() */ /*! + \fn void QMailMessageServer::messagesFailedTransmitted(quint64 action, const QMailMessageIdList& list, QMailServiceAction::Status::ErrorCode error); + + Emitted when a failed attempt has been made to transmit messages identified by \a list to the external server, + in response to the request identified by \a action. + + The error is described by \a error. + + \sa transmitMessages() +*/ + +/*! \fn void QMailMessageServer::transmissionCompleted(quint64 action); Emitted when the transmit operation identified by \a action is completed. diff --git a/src/libraries/qtopiamail/qmailmessageserver.h b/src/libraries/qtopiamail/qmailmessageserver.h index 7902108f..b36cf098 100644 --- a/src/libraries/qtopiamail/qmailmessageserver.h +++ b/src/libraries/qtopiamail/qmailmessageserver.h @@ -84,6 +84,7 @@ signals: void retrievalCompleted(quint64); void messagesTransmitted(quint64, const QMailMessageIdList&); + void messagesFailedTransmission(quint64, const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode); void transmissionCompleted(quint64); void messagesDeleted(quint64, const QMailMessageIdList&); diff --git a/src/libraries/qtopiamail/qmailserviceaction.cpp b/src/libraries/qtopiamail/qmailserviceaction.cpp index 445847ac..e9553403 100644 --- a/src/libraries/qtopiamail/qmailserviceaction.cpp +++ b/src/libraries/qtopiamail/qmailserviceaction.cpp @@ -912,6 +912,8 @@ QMailTransmitActionPrivate::QMailTransmitActionPrivate(QMailTransmitAction *i) { connect(_server, SIGNAL(messagesTransmitted(quint64, QMailMessageIdList)), this, SLOT(messagesTransmitted(quint64, QMailMessageIdList))); + connect(_server, SIGNAL(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)), + this, SLOT(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode))); connect(_server, SIGNAL(transmissionCompleted(quint64)), this, SLOT(transmissionCompleted(quint64))); @@ -922,31 +924,32 @@ void QMailTransmitActionPrivate::transmitMessages(const QMailAccountId &accountI { _server->transmitMessages(newAction(), accountId); - QMailAccount account(accountId); - _ids = QMailStore::instance()->queryMessages(QMailMessageKey::parentAccountId(accountId) & QMailMessageKey::status(QMailMessage::Outbox)); - emitChanges(); } void QMailTransmitActionPrivate::init() { QMailServiceActionPrivate::init(); - - _ids.clear(); } void QMailTransmitActionPrivate::messagesTransmitted(quint64 action, const QMailMessageIdList &ids) { if (validAction(action)) { - foreach (const QMailMessageId &id, ids) - _ids.removeAll(id); + emit messagesTransmitted(ids); + } +} + +void QMailTransmitActionPrivate::messagesFailedTransmission(quint64 action, const QMailMessageIdList &ids, QMailServiceAction::Status::ErrorCode error) +{ + if (validAction(action)) { + emit messagesFailedTransmission(ids, error); } } void QMailTransmitActionPrivate::transmissionCompleted(quint64 action) { if (validAction(action)) { - QMailServiceAction::Activity result(_ids.isEmpty() ? QMailServiceAction::Successful : QMailServiceAction::Failed); + QMailServiceAction::Activity result(QMailServiceAction::Successful); setActivity(result); emitChanges(); } @@ -983,6 +986,10 @@ void QMailTransmitActionPrivate::transmissionCompleted(quint64 action) QMailTransmitAction::QMailTransmitAction(QObject *parent) : QMailServiceAction(new QMailTransmitActionPrivate(this), parent) { + connect(impl(this), SIGNAL(messagesTransmitted(QMailMessageIdList)), + this, SIGNAL(messagesTransmitted(QMailMessageIdList))); + connect(impl(this), SIGNAL(messagesFailedTransmission(QMailMessageIdList, QMailServiceAction::Status::ErrorCode)), + this, SIGNAL(messagesFailedTransmission(QMailMessageIdList, QMailServiceAction::Status::ErrorCode))); } /*! \internal */ diff --git a/src/libraries/qtopiamail/qmailserviceaction.h b/src/libraries/qtopiamail/qmailserviceaction.h index e3f67c82..4a4f80d1 100644 --- a/src/libraries/qtopiamail/qmailserviceaction.h +++ b/src/libraries/qtopiamail/qmailserviceaction.h @@ -207,8 +207,13 @@ public: QMailTransmitAction(QObject *parent = 0); ~QMailTransmitAction(); +signals: + void messagesTransmitted(const QMailMessageIdList &ids); + void messagesFailedTransmission(const QMailMessageIdList &ids, QMailServiceAction::Status::ErrorCode); + public slots: void transmitMessages(const QMailAccountId &accountId); + }; diff --git a/src/libraries/qtopiamail/qmailserviceaction_p.h b/src/libraries/qtopiamail/qmailserviceaction_p.h index 49a23c96..3330a263 100644 --- a/src/libraries/qtopiamail/qmailserviceaction_p.h +++ b/src/libraries/qtopiamail/qmailserviceaction_p.h @@ -155,17 +155,20 @@ public: void transmitMessages(const QMailAccountId &accountId); +signals: + void messagesTransmitted(const QMailMessageIdList &ids); + void messagesFailedTransmission(const QMailMessageIdList &ids, QMailServiceAction::Status::ErrorCode); + protected: virtual void init(); protected slots: void messagesTransmitted(quint64, const QMailMessageIdList &id); + void messagesFailedTransmission(quint64, const QMailMessageIdList &id, QMailServiceAction::Status::ErrorCode); void transmissionCompleted(quint64); private: friend class QMailTransmitAction; - - QMailMessageIdList _ids; }; diff --git a/src/plugins/messageservices/smtp/smtpservice.cpp b/src/plugins/messageservices/smtp/smtpservice.cpp index bb38ac6f..2a44b746 100644 --- a/src/plugins/messageservices/smtp/smtpservice.cpp +++ b/src/plugins/messageservices/smtp/smtpservice.cpp @@ -42,6 +42,7 @@ #include "smtpservice.h" #include "smtpsettings.h" #include <QtPlugin> +#include <QTimer> namespace { const QString serviceKey("smtp"); } @@ -70,26 +71,33 @@ private: bool SmtpService::Sink::transmitMessages(const QMailMessageIdList &ids) { - QMailServiceAction::Status::ErrorCode errorCode = QMailServiceAction::Status::ErrNoError; + bool messageQueued = false; + QMailMessageIdList failedMessages; QString errorText; if (!ids.isEmpty()) { foreach (const QMailMessageId id, ids) { QMailMessage message(id); - if ((errorCode = _service->_client.addMail(message)) != QMailServiceAction::Status::ErrNoError) { - errorText = tr("Unable to addMail"); - break; + if (_service->_client.addMail(message) == QMailServiceAction::Status::ErrNoError) { + messageQueued = true; + } else { + failedMessages << id; } } } + + if (failedMessages.count()) { + emit messagesFailedTransmission(failedMessages, QMailServiceAction::Status::ErrInvalidAddress); + } - if (errorCode == QMailServiceAction::Status::ErrNoError) { + if (messageQueued) { + // At least one message could be queued for sending _service->_client.newConnection(); - return true; + } else { + // No messages to send, so sending completed successfully + QTimer::singleShot(0, this, SLOT(sendCompleted())); } - - _service->errorOccurred(errorCode, errorText); - return false; + return true; } void SmtpService::Sink::messageTransmitted(const QMailMessageId &id) diff --git a/src/tools/messageserver/mailmessageclient.cpp b/src/tools/messageserver/mailmessageclient.cpp index f141d91a..849bb303 100644 --- a/src/tools/messageserver/mailmessageclient.cpp +++ b/src/tools/messageserver/mailmessageclient.cpp @@ -71,6 +71,8 @@ MailMessageClient::MailMessageClient(QObject* parent) adaptor, MESSAGE(transmissionCompleted(quint64))); connectIpc(this, SIGNAL(messagesTransmitted(quint64, QMailMessageIdList)), adaptor, MESSAGE(messagesTransmitted(quint64, QMailMessageIdList))); + connectIpc(this, SIGNAL(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)), + adaptor, MESSAGE(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode))); connectIpc(this, SIGNAL(retrievalCompleted(quint64)), adaptor, MESSAGE(retrievalCompleted(quint64))); connectIpc(this, SIGNAL(messagesDeleted(quint64, QMailMessageIdList)), diff --git a/src/tools/messageserver/mailmessageclient.h b/src/tools/messageserver/mailmessageclient.h index 18c3f9fc..b7f008bb 100644 --- a/src/tools/messageserver/mailmessageclient.h +++ b/src/tools/messageserver/mailmessageclient.h @@ -115,6 +115,7 @@ signals: void retrievalCompleted(quint64); void messagesTransmitted(quint64, const QMailMessageIdList&); + void messagesFailedTransmission(quint64, const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode); void transmissionCompleted(quint64); void messagesDeleted(quint64, const QMailMessageIdList&); diff --git a/src/tools/messageserver/messageserver.cpp b/src/tools/messageserver/messageserver.cpp index 952152e0..a7eb32c9 100644 --- a/src/tools/messageserver/messageserver.cpp +++ b/src/tools/messageserver/messageserver.cpp @@ -120,6 +120,8 @@ MessageServer::MessageServer(QObject *parent) client, SIGNAL(protocolRequestCompleted(quint64))); connect(handler, SIGNAL(messagesTransmitted(quint64, QMailMessageIdList)), client, SIGNAL(messagesTransmitted(quint64, QMailMessageIdList))); + connect(handler, SIGNAL(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)), + client, SIGNAL(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode))); connect(handler, SIGNAL(transmissionCompleted(quint64)), this, SLOT(transmissionCompleted(quint64))); diff --git a/src/tools/messageserver/servicehandler.cpp b/src/tools/messageserver/servicehandler.cpp index 884e1a0a..d84f3b95 100644 --- a/src/tools/messageserver/servicehandler.cpp +++ b/src/tools/messageserver/servicehandler.cpp @@ -626,6 +626,8 @@ void ServiceHandler::registerAccountSink(const QMailAccountId &accountId, QMailM sinkService.insert(sink, service); connect(sink, SIGNAL(messagesTransmitted(QMailMessageIdList)), this, SLOT(messagesTransmitted(QMailMessageIdList))); + connect(sink, SIGNAL(messagesFailedTransmission(QMailMessageIdList, QMailServiceAction::Status::ErrorCode)), + this, SLOT(messagesFailedTransmission(QMailMessageIdList, QMailServiceAction::Status::ErrorCode))); } QMailMessageSink *ServiceHandler::accountSink(const QMailAccountId &accountId) const @@ -1948,6 +1950,15 @@ void ServiceHandler::messagesTransmitted(const QMailMessageIdList &messageIds) } } +void ServiceHandler::messagesFailedTransmission(const QMailMessageIdList &messageIds, QMailServiceAction::Status::ErrorCode error) +{ + if (QMailMessageSink *sink = qobject_cast<QMailMessageSink*>(sender())) { + if (quint64 action = sinkAction(sink)) { + emit messagesFailedTransmission(action, messageIds, error); + } + } +} + void ServiceHandler::availabilityChanged(bool available) { if (QMailMessageService *service = qobject_cast<QMailMessageService*>(sender())) { diff --git a/src/tools/messageserver/servicehandler.h b/src/tools/messageserver/servicehandler.h index bd37b3dd..0d6d2edf 100644 --- a/src/tools/messageserver/servicehandler.h +++ b/src/tools/messageserver/servicehandler.h @@ -102,6 +102,7 @@ signals: void retrievalCompleted(quint64 action); void messagesTransmitted(quint64 action, const QMailMessageIdList&); + void messagesFailedTransmission(quint64 action, const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode); void transmissionCompleted(quint64 action); void messagesDeleted(quint64 action, const QMailMessageIdList&); @@ -135,6 +136,7 @@ private slots: void actionCompleted(bool); void messagesTransmitted(const QMailMessageIdList&); + void messagesFailedTransmission(const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode); void messagesDeleted(const QMailMessageIdList&); void messagesCopied(const QMailMessageIdList&); |
