diff options
author | MattV <qt-info@nokia.com> | 2009-05-08 16:49:49 +1000 |
---|---|---|
committer | MattV <qt-info@nokia.com> | 2009-05-08 16:49:49 +1000 |
commit | 2f8c65ea2804497d625ea97943b20704c325faae (patch) | |
tree | 3ba7e8582e295c13b775f220ae93fe5beaabb7dc | |
parent | d5410a28f92c1d190254b1e3a42bcfddacebad86 (diff) |
More efficient partitioning of message set amongst folders.2009W19A
-rw-r--r-- | src/plugins/messageservices/imap/imapstrategy.cpp | 64 | ||||
-rw-r--r-- | src/plugins/messageservices/imap/imapstrategy.h | 3 |
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; |