diff options
author | Don Sanders <don.sanders@nokia.com> | 2011-07-07 23:10:21 +0800 |
---|---|---|
committer | Don Sanders <don.sanders@nokia.com> | 2011-07-07 23:10:21 +0800 |
commit | 52accdde5db7d3ed60cf803692b023eb83632e46 (patch) | |
tree | 85fe4f1f147ff4b989ce317866f27289fb592fce | |
parent | 6c1880eb0ddca296c7bb0eb284c86a8c7283bf99 (diff) |
Add new retrieveMessageLists interface and implementation.2011W26_4
Fix for nb#271151.
-rw-r--r-- | CHANGES | 3 | ||||
-rw-r--r-- | src/libraries/qmfclient/qmailmessageserver.cpp | 24 | ||||
-rw-r--r-- | src/libraries/qmfclient/qmailmessageserver.h | 1 | ||||
-rw-r--r-- | src/libraries/qmfclient/qmailserviceaction.cpp | 56 | ||||
-rw-r--r-- | src/libraries/qmfclient/qmailserviceaction.h | 1 | ||||
-rw-r--r-- | src/libraries/qmfclient/qmailserviceaction_p.h | 1 | ||||
-rw-r--r-- | src/libraries/qmfmessageserver/qmailmessageservice.cpp | 60 | ||||
-rw-r--r-- | src/libraries/qmfmessageserver/qmailmessageservice.h | 3 | ||||
-rw-r--r-- | src/plugins/messageservices/imap/imapservice.cpp | 27 | ||||
-rw-r--r-- | src/plugins/messageservices/pop/popservice.cpp | 11 | ||||
-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 | 38 | ||||
-rw-r--r-- | src/tools/messageserver/servicehandler.h | 2 |
15 files changed, 220 insertions, 12 deletions
@@ -4,7 +4,8 @@ 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 - + * Fixes: NB#271151 [TASK] Provide a API that accepts a list of folders to be synced + 201125 * Fixes: NB#215942 Traditional Chinese character is corrupted in mailbox * Fixes: NB#232541 Invitations not displayed in the message viewer for Gmail diff --git a/src/libraries/qmfclient/qmailmessageserver.cpp b/src/libraries/qmfclient/qmailmessageserver.cpp index 4132a928..fa24f099 100644 --- a/src/libraries/qmfclient/qmailmessageserver.cpp +++ b/src/libraries/qmfclient/qmailmessageserver.cpp @@ -66,6 +66,7 @@ signals: void transmitMessages(quint64, const QMailAccountId &accountId); void retrieveFolderList(quint64, const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending); + void retrieveMessageLists(quint64, const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort); void retrieveMessageList(quint64, const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); void retrieveMessages(quint64, const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec); @@ -130,6 +131,8 @@ QMailMessageServerPrivate::QMailMessageServerPrivate(QMailMessageServer* parent) adaptor, MESSAGE(retrieveFolderList(quint64, QMailAccountId, QMailFolderId, bool))); connectIpc(this, SIGNAL(retrieveMessageList(quint64, QMailAccountId, QMailFolderId, uint, QMailMessageSortKey)), adaptor, MESSAGE(retrieveMessageList(quint64, QMailAccountId, QMailFolderId, uint, QMailMessageSortKey))); + connectIpc(this, SIGNAL(retrieveMessageLists(quint64, QMailAccountId, QMailFolderIdList, uint, QMailMessageSortKey)), + adaptor, MESSAGE(retrieveMessageLists(quint64, QMailAccountId, QMailFolderIdList, uint, QMailMessageSortKey))); connectIpc(this, SIGNAL(retrieveMessages(quint64, QMailMessageIdList, QMailRetrievalAction::RetrievalSpecification)), adaptor, MESSAGE(retrieveMessages(quint64, QMailMessageIdList, QMailRetrievalAction::RetrievalSpecification))); connectIpc(this, SIGNAL(retrieveMessagePart(quint64, QMailMessagePart::Location)), @@ -544,6 +547,27 @@ void QMailMessageServer::retrieveMessageList(quint64 action, const QMailAccountI } /*! + Requests that the message server retrieve the list of messages available for the account \a accountId. + If \a folderIdList is not empty, then only messages within those folders should be retrieved; otherwise + no messages should be retrieved. If a folder messages are being + retrieved from contains at least \a minimum messages then the messageserver should ensure that at + least \a minimum messages are available from the mail store for that folder; otherwise if the + folder contains less than \a minimum messages the messageserver should ensure all the messages for + that folder are available from the mail store. + + If \a sort is not empty, the external service will + discover the listed messages in the ordering indicated by the sort criterion, if possible. + + The request has the identifier \a action. + + \sa retrievalCompleted() +*/ +void QMailMessageServer::retrieveMessageLists(quint64 action, const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort) +{ + emit d->retrieveMessageLists(action, accountId, folderIds, minimum, sort); +} + +/*! Requests that the message server retrieve data regarding the messages identified by \a messageIds. If \a spec is \l QMailRetrievalAction::Flags, then the message server should detect if diff --git a/src/libraries/qmfclient/qmailmessageserver.h b/src/libraries/qmfclient/qmailmessageserver.h index a36c0eee..1bf14011 100644 --- a/src/libraries/qmfclient/qmailmessageserver.h +++ b/src/libraries/qmfclient/qmailmessageserver.h @@ -118,6 +118,7 @@ public slots: void retrieveFolderList(quint64, const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending); void retrieveMessageList(quint64, const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); + void retrieveMessageLists(quint64, const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort); void retrieveMessages(quint64, const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec); void retrieveMessagePart(quint64, const QMailMessagePart::Location &partLocation); diff --git a/src/libraries/qmfclient/qmailserviceaction.cpp b/src/libraries/qmfclient/qmailserviceaction.cpp index a449eac1..be01d4dc 100644 --- a/src/libraries/qmfclient/qmailserviceaction.cpp +++ b/src/libraries/qmfclient/qmailserviceaction.cpp @@ -749,6 +749,12 @@ void QMailRetrievalActionPrivate::retrieveMessageList(const QMailAccountId &acco retrieveMessageListHelper(accountId, folderId, minimum, sort); } +void QMailRetrievalActionPrivate::retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort) +{ + Q_ASSERT(!_pendingActions.count()); + _server->retrieveMessageLists(newAction(), accountId, folderIds, minimum, sort); +} + void QMailRetrievalActionPrivate::retrieveMessages(const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec) { _server->retrieveMessages(newAction(), messageIds, spec); @@ -840,7 +846,7 @@ void QMailRetrievalActionPrivate::retrievalCompleted(quint64 action) A range of functions are available to support varying client operations: The retrieveFolderList() function allows a client to retrieve the list of folders available for an account. - The retrieveMessageList() function allows a client to retrieve a subset of messages available for an account or folder. + The retrieveMessageList() and retrieveMessageLists() functions allows a client to retrieve a subset of messages available for an account or folder. The retrieveMessages() function allows a client to retrieve the flags, meta data or content of a specific list of messages. @@ -897,7 +903,7 @@ QMailRetrievalAction::~QMailRetrievalAction() folder that is searched for child folders; these properties are not updated for folders that are merely discovered by searching. - \sa retrieveMessageList() + \sa retrieveMessageList(), retrieveMessageLists() */ void QMailRetrievalAction::retrieveFolderList(const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending) { @@ -939,6 +945,48 @@ void QMailRetrievalAction::retrieveMessageList(const QMailAccountId &accountId, } /*! + Requests that the message server retrieve the list of messages available for the account \a accountId. + If \a folderIds is not empty, then only messages within those folders should be retrieved and the + lastSynchronized() time of the account updated; otherwise + no messages should be retrieved, . If \a minimum is non-zero, then that value will be used to restrict the + number of messages to be retrieved from each folder; otherwise, all messages will be retrieved. + + If \a sort is not empty, the external service will report the discovered messages in the + ordering indicated by the sort criterion, if possible. Services are not required to support + this facility. + + If a folder messages are being retrieved from contains at least \a minimum messages then the + messageserver should ensure that at least \a minimum messages are available from the mail + store for that folder; otherwise if the folder contains less than \a minimum messages the + messageserver should ensure all the messages for that folder are available from the mail store. + If a folder has messages locally available, then all previously undiscovered messages will be + retrieved for that folder, even if that number exceeds \a minimum. + + The QMailFolder::serverCount(), QMailFolder::serverUnreadCount() and + QMailFolder::serverUndiscoveredCount() properties will be updated for each folder + from which messages are retrieved. + + New messages will be added to the mail store as they are discovered, and + marked with the \l QMailMessage::New status flag. Messages that are present + in the mail store but found to be no longer available are marked with the + \l QMailMessage::Removed status flag. + + \sa QMailAccount::lastSynchronized() +*/ +void QMailRetrievalAction::retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort) +{ + if (folderIds.isEmpty()) { + // nothing to do + impl(this)->newAction(); + impl(this)->setActivity(QMailServiceAction::Successful); + impl(this)->emitChanges(); + return; + } + + impl(this)->retrieveMessageLists(accountId, folderIds, minimum, sort); +} + +/*! Requests that the message server retrieve data regarding the messages identified by \a messageIds. If \a spec is \l QMailRetrievalAction::Flags, then the message server should detect if @@ -1020,7 +1068,7 @@ void QMailRetrievalAction::retrieveMessagePartRange(const QMailMessagePart::Loca marked with the \l QMailMessage::New status flag. Messages that are no longer available will be marked with the \l QMailMessage::Removed status flag. - \sa retrieveFolderList(), retrieveMessageList() + \sa retrieveFolderList(), retrieveMessageList(), retrieveMessageLists() */ void QMailRetrievalAction::retrieveAll(const QMailAccountId &accountId) { @@ -1070,7 +1118,7 @@ void QMailRetrievalAction::exportUpdates(const QMailAccountId &accountId) the external server. The QMailFolder::serverCount(), QMailFolder::serverUnreadCount() and QMailFolder::serverUndiscoveredCount() properties will be updated for each folder. - \sa retrieveFolderList(), retrieveMessageList(), exportUpdates() + \sa retrieveFolderList(), retrieveMessageList(), retrieveMessageLists(), exportUpdates() */ void QMailRetrievalAction::synchronizeAll(const QMailAccountId &accountId) { diff --git a/src/libraries/qmfclient/qmailserviceaction.h b/src/libraries/qmfclient/qmailserviceaction.h index 6231ec9b..c4771446 100644 --- a/src/libraries/qmfclient/qmailserviceaction.h +++ b/src/libraries/qmfclient/qmailserviceaction.h @@ -179,6 +179,7 @@ public: public slots: void retrieveFolderList(const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending = true); void retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum = 0, const QMailMessageSortKey &sort = QMailMessageSortKey()); + void retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum = 0, const QMailMessageSortKey &sort = QMailMessageSortKey()); void retrieveMessages(const QMailMessageIdList &messageIds, RetrievalSpecification spec = MetaData); void retrieveMessagePart(const QMailMessagePart::Location &partLocation); diff --git a/src/libraries/qmfclient/qmailserviceaction_p.h b/src/libraries/qmfclient/qmailserviceaction_p.h index 6359a19f..bdfef0ea 100644 --- a/src/libraries/qmfclient/qmailserviceaction_p.h +++ b/src/libraries/qmfclient/qmailserviceaction_p.h @@ -152,6 +152,7 @@ public: void retrieveFolderList(const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending); void retrieveMessageListHelper(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); void retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); + void retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort); void retrieveMessages(const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec); void retrieveMessagePart(const QMailMessagePart::Location &partLocation); diff --git a/src/libraries/qmfmessageserver/qmailmessageservice.cpp b/src/libraries/qmfmessageserver/qmailmessageservice.cpp index fa8ffb34..d10eea86 100644 --- a/src/libraries/qmfmessageserver/qmailmessageservice.cpp +++ b/src/libraries/qmfmessageserver/qmailmessageservice.cpp @@ -441,7 +441,7 @@ QMailStore::MessageRemovalOption QMailMessageSource::messageRemovalOption() cons Return true if an operation is initiated. - \sa retrieveMessageList() + \sa retrieveMessageList(), retrieveMessageLists() */ bool QMailMessageSource::retrieveFolderList(const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending) { @@ -482,7 +482,7 @@ bool QMailMessageSource::retrieveFolderList(const QMailAccountId &accountId, con Return true if an operation is initiated. - \sa QMailAccount::lastSynchronized() + \sa QMailAccount::lastSynchronized(), retrieveMessageLists() */ bool QMailMessageSource::retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort) { @@ -496,6 +496,48 @@ bool QMailMessageSource::retrieveMessageList(const QMailAccountId &accountId, co } /*! + Retrieve the list of messages available for the account \a accountId. + If \a folderIds is not empty, then only messages within those folders should be retrieved and + the lastSynchronized() time of the account updated; otherwise + no messages should be retrieved. If \a minimum is non-zero, then that value will be used to restrict the + number of messages to be retrieved from each folder; otherwise, all messages will be retrieved. + + If \a sort is not empty, the external service will report the discovered messages in the + ordering indicated by the sort criterion, if possible. Services are not required to support + this facility. + + If a folder messages are being retrieved from contains at least \a minimum messages then the + messageserver should ensure that at least \a minimum messages are available from the mail + store for that folder; otherwise if the folder contains less than \a minimum messages the + messageserver should ensure all the messages for that folder are available from the mail store. + If a folder has messages locally available, then all previously undiscovered messages will be + retrieved for that folder, even if that number exceeds \a minimum. + + The QMailFolder::serverCount(), QMailFolder::serverUnreadCount() and + QMailFolder::serverUndiscoveredCount() properties will be updated for each folder + from which messages are retrieved. + + New messages will be added to the mail store as they are discovered, and + marked with the \l QMailMessage::New status flag. Messages that are present + in the mail store but found to be no longer available are marked with the + \l QMailMessage::Removed status flag. + + Return true if an operation is initiated. + + \sa QMailAccount::lastSynchronized(), retrieveMessageList() +*/ +bool QMailMessageSource::retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort) +{ + Q_UNUSED(accountId) + Q_UNUSED(folderIds) + Q_UNUSED(minimum) + Q_UNUSED(sort) + + notImplemented(); + return false; +} + +/*! Invoked by the message server to initiate a message retrieval operation. Retrieve data regarding each of the messages listed in \a ids. @@ -604,7 +646,7 @@ bool QMailMessageSource::retrieveMessagePartRange(const QMailMessagePart::Locati Return true if an operation is initiated. - \sa QMailAccount::lastSynchronized(), retrieveFolderList(), retrieveMessageList(), synchronize() + \sa QMailAccount::lastSynchronized(), retrieveFolderList(), retrieveMessageList(), retrieveMessageLists(), synchronize() */ bool QMailMessageSource::retrieveAll(const QMailAccountId &accountId) { @@ -1485,6 +1527,18 @@ bool QMailMessageSource::retrieveMessageList(const QMailAccountId &accountId, co return false; } +bool QMailMessageSource::retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort, quint64 action) +{ + Q_UNUSED(accountId) + Q_UNUSED(folderIds) + Q_UNUSED(minimum) + Q_UNUSED(sort) + Q_UNUSED(action) + + notImplemented(action); + return false; +} + bool QMailMessageSource::retrieveMessages(const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec, quint64 action) { Q_UNUSED(messageIds) diff --git a/src/libraries/qmfmessageserver/qmailmessageservice.h b/src/libraries/qmfmessageserver/qmailmessageservice.h index 09e137f4..0d09f65c 100644 --- a/src/libraries/qmfmessageserver/qmailmessageservice.h +++ b/src/libraries/qmfmessageserver/qmailmessageservice.h @@ -130,6 +130,9 @@ public slots: virtual bool retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); virtual bool retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort, quint64 action); + virtual bool retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort); + virtual bool retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort, quint64 action); + virtual bool retrieveMessages(const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec); virtual bool retrieveMessages(const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec, quint64 action); virtual bool retrieveMessagePart(const QMailMessagePart::Location &partLocation); diff --git a/src/plugins/messageservices/imap/imapservice.cpp b/src/plugins/messageservices/imap/imapservice.cpp index 5df086af..60d901ac 100644 --- a/src/plugins/messageservices/imap/imapservice.cpp +++ b/src/plugins/messageservices/imap/imapservice.cpp @@ -117,7 +117,9 @@ signals: public slots: virtual bool retrieveFolderList(const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending); + virtual bool retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort); virtual bool retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); + virtual bool retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &_folderIds, uint minimum, const QMailMessageSortKey &sort, bool retrieveAll); virtual bool retrieveMessages(const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec); virtual bool retrieveMessagePart(const QMailMessagePart::Location &partLocation); @@ -203,8 +205,24 @@ bool ImapService::Source::retrieveFolderList(const QMailAccountId &accountId, co return true; } +bool ImapService::Source::retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort) +{ + if (folderIds.isEmpty()) { + _service->errorOccurred(QMailServiceAction::Status::ErrInvalidData, tr("No folders specified")); + return false; + } + + return retrieveMessageLists(accountId, folderIds, minimum, sort, true /* accountCheck */); +} + bool ImapService::Source::retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort) { + bool accountCheck = !folderId.isValid(); + return retrieveMessageLists(accountId, QMailFolderIdList() << folderId, minimum, sort, accountCheck); +} + +bool ImapService::Source::retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &_folderIds, uint minimum, const QMailMessageSortKey &sort, bool accountCheck) +{ if (!_service->_client) { _service->errorOccurred(QMailServiceAction::Status::ErrFrameworkFault, tr("Account disabled")); return false; @@ -223,17 +241,18 @@ bool ImapService::Source::retrieveMessageList(const QMailAccountId &accountId, c uint adjustedMinimum = minimum ? minimum : INT_MAX; // zero means retrieve all mail _service->_client->strategyContext()->retrieveMessageListStrategy.clearSelection(); _service->_client->strategyContext()->retrieveMessageListStrategy.setMinimum(adjustedMinimum); - if (folderId.isValid()) { - folderIds.append(folderId); - _service->_client->strategyContext()->retrieveMessageListStrategy.setAccountCheck(false); + if (!_folderIds.isEmpty()) { + folderIds = _folderIds; } else { // Retrieve messages for all folders in the account that have undiscovered messages QMailFolderKey accountKey(QMailFolderKey::parentAccountId(accountId)); QMailFolderKey canSelectKey(QMailFolderKey::status(QMailFolder::MessagesPermitted)); QMailFolderKey filterKey(accountKey & canSelectKey); folderIds = QMailStore::instance()->queryFolders(filterKey, QMailFolderSortKey::id(Qt::AscendingOrder)); - _service->_client->strategyContext()->retrieveMessageListStrategy.setAccountCheck(true); } + // accountCheck false, just retrieve new mail or minimum mails whichever is more + // accountCheck is true, also update status of messages on device, and detect removed messages + _service->_client->strategyContext()->retrieveMessageListStrategy.setAccountCheck(accountCheck); _service->_client->strategyContext()->retrieveMessageListStrategy.setOperation(_service->_client->strategyContext(), QMailRetrievalAction::Auto); _service->_client->strategyContext()->retrieveMessageListStrategy.selectedFoldersAppend(folderIds); diff --git a/src/plugins/messageservices/pop/popservice.cpp b/src/plugins/messageservices/pop/popservice.cpp index 897d0c41..1e855eee 100644 --- a/src/plugins/messageservices/pop/popservice.cpp +++ b/src/plugins/messageservices/pop/popservice.cpp @@ -82,6 +82,7 @@ public: public slots: virtual bool retrieveFolderList(const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending); virtual bool retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); + virtual bool retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort); virtual bool retrieveMessages(const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec); @@ -124,6 +125,16 @@ bool PopService::Source::retrieveFolderList(const QMailAccountId &accountId, con Q_UNUSED(folderId) } +bool PopService::Source::retrieveMessageLists(const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort) +{ + if (folderIds.isEmpty()) { + _service->errorOccurred(QMailServiceAction::Status::ErrInvalidData, tr("No folders specified")); + return false; + } + + return retrieveMessageList(accountId, QMailFolderId(), minimum, sort); +} + bool PopService::Source::retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort) { if (!accountId.isValid()) { diff --git a/src/tools/messageserver/mailmessageclient.cpp b/src/tools/messageserver/mailmessageclient.cpp index ddcbefcd..715f28b6 100644 --- a/src/tools/messageserver/mailmessageclient.cpp +++ b/src/tools/messageserver/mailmessageclient.cpp @@ -106,6 +106,8 @@ MailMessageClient::MailMessageClient(QObject* parent) this, SIGNAL(transmitMessages(quint64, QMailAccountId))); connectIpc(adaptor, MESSAGE(retrieveFolderList(quint64, QMailAccountId, QMailFolderId, bool)), this, SIGNAL(retrieveFolderList(quint64, QMailAccountId, QMailFolderId, bool))); + connectIpc(adaptor, MESSAGE(retrieveMessageLists(quint64, QMailAccountId, QMailFolderIdList, uint, QMailMessageSortKey)), + this, SIGNAL(retrieveMessageLists(quint64, QMailAccountId, QMailFolderIdList, uint, QMailMessageSortKey))); connectIpc(adaptor, MESSAGE(retrieveMessageList(quint64, QMailAccountId, QMailFolderId, uint, QMailMessageSortKey)), this, SIGNAL(retrieveMessageList(quint64, QMailAccountId, QMailFolderId, uint, QMailMessageSortKey))); connectIpc(adaptor, MESSAGE(retrieveMessages(quint64, QMailMessageIdList, QMailRetrievalAction::RetrievalSpecification)), diff --git a/src/tools/messageserver/mailmessageclient.h b/src/tools/messageserver/mailmessageclient.h index 43616425..b21a44a8 100644 --- a/src/tools/messageserver/mailmessageclient.h +++ b/src/tools/messageserver/mailmessageclient.h @@ -71,6 +71,7 @@ signals: void retrieveFolderList(quint64, const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending); void retrieveMessageList(quint64, const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); + void retrieveMessageLists(quint64, const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort); void retrieveMessages(quint64, const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec); void retrieveMessagePart(quint64, const QMailMessagePart::Location &partLocation); diff --git a/src/tools/messageserver/messageserver.cpp b/src/tools/messageserver/messageserver.cpp index 5796e1be..b5f2a275 100644 --- a/src/tools/messageserver/messageserver.cpp +++ b/src/tools/messageserver/messageserver.cpp @@ -165,6 +165,8 @@ MessageServer::MessageServer(QObject *parent) handler, SLOT(retrieveFolderList(quint64, QMailAccountId, QMailFolderId, bool))); connect(client, SIGNAL(retrieveMessageList(quint64, QMailAccountId, QMailFolderId, uint, QMailMessageSortKey)), handler, SLOT(retrieveMessageList(quint64, QMailAccountId, QMailFolderId, uint, QMailMessageSortKey))); + connect(client, SIGNAL(retrieveMessageLists(quint64, QMailAccountId, QMailFolderIdList, uint, QMailMessageSortKey)), + handler, SLOT(retrieveMessageLists(quint64, QMailAccountId, QMailFolderIdList, uint, QMailMessageSortKey))); connect(client, SIGNAL(retrieveMessages(quint64, QMailMessageIdList, QMailRetrievalAction::RetrievalSpecification)), handler, SLOT(retrieveMessages(quint64, QMailMessageIdList, QMailRetrievalAction::RetrievalSpecification))); connect(client, SIGNAL(retrieveMessagePart(quint64, QMailMessagePart::Location)), diff --git a/src/tools/messageserver/servicehandler.cpp b/src/tools/messageserver/servicehandler.cpp index b1d79703..bcd3cd75 100644 --- a/src/tools/messageserver/servicehandler.cpp +++ b/src/tools/messageserver/servicehandler.cpp @@ -1393,6 +1393,44 @@ bool ServiceHandler::dispatchRetrieveMessageList(quint64 action, const QByteArra return true; } +void ServiceHandler::retrieveMessageLists(quint64 action, const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort) +{ + QSet<QMailMessageService*> sources(sourceServiceSet(accountId)); + if (sources.isEmpty()) { + reportFailure(action, QMailServiceAction::Status::ErrNoConnection, tr("Unable to retrieve message list for unconfigured account")); + } else { + enqueueRequest(action, serialize(accountId, folderIds, minimum, sort), sources, &ServiceHandler::dispatchRetrieveMessageLists, &ServiceHandler::retrievalCompleted, RetrieveMessageListRequestType); + } +} + +bool ServiceHandler::dispatchRetrieveMessageLists(quint64 action, const QByteArray &data) +{ + QMailAccountId accountId; + QMailFolderIdList folderIds; + uint minimum; + QMailMessageSortKey sort; + + deserialize(data, accountId, folderIds, minimum, sort); + + if (QMailMessageSource *source = accountSource(accountId)) { + bool success(sourceService.value(source)->usesConcurrentActions() + ? source->retrieveMessageLists(accountId, folderIds, minimum, sort, action) + : source->retrieveMessageLists(accountId, folderIds, minimum, sort)); + if (success) { + // This account is now retrieving + setRetrievalInProgress(accountId, true); + } else { + qWarning() << "Unable to service request to retrieve message list for folders:" << folderIds; + return false; + } + } else { + reportFailure(action, QMailServiceAction::Status::ErrFrameworkFault, tr("Unable to locate source for account"), accountId); + return false; + } + + return true; +} + void ServiceHandler::retrieveMessages(quint64 action, const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec) { QMap<QMailAccountId, QMailMessageIdList> messageLists(accountMessages(messageIds)); diff --git a/src/tools/messageserver/servicehandler.h b/src/tools/messageserver/servicehandler.h index d939f2ef..779f9a05 100644 --- a/src/tools/messageserver/servicehandler.h +++ b/src/tools/messageserver/servicehandler.h @@ -69,6 +69,7 @@ public slots: void transmitMessages(quint64 action, const QMailAccountId &accountId); void retrieveFolderList(quint64, const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending); void retrieveMessageList(quint64, const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); + void retrieveMessageLists(quint64, const QMailAccountId &accountId, const QMailFolderIdList &folderIds, uint minimum, const QMailMessageSortKey &sort); void retrieveMessages(quint64, const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec); void retrieveMessagePart(quint64, const QMailMessagePart::Location &partLocation); void retrieveMessageRange(quint64, const QMailMessageId &messageId, uint minimum); @@ -226,6 +227,7 @@ private: bool dispatchRetrieveFolderListAccount(quint64, const QByteArray &data); bool dispatchRetrieveFolderList(quint64, const QByteArray &data); bool dispatchRetrieveMessageList(quint64, const QByteArray &data); + bool dispatchRetrieveMessageLists(quint64, const QByteArray &data); bool dispatchRetrieveMessages(quint64, const QByteArray &data); bool dispatchRetrieveMessagePart(quint64, const QByteArray &data); bool dispatchRetrieveMessageRange(quint64, const QByteArray &data); |