summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattV <qt-info@nokia.com>2009-05-08 16:49:49 +1000
committerMattV <qt-info@nokia.com>2009-05-08 16:49:49 +1000
commit2f8c65ea2804497d625ea97943b20704c325faae (patch)
tree3ba7e8582e295c13b775f220ae93fe5beaabb7dc
parentd5410a28f92c1d190254b1e3a42bcfddacebad86 (diff)
More efficient partitioning of message set amongst folders.2009W19A
-rw-r--r--src/plugins/messageservices/imap/imapstrategy.cpp64
-rw-r--r--src/plugins/messageservices/imap/imapstrategy.h3
2 files changed, 29 insertions, 38 deletions
diff --git a/src/plugins/messageservices/imap/imapstrategy.cpp b/src/plugins/messageservices/imap/imapstrategy.cpp
index 908ac6eb..5dc1fce8 100644
--- a/src/plugins/messageservices/imap/imapstrategy.cpp
+++ b/src/plugins/messageservices/imap/imapstrategy.cpp
@@ -1629,7 +1629,7 @@ void ImapUpdateMessagesFlagsStrategy::clearSelection()
{
ImapFolderListStrategy::clearSelection();
_monitoredFoldersIds.clear();
- _selectedMessageIds.clear();
+ _folderMessageUids.clear();
}
void ImapUpdateMessagesFlagsStrategy::selectedMailsAppend(const QMailMessageIdList &messageIds)
@@ -1657,10 +1657,19 @@ void ImapUpdateMessagesFlagsStrategy::transition(ImapStrategyContextBase *contex
void ImapUpdateMessagesFlagsStrategy::handleLogin(ImapStrategyContextBase *context)
{
_serverUids.clear();
- _folderId = QMailFolderId();
_transferState = List;
_searchState = Seen;
- _messageIds = _selectedMessageIds;
+
+ // Associate each message to the relevant folder
+ _folderMessageUids.clear();
+ if (!_selectedMessageIds.isEmpty()) {
+ foreach (const QMailMessageMetaData &metaData, QMailStore::instance()->messagesMetaData(QMailMessageKey::id(_selectedMessageIds),
+ QMailMessageKey::ServerUid | QMailMessageKey::ParentFolderId,
+ QMailStore::ReturnAll)) {
+ if (!metaData.serverUid().isEmpty() && metaData.parentFolderId().isValid())
+ _folderMessageUids[metaData.parentFolderId()].append(metaData.serverUid());
+ }
+ }
processNextMailbox(context);
}
@@ -1712,51 +1721,34 @@ void ImapUpdateMessagesFlagsStrategy::handleUidSearch(ImapStrategyContextBase *c
bool ImapUpdateMessagesFlagsStrategy::getnextMailbox()
{
- QMailFolderId folderId;
- QList<QMailMessageId> nextMessageIds;
- QListIterator<QMailMessageId> it(_messageIds);
- _serverUids.clear();
- while (it.hasNext()) {
- QMailMessageId id(it.next());
- if (!id.isValid()) {
- continue;
- }
- QMailMessageMetaData metaData(id);
- if (!metaData.parentFolderId().isValid()) {
- continue;
- }
- if (!folderId.isValid())
- folderId = metaData.parentFolderId();
- if (metaData.parentFolderId() == folderId) {
- _serverUids.append(metaData.serverUid());
- continue;
- }
- nextMessageIds.append(id);
+ if (_folderMessageUids.isEmpty()) {
+ return false;
}
- _messageIds = nextMessageIds;
- if (folderId.isValid()) {
- _folderId = folderId;
- _currentMailbox = QMailFolder(_folderId);
- return true;
- }
+ QMap<QMailFolderId, QStringList>::iterator it = _folderMessageUids.begin();
- return false;
+ _currentMailbox = QMailFolder(it.key());
+ _serverUids = it.value();
+
+ _folderMessageUids.erase(it);
+ return true;
}
void ImapUpdateMessagesFlagsStrategy::newfolderAction(ImapStrategyContextBase *context)
{
- if ((_folderId != context->client()->mailboxId("INBOX")) &&
- !_monitoredFoldersIds.contains(_folderId)) {
- _monitoredFoldersIds << _folderId;
+ QMailFolderId folderId(_currentMailbox.id());
+ if ((folderId != context->client()->mailboxId("INBOX")) &&
+ !_monitoredFoldersIds.contains(folderId)) {
+ _monitoredFoldersIds << folderId;
}
- context->protocol().sendSelect(QMailFolder(_folderId));
+ context->protocol().sendSelect(_currentMailbox);
}
void ImapUpdateMessagesFlagsStrategy::processUidSearchResults(ImapStrategyContextBase *context)
{
- if (!_folderId.isValid()) {
+ QMailFolderId folderId(_currentMailbox.id());
+ if (!folderId.isValid()) {
// Folder was removed while we were updating messages flags in it
processNextMailbox(context);
return;
@@ -1768,7 +1760,7 @@ void ImapUpdateMessagesFlagsStrategy::processUidSearchResults(ImapStrategyContex
QMailMessageKey unseenKey(QMailMessageKey::serverUid(_unseenUids));
QMailMessageKey seenKey(QMailMessageKey::serverUid(_seenUids));
QMailMessageKey readStatusKey(QMailMessageKey::status(QMailMessage::ReadElsewhere, QMailDataComparator::Includes));
- QMailMessageKey folderKey(context->client()->messagesKey(_folderId) | context->client()->trashKey(_folderId));
+ QMailMessageKey folderKey(context->client()->messagesKey(folderId) | context->client()->trashKey(folderId));
QMailMessageKey unreadElsewhereKey(folderKey & accountKey & ~readStatusKey);
updateMessagesMetaData(context, storedKey, unseenKey, seenKey, unreadElsewhereKey);
diff --git a/src/plugins/messageservices/imap/imapstrategy.h b/src/plugins/messageservices/imap/imapstrategy.h
index 993f2b9c..91b1d1b6 100644
--- a/src/plugins/messageservices/imap/imapstrategy.h
+++ b/src/plugins/messageservices/imap/imapstrategy.h
@@ -233,8 +233,7 @@ protected:
private:
QMailMessageIdList _selectedMessageIds;
- QMailMessageIdList _messageIds;
- QMailFolderId _folderId;
+ QMap<QMailFolderId, QStringList> _folderMessageUids;
QMailFolderIdList _monitoredFoldersIds;
QStringList _serverUids;
QString _filter;