summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGES2
-rw-r--r--src/plugins/messageservices/imap/imapclient.cpp5
-rw-r--r--src/plugins/messageservices/imap/imapstrategy.cpp59
-rw-r--r--src/plugins/messageservices/imap/imapstrategy.h14
4 files changed, 48 insertions, 32 deletions
diff --git a/CHANGES b/CHANGES
index c7dceb3c..d187a757 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,7 @@ Latest Changes
---------------
201126
+ * Fixes: NB#267169 "can't get your message" error shown when going back
* Fixes: NB#195729 ConfigurationError not shown when account is configured with wrong settings
201125
@@ -12,6 +13,7 @@ Latest Changes
* Fixes: NB#265236 "Error occurred" shown frequently when syncing emails
* Fixes: NB#268303 messageserver aborts with manual send receive of Google plugin account after SSU
* Fixes: NB#267055 - Other mail account : messages deleted in device are not synced to server
+ * Fixes: NB#267394 Always up to date stops working in a certain scenario
201123
* Fixes: NB#265223 Original message body shown empty in message view
diff --git a/src/plugins/messageservices/imap/imapclient.cpp b/src/plugins/messageservices/imap/imapclient.cpp
index 205bcc4f..1eb2d560 100644
--- a/src/plugins/messageservices/imap/imapclient.cpp
+++ b/src/plugins/messageservices/imap/imapclient.cpp
@@ -887,7 +887,10 @@ void ImapClient::messageFetched(QMailMessage& mail, const QString &detachedFilen
QMailMessage *bufferMessage(new QMailMessage(mail));
_bufferedMessages.append(bufferMessage);
- _strategyContext->messageFetched(*bufferMessage);
+ if (_strategyContext->messageFetched(*bufferMessage)) {
+ removeAllFromBuffer(bufferMessage);
+ return;
+ }
QMailMessageBufferFlushCallback *callback = new MessageFlushedWrapper(_strategyContext);
callbacks << callback;
QMailMessageBuffer::instance()->setCallback(bufferMessage, callback);
diff --git a/src/plugins/messageservices/imap/imapstrategy.cpp b/src/plugins/messageservices/imap/imapstrategy.cpp
index 43205afc..8ae059db 100644
--- a/src/plugins/messageservices/imap/imapstrategy.cpp
+++ b/src/plugins/messageservices/imap/imapstrategy.cpp
@@ -522,31 +522,40 @@ void ImapStrategy::mailboxListed(ImapStrategyContextBase *c, QMailFolder& folder
Q_UNUSED(flags)
}
-void ImapStrategy::messageFetched(ImapStrategyContextBase * /*context*/, QMailMessage &message)
+bool ImapStrategy::messageFetched(ImapStrategyContextBase * context, QMailMessage &message)
{
_folder[message.serverUid()] = false;
// Store this message to the mail store
if (message.id().isValid()) {
if (!QMailMessageBuffer::instance()->updateMessage(&message)) {
_error = true;
- qWarning() << "Unable to add message for account:" << message.parentAccountId() << "UID:" << message.serverUid();
- return;
+ qWarning() << "Unable to update message for account:" << message.parentAccountId() << "UID:" << message.serverUid();
+ return false;
}
- } else {
+ } else {
QMailMessageKey duplicateKey(QMailMessageKey::serverUid(message.serverUid()) & QMailMessageKey::parentAccountId(message.parentAccountId()));
- if (!QMailStore::instance()->removeMessages(duplicateKey)) {
- _error = true;
- qWarning() << "Unable to remove duplicate message(s) for account:" << message.parentAccountId() << "UID:" << message.serverUid();
- return;
- }
- if (!QMailMessageBuffer::instance()->addMessage(&message)) {
- _error = true;
- qWarning() << "Unable to add message for account:" << message.parentAccountId() << "UID:" << message.serverUid();
- return;
+ QMailMessageIdList ids(QMailStore::instance()->queryMessages(duplicateKey));
+ if (!ids.isEmpty()) {
+ QMailMessageId existingId(ids.takeFirst());
+ if (!ids.isEmpty() && !QMailStore::instance()->removeMessages(QMailMessageKey::id(ids))) {
+ _error = true;
+ qWarning() << "Unable to remove duplicate message(s) for account:" << message.parentAccountId() << "UID:" << message.serverUid();
+ return true;
+ }
+ QMailMessage lv(existingId);
+ messageFlushed(context, lv);
+ return true; // flushing complete
+ } else {
+ if (!QMailMessageBuffer::instance()->addMessage(&message)) {
+ _error = true;
+ qWarning() << "Unable to add message for account:" << message.parentAccountId() << "UID:" << message.serverUid();
+ return false;
+ }
}
_folder[message.serverUid()] = true;
}
+ return false;
}
void ImapStrategy::messageFlushed(ImapStrategyContextBase *context, QMailMessage &message)
@@ -1653,11 +1662,12 @@ void ImapFetchSelectedMessagesStrategy::downloadSize(ImapStrategyContextBase *co
}
}
-void ImapFetchSelectedMessagesStrategy::messageFetched(ImapStrategyContextBase *context, QMailMessage &message)
+bool ImapFetchSelectedMessagesStrategy::messageFetched(ImapStrategyContextBase *context, QMailMessage &message)
{
- ImapMessageListStrategy::messageFetched(context, message);
+ bool result = ImapMessageListStrategy::messageFetched(context, message);
itemFetched(context, message.serverUid());
+ return result;
}
void ImapFetchSelectedMessagesStrategy::messageFlushed(ImapStrategyContextBase *context, QMailMessage &message)
@@ -1755,13 +1765,13 @@ void ImapSearchMessageStrategy::folderListFolderAction(ImapStrategyContextBase *
context->protocol().sendSearchMessages(search.criteria, search.bodyText, search.sort);
}
-void ImapSearchMessageStrategy::messageFetched(ImapStrategyContextBase *context, QMailMessage &message)
+bool ImapSearchMessageStrategy::messageFetched(ImapStrategyContextBase *context, QMailMessage &message)
{
if(_canceled)
- return;
+ return false;
message.setStatus(QMailMessage::Temporary, true);
- ImapRetrieveFolderListStrategy::messageFetched(context, message);
+ return ImapRetrieveFolderListStrategy::messageFetched(context, message);
}
void ImapSearchMessageStrategy::messageFlushed(ImapStrategyContextBase *context, QMailMessage &message)
@@ -2216,11 +2226,12 @@ void ImapSynchronizeBaseStrategy::folderPreviewCompleted(ImapStrategyContextBase
{
}
-void ImapSynchronizeBaseStrategy::messageFetched(ImapStrategyContextBase *context, QMailMessage &message)
+bool ImapSynchronizeBaseStrategy::messageFetched(ImapStrategyContextBase *context, QMailMessage &message)
{
- ImapFolderListStrategy::messageFetched(context, message);
+ bool result = ImapFolderListStrategy::messageFetched(context, message);
if (_transferState == Preview)
context->progressChanged(_progress++, _total);
+ return result;
}
void ImapSynchronizeBaseStrategy::messageFlushed(ImapStrategyContextBase *context, QMailMessage &message)
@@ -3877,12 +3888,12 @@ void ImapCopyMessagesStrategy::messageCreated(ImapStrategyContextBase *context,
ImapFetchSelectedMessagesStrategy::messageCreated(context, id, createdUid);
}
-void ImapCopyMessagesStrategy::messageFetched(ImapStrategyContextBase *context, QMailMessage &message)
+bool ImapCopyMessagesStrategy::messageFetched(ImapStrategyContextBase *context, QMailMessage &message)
{
QString sourceUid = copiedMessageFetched(context, message);
_remember[message.serverUid()] = sourceUid;
- ImapFetchSelectedMessagesStrategy::messageFetched(context, message);
+ return ImapFetchSelectedMessagesStrategy::messageFetched(context, message);
}
void ImapCopyMessagesStrategy::messageFlushed(ImapStrategyContextBase *context, QMailMessage &message)
@@ -4196,11 +4207,11 @@ void ImapExternalizeMessagesStrategy::handleGenUrlAuth(ImapStrategyContextBase *
resolveNextMessage(context);
}
-void ImapExternalizeMessagesStrategy::messageFetched(ImapStrategyContextBase *context, QMailMessage &message)
+bool ImapExternalizeMessagesStrategy::messageFetched(ImapStrategyContextBase *context, QMailMessage &message)
{
copiedMessageFetched(context, message);
- ImapFetchSelectedMessagesStrategy::messageFetched(context, message);
+ return ImapFetchSelectedMessagesStrategy::messageFetched(context, message);
}
void ImapExternalizeMessagesStrategy::messageFlushed(ImapStrategyContextBase *context, QMailMessage &message)
diff --git a/src/plugins/messageservices/imap/imapstrategy.h b/src/plugins/messageservices/imap/imapstrategy.h
index 48a4948e..0ea26489 100644
--- a/src/plugins/messageservices/imap/imapstrategy.h
+++ b/src/plugins/messageservices/imap/imapstrategy.h
@@ -137,7 +137,7 @@ public:
virtual void transition(ImapStrategyContextBase*, const ImapCommand, const OperationStatus) = 0;
virtual void mailboxListed(ImapStrategyContextBase *context, QMailFolder& folder, const QString &flags);
- virtual void messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
+ virtual bool messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
virtual void messageFlushed(ImapStrategyContextBase *context, QMailMessage &message);
virtual void dataFetched(ImapStrategyContextBase *context, QMailMessage &message, const QString &uid, const QString &section);
virtual void dataFlushed(ImapStrategyContextBase *context, QMailMessage &message, const QString &uid, const QString &section);
@@ -314,7 +314,7 @@ public:
virtual void transition(ImapStrategyContextBase*, const ImapCommand, const OperationStatus);
virtual void downloadSize(ImapStrategyContextBase*, const QString &uid, int length);
- virtual void messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
+ virtual bool messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
virtual void messageFlushed(ImapStrategyContextBase *context, QMailMessage &message);
virtual void dataFetched(ImapStrategyContextBase *context, QMailMessage &message, const QString &uid, const QString &section);
virtual void dataFlushed(ImapStrategyContextBase *context, QMailMessage &message, const QString &uid, const QString &section);
@@ -441,7 +441,7 @@ public:
virtual void newConnection(ImapStrategyContextBase *context);
- virtual void messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
+ virtual bool messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
virtual void messageFlushed(ImapStrategyContextBase *context, QMailMessage &message);
protected:
@@ -623,7 +623,7 @@ protected:
virtual void handleUidFetch(ImapStrategyContextBase *context);
virtual void folderListFolderAction(ImapStrategyContextBase *context);
- virtual void messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
+ virtual bool messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
virtual void messageFlushed(ImapStrategyContextBase *context, QMailMessage &message);
virtual void messageListCompleted(ImapStrategyContextBase *context);
@@ -677,7 +677,7 @@ public:
virtual void messageCopied(ImapStrategyContextBase *context, const QString &copiedUid, const QString &createdUid);
virtual void messageCreated(ImapStrategyContextBase *context, const QMailMessageId &id, const QString &createdUid);
- virtual void messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
+ virtual bool messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
virtual void messageFlushed(ImapStrategyContextBase *context, QMailMessage &message);
protected:
@@ -750,7 +750,7 @@ public:
virtual void newConnection(ImapStrategyContextBase *context);
virtual void transition(ImapStrategyContextBase*, const ImapCommand, const OperationStatus);
- virtual void messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
+ virtual bool messageFetched(ImapStrategyContextBase *context, QMailMessage &message);
virtual void messageFlushed(ImapStrategyContextBase *context, QMailMessage &message);
virtual void urlAuthorized(ImapStrategyContextBase *context, const QString &url);
@@ -839,7 +839,7 @@ public:
void commandTransition(const ImapCommand command, const OperationStatus status) { _strategy->transition(this, command, status); }
void mailboxListed(QMailFolder& folder, const QString &flags) { _strategy->mailboxListed(this, folder, flags); }
- void messageFetched(QMailMessage &message) { _strategy->messageFetched(this, message); }
+ bool messageFetched(QMailMessage &message) { return _strategy->messageFetched(this, message); }
void messageFlushed(QMailMessage &message) { _strategy->messageFlushed(this, message); }
void dataFetched(QMailMessage &message, const QString &uid, const QString &section) { _strategy->dataFetched(this, message, uid, section); }
void dataFlushed(QMailMessage &message, const QString &uid, const QString &section) { _strategy->dataFlushed(this, message, uid, section); }