summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDon Sanders <don.sanders@nokia.com>2012-01-10 11:06:13 +0200
committerDon Sanders <don.sanders@nokia.com>2012-01-10 11:06:13 +0200
commita6748fd6a7bd41b79667c5f399fd649eabe23161 (patch)
tree607006da14a159474c33972a153d776f0041ba2e
parent8facc917b9cc69e38d7eb9a0642032c76a043512 (diff)
Add disconnected storage actions, for actions requiring database writes.2012W02
Specifically, as documented in src/libraries/qmfclient/CHANGES.qdoc item 52, added: 'void QMailStorageAction::deleteMessages(quint64, const QMailMessageIdList &ids)', 'void QMailStorageAction::rollBackUpdates(quint64, const QMailAccountId &mailAccountId)', 'void QMailStorageAction::moveToStandardFolder(quint64, const QMailMessageIdList& ids, QMailFolder::StandardFolder standardFolder)', 'void QMailStorageAction::moveToFolder(quint64, const QMailMessageIdList& ids, const QMailFolderId& folderId)', 'void QMailStorageAction::flagMessages(quint64, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask)', 'void QMailStorageAction::restoreToPreviousFolder(quint64, const QMailMessageKey& key)', 'void QMailMessageServer::deleteMessages(quint64, const QMailMessageIdList &ids)', 'void QMailMessageServer::rollBackUpdates(quint64, const QMailAccountId &mailAccountId)', 'void QMailMessageServer::moveToStandardFolder(quint64, const QMailMessageIdList& ids, quint64 standardFolder)', 'void QMailMessageServer::moveToFolder(quint64, const QMailMessageIdList& ids, const QMailFolderId& folderId)', 'void QMailMessageServer::flagMessages(quint64, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask)' and 'void QMailMessageServer::restoreToPreviousFolder(quint64, const QMailMessageKey& key)'. Also added documentation for new functions, and made some minor documentation updates for existing functions. Additionally added a new set of module tests tst_qmailstorageaction. These tests require the messageserver to be running. They are not just stubs but do real testing.
-rw-r--r--CHANGES3
-rw-r--r--examples/qtmail/app/emailclient.cpp5
-rw-r--r--src/libraries/qmfclient/CHANGES.qdoc13
-rw-r--r--src/libraries/qmfclient/qmaildisconnected.cpp10
-rw-r--r--src/libraries/qmfclient/qmailmessageserver.cpp131
-rw-r--r--src/libraries/qmfclient/qmailmessageserver.h6
-rw-r--r--src/libraries/qmfclient/qmailserviceaction.cpp150
-rw-r--r--src/libraries/qmfclient/qmailserviceaction.h8
-rw-r--r--src/libraries/qmfclient/qmailserviceaction_p.h6
-rw-r--r--src/libraries/qmfclient/qmailstore.h1
-rw-r--r--src/tools/messageserver/mailmessageclient.cpp12
-rw-r--r--src/tools/messageserver/mailmessageclient.h6
-rw-r--r--src/tools/messageserver/messageserver.cpp12
-rw-r--r--src/tools/messageserver/servicehandler.cpp72
-rw-r--r--src/tools/messageserver/servicehandler.h7
-rw-r--r--tests/tests.pro1
-rw-r--r--tests/tst_qmailstorageaction/tst_qmailstorageaction.cpp828
-rw-r--r--tests/tst_qmailstorageaction/tst_qmailstorageaction.pro8
18 files changed, 1266 insertions, 13 deletions
diff --git a/CHANGES b/CHANGES
index 651f2a05..aae1f0d3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
Latest Changes
---------------
+201201_2
+ * Made API additions as documented in src/libraries/qmfclient/CHANGES.qdoc item 52.
+
201201_1
* Made API renaming changes as documented in src/libraries/qmfclient/CHANGES.qdoc item 51.
diff --git a/examples/qtmail/app/emailclient.cpp b/examples/qtmail/app/emailclient.cpp
index 1619ac36..08fcf319 100644
--- a/examples/qtmail/app/emailclient.cpp
+++ b/examples/qtmail/app/emailclient.cpp
@@ -1362,6 +1362,7 @@ void EmailClient::retrievalCompleted()
void EmailClient::storageActionCompleted()
{
clearStatusText();
+ exportPendingChanges();
}
void EmailClient::getNewMail()
@@ -1749,7 +1750,7 @@ void EmailClient::deleteSelectedMessages()
deleteList = (deleteList.toSet().subtract(localOnlyIds.toSet())).toList();
}
if(!deleteList.isEmpty())
- storageAction("Deleting messages..")->onlineDeleteMessages(deleteList);
+ storageAction("Deleting messages..")->deleteMessages(deleteList);
}
else
{
@@ -1938,7 +1939,7 @@ void EmailClient::emptyTrashFolder()
if (confirmDelete(this, "Empty trash", tr("all messages in the trash"))) {
AcknowledgmentBox::show(tr("Deleting"), tr("Deleting %n message(s)", "%1: number of messages", trashIds.count()));
- storageAction("Deleting messages")->onlineDeleteMessages(trashIds);
+ storageAction("Deleting messages")->deleteMessages(trashIds);
}
}
diff --git a/src/libraries/qmfclient/CHANGES.qdoc b/src/libraries/qmfclient/CHANGES.qdoc
index 704fb726..9288441a 100644
--- a/src/libraries/qmfclient/CHANGES.qdoc
+++ b/src/libraries/qmfclient/CHANGES.qdoc
@@ -218,6 +218,19 @@ Changes since the QMF-1.0 release on 15/05/09:
'void QMailMessageServer::renameFolder(const QMailFolderId &folderId, const QString &name)' to onlineRenameFolder,
'void QMailMessageServer::deleteFolder(const QMailFolderId &folderId)' to onlineDeleteFolder.
+52. Added 'void QMailStorageAction::deleteMessages(quint64, const QMailMessageIdList &ids)',
+ 'void QMailStorageAction::rollBackUpdates(quint64, const QMailAccountId &mailAccountId)',
+ 'void QMailStorageAction::moveToStandardFolder(quint64, const QMailMessageIdList& ids, QMailFolder::StandardFolder standardFolder)',
+ 'void QMailStorageAction::moveToFolder(quint64, const QMailMessageIdList& ids, const QMailFolderId& folderId)',
+ 'void QMailStorageAction::flagMessages(quint64, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask)',
+ 'void QMailStorageAction::restoreToPreviousFolder(quint64, const QMailMessageKey& key)',
+ 'void QMailMessageServer::deleteMessages(quint64, const QMailMessageIdList &ids)',
+ 'void QMailMessageServer::rollBackUpdates(quint64, const QMailAccountId &mailAccountId)',
+ 'void QMailMessageServer::moveToStandardFolder(quint64, const QMailMessageIdList& ids, quint64 standardFolder)',
+ 'void QMailMessageServer::moveToFolder(quint64, const QMailMessageIdList& ids, const QMailFolderId& folderId)',
+ 'void QMailMessageServer::flagMessages(quint64, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask)' and
+ 'void QMailMessageServer::restoreToPreviousFolder(quint64, const QMailMessageKey& key)'.
+
*****************************************************************************
Changes since the development preview release on 03/04/09:
diff --git a/src/libraries/qmfclient/qmaildisconnected.cpp b/src/libraries/qmfclient/qmaildisconnected.cpp
index 1684bd35..1c3c33ca 100644
--- a/src/libraries/qmfclient/qmaildisconnected.cpp
+++ b/src/libraries/qmfclient/qmaildisconnected.cpp
@@ -390,7 +390,7 @@ void QMailDisconnected::moveToStandardFolder(const QMailMessageIdList& ids, QMai
Disconnected moves the list of messages identified by \a ids into the folder identified by \a folderId, setting standard
folder flags as appropriate.
- Moving to another accounts are not supported.
+ Moving to another account is not supported.
The move operation will be propagated to the server by a successful call to QMailRetrievalAction::exportUpdates().
*/
@@ -505,7 +505,7 @@ void QMailDisconnected::copyToFolder(const QMailMessageIdList& ids, const QMailF
Disconnected flags the list of messages identified by \a ids, setting the flags specified by the bit mask \a setMask
to on and setting the flags set by the bit mask \a unsetMask to off.
- For example this function may be used to mark messages as important or 'move to trash' messages.
+ For example this function may be used to mark messages as important.
The flagging operation will be propagated to the server by a successful call to QMailRetrievalAction::exportUpdates().
@@ -527,7 +527,7 @@ void QMailDisconnected::flagMessages(const QMailMessageIdList &ids, quint64 setM
Disconnected flags the list a message identified by \a id, setting the flags specified by the bit mask \a setMask
to on and setting the flags set by the bit mask \a unsetMask to off.
- For example this function may be used to mark a message as important or 'move to trash' a message.
+ For example this function may be used to mark a message as important.
The flagging operation will be propagated to the server by a successful call to QMailRetrievalAction::exportUpdates().
@@ -543,6 +543,8 @@ void QMailDisconnected::flagMessage(const QMailMessageId &id, quint64 setMask, q
previous folder it was contained by.
Returns \c true if the operation completed successfully, \c false otherwise.
+
+ \sa QMailDisconnected::moveToFolder(), QMailDisconnected::moveToStandardFolder()
*/
void QMailDisconnected::restoreToPreviousFolder(const QMailMessageId& id)
{
@@ -552,8 +554,6 @@ void QMailDisconnected::restoreToPreviousFolder(const QMailMessageId& id)
/*!
Updates all QMailMessages identified by the key \a key to move the messages back to the
previous folder they were contained by.
-
- Returns \c true if the operation completed successfully, \c false otherwise.
*/
void QMailDisconnected::restoreToPreviousFolder(const QMailMessageKey& key)
{
diff --git a/src/libraries/qmfclient/qmailmessageserver.cpp b/src/libraries/qmfclient/qmailmessageserver.cpp
index 1229cdf2..044858e8 100644
--- a/src/libraries/qmfclient/qmailmessageserver.cpp
+++ b/src/libraries/qmfclient/qmailmessageserver.cpp
@@ -87,7 +87,12 @@ signals:
void addMessages(quint64, const QMailMessageMetaDataList &list);
void updateMessages(quint64, const QString &filename);
void updateMessages(quint64, const QMailMessageMetaDataList &list);
-
+ void deleteMessages(quint64, const QMailMessageIdList &ids);
+ void rollBackUpdates(quint64, const QMailAccountId &mailAccountId);
+ void moveToStandardFolder(quint64, const QMailMessageIdList& ids, quint64 standardFolder);
+ void moveToFolder(quint64, const QMailMessageIdList& ids, const QMailFolderId& folderId);
+ void flagMessages(quint64, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask);
+ void restoreToPreviousFolder(quint64, const QMailMessageKey& key);
void onlineCreateFolder(quint64, const QString &name, const QMailAccountId &accountId, const QMailFolderId &parentId);
void onlineRenameFolder(quint64, const QMailFolderId &folderId, const QString &name);
void onlineDeleteFolder(quint64, const QMailFolderId &folderId);
@@ -173,6 +178,18 @@ QMailMessageServerPrivate::QMailMessageServerPrivate(QMailMessageServer* parent)
adaptor, MESSAGE(onlineRenameFolder(quint64, QMailFolderId, QString)));
connectIpc(this, SIGNAL(onlineDeleteFolder(quint64, QMailFolderId)),
adaptor, MESSAGE(onlineDeleteFolder(quint64, QMailFolderId)));
+ connectIpc(this, SIGNAL(deleteMessages(quint64, QMailMessageIdList)),
+ adaptor, MESSAGE(deleteMessages(quint64, QMailMessageIdList)));
+ connectIpc(this, SIGNAL(rollBackUpdates(quint64, QMailAccountId)),
+ adaptor, MESSAGE(rollBackUpdates(quint64, QMailAccountId)));
+ connectIpc(this, SIGNAL(moveToStandardFolder(quint64, QMailMessageIdList, quint64)),
+ adaptor, MESSAGE(moveToStandardFolder(quint64, QMailMessageIdList, quint64)));
+ connectIpc(this, SIGNAL(moveToFolder(quint64, QMailMessageIdList, QMailFolderId)),
+ adaptor, MESSAGE(moveToFolder(quint64, QMailMessageIdList, QMailFolderId)));
+ connectIpc(this, SIGNAL(flagMessages(quint64, QMailMessageIdList, quint64, quint64)),
+ adaptor, MESSAGE(flagMessages(quint64, QMailMessageIdList, quint64, quint64)));
+ connectIpc(this, SIGNAL(restoreToPreviousFolder(quint64, QMailMessageKey)),
+ adaptor, MESSAGE(restoreToPreviousFolder(quint64, QMailMessageKey)));
connectIpc(this, SIGNAL(searchMessages(quint64, QMailMessageKey, QString, QMailSearchAction::SearchSpecification, QMailMessageSortKey)),
adaptor, MESSAGE(searchMessages(quint64, QMailMessageKey, QString, QMailSearchAction::SearchSpecification, QMailMessageSortKey)));
connectIpc(this, SIGNAL(searchMessages(quint64, QMailMessageKey, QString, QMailSearchAction::SearchSpecification, quint64, QMailMessageSortKey)),
@@ -373,7 +390,7 @@ QMailMessageServerPrivate::~QMailMessageServerPrivate()
Emitted when the messages identified by \a list have been deleted from the mail store,
in response to the request identified by \a action.
- \sa onlineDeleteMessages()
+ \sa deleteMessages(), onlineDeleteMessages()
*/
/*!
@@ -391,7 +408,7 @@ QMailMessageServerPrivate::~QMailMessageServerPrivate()
Emitted when the messages identified by \a list have been moved to the destination
folder on the external service, in response to the request identified by \a action.
- \sa onlineMoveMessages()
+ \sa moveToFolder(), moveToStandardFolder(), onlineMoveMessages()
*/
/*!
@@ -400,7 +417,7 @@ QMailMessageServerPrivate::~QMailMessageServerPrivate()
Emitted when the messages identified by \a list have been flagged with the specified
set of status flags, in response to the request identified by \a action.
- \sa onlineFlagMessagesAndMoveToStandardFolder()
+ \sa flagMessages(), moveToStandardFolder(), onlineFlagMessagesAndMoveToStandardFolder()
*/
/*!
@@ -434,8 +451,6 @@ QMailMessageServerPrivate::~QMailMessageServerPrivate()
\fn void QMailMessageServer::storageActionCompleted(quint64 action);
Emitted when the storage operation identified by \a action is completed.
-
- \sa onlineDeleteMessages(), onlineCopyMessages(), onlineMoveMessages(), onlineFlagMessagesAndMoveToStandardFolder()
*/
/*!
@@ -927,6 +942,110 @@ void QMailMessageServer::onlineDeleteMessages(quint64 action, const QMailMessage
}
/*!
+ Requests that the MessageServer delete the messages in \a mailList, messages
+ will be removed locally from the device, and if necessary information needed
+ to delete messages from an external server is recorded.
+
+ Deleting messages using this slot does not initiate communication with any external
+ server; Deletion from the external server will occur when
+ QMailRetrievalAction::exportUpdates is called successfully.
+
+ The request has the identifier \a action.
+
+ \sa QMailStore::removeMessage()
+*/
+void QMailMessageServer::deleteMessages(quint64 action, const QMailMessageIdList& mailList)
+{
+ emit d->deleteMessages(action, mailList);
+}
+
+/*!
+ Asynchronous version of QMailDisconnected::rollBackUpdates()
+
+ Rolls back all disconnected move and copy operations that have been applied to the
+ message store since the most recent synchronization of the message with the account
+ specified by \a mailAccountId.
+
+ The request has the identifier \a action.
+
+ \sa QMailDisconnected::updatesOutstanding()
+*/
+void QMailMessageServer::rollBackUpdates(quint64 action, const QMailAccountId &mailAccountId)
+{
+ emit d->rollBackUpdates(action, mailAccountId);
+}
+
+/*!
+ Asynchronous version of QMailDisconnected::moveToStandardFolder()
+
+ Disconnected moves the list of messages identified by \a ids into the standard folder \a standardFolder, setting standard
+ folder flags as appropriate.
+
+ The move operation will be propagated to the server by a successful call to QMailRetrievalAction::exportUpdates().
+
+ The request has the identifier \a action.
+
+ \sa QMailDisconnected::moveToStandardFolder()
+*/
+void QMailMessageServer::moveToStandardFolder(quint64 action, const QMailMessageIdList& ids, quint64 standardFolder)
+{
+ emit d->moveToStandardFolder(action, ids, standardFolder);
+}
+
+/*!
+ Asynchronous version of QMailDisconnected::moveToFolder()
+
+ Disconnected moves the list of messages identified by \a ids into the folder identified by \a folderId, setting standard
+ folder flags as appropriate.
+
+ Moving to another account is not supported.
+
+ The move operation will be propagated to the server by a successful call to QMailRetrievalAction::exportUpdates().
+
+ The request has the identifier \a action.
+
+ \sa QMailDisconnected::moveToFolder()
+*/
+void QMailMessageServer::moveToFolder(quint64 action, const QMailMessageIdList& ids, const QMailFolderId& folderId)
+{
+ emit d->moveToFolder(action, ids, folderId);
+}
+
+/*!
+ Asynchronous version of QMailDisconnected::flagMessages()
+
+ Disconnected flags the list of messages identified by \a ids, setting the flags specified by the bit mask \a setMask
+ to on and setting the flags set by the bit mask \a unsetMask to off.
+
+ For example this function may be used to mark messages as important.
+
+ The flagging operation will be propagated to the server by a successful call to QMailRetrievalAction::exportUpdates().
+
+ The request has the identifier \a action.
+
+ \sa QMailDisconnected::flagMessages()
+*/
+void QMailMessageServer::flagMessages(quint64 action, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask)
+{
+ emit d->flagMessages(action, ids, setMask, unsetMask);
+}
+
+/*!
+ Asynchronous version of QMailDisconnected::restoreToPreviousFolder()
+
+ Updates all QMailMessages identified by the key \a key to move the messages back to the
+ previous folder they were contained by.
+
+ The request has the identifier \a action.
+
+ \sa QMailDisconnected::restoreToPreviousFolder(), QMailMessageServer::moveToFolder(), QMailMessageServer::moveToStandardFolder()
+*/
+void QMailMessageServer::restoreToPreviousFolder(quint64 action, const QMailMessageKey& key)
+{
+ emit d->restoreToPreviousFolder(action, key);
+}
+
+/*!
Requests that the MessageServer search for messages that meet the criteria encoded
in \a filter. If \a bodyText is non-empty, messages containing the specified text
in their content will also be matched. If \a spec is
diff --git a/src/libraries/qmfclient/qmailmessageserver.h b/src/libraries/qmfclient/qmailmessageserver.h
index 32cfd7c8..8ec13c3e 100644
--- a/src/libraries/qmfclient/qmailmessageserver.h
+++ b/src/libraries/qmfclient/qmailmessageserver.h
@@ -145,6 +145,12 @@ public slots:
void onlineRenameFolder(quint64, const QMailFolderId &folderId, const QString &name);
void onlineDeleteFolder(quint64, const QMailFolderId &folderId);
+ void deleteMessages(quint64, const QMailMessageIdList &ids);
+ void rollBackUpdates(quint64, const QMailAccountId &mailAccountId);
+ void moveToStandardFolder(quint64, const QMailMessageIdList& ids, quint64 standardFolder);
+ void moveToFolder(quint64, const QMailMessageIdList& ids, const QMailFolderId& folderId);
+ void flagMessages(quint64, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask);
+ void restoreToPreviousFolder(quint64, const QMailMessageKey& key);
void cancelTransfer(quint64);
void onlineDeleteMessages(quint64, const QMailMessageIdList& mailList, QMailStore::MessageRemovalOption);
diff --git a/src/libraries/qmfclient/qmailserviceaction.cpp b/src/libraries/qmfclient/qmailserviceaction.cpp
index 48054c4a..4af6a3b1 100644
--- a/src/libraries/qmfclient/qmailserviceaction.cpp
+++ b/src/libraries/qmfclient/qmailserviceaction.cpp
@@ -1516,6 +1516,52 @@ void QMailStorageActionPrivate::updateMessages(const QMailMessageMetaDataList &l
emitChanges();
}
+void QMailStorageActionPrivate::deleteMessages(const QMailMessageIdList &ids)
+{
+ _server->deleteMessages(newAction(), ids);
+
+ _ids = ids;
+ emitChanges();
+}
+
+void QMailStorageActionPrivate::rollBackUpdates(const QMailAccountId &mailAccountId)
+{
+ _server->rollBackUpdates(newAction(), mailAccountId);
+ emitChanges();
+}
+
+void QMailStorageActionPrivate::moveToStandardFolder(const QMailMessageIdList& ids, quint64 standardFolder)
+{
+ _server->moveToStandardFolder(newAction(), ids, standardFolder);
+
+ _ids = ids;
+ emitChanges();
+}
+
+void QMailStorageActionPrivate::moveToFolder(const QMailMessageIdList& ids, const QMailFolderId& folderId)
+{
+ _server->moveToFolder(newAction(), ids, folderId);
+
+ _ids = ids;
+ emitChanges();
+}
+
+void QMailStorageActionPrivate::flagMessages(const QMailMessageIdList &ids, quint64 setMask, quint64 unsetMask)
+{
+ // Ensure that nothing is both set and unset
+ setMask &= ~unsetMask;
+ _server->flagMessages(newAction(), ids, setMask, unsetMask);
+
+ _ids = ids;
+ emitChanges();
+}
+
+void QMailStorageActionPrivate::restoreToPreviousFolder(const QMailMessageKey& key)
+{
+ _server->restoreToPreviousFolder(newAction(), key);
+ emitChanges();
+}
+
void QMailStorageActionPrivate::onlineCreateFolder(const QString &name, const QMailAccountId &accountId, const QMailFolderId &parentId)
{
_server->onlineCreateFolder(newAction(), name, accountId, parentId);
@@ -1746,6 +1792,110 @@ QMailMessageIdList QMailStorageAction::messagesUpdated() const
}
/*!
+ Asynchronously deletes the messages in \a mailList, messages
+ will be removed locally from the device, and if necessary information needed
+ to delete messages from an external server is recorded.
+
+ Deleting messages using this slot does not initiate communication with any external
+ server; Deletion from the external server will occur when
+ QMailRetrievalAction::exportUpdates is called successfully.
+
+ The request has the identifier \a action.
+
+ \sa QMailStore::removeMessage()
+*/
+void QMailStorageAction::deleteMessages(const QMailMessageIdList& mailList)
+{
+ emit impl(this)->deleteMessages(mailList);
+}
+
+/*!
+ Asynchronous version of QMailDisconnected::rollBackUpdates()
+
+ Rolls back all disconnected move and copy operations that have been applied to the
+ message store since the most recent synchronization of the message with the account
+ specified by \a mailAccountId.
+
+ The request has the identifier \a action.
+
+ \sa QMailDisconnected::updatesOutstanding()
+*/
+void QMailStorageAction::rollBackUpdates(const QMailAccountId &mailAccountId)
+{
+ impl(this)->rollBackUpdates(mailAccountId);
+}
+
+/*!
+ Asynchronous version of QMailDisconnected::moveToStandardFolder()
+
+ Disconnected moves the list of messages identified by \a ids into the standard folder \a standardFolder, setting standard
+ folder flags as appropriate.
+
+ The move operation will be propagated to the server by a successful call to QMailRetrievalAction::exportUpdates().
+
+ The request has the identifier \a action.
+
+ \sa QMailDisconnected::moveToStandardFolder()
+*/
+void QMailStorageAction::moveToStandardFolder(const QMailMessageIdList& ids, QMailFolder::StandardFolder standardFolder)
+{
+ impl(this)->moveToStandardFolder(ids, standardFolder);
+}
+
+/*!
+ Asynchronous version of QMailDisconnected::moveToFolder()
+
+ Disconnected moves the list of messages identified by \a ids into the folder identified by \a folderId, setting standard
+ folder flags as appropriate.
+
+ Moving to another account is not supported.
+
+ The move operation will be propagated to the server by a successful call to QMailRetrievalAction::exportUpdates().
+
+ The request has the identifier \a action.
+
+ \sa QMailDisconnected::moveToFolder()
+*/
+void QMailStorageAction::moveToFolder(const QMailMessageIdList& ids, const QMailFolderId& folderId)
+{
+ emit impl(this)->moveToFolder(ids, folderId);
+}
+
+/*!
+ Asynchronous version of QMailDisconnected::flagMessages()
+
+ Disconnected flags the list of messages identified by \a ids, setting the flags specified by the bit mask \a setMask
+ to on and setting the flags set by the bit mask \a unsetMask to off.
+
+ For example this function may be used to mark messages as important.
+
+ The flagging operation will be propagated to the server by a successful call to QMailRetrievalAction::exportUpdates().
+
+ The request has the identifier \a action.
+
+ \sa QMailDisconnected::flagMessages(), QMailStorageAction::moveToFolder(), QMailStorageAction::moveToStandardFolder()
+*/
+void QMailStorageAction::flagMessages(const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask)
+{
+ emit impl(this)->flagMessages(ids, setMask, unsetMask);
+}
+
+/*!
+ Asynchronous version of QMailDisconnected::restoreToPreviousFolder()
+
+ Updates all QMailMessages identified by the key \a key to move the messages back to the
+ previous folder they were contained by.
+
+ The request has the identifier \a action.
+
+ \sa QMailDisconnected::restoreToPreviousFolder()
+*/
+void QMailStorageAction::restoreToPreviousFolder(const QMailMessageKey& key)
+{
+ emit impl(this)->restoreToPreviousFolder(key);
+}
+
+/*!
Requests that the message server create a new folder named \a name, created in the
account identified by \a accountId.
If \a parentId is a valid folder identifier the new folder will be a child of the parent;
diff --git a/src/libraries/qmfclient/qmailserviceaction.h b/src/libraries/qmfclient/qmailserviceaction.h
index d54ee995..2702e843 100644
--- a/src/libraries/qmfclient/qmailserviceaction.h
+++ b/src/libraries/qmfclient/qmailserviceaction.h
@@ -48,6 +48,7 @@
#include "qmailmessagekey.h"
#include "qmailmessagesortkey.h"
#include "qmailmessage.h"
+#include "qmailfolder.h"
#include "qmailaction.h"
#include <QString>
#include <QStringList>
@@ -247,6 +248,13 @@ public slots:
void onlineCreateFolder(const QString &name, const QMailAccountId &accountId, const QMailFolderId &parentId);
void onlineRenameFolder(const QMailFolderId &folderId, const QString &name);
void onlineDeleteFolder(const QMailFolderId &folderId);
+
+ void deleteMessages(const QMailMessageIdList &ids);
+ void rollBackUpdates(const QMailAccountId &mailAccountId);
+ void moveToStandardFolder(const QMailMessageIdList& ids, QMailFolder::StandardFolder standardFolder);
+ void moveToFolder(const QMailMessageIdList& ids, const QMailFolderId& folderId);
+ void flagMessages(const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask);
+ void restoreToPreviousFolder(const QMailMessageKey& key);
};
diff --git a/src/libraries/qmfclient/qmailserviceaction_p.h b/src/libraries/qmfclient/qmailserviceaction_p.h
index 1bee0afd..03e65ca1 100644
--- a/src/libraries/qmfclient/qmailserviceaction_p.h
+++ b/src/libraries/qmfclient/qmailserviceaction_p.h
@@ -261,6 +261,12 @@ public:
void addMessages(const QMailMessageList &list);
void updateMessages(const QMailMessageList &list);
void updateMessages(const QMailMessageMetaDataList &list);
+ void deleteMessages(const QMailMessageIdList &ids);
+ void rollBackUpdates(const QMailAccountId &mailAccountId);
+ void moveToStandardFolder(const QMailMessageIdList& ids, quint64 standardFolder);
+ void moveToFolder(const QMailMessageIdList& ids, const QMailFolderId& folderId);
+ void flagMessages(const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask);
+ void restoreToPreviousFolder(const QMailMessageKey& key);
void onlineCreateFolder(const QString &name, const QMailAccountId &accountId, const QMailFolderId &parentId);
void onlineRenameFolder(const QMailFolderId &id, const QString &name);
diff --git a/src/libraries/qmfclient/qmailstore.h b/src/libraries/qmfclient/qmailstore.h
index a8ccf6ea..7f4a72e9 100644
--- a/src/libraries/qmfclient/qmailstore.h
+++ b/src/libraries/qmfclient/qmailstore.h
@@ -251,6 +251,7 @@ private:
friend class tst_QMailStore;
friend class tst_QMailStoreKeys;
friend class tst_qmailthread;
+ friend class tst_QMailStorageAction;
QMailStore();
diff --git a/src/tools/messageserver/mailmessageclient.cpp b/src/tools/messageserver/mailmessageclient.cpp
index 258e9b2e..ef913253 100644
--- a/src/tools/messageserver/mailmessageclient.cpp
+++ b/src/tools/messageserver/mailmessageclient.cpp
@@ -144,6 +144,18 @@ MailMessageClient::MailMessageClient(QObject* parent)
this, SIGNAL(updateMessages(quint64, QString)));
connectIpc(adaptor, MESSAGE(updateMessages(quint64,QMailMessageMetaDataList)),
this, SIGNAL(updateMessages(quint64, QMailMessageMetaDataList)));
+ connectIpc(adaptor, MESSAGE(deleteMessages(quint64, QMailMessageIdList)),
+ this, SIGNAL(deleteMessages(quint64, QMailMessageIdList)));
+ connectIpc(adaptor, MESSAGE(rollBackUpdates(quint64, QMailAccountId)),
+ this, SIGNAL(rollBackUpdates(quint64, QMailAccountId)));
+ connectIpc(adaptor, MESSAGE(moveToStandardFolder(quint64, QMailMessageIdList, quint64)),
+ this, SIGNAL(moveToStandardFolder(quint64, QMailMessageIdList, quint64)));
+ connectIpc(adaptor, MESSAGE(moveToFolder(quint64, QMailMessageIdList, QMailFolderId)),
+ this, SIGNAL(moveToFolder(quint64, QMailMessageIdList, QMailFolderId)));
+ connectIpc(adaptor, MESSAGE(flagMessages(quint64, QMailMessageIdList, quint64, quint64)),
+ this, SIGNAL(flagMessages(quint64, QMailMessageIdList, quint64, quint64)));
+ connectIpc(adaptor, MESSAGE(restoreToPreviousFolder(quint64, QMailMessageKey)),
+ this, SIGNAL(restoreToPreviousFolder(quint64, QMailMessageKey)));
connectIpc(adaptor, MESSAGE(onlineCreateFolder(quint64, QString, QMailAccountId, QMailFolderId)),
this, SIGNAL(onlineCreateFolder(quint64,QString,QMailAccountId,QMailFolderId)));
connectIpc(adaptor, MESSAGE(onlineRenameFolder(quint64, QMailFolderId, QString)),
diff --git a/src/tools/messageserver/mailmessageclient.h b/src/tools/messageserver/mailmessageclient.h
index 2a9ba81c..6e6006ec 100644
--- a/src/tools/messageserver/mailmessageclient.h
+++ b/src/tools/messageserver/mailmessageclient.h
@@ -93,6 +93,12 @@ signals:
void addMessages(quint64, const QMailMessageMetaDataList &metadata);
void updateMessages(quint64, const QString &filename);
void updateMessages(quint64, const QMailMessageMetaDataList &metadata);
+ void deleteMessages(quint64, const QMailMessageIdList &ids);
+ void rollBackUpdates(quint64, const QMailAccountId &mailAccountId);
+ void moveToStandardFolder(quint64, const QMailMessageIdList& ids, quint64 standardFolder);
+ void moveToFolder(quint64, const QMailMessageIdList& ids, const QMailFolderId& folderId);
+ void flagMessages(quint64, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask);
+ void restoreToPreviousFolder(quint64, const QMailMessageKey& key);
void onlineCreateFolder(quint64, const QString &name, const QMailAccountId &accountId, const QMailFolderId &parentId);
void onlineRenameFolder(quint64, const QMailFolderId &folderId, const QString &name);
diff --git a/src/tools/messageserver/messageserver.cpp b/src/tools/messageserver/messageserver.cpp
index 4c868579..bba4ebb6 100644
--- a/src/tools/messageserver/messageserver.cpp
+++ b/src/tools/messageserver/messageserver.cpp
@@ -201,6 +201,18 @@ MessageServer::MessageServer(QObject *parent)
handler, SLOT(addMessages(quint64, QMailMessageMetaDataList)));
connect(client, SIGNAL(updateMessages(quint64, QMailMessageMetaDataList)),
handler, SLOT(updateMessages(quint64, QMailMessageMetaDataList)));
+ connect(client, SIGNAL(deleteMessages(quint64, QMailMessageIdList)),
+ handler, SLOT(deleteMessages(quint64, QMailMessageIdList)));
+ connect(client, SIGNAL(rollBackUpdates(quint64, QMailAccountId)),
+ handler, SLOT(rollBackUpdates(quint64, QMailAccountId)));
+ connect(client, SIGNAL(moveToStandardFolder(quint64, QMailMessageIdList, quint64)),
+ handler, SLOT(moveToStandardFolder(quint64, QMailMessageIdList, quint64)));
+ connect(client, SIGNAL(moveToFolder(quint64, QMailMessageIdList, QMailFolderId)),
+ handler, SLOT(moveToFolder(quint64, QMailMessageIdList, QMailFolderId)));
+ connect(client, SIGNAL(flagMessages(quint64, QMailMessageIdList, quint64, quint64)),
+ handler, SLOT(flagMessages(quint64, QMailMessageIdList, quint64, quint64)));
+ connect(client, SIGNAL(restoreToPreviousFolder(quint64, QMailMessageKey)),
+ handler, SLOT(restoreToPreviousFolder(quint64, QMailMessageKey)));
connect(client, SIGNAL(onlineCreateFolder(quint64, QString, QMailAccountId, QMailFolderId)),
handler, SLOT(onlineCreateFolder(quint64, QString, QMailAccountId, QMailFolderId)));
connect(client, SIGNAL(onlineRenameFolder(quint64, QMailFolderId, QString)),
diff --git a/src/tools/messageserver/servicehandler.cpp b/src/tools/messageserver/servicehandler.cpp
index 08756eb7..f1216772 100644
--- a/src/tools/messageserver/servicehandler.cpp
+++ b/src/tools/messageserver/servicehandler.cpp
@@ -47,6 +47,7 @@
#include <qmailmessageserver.h>
#include <qmailserviceconfiguration.h>
#include <qmailstore.h>
+#include <qmaildisconnected.h>
#include <qmaillog.h>
#include <qmailmessage.h>
#include <qmailcontentmanager.h>
@@ -1995,11 +1996,13 @@ void ServiceHandler::addOrUpdateMessages(quint64 action, const QString &filename
void ServiceHandler::addMessages(quint64 action, const QString &filename)
{
addOrUpdateMessages(action, filename, true);
+ QMailStore::instance()->flushIpcNotifications();
}
void ServiceHandler::updateMessages(quint64 action, const QString &filename)
{
addOrUpdateMessages(action, filename, false);
+ QMailStore::instance()->flushIpcNotifications();
}
void ServiceHandler::addMessages(quint64 action, const QMailMessageMetaDataList &messages)
@@ -2050,6 +2053,7 @@ void ServiceHandler::addMessages(quint64 action, const QMailMessageMetaDataList
emit messagesAdded(action, ids);
emit storageActionCompleted(action);
+ QMailStore::instance()->flushIpcNotifications();
}
void ServiceHandler::updateMessages(quint64 action, const QMailMessageMetaDataList &messages)
@@ -2108,6 +2112,7 @@ void ServiceHandler::updateMessages(quint64 action, const QMailMessageMetaDataLi
emit messagesUpdated(action, ids);
emit storageActionCompleted(action);
+ QMailStore::instance()->flushIpcNotifications();
}
bool ServiceHandler::dispatchOnlineFlagMessagesAndMoveToStandardFolder(quint64 action, const QByteArray &data)
@@ -2140,6 +2145,73 @@ bool ServiceHandler::dispatchOnlineFlagMessagesAndMoveToStandardFolder(quint64 a
return true;
}
+void ServiceHandler::deleteMessages(quint64 action, const QMailMessageIdList& messageIds)
+{
+ uint total = messageIds.count();
+
+ // Just delete all these messages from device and mark for deletion on server when exportUpdates is called
+ if (!messageIds.isEmpty() && !QMailStore::instance()->removeMessages(QMailMessageKey::id(messageIds), QMailStore::CreateRemovalRecord)) {
+ qWarning() << "Unable to service request to delete messages";
+ reportFailure(action, QMailServiceAction::Status::ErrFrameworkFault, tr("Could not delete messages"));
+ return;
+ }
+
+ emit progressChanged(action, total, total);
+ emit messagesDeleted(action, messageIds);
+ emit storageActionCompleted(action);
+ QMailStore::instance()->flushIpcNotifications();
+ return;
+}
+
+void ServiceHandler::rollBackUpdates(quint64 action, const QMailAccountId &mailAccountId)
+{
+ QMailDisconnected::rollBackUpdates(mailAccountId);
+
+ emit storageActionCompleted(action);
+ QMailStore::instance()->flushIpcNotifications();
+ return;
+}
+
+void ServiceHandler::moveToStandardFolder(quint64 action, const QMailMessageIdList& ids, quint64 standardFolder)
+{
+ QMailDisconnected::moveToStandardFolder(ids, static_cast<QMailFolder::StandardFolder>(standardFolder));
+ messagesMoved(ids, action);
+ messagesFlagged(ids, action);
+
+ emit storageActionCompleted(action);
+ QMailStore::instance()->flushIpcNotifications();
+ return;
+}
+
+void ServiceHandler::moveToFolder(quint64 action, const QMailMessageIdList& ids, const QMailFolderId& folderId)
+{
+ QMailDisconnected::moveToFolder(ids, folderId);
+ messagesMoved(ids, action);
+
+ emit storageActionCompleted(action);
+ QMailStore::instance()->flushIpcNotifications();
+ return;
+}
+
+void ServiceHandler::flagMessages(quint64 action, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask)
+{
+ QMailDisconnected::flagMessages(ids, setMask, unsetMask, "");
+ messagesFlagged(ids, action);
+
+ emit storageActionCompleted(action);
+ QMailStore::instance()->flushIpcNotifications();
+ return;
+}
+
+void ServiceHandler::restoreToPreviousFolder(quint64 action, const QMailMessageKey& key)
+{
+ QMailDisconnected::restoreToPreviousFolder(key);
+
+ emit storageActionCompleted(action);
+ QMailStore::instance()->flushIpcNotifications();
+ return;
+}
+
void ServiceHandler::onlineCreateFolder(quint64 action, const QString &name, const QMailAccountId &accountId, const QMailFolderId &parentId)
{
if(accountId.isValid()) {
diff --git a/src/tools/messageserver/servicehandler.h b/src/tools/messageserver/servicehandler.h
index ab87e2e9..15789983 100644
--- a/src/tools/messageserver/servicehandler.h
+++ b/src/tools/messageserver/servicehandler.h
@@ -85,6 +85,13 @@ public slots:
void addMessages(quint64 action, const QMailMessageMetaDataList &messages);
void updateMessages(quint64 action, const QString &filename);
void updateMessages(quint64 action, const QMailMessageMetaDataList &messages);
+ void deleteMessages(quint64 action, const QMailMessageIdList &ids);
+ void rollBackUpdates(quint64 action, const QMailAccountId &mailAccountId);
+ void moveToStandardFolder(quint64 action, const QMailMessageIdList& ids, quint64 standardFolder);
+ void moveToFolder(quint64 action, const QMailMessageIdList& ids, const QMailFolderId& folderId);
+ void flagMessages(quint64 action, const QMailMessageIdList& ids, quint64 setMask, quint64 unsetMask);
+ void restoreToPreviousFolder(quint64, const QMailMessageKey& key);
+
void onlineCreateFolder(quint64 action, const QString &name, const QMailAccountId &accountId, const QMailFolderId &parentId);
void onlineRenameFolder(quint64 action, const QMailFolderId &folderId, const QString &name);
void onlineDeleteFolder(quint64 action, const QMailFolderId &folderId);
diff --git a/tests/tests.pro b/tests/tests.pro
index 8c46c4a2..24e9e4bc 100644
--- a/tests/tests.pro
+++ b/tests/tests.pro
@@ -15,6 +15,7 @@ SUBDIRS = \
tst_longstream \
tst_qmailmessageset \
tst_qmailserviceaction \
+ tst_qmailstorageaction \
tst_qmail_sortkeys \
tst_qmail_listmodels \
tst_qmaillog \
diff --git a/tests/tst_qmailstorageaction/tst_qmailstorageaction.cpp b/tests/tst_qmailstorageaction/tst_qmailstorageaction.cpp
new file mode 100644
index 00000000..dca63cfc
--- /dev/null
+++ b/tests/tst_qmailstorageaction/tst_qmailstorageaction.cpp
@@ -0,0 +1,828 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Messaging Framework.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QObject>
+#include <QTest>
+#include <qmailserviceaction.h>
+#include <qmailserviceaction_p.h>
+#include <qmailaccount.h>
+#include <qmaildisconnected.h>
+#include <qmailnamespace.h>
+
+static bool isMessageServerRunning()
+{
+ QString lockfile = "messageserver-instance.lock";
+ int lockid = QMail::fileLock(lockfile);
+ if (lockid == -1)
+ return true;
+
+ QMail::fileUnlock(lockid);
+ return false;
+}
+
+class tst_QMailStorageAction : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QMailStorageAction() {}
+ virtual ~tst_QMailStorageAction() {}
+
+private slots:
+ void initTestCase();
+ void cleanupTestCase();
+
+ void test_storageaction_add();
+ void test_storageaction_update_message();
+ void test_storageaction_update_messagemetadata();
+ void test_storageaction_movetostandardfolder();
+ void test_storageaction_restoretopreviousfolder();
+ void test_storageaction_movetofolder();
+ void test_storageaction_flagMessages();
+ void test_storageaction_rollBackUpdates();
+ void test_storageaction_deleteMessages();
+ void test_storageaction_discardMessages();
+
+private:
+ QMailAccountId accountId1, accountId2, accountId3, accountId4;
+ QMailFolderId inboxId1, inboxId2, inboxId3, trashId1, trashId2, savedId1, savedId2, archivedId1, archivedId2;
+ QMailMessageId smsMessage, inboxMessage1, archivedMessage1, inboxMessage2, savedMessage2;
+
+ QSet<QMailAccountId> noAccounts, verifiedAccounts, unverifiedAccounts, allAccounts;
+ QSet<QMailFolderId> noFolders, allFolders, standardFolders;
+ QSet<QMailMessageId> noMessages, allMessages, allEmailMessages;
+};
+
+QTEST_MAIN(tst_QMailStorageAction)
+
+#include "tst_qmailstorageaction.moc"
+
+void tst_QMailStorageAction::initTestCase()
+{
+ if (!isMessageServerRunning()) {
+ qWarning() << "tst_QMailStorageAction requires messageserver to be running";
+ QVERIFY(isMessageServerRunning());
+ exit(1);
+ }
+
+ // Instantiate the store to initialise the values of the status flags and create the standard folders
+ QMailStore::instance();
+
+ // Create the data set we will test our keys upon
+ standardFolders << QMailFolderId(QMailFolder::LocalStorageFolderId);
+
+ {
+ QMailAccount account;
+ account.setName("Account 1");
+ account.setMessageType(QMailMessage::Email);
+ account.setFromAddress(QMailAddress("Account 1", "account1@example.org"));
+ account.setStatus(QMailAccount::SynchronizationEnabled, false);
+ account.setStatus(QMailAccount::Synchronized, false);
+ account.setStatus(QMailAccount::MessageSource, true);
+ account.setStatus(QMailAccount::CanRetrieve, true);
+ account.setStatus(QMailAccount::MessageSink, true);
+ account.setStatus(QMailAccount::CanTransmit, true);
+ account.setCustomField("verified", "true");
+ account.setCustomField("question", "What is your dog's name?");
+ account.setCustomField("answer", "Fido");
+
+ QMailAccountConfiguration config;
+ config.addServiceConfiguration("imap4");
+ if (QMailAccountConfiguration::ServiceConfiguration *svcCfg = &config.serviceConfiguration("imap4")) {
+ svcCfg->setValue("server", "mail.example.org");
+ svcCfg->setValue("username", "account1");
+ }
+ config.addServiceConfiguration("smtp");
+ if (QMailAccountConfiguration::ServiceConfiguration *svcCfg = &config.serviceConfiguration("smtp")) {
+ svcCfg->setValue("server", "mail.example.org");
+ svcCfg->setValue("username", "account1");
+ }
+
+ QVERIFY(QMailStore::instance()->addAccount(&account, &config));
+ accountId1 = account.id();
+ allAccounts << account.id();
+ verifiedAccounts << account.id();
+ }
+
+ {
+ QMailAccount account;
+ account.setName("Account 2");
+ account.setMessageType(QMailMessage::Instant);
+ account.setFromAddress(QMailAddress("Account 2", "account2@example.org"));
+ account.setStatus(QMailAccount::SynchronizationEnabled, true);
+ account.setStatus(QMailAccount::Synchronized, false);
+ account.setStatus(QMailAccount::MessageSource, true);
+ account.setStatus(QMailAccount::CanRetrieve, true);
+ account.setCustomField("verified", "true");
+ account.setCustomField("question", "What is your dog's name?");
+ account.setCustomField("answer", "Lassie");
+
+ QMailAccountConfiguration config;
+ config.addServiceConfiguration("imap4");
+ if (QMailAccountConfiguration::ServiceConfiguration *svcCfg = &config.serviceConfiguration("imap4")) {
+ svcCfg->setValue("server", "imap.example.org");
+ svcCfg->setValue("username", "account2");
+ }
+
+ QVERIFY(QMailStore::instance()->addAccount(&account, &config));
+ accountId2 = account.id();
+ allAccounts << account.id();
+ verifiedAccounts << account.id();
+ }
+
+ {
+ QMailAccount account;
+ account.setName("Account 3");
+ account.setMessageType(QMailMessage::None);
+ account.setFromAddress(QMailAddress("Account 3", "account3@test"));
+ account.setCustomField("verified", "false");
+
+ QVERIFY(QMailStore::instance()->addAccount(&account, 0));
+ accountId3 = account.id();
+ allAccounts << account.id();
+ unverifiedAccounts << account.id();
+ }
+
+ {
+ QMailAccount account;
+ account.setName("Account 4");
+ account.setMessageType(QMailMessage::None);
+ account.setFromAddress(QMailAddress("Account 4", "account4@test"));
+ account.setCustomField("verified", "false");
+
+ QVERIFY(QMailStore::instance()->addAccount(&account, 0));
+ accountId4 = account.id();
+ allAccounts << account.id();
+ unverifiedAccounts << account.id();
+ }
+
+ QVERIFY(!QMailDisconnected::updatesOutstanding(accountId1));
+ QVERIFY(!QMailDisconnected::updatesOutstanding(accountId2));
+ QVERIFY(!QMailDisconnected::updatesOutstanding(accountId3));
+ QVERIFY(!QMailDisconnected::updatesOutstanding(accountId4));
+
+ {
+ QMailFolder folder;
+ folder.setPath("Inbox");
+ folder.setDisplayName("Inbox");
+ folder.setParentFolderId(QMailFolderId());
+ folder.setParentAccountId(accountId1);
+ folder.setStatus(QMailFolder::SynchronizationEnabled, true);
+ folder.setStatus(QMailFolder::Synchronized, false);
+ folder.setCustomField("uidValidity", "abcdefg");
+ folder.setCustomField("uidNext", "1");
+
+ QVERIFY(QMailStore::instance()->addFolder(&folder));
+ inboxId1 = folder.id();
+ allFolders << folder.id();
+ }
+
+ {
+ QMailFolder folder;
+ folder.setPath("Inbox/Saved");
+ folder.setDisplayName("Saved");
+ folder.setParentFolderId(inboxId1);
+ folder.setParentAccountId(accountId1);
+ folder.setStatus(QMailFolder::SynchronizationEnabled, true);
+ folder.setStatus(QMailFolder::Synchronized, true);
+ folder.setCustomField("uidValidity", "hijklmnop");
+ folder.setCustomField("uidNext", "11");
+
+ QVERIFY(QMailStore::instance()->addFolder(&folder));
+ savedId1 = folder.id();
+ allFolders << folder.id();
+ }
+
+ {
+ QMailFolder folder;
+ folder.setPath("Inbox/Saved/Archived");
+ folder.setDisplayName("Archived");
+ folder.setParentFolderId(savedId1);
+ folder.setParentAccountId(accountId1);
+ folder.setStatus(QMailFolder::SynchronizationEnabled, false);
+ folder.setStatus(QMailFolder::Synchronized, false);
+ folder.setCustomField("archived", "true");
+ folder.setCustomField("uidNext", "111");
+
+ QVERIFY(QMailStore::instance()->addFolder(&folder));
+ archivedId1 = folder.id();
+ allFolders << folder.id();
+ }
+
+ {
+ QMailFolder folder;
+ folder.setPath("Inbox");
+ folder.setDisplayName("Inbox");
+ folder.setParentFolderId(QMailFolderId());
+ folder.setParentAccountId(accountId2);
+ folder.setStatus(QMailFolder::SynchronizationEnabled, false);
+ folder.setStatus(QMailFolder::Synchronized, false);
+ folder.setCustomField("uidValidity", "qrstuv");
+ folder.setCustomField("uidNext", "1");
+
+ QVERIFY(QMailStore::instance()->addFolder(&folder));
+ inboxId2 = folder.id();
+ allFolders << folder.id();
+ }
+
+ {
+ QMailFolder folder;
+ folder.setPath("Trash");
+ folder.setDisplayName("Trash");
+ folder.setParentFolderId(QMailFolderId());
+ folder.setParentAccountId(accountId2);
+ folder.setStatus(QMailFolder::SynchronizationEnabled, false);
+ folder.setStatus(QMailFolder::Synchronized, false);
+ folder.setStatus(QMailFolder::TrashFolder, true);
+ folder.setCustomField("uidValidity", "qrstux");
+ folder.setCustomField("uidNext", "1");
+
+ QVERIFY(QMailStore::instance()->addFolder(&folder));
+ trashId1 = folder.id();
+ allFolders << folder.id();
+
+ QMailAccount account(accountId2);
+ account.setStandardFolder(QMailFolder::TrashFolder, trashId1);
+ QVERIFY(QMailStore::instance()->updateAccount(&account));
+ }
+
+ {
+ QMailFolder folder;
+ folder.setPath("Inbox/Saved");
+ folder.setDisplayName("Saved");
+ folder.setParentFolderId(inboxId2);
+ folder.setParentAccountId(accountId2);
+ folder.setStatus(QMailFolder::SynchronizationEnabled, false);
+ folder.setStatus(QMailFolder::Synchronized, true);
+ folder.setCustomField("uidValidity", "wxyz");
+ folder.setCustomField("uidNext", "11");
+
+ QVERIFY(QMailStore::instance()->addFolder(&folder));
+ savedId2 = folder.id();
+ allFolders << folder.id();
+ }
+
+ {
+ QMailFolder folder;
+ folder.setPath("Inbox/Saved/Archived");
+ folder.setDisplayName("Archived");
+ folder.setParentFolderId(savedId2);
+ folder.setParentAccountId(accountId2);
+ folder.setStatus(QMailFolder::SynchronizationEnabled, false);
+ folder.setStatus(QMailFolder::Synchronized, false);
+ folder.setCustomField("archived", "true");
+ folder.setCustomField("uidNext", "111");
+
+ QVERIFY(QMailStore::instance()->addFolder(&folder));
+ archivedId2 = folder.id();
+ allFolders << folder.id();
+ }
+
+ {
+ QMailFolder folder;
+ folder.setPath("Inbox");
+ folder.setDisplayName("Inbox");
+ folder.setParentFolderId(QMailFolderId());
+ folder.setParentAccountId(accountId3);
+ folder.setStatus(QMailFolder::SynchronizationEnabled, false);
+ folder.setStatus(QMailFolder::Synchronized, false);
+ folder.setCustomField("uidValidity", "qrstua");
+ folder.setCustomField("uidNext", "1");
+
+ QVERIFY(QMailStore::instance()->addFolder(&folder));
+ inboxId3 = folder.id();
+ allFolders << folder.id();
+ }
+
+ {
+ QMailFolder folder;
+ folder.setPath("Trash");
+ folder.setDisplayName("Trash");
+ folder.setParentFolderId(QMailFolderId());
+ folder.setParentAccountId(accountId3);
+ folder.setStatus(QMailFolder::SynchronizationEnabled, false);
+ folder.setStatus(QMailFolder::Synchronized, false);
+ folder.setStatus(QMailFolder::TrashFolder, true);
+ folder.setCustomField("uidValidity", "qrstub");
+ folder.setCustomField("uidNext", "1");
+
+ QVERIFY(QMailStore::instance()->addFolder(&folder));
+ trashId2 = folder.id();
+ allFolders << folder.id();
+
+ QMailAccount account(accountId3);
+ account.setStandardFolder(QMailFolder::TrashFolder, trashId2);
+ QVERIFY(QMailStore::instance()->updateAccount(&account));
+ }
+
+ {
+ QMailMessage message;
+ message.setMessageType(QMailMessage::Sms);
+ message.setParentAccountId(accountId4);
+ message.setParentFolderId(QMailFolder::LocalStorageFolderId);
+ message.setFrom(QMailAddress("0404404040"));
+ message.setTo(QMailAddress("0404040404"));
+ message.setSubject("Where are you?");
+ message.setDate(QMailTimeStamp(QDateTime(QDate::currentDate())));
+ message.setReceivedDate(QMailTimeStamp(QDateTime(QDate::currentDate())));
+ message.setStatus(QMailMessage::Incoming, true);
+ message.setStatus(QMailMessage::New, false);
+ message.setStatus(QMailMessage::Read, true);
+ message.setServerUid("sim:12345");
+ message.setSize(1 * 1024);
+ message.setContent(QMailMessage::PlainTextContent);
+ message.setCustomField("present", "true");
+ message.setCustomField("todo", "true");
+
+ QVERIFY(QMailStore::instance()->addMessage(&message));
+ smsMessage = message.id();
+ allMessages << message.id();
+ }
+
+ {
+ QMailMessage message;
+ message.setMessageType(QMailMessage::Email);
+ message.setParentAccountId(accountId1);
+ message.setParentFolderId(inboxId1);
+ message.setFrom(QMailAddress("account2@example.org"));
+ message.setTo(QMailAddress("account1@example.org"));
+ message.setSubject("inboxMessage1");
+ message.setDate(QMailTimeStamp(QDateTime(QDate::currentDate())));
+ message.setReceivedDate(QMailTimeStamp(QDateTime(QDate::currentDate())));
+ message.setStatus(QMailMessage::Incoming, true);
+ message.setStatus(QMailMessage::New, true);
+ message.setStatus(QMailMessage::Read, false);
+ message.setServerUid("inboxMessage1");
+ message.setSize(5 * 1024);
+ message.setContent(QMailMessage::PlainTextContent);
+ message.setCustomField("present", "true");
+
+ QVERIFY(QMailStore::instance()->addMessage(&message));
+ inboxMessage1 = message.id();
+ allMessages << message.id();
+ allEmailMessages << message.id();
+ }
+
+ {
+ QMailMessage message;
+ message.setMessageType(QMailMessage::Email);
+ message.setParentAccountId(accountId1);
+ message.setParentFolderId(inboxId1);
+ message.setFrom(QMailAddress("account1@example.org"));
+ message.setTo(QMailAddress("fred@example.net"));
+ message.setSubject("archivedMessage1");
+ message.setDate(QMailTimeStamp(QDateTime(QDate::currentDate().addDays(-1))));
+ message.setReceivedDate(QMailTimeStamp(QDateTime(QDate::currentDate().addDays(-1))));
+ message.setStatus(QMailMessage::Outgoing, true);
+ message.setStatus(QMailMessage::New, false);
+ message.setStatus(QMailMessage::Sent, true);
+ message.setServerUid("archivedMessage1");
+ message.setSize(15 * 1024);
+ message.setContent(QMailMessage::VideoContent);
+ message.setCustomField("present", "true");
+
+ QVERIFY(QMailStore::instance()->addMessage(&message));
+
+ message.setPreviousParentFolderId(message.parentFolderId());
+ message.setParentFolderId(archivedId1);
+ QVERIFY(QMailStore::instance()->updateMessage(&message));
+
+ archivedMessage1 = message.id();
+ allMessages << message.id();
+ allEmailMessages << message.id();
+ }
+
+ {
+ QMailMessage message;
+ message.setMessageType(QMailMessage::Email);
+ message.setParentAccountId(accountId2);
+ message.setParentFolderId(inboxId2);
+ message.setFrom(QMailAddress("account1@example.org"));
+ message.setTo(QMailAddress("account2@example.org"));
+ message.setSubject("Fwd:inboxMessage2");
+ message.setDate(QMailTimeStamp(QDateTime(QDate::currentDate())));
+ message.setReceivedDate(QMailTimeStamp(QDateTime(QDate::currentDate())));
+ message.setStatus(QMailMessage::Incoming, true);
+ message.setStatus(QMailMessage::New, true);
+ message.setStatus(QMailMessage::Read, true);
+ message.setServerUid("inboxMessage2");
+ message.setSize(5 * 1024);
+ message.setContent(QMailMessage::HtmlContent);
+ message.setInResponseTo(inboxMessage1);
+ message.setResponseType(QMailMessage::Forward);
+ message.setCustomField("present", "true");
+ message.setCustomField("todo", "false");
+
+ QVERIFY(QMailStore::instance()->addMessage(&message));
+ inboxMessage2 = message.id();
+ allMessages << message.id();
+ allEmailMessages << message.id();
+ }
+
+ {
+ QMailMessage message;
+ message.setMessageType(QMailMessage::Email);
+ message.setParentAccountId(accountId2);
+ message.setParentFolderId(inboxId2);
+ message.setFrom(QMailAddress("fred@example.net"));
+ message.setTo(QMailAddressList() << QMailAddress("account2@example.org") << QMailAddress("testing@test"));
+ message.setSubject("Re:savedMessage2");
+ message.setDate(QMailTimeStamp(QDateTime(QDate::currentDate().addDays(-7))));
+ message.setReceivedDate(QMailTimeStamp(QDateTime(QDate::currentDate().addDays(-7))));
+ message.setStatus(QMailMessage::Incoming, true);
+ message.setStatus(QMailMessage::New, false);
+ message.setStatus(QMailMessage::Read, false);
+ message.setServerUid("savedMessage2");
+ message.setSize(5 * 1024);
+ message.setContent(QMailMessage::HtmlContent);
+ message.setInResponseTo(archivedMessage1);
+ message.setResponseType(QMailMessage::Reply);
+ message.setCustomField("present", "true");
+
+ QVERIFY(QMailStore::instance()->addMessage(&message));
+
+ message.setPreviousParentFolderId(message.parentFolderId());
+ message.setParentFolderId(savedId2);
+ QVERIFY(QMailStore::instance()->updateMessage(&message));
+
+ savedMessage2 = message.id();
+ allMessages << message.id();
+ allEmailMessages << message.id();
+ }
+}
+
+
+void tst_QMailStorageAction::cleanupTestCase()
+{
+ QMailStore::instance()->removeAccounts(QMailAccountKey::customField("verified"));
+ QMailStore::instance()->removeMessages(QMailMessageKey::customField("present"));
+ QMailStore::instance()->removeFolders(QMailFolderKey::customField("uidNext"));
+}
+
+void tst_QMailStorageAction::test_storageaction_add()
+{
+ QMailStorageAction action;
+ QMailMessageId saved3id;
+ QMailMessage message;
+ QMailMessageList messages;
+
+ message.setMessageType(QMailMessage::Email);
+ message.setParentAccountId(accountId2);
+ message.setParentFolderId(inboxId2);
+ message.setFrom(QMailAddress("wilma@example.net"));
+ message.setTo(QMailAddressList() << QMailAddress("account2@example.org") << QMailAddress("testing@test"));
+ message.setSubject("Simple test message");
+ message.setDate(QMailTimeStamp(QDateTime(QDate::currentDate().addDays(-100))));
+ message.setReceivedDate(QMailTimeStamp(QDateTime(QDate::currentDate().addDays(-100))));
+ message.setStatus(QMailMessage::Incoming, true);
+ message.setStatus(QMailMessage::New, false);
+ message.setStatus(QMailMessage::Read, false);
+ message.setServerUid("savedMessage3");
+ message.setSize(5 * 1024);
+ message.setContent(QMailMessage::HtmlContent);
+ message.setCustomField("present", "true");
+
+ messages << message;
+ action.addMessages(messages);
+
+ int i = 0;
+ while (action.isRunning() && i++ < 1000)
+ QTest::qWait(10);
+ QTest::qWait(0);
+
+ QVERIFY(action.status().errorCode == QMailServiceAction::Status::ErrNoError);
+ QVERIFY(action.activity() == QMailServiceAction::Successful);
+
+ QMailMessageKey savedMessage3Key(QMailMessageKey::serverUid("savedMessage3"));
+ QVERIFY(QMailStore::instance()->countMessages(savedMessage3Key) == 1);
+ message = QMailStore::instance()->message("savedMessage3", accountId2);
+ saved3id = message.id();
+ QVERIFY(saved3id.isValid());
+}
+
+void tst_QMailStorageAction::test_storageaction_update_message()
+{
+ QMailStorageAction action;
+ QMailMessageId saved3id;
+ QMailMessageList messages;
+ QMailMessage message;
+
+ message = QMailStore::instance()->message("savedMessage3", accountId2);
+ saved3id = message.id();
+ QVERIFY(saved3id.isValid());
+
+ QString subject("Updated simple test message");
+ message.setSubject(subject);
+ messages << message;
+ action.updateMessages(messages);
+
+ int i = 0;
+ while (action.isRunning() && i++ < 1000)
+ QTest::qWait(10);
+ QTest::qWait(0);
+
+ QVERIFY(action.status().errorCode == QMailServiceAction::Status::ErrNoError);
+ QVERIFY(action.activity() == QMailServiceAction::Successful);
+
+ QMailMessage saved3(saved3id);
+ QVERIFY(saved3.subject() == subject);
+}
+
+void tst_QMailStorageAction::test_storageaction_update_messagemetadata()
+{
+ QMailStorageAction action;
+ QMailMessageId saved3id;
+ QMailMessageMetaDataList metadatalist;
+ QMailMessageMetaData metadata;
+
+ metadata = QMailStore::instance()->message("savedMessage3", accountId2);
+ saved3id = metadata.id();
+ QVERIFY((metadata.status() & QMailMessage::Read) == false);
+ QVERIFY(saved3id.isValid());
+
+ QString subject("Updated again simple test message");
+ metadata.setSubject(subject);
+ metadata.setStatus(QMailMessage::Read, true);
+ metadatalist << metadata;
+ action.updateMessages(metadatalist);
+
+ int i = 0;
+ while (action.isRunning() && i++ < 1000)
+ QTest::qWait(10);
+ QTest::qWait(0);
+
+ QVERIFY(action.status().errorCode == QMailServiceAction::Status::ErrNoError);
+ QVERIFY(action.activity() == QMailServiceAction::Successful);
+
+ QMailMessage saved3(saved3id);
+ QVERIFY(saved3.subject() == subject);
+ QVERIFY(saved3.status() & QMailMessage::Read);
+}
+
+void tst_QMailStorageAction::test_storageaction_movetostandardfolder()
+{
+ QMailStorageAction action;
+ QMailMessageIdList list;
+
+ list = QMailStore::instance()->queryMessages(QMailMessageKey::serverUid("savedMessage3"));
+ QVERIFY(list.count() == 1);
+ int oldTrashCount = QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(trashId1));
+ int oldInboxCount = QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(inboxId2));
+
+ action.moveToStandardFolder(list, QMailFolder::TrashFolder);
+
+ int i = 0;
+ while (action.isRunning() && i++ < 1000)
+ QTest::qWait(10);
+ QTest::qWait(0);
+
+ QVERIFY(action.status().errorCode == QMailServiceAction::Status::ErrNoError);
+ QVERIFY(action.activity() == QMailServiceAction::Successful);
+
+ QVERIFY(QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(trashId1)) == (oldTrashCount + 1));
+ QVERIFY(QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(inboxId2)) == (oldInboxCount - 1));
+
+ QMailMessageMetaData metadata("savedMessage3", accountId2);
+ QVERIFY(metadata.parentFolderId() == trashId1);
+ QVERIFY(metadata.previousParentFolderId() == inboxId2);
+ QVERIFY(metadata.status() & QMailMessage::Trash);
+}
+
+void tst_QMailStorageAction::test_storageaction_restoretopreviousfolder()
+{
+ QMailStorageAction action;
+ QMailMessageIdList list;
+
+ list = QMailStore::instance()->queryMessages(QMailMessageKey::serverUid("savedMessage3"));
+ QVERIFY(list.count() == 1);
+ int oldInboxCount = QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(inboxId2));
+ int oldTrashCount = QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(trashId1));
+
+ action.restoreToPreviousFolder(QMailMessageKey::id(list));
+
+ int i = 0;
+ while (action.isRunning() && i++ < 1000)
+ QTest::qWait(10);
+ QTest::qWait(0);
+
+ QVERIFY(action.status().errorCode == QMailServiceAction::Status::ErrNoError);
+ QVERIFY(action.activity() == QMailServiceAction::Successful);
+
+ QVERIFY(QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(inboxId2)) == (oldInboxCount + 1));
+ QVERIFY(QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(trashId1)) == (oldTrashCount - 1));
+
+ QMailMessageMetaData metadata("savedMessage3", accountId2);
+ QVERIFY(metadata.parentFolderId() == inboxId2);
+ QVERIFY(metadata.previousParentFolderId() == QMailFolderId());
+}
+
+void tst_QMailStorageAction::test_storageaction_movetofolder()
+{
+ QMailStorageAction action;
+ QMailMessageIdList list;
+
+ list = QMailStore::instance()->queryMessages(QMailMessageKey::serverUid("savedMessage3"));
+ QVERIFY(list.count() == 1);
+ int oldInboxCount = QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(inboxId2));
+ int oldTrashCount = QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(trashId1));
+
+ action.moveToFolder(list, trashId1);
+
+ int i = 0;
+ while (action.isRunning() && i++ < 1000)
+ QTest::qWait(10);
+ QTest::qWait(0);
+
+ QVERIFY(action.status().errorCode == QMailServiceAction::Status::ErrNoError);
+ QVERIFY(action.activity() == QMailServiceAction::Successful);
+
+ QVERIFY(QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(inboxId2)) == (oldInboxCount - 1));
+ QVERIFY(QMailStore::instance()->countMessages(QMailMessageKey::parentFolderId(trashId1)) == (oldTrashCount + 1));
+
+ QMailMessageMetaData metadata("savedMessage3", accountId2);
+ QVERIFY(metadata.parentFolderId() == trashId1);
+ QVERIFY(metadata.previousParentFolderId() == inboxId2);
+}
+
+void tst_QMailStorageAction::test_storageaction_flagMessages()
+{
+ QMailStorageAction action;
+ QMailMessageIdList list;
+
+ QMailMessageMetaData metadata("savedMessage3", accountId2);
+ QVERIFY(metadata.status() & QMailMessage::Read);
+
+ list = QMailStore::instance()->queryMessages(QMailMessageKey::serverUid("savedMessage3"));
+ QVERIFY(list.count() == 1);
+
+ action.flagMessages(list, 0, QMailMessage::Read);
+
+ int i = 0;
+ while (action.isRunning() && i++ < 1000)
+ QTest::qWait(10);
+ QTest::qWait(0);
+
+ QVERIFY(action.status().errorCode == QMailServiceAction::Status::ErrNoError);
+ QVERIFY(action.activity() == QMailServiceAction::Successful);
+
+ QMailMessageMetaData metadataAfter("savedMessage3", accountId2);
+ QVERIFY((metadataAfter.status() & QMailMessage::Read) == false);
+}
+
+void tst_QMailStorageAction::test_storageaction_rollBackUpdates()
+{
+ QMailStorageAction action;
+ QMailMessageId saved3id;
+ QMailMessage message;
+ QMailMessageIdList list;
+
+ message.setMessageType(QMailMessage::Email);
+ message.setParentAccountId(accountId3);
+ message.setParentFolderId(inboxId3);
+ message.setFrom(QMailAddress("barney@example.net"));
+ message.setTo(QMailAddressList() << QMailAddress("account3@example.org") << QMailAddress("testing@test"));
+ message.setSubject("Rollback test message");
+ message.setDate(QMailTimeStamp(QDateTime(QDate::currentDate().addDays(-98))));
+ message.setReceivedDate(QMailTimeStamp(QDateTime(QDate::currentDate().addDays(-98))));
+ message.setStatus(QMailMessage::Incoming, true);
+ message.setStatus(QMailMessage::New, false);
+ message.setStatus(QMailMessage::Read, false);
+ message.setServerUid("savedMessage5");
+ message.setSize(7 * 1024);
+ message.setContent(QMailMessage::HtmlContent);
+ message.setCustomField("present", "true");
+
+ QVERIFY(QMailStore::instance()->addMessage(&message));
+
+ QMailMessageMetaData metadata("savedMessage5", accountId3);
+ QVERIFY(metadata.parentFolderId() == inboxId3);
+ QVERIFY(metadata.previousParentFolderId() == QMailFolderId());
+
+ list = QMailStore::instance()->queryMessages(QMailMessageKey::serverUid("savedMessage5"));
+ QVERIFY(list.count() == 1);
+
+ QMailDisconnected::moveToFolder(list, trashId2);
+ {
+ QMailMessageMetaData m("savedMessage5", accountId3);
+ QVERIFY(m.parentFolderId() == trashId2);
+ QVERIFY(m.previousParentFolderId() == inboxId3);
+ }
+ action.rollBackUpdates(accountId3);
+
+ int i = 0;
+ while (action.isRunning() && i++ < 1000)
+ QTest::qWait(10);
+ QTest::qWait(0);
+
+ QVERIFY(action.status().errorCode == QMailServiceAction::Status::ErrNoError);
+ QVERIFY(action.activity() == QMailServiceAction::Successful);
+
+ QMailMessageMetaData metadataAfter("savedMessage5", accountId3);
+ QVERIFY(metadataAfter.parentFolderId() == inboxId3);
+ QVERIFY(metadataAfter.previousParentFolderId() == QMailFolderId());
+
+ // Can't test QMailDisconnected::upatesOutstanding(accountId3) == false, because having any
+ // local messages at all causes a folder to be considered as having updates outstanding
+}
+
+void tst_QMailStorageAction::test_storageaction_deleteMessages()
+{
+ QMailStorageAction action;
+ QMailMessageIdList list;
+
+ list = QMailStore::instance()->queryMessages(QMailMessageKey::serverUid("savedMessage3"));
+ QVERIFY(list.count() == 1);
+
+ action.deleteMessages(list);
+
+ int i = 0;
+ while (action.isRunning() && i++ < 1000)
+ QTest::qWait(10);
+ QTest::qWait(0);
+
+ QVERIFY(action.status().errorCode == QMailServiceAction::Status::ErrNoError);
+ QVERIFY(action.activity() == QMailServiceAction::Successful);
+
+ list = QMailStore::instance()->queryMessages(QMailMessageKey::serverUid("savedMessage3"));
+ QVERIFY(list.count() == 0);
+}
+
+
+void tst_QMailStorageAction::test_storageaction_discardMessages()
+{
+ QMailStorageAction action;
+ QMailMessageId saved3id;
+ QMailMessage message;
+ QMailMessageIdList messages;
+
+ message.setMessageType(QMailMessage::Email);
+ message.setParentAccountId(accountId2);
+ message.setParentFolderId(inboxId2);
+ message.setFrom(QMailAddress("barney@example.net"));
+ message.setTo(QMailAddressList() << QMailAddress("account2@example.org") << QMailAddress("testing@test"));
+ message.setSubject("Another test message");
+ message.setDate(QMailTimeStamp(QDateTime(QDate::currentDate().addDays(-99))));
+ message.setReceivedDate(QMailTimeStamp(QDateTime(QDate::currentDate().addDays(-99))));
+ message.setStatus(QMailMessage::Incoming, true);
+ message.setStatus(QMailMessage::New, false);
+ message.setStatus(QMailMessage::Read, false);
+ message.setServerUid("savedMessage4");
+ message.setSize(6 * 1024);
+ message.setContent(QMailMessage::HtmlContent);
+ message.setCustomField("present", "true");
+
+ QVERIFY(QMailStore::instance()->addMessage(&message));
+ QMailMessageKey savedMessage4Key(QMailMessageKey::serverUid("savedMessage4"));
+ QVERIFY(QMailStore::instance()->countMessages(savedMessage4Key) == 1);
+
+ messages << message.id();
+ action.discardMessages(messages);
+
+ int i = 0;
+ while (action.isRunning() && i++ < 1000)
+ QTest::qWait(10);
+ QTest::qWait(0);
+
+ QVERIFY(action.status().errorCode == QMailServiceAction::Status::ErrNoError);
+ QVERIFY(action.activity() == QMailServiceAction::Successful);
+
+ QVERIFY(QMailStore::instance()->countMessages(savedMessage4Key) == 0);
+}
diff --git a/tests/tst_qmailstorageaction/tst_qmailstorageaction.pro b/tests/tst_qmailstorageaction/tst_qmailstorageaction.pro
new file mode 100644
index 00000000..d3b91b33
--- /dev/null
+++ b/tests/tst_qmailstorageaction/tst_qmailstorageaction.pro
@@ -0,0 +1,8 @@
+TEMPLATE = app
+CONFIG += qtestlib unittest qmfclient
+TARGET = tst_qmailstorageaction
+
+SOURCES += tst_qmailstorageaction.cpp
+
+include(../tests.pri)
+