summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValerio Valerio <valerio.valerio@nokia.com>2012-01-20 13:28:28 +0200
committerValerio Valerio <valerio.valerio@nokia.com>2012-01-20 13:28:28 +0200
commite5f1fd7139f24571b325c0cb357b6d95ed504eb5 (patch)
tree24f0ce4182f63c67acf490b3aa072862c2f63026
parent4582636586ed1e29b2f893f1ed626db9d95b23fa (diff)
Conversation support improvements from MeeGo QMF - patch 3.conversations_improvements
-rw-r--r--src/libraries/qmfclient/qmailserviceaction.cpp2
-rw-r--r--src/libraries/qmfclient/qmailstore.cpp12
-rw-r--r--src/libraries/qmfclient/qmailstore_p.cpp352
-rw-r--r--src/libraries/qmfclient/qmailstore_p.h4
-rw-r--r--src/libraries/qmfclient/qmailthreadkey.cpp1
-rw-r--r--src/plugins/messageservices/imap/imapstructure.cpp2
-rw-r--r--src/plugins/messageservices/smtp/smtpauthenticator.cpp2
7 files changed, 182 insertions, 193 deletions
diff --git a/src/libraries/qmfclient/qmailserviceaction.cpp b/src/libraries/qmfclient/qmailserviceaction.cpp
index 02ad3754..34c8f0f1 100644
--- a/src/libraries/qmfclient/qmailserviceaction.cpp
+++ b/src/libraries/qmfclient/qmailserviceaction.cpp
@@ -1472,7 +1472,7 @@ void QMailStorageActionPrivate::updateMessages(const QMailMessageList &list)
// If so must use sync updating
bool fwod(false);
foreach (QMailMessage message, list) {
- if (message.status() & (QMailMessage::HasUnresolvedReferences | QMailMessage::TransmitFromExternal)) {
+ if (message.status() & (QMailMessage::HasUnresolvedReferences | QMailMessage::TransmitFromExternal | QMailMessage::Outgoing)) {
fwod = true;
break;
}
diff --git a/src/libraries/qmfclient/qmailstore.cpp b/src/libraries/qmfclient/qmailstore.cpp
index d36a33f4..3339018f 100644
--- a/src/libraries/qmfclient/qmailstore.cpp
+++ b/src/libraries/qmfclient/qmailstore.cpp
@@ -526,6 +526,10 @@ bool QMailStore::removeMessages(const QMailMessageKey& key, QMailStore::MessageR
emitMessageNotification(Removed, deletedMessageIds);
emitMessageNotification(Updated, updatedMessageIds);
emitFolderNotification(ContentsModified, modifiedFolderIds);
+ // FIXME: use updatedThreadIds instead of modifiedThreadIds
+ // to emit signal about updated threads. However, do so we should write
+ // one more bind impl, otherwise we've got too much args for bind in QMailStorePrivate.
+ emitThreadNotification(Updated, modifiedThreadIds);
emitThreadNotification(ContentsModified, modifiedThreadIds);
emitThreadNotification(Removed, deletedThreadIds);
emitAccountNotification(ContentsModified, modifiedAccountIds);
@@ -682,7 +686,11 @@ bool QMailStore::updateMessages(const QList<QPair<QMailMessageMetaData*, QMailMe
}
emitMessageNotification(Updated, updatedMessages);
+ // FIXME: use updatedThreadIds instead of modifiedThreadIds
+ // to emit signal about updated threads. However, do so we should write
+ // one more bind impl, otherwise we've got too much args for bind in QMailStorePrivate.
emitThreadNotification(Updated, modifiedThreads);
+ emitThreadNotification(ContentsModified, modifiedThreads);
emitMessageNotification(ContentsModified, modifiedMessages);
emitMessageDataNotification(Updated, dataList(data, updatedMessages));
emitFolderNotification(ContentsModified, modifiedFolders);
@@ -713,6 +721,10 @@ bool QMailStore::updateMessagesMetaData(const QMailMessageKey& key,
emitMessageNotification(Updated, updatedMessages);
emitMessageDataNotification(updatedMessages, properties, data);
emitThreadNotification(Removed, deletedThreads);
+ // FIXME: use updatedThreadIds instead of modifiedThreadIds
+ // to emit signal about updated threads. However, do so we should write
+ // one more bind impl, otherwise we've got too much args for bind in QMailStorePrivate.
+ emitThreadNotification(Updated, modifiedThreads);
emitThreadNotification(ContentsModified, modifiedThreads);
emitFolderNotification(ContentsModified, modifiedFolders);
emitAccountNotification(ContentsModified, modifiedAccounts);
diff --git a/src/libraries/qmfclient/qmailstore_p.cpp b/src/libraries/qmfclient/qmailstore_p.cpp
index 7a4c154c..b39654a0 100644
--- a/src/libraries/qmfclient/qmailstore_p.cpp
+++ b/src/libraries/qmfclient/qmailstore_p.cpp
@@ -5616,44 +5616,69 @@ QMailStorePrivate::AttemptResult QMailStorePrivate::attemptAddMessage(QMailMessa
}
if (metaData->parentThreadId().isValid()) {
- APPEND_UNIQUE(out->modifiedThreadIds, metaData->parentThreadId());
- APPEND_UNIQUE(out->updatedThreadIds, metaData->parentThreadId());
+ //if it is a Trash or Draft message, then we shouldn't update any thread value
+ QMailAccount acc(metaData->parentAccountId());
+ QMailFolderId trashFolderId = acc.standardFolder(QMailFolder::TrashFolder);
+ QMailFolderId draftFolderId = acc.standardFolder(QMailFolder::DraftsFolder);
+ const bool& TrashOrDraft = (metaData->status() & (QMailMessage::Trash | QMailMessage::Draft) != 0) ||
+ (trashFolderId != QMailFolder::LocalStorageFolderId && metaData->parentFolderId() == trashFolderId) ||
+ (draftFolderId != QMailFolder::LocalStorageFolderId && metaData->parentFolderId() == draftFolderId);
+ if (!TrashOrDraft) {
+ APPEND_UNIQUE(out->modifiedThreadIds, metaData->parentThreadId());
+ APPEND_UNIQUE(out->updatedThreadIds, metaData->parentThreadId());
+ QMailThread thread(metaData->parentThreadId());
+ QString senders;
+ const QMailAddress &newSender = metaData->from();
+ const bool& newStartedMessage = thread.startedDate() > metaData->date();
+ const bool& newLastMessage = thread.lastDate() < metaData->date();
+
+ if (!thread.senders().contains(newSender)) {
+ senders = QMailAddress::toStringList(QMailAddressList() << newSender
+ << thread.senders()).join(",");
+ }
+ else {
+ if (newLastMessage) {
+ QMailAddressList oldSendersList = thread.senders();
+ oldSendersList.removeAll(newSender);
+ oldSendersList.prepend(newSender);
+ senders = QMailAddress::toStringList(oldSendersList).join(",");
+ } else {
+ senders = QMailAddress::toStringList(thread.senders()).join(",");
+ }
+ }
- QMailThread thread(metaData->parentThreadId());
- QString senders = QMailAddress::toStringList(thread.senders()).join(",");
- const QString &newSender = metaData->from().toString();
+ QString sql("UPDATE mailthreads SET"
+ + QString(" messagecount = messagecount + 1,")
+ + QString(" senders = (?)")
+ + ((newLastMessage && !metaData->preview().isEmpty()) ? QString(", preview = (?)") : QString(""))
+ + (newLastMessage ? QString(", lastdate = (?)") : QString(""))
+ + (newStartedMessage ? QString(", starteddate = (?)") : QString(""))
+ + (metaData->status() & QMailMessage::Read ? QString("") : QString(", unreadcount = unreadcount + 1 "))
+ + QString(", status = (status | %1)").arg(metaData->status()) + " WHERE id= (?)");
+ QVariantList bindValues;
+ bindValues << QVariant(senders);
+ if (newLastMessage && !metaData->preview().isEmpty())
+ bindValues << QVariant(metaData->preview());
+ if (newLastMessage)
+ bindValues << QVariant(metaData->date().toLocalTime());
+ if (newStartedMessage)
+ bindValues << QVariant(metaData->date().toLocalTime());
+ bindValues << QVariant(metaData->parentThreadId().toULongLong());
+ QSqlQuery query = simpleQuery(sql, bindValues, "addMessage update thread");
- if (!senders.contains(newSender)) {
- senders.append(QString(",") + newSender);
+ if (query.lastError().type() != QSqlError::NoError)
+ return DatabaseFailure;
}
-
- QString sql("UPDATE mailthreads SET messagecount = messagecount + 1, senders = (?)"
- + (thread.lastDate() < metaData->date() ? QString(", preview = (?)") : QString(""))
- + (thread.lastDate() < metaData->date() ? QString(", lastdate = (?)") : QString(""))
- + (thread.startedDate() > metaData->date() ? QString(", starteddate = (?)") : QString(""))
- + (metaData->status() & QMailMessage::Read ? QString("") : QString(", unreadcount = unreadcount + 1 "))
- + QString(", status = (status | %1)").arg(metaData->status()) + " WHERE id= (?)");
- QVariantList bindValues;
- bindValues << QVariant(senders);
- if (thread.lastDate() < metaData->date())
- bindValues << QVariant(metaData->preview());
- if (thread.lastDate() < metaData->date())
- bindValues << QVariant(metaData->date().toLocalTime());
- if (thread.startedDate() > metaData->date())
- bindValues << QVariant(metaData->date().toLocalTime());
- bindValues << QVariant(metaData->parentThreadId().toULongLong());
- QSqlQuery query = simpleQuery(sql, bindValues, "addMessage update thread");
-
- if (query.lastError().type() != QSqlError::NoError)
- return DatabaseFailure;
} else {
quint64 threadId = 0;
// Add a new thread for this message
QMap<QString, QVariant> values;
- values.insert("messagecount", 1);
- values.insert("unreadcount", metaData->status() & QMailMessage::Read ? 0 : 1);
+ values.insert("messagecount", (metaData->status() & QMailMessage::Trash ||
+ metaData->status() & QMailMessage::Draft) ? 0 : 1);
+ values.insert("unreadcount", (metaData->status() & QMailMessage::Read ||
+ metaData->status() & QMailMessage::Trash || metaData->status() & QMailMessage::Draft) ? 0 : 1);
values.insert("serveruid", "");
values.insert("parentaccountid", metaData->parentAccountId().toULongLong());
values.insert("subject", metaData->subject());
@@ -6423,7 +6448,7 @@ QMailStorePrivate::AttemptResult QMailStorePrivate::attemptUpdateMessage(QMailMe
threadId = extractValue<quint64>(query.value(0));
}
}
- if (threadId) {
+ if (threadId && metaData->parentThreadId().toULongLong() != threadId) {
{
QSqlQuery query(simpleQuery("UPDATE mailmessages SET parentthreadid=(SELECT parentthreadid FROM mailmessages WHERE id=?) WHERE parentthreadid=?",
QVariantList() << metaData->inResponseTo().toULongLong() << threadId,
@@ -6533,16 +6558,20 @@ QMailStorePrivate::AttemptResult QMailStorePrivate::attemptUpdateMessage(QMailMe
if (updateProperties != QMailMessageKey::Properties()) {
+ // Check NB#294937. Sometimes metaData contains 0 as a parentThreadId
+ // and that is really bad for a thread mode.
+ if (!metaData->parentThreadId().isValid())
+ updateProperties &= ~QMailMessageKey::ParentThreadId;
extractedValues = messageValues(updateProperties, *metaData);
{
- QString sql("UPDATE mailmessages SET %1 WHERE id=?");
+ QString sql("UPDATE mailmessages SET %1 WHERE id=?");
- QSqlQuery query(simpleQuery(sql.arg(expandProperties(updateProperties, true)),
- extractedValues + (QVariantList() << updateId),
- "updateMessage mailmessages update"));
- if (query.lastError().type() != QSqlError::NoError)
- return DatabaseFailure;
- }
+ QSqlQuery query(simpleQuery(sql.arg(expandProperties(updateProperties, true)),
+ extractedValues + (QVariantList() << updateId),
+ "updateMessage mailmessages update"));
+ if (query.lastError().type() != QSqlError::NoError)
+ return DatabaseFailure;
+ }
// perhaps, we need to update some thread's columns
// TODO: check other columns.
@@ -6550,22 +6579,15 @@ QMailStorePrivate::AttemptResult QMailStorePrivate::attemptUpdateMessage(QMailMe
QMailAccount account(metaData->parentAccountId());
QMailFolderId trashFolderId = account.standardFolder(QMailFolder::TrashFolder);
QMailFolderId draftFolderId = account.standardFolder(QMailFolder::DraftsFolder);
- const bool& movedToTrashOrDraft = ((metaData->status() & QMailMessage::Trash || metaData->status() & QMailMessage::Draft)
- != (status & QMailMessage::Trash || status & QMailMessage::Draft )) ||
- (parentFolderId != metaData->parentFolderId());
+ const bool& movedToTrashOrDraft = (((metaData->status() & (QMailMessage::Trash | QMailMessage::Draft)) != 0)
+ || (trashFolderId != QMailFolder::LocalStorageFolderId && metaData->parentFolderId() == trashFolderId)
+ || (draftFolderId != QMailFolder::LocalStorageFolderId && metaData->parentFolderId() == draftFolderId) )
+ && metaData->parentFolderId() != parentFolderId;
+ const bool& movedFromTrashOrDraft = ((parentFolderId == trashFolderId || parentFolderId == draftFolderId
+ || ((status & (QMailMessage::Trash | QMailMessage::Draft)) != (metaData->status() & (QMailMessage::Trash | QMailMessage::Draft)))) &&
+ (metaData->parentFolderId() != parentFolderId));
// if message was moved to/from Trash or Draft folder we should update all threads values in an appropriate way
- if (movedToTrashOrDraft) {
- //It is easier to recalculate all thread values, because we must check all threads messages to understand should we
- //change thread status or not.
- const QMailThreadIdList idList = QMailThreadIdList() << metaData->parentThreadId();
- QMailThreadIdList deletedThreadIds; // FIXME: add deletedThreadIds as argument for updateMessage().
- if (!recalculateThreadsColumns(idList, deletedThreadIds))
- return DatabaseFailure;
- APPEND_UNIQUE(all_modifiedThreads, metaData->parentThreadId());
- } else {
- if (metaData->status() & QMailMessage::Trash || metaData->status() & QMailMessage::Draft
- || metaData->parentFolderId() == trashFolderId || metaData->parentFolderId() == draftFolderId) {
- //Removing message from the thread's columns
+ if (movedToTrashOrDraft || movedFromTrashOrDraft) {
//It is easier to recalculate all thread values, because we must check all threads messages to understand should we
//change thread status or not.
const QMailThreadIdList idList = QMailThreadIdList() << metaData->parentThreadId();
@@ -6573,28 +6595,39 @@ QMailStorePrivate::AttemptResult QMailStorePrivate::attemptUpdateMessage(QMailMe
if (!recalculateThreadsColumns(idList, deletedThreadIds))
return DatabaseFailure;
APPEND_UNIQUE(all_modifiedThreads, metaData->parentThreadId());
- } else {
- QMailThread thread(metaData->parentThreadId());
- const bool& updatePreview = (metaData->date().toLocalTime() == thread.lastDate().toLocalTime()) && (thread.preview() != metaData->preview());
- const bool& updateSubject = (metaData->inResponseTo() == QMailMessageId()) && (metaData->date().toLocalTime() == thread.startedDate().toLocalTime());
- const bool& messageUnreadStatusChanged = (status & QMailMessage::Read) != (metaData->status() & QMailMessage::Read);
- const bool& threadStatusChanged = (!thread.status() & metaData->status());
-
- if (updatePreview || updateSubject || messageUnreadStatusChanged || threadStatusChanged) {
- AttemptResult res = updateThreadsValues(QMailThreadIdList(), QMailThreadIdList() << metaData->parentThreadId(),
- ThreadUpdateData(0, messageUnreadStatusChanged ? ((metaData->status() & QMailMessage::Read) ? -1 : 1) : 0,
- updateSubject ? metaData->subject() : QString(),
- updatePreview ? metaData->preview() : QString(),
- QString(), QMailTimeStamp(), QMailTimeStamp(),
- metaData->status() ));
- if (res != Success)
- return res;
- APPEND_UNIQUE(all_modifiedThreads, metaData->parentThreadId());
+ } else {
+ QMailThread thread(metaData->parentThreadId());
+ const bool& updatePreview = (metaData->date() >= thread.lastDate()) && (thread.preview() != metaData->preview()) && !metaData->preview().isEmpty();
+ const bool& updateSubject = (metaData->inResponseTo() == QMailMessageId()) && (metaData->date().toLocalTime() == thread.startedDate().toLocalTime());
+ const bool& messageUnreadStatusChanged = (status & QMailMessage::Read) != (metaData->status() & QMailMessage::Read);
+ const bool& threadStatusChanged = (!thread.status() & metaData->status());
+ const bool& threadSendersChanged = !thread.senders().contains(metaData->from()) || metaData->date() > thread.lastDate();
+
+ if (updatePreview || updateSubject || messageUnreadStatusChanged || threadStatusChanged || threadSendersChanged) {
+ QString senders;
+ if (threadSendersChanged) {
+ if (metaData->date() > thread.lastDate()) {
+ QMailAddressList oldSendersList = thread.senders();
+ oldSendersList.removeAll(metaData->from());
+ oldSendersList.prepend(metaData->from());
+ senders = QMailAddress::toStringList(oldSendersList).join(",");
+ } else {
+ senders = QMailAddress::toStringList(QMailAddressList() << metaData->from() << thread.senders()).join(",");
+ }
+ }
+ AttemptResult res = updateThreadsValues(QMailThreadIdList(), QMailThreadIdList() << metaData->parentThreadId(),
+ ThreadUpdateData(0, messageUnreadStatusChanged ? ((metaData->status() & QMailMessage::Read) ? -1 : 1) : 0,
+ updateSubject ? metaData->subject() : QString(),
+ updatePreview ? metaData->preview() : QString(),
+ senders, QMailTimeStamp(), QMailTimeStamp(),
+ metaData->status() ));
+ if (res != Success)
+ return res;
+ APPEND_UNIQUE(all_modifiedThreads, metaData->parentThreadId());
+ }
}
}
}
- }
- }
if (metaData->customFieldsModified()) {
AttemptResult result = updateCustomFields(updateId, metaData->customFields(), "mailmessagecustom");
@@ -6746,6 +6779,10 @@ QMailStorePrivate::AttemptResult QMailStorePrivate::attemptUpdateMessage(QMailMe
APPEND_UNIQUE(all_modifiedMessageIds, metaData->id());
}
+ foreach (const QMailThreadId& id, *all_modifiedThreads) {
+ threadCache.remove(id);
+ }
+
return Success;
}
@@ -6876,6 +6913,10 @@ QMailStorePrivate::AttemptResult QMailStorePrivate::attemptUpdateMessagesMetaDat
}
}
+ foreach (const QMailThreadId& id, *modifiedThreadIds) {
+ threadCache.remove(id);
+ }
+
return Success;
}
@@ -6920,7 +6961,6 @@ QMailStorePrivate::AttemptResult QMailStorePrivate::attemptUpdateMessagesStatus(
qlonglong unreadCount = 0;
foreach (const quint64& oldStatus, oldStatusList)
{
-
if (set != bool(oldStatus & QMailMessage::Read)) {
set ? --unreadCount : ++unreadCount;
}
@@ -6972,6 +7012,12 @@ QMailStorePrivate::AttemptResult QMailStorePrivate::attemptUpdateMessagesStatus(
}
}
+ foreach (const QMailThreadId& id, *modifiedThreadIds) {
+ if (threadCache.contains(id)) {
+ threadCache.remove(id);
+ }
+ }
+
return Success;
}
@@ -7706,10 +7752,11 @@ void QMailStorePrivate::preloadHeaderCache(const QMailMessageId& id) const
if (metaData.id().isValid()) {
messageCache.insert(metaData);
uidCache.insert(qMakePair(metaData.parentAccountId(), metaData.serverUid()), metaData.id());
- if (metaData.id() == id)
+ if (metaData.id() == id) {
result = metaData;
}
}
+ }
}
void QMailStorePrivate::preloadThreadCache(const QMailThreadId& id) const
@@ -8179,8 +8226,8 @@ QMailStorePrivate::AttemptResult QMailStorePrivate::resolveMissingMessages(const
foreach (const QMailMessageId& id, *updatedMessageIds) {
bindValues << id.toULongLong();
}
- QSqlQuery query(simpleQuery(sql.arg(expandValueList(bindValues)),
- bindValues << message.parentThreadId().toULongLong(),
+ QSqlQuery query(simpleQuery(expandValueList(bindValues),
+ QVariantList() << bindValues << message.parentThreadId().toULongLong(),
"resolveMissingMessages mailmessages query"));
if (query.lastError().type() != QSqlError::NoError)
return DatabaseFailure;
@@ -8423,41 +8470,34 @@ bool QMailStorePrivate::checkPreconditions(const QMailFolder& folder, bool updat
bool QMailStorePrivate::recalculateThreadsColumns(const QMailThreadIdList& modifiedThreads, QMailThreadIdList& deletedThreads)
{
- QMap<QMailThreadId, QMailMessageId> existedMessagesMap;
+ QMap<QMailThreadId, QMailMessageMetaDataList> existedMessagesMap;
{
QVariantList bindValues;
- QVariantList excludeFoldersList;
foreach (const QMailThreadId& threadId, modifiedThreads)
{
bindValues << threadId.toULongLong();
- QMailAccount account(QMailThread(threadId).parentAccountId());
- const QMailFolderId trashFolderId(account.standardFolder(QMailFolder::TrashFolder));
- const QMailFolderId draftFolderId(account.standardFolder(QMailFolder::DraftsFolder));
- if (trashFolderId.isValid() && !excludeFoldersList.contains(trashFolderId.toULongLong()))
- excludeFoldersList << trashFolderId.toULongLong();
- if (draftFolderId.isValid() && !excludeFoldersList.contains(draftFolderId.toULongLong()))
- excludeFoldersList << draftFolderId.toULongLong();
}
if (!bindValues.isEmpty()) {
QString sql;
- if (excludeFoldersList.isEmpty()) {
- sql = QString("SELECT id, parentthreadid FROM mailmessages WHERE parentthreadid IN %1 ORDER BY stamp").arg(expandValueList(bindValues));
- } else {
- sql = QString("SELECT id, parentthreadid FROM mailmessages WHERE parentthreadid IN %1 AND parentfolderid NOT IN %2 ORDER BY stamp").arg(expandValueList(bindValues)).arg(expandValueList(excludeFoldersList));
- bindValues.append(excludeFoldersList);
- }
+ sql = QString("SELECT id, parentfolderid, sender, subject, status, preview, parentthreadid FROM mailmessages WHERE parentthreadid IN %1 ORDER BY stamp").arg(expandValueList(bindValues));
QSqlQuery query(simpleQuery(sql, bindValues,
"recalculateThreadsColumns select messages info query"));
- if (query.lastError().type() != QSqlError::NoError)
- return false;
+ if (query.lastError().type() != QSqlError::NoError)
+ return false;
- while (query.next()) {
- existedMessagesMap.insertMulti(QMailThreadId(extractValue<quint64>(query.value(1))),
- QMailMessageId(extractValue<quint64>(query.value(0))));
+ while (query.next()) {
+ QMailMessageMetaData data(QMailMessageId(extractValue<quint64>(query.value(0))));
+ data.setParentFolderId(QMailFolderId(extractValue<quint64>(query.value(1))));
+ data.setFrom(QMailAddress(extractValue<QString>(query.value(2))));
+ data.setSubject(extractValue<QString>(query.value(3)));
+ data.setStatus(extractValue<quint64>(query.value(4)));
+ data.setPreview(extractValue<QString>(query.value(5)));
+ QMailThreadId tId(extractValue<quint64>(query.value(6)));
+ existedMessagesMap[tId].append(data);
+ }
}
}
- }
foreach (const QMailThreadId& threadId, modifiedThreads)
{
@@ -8472,23 +8512,39 @@ bool QMailStorePrivate::recalculateThreadsColumns(const QMailThreadIdList& modif
QMailThread thread(threadId);
uint messagesCount = 0;
uint unreadCount = 0;
+ uint firstUnread = 0;
+ uint firstMessageIndex = 0;
+ uint lastMessageIndex = 0;
+ uint index = 0;
quint64 status = 0;
QStringList senders;
- const QMailMessageIdList &threadsMessagesList = existedMessagesMap.values(threadId);
- messagesCount = threadsMessagesList.count();
- foreach (const QMailMessageId& messageId, threadsMessagesList)
+ const QMailMessageMetaDataList &threadsMessagesList = existedMessagesMap.value(threadId);
+ foreach (const QMailMessageMetaData& data, threadsMessagesList)
{
- QMailMessageMetaData data(messageId);
- if (!senders.contains(data.from().toString()))
- senders.append(data.from().toString());
- status |= data.status();
- if ((data.status() & QMailMessage::Read) == 0) {
- ++unreadCount;
+ // Messages moved to Draft or Trash folder should not being counted.
+ QMailAccount account(data.parentAccountId());
+ QMailFolderId trashFolderId = account.standardFolder(QMailFolder::TrashFolder);
+ QMailFolderId draftFolderId = account.standardFolder(QMailFolder::DraftsFolder);
+ const bool& trashOrDraftMessage = (((data.status() & (QMailMessage::Trash | QMailMessage::Draft)) != 0) ||
+ (data.parentFolderId() == trashFolderId) || (data.parentFolderId() == draftFolderId));
+ if (!trashOrDraftMessage) {
+ status |= data.status();
+ if (!senders.contains(data.from().toString()))
+ senders.append(data.from().toString());
+ lastMessageIndex = index;
+ if (messagesCount == 0) firstMessageIndex = index;
+ messagesCount++;
+ if ((data.status() & QMailMessage::Read) == 0) {
+ if (unreadCount == 0) firstUnread = messagesCount - 1;
+ ++unreadCount;
+ }
}
+ index++;
}
+
// messages are sorted by time stamp, so we can set preview, lastDate, subject and startedDate easily by taking them from last and first message in the list
- QMailMessageMetaData lastMessage(threadsMessagesList.at(0));
- QMailMessageMetaData firstMessage(threadsMessagesList.at(threadsMessagesList.count()-1));
+ QMailMessageMetaData firstMessage(threadsMessagesList.at(firstMessageIndex));
+ QMailMessageMetaData lastMessage(threadsMessagesList.at(lastMessageIndex));
thread.setLastDate(QMailTimeStamp(lastMessage.date().toLocalTime()));
thread.setPreview(lastMessage.preview());
thread.setStartedDate(QMailTimeStamp(firstMessage.date().toLocalTime()));
@@ -9022,88 +9078,6 @@ bool QMailStorePrivate::deleteAccounts(const QMailAccountKey& key,
}
}
- {
- // Update modified threads. Remove empty threads
-
- QMap<QMailThreadId, QMailMessageId> existedMessagesMap;
- {
- QVariantList bindValues;
- foreach (const QMailThreadId& threadId, modifiedThreadIds)
- {
- bindValues << threadId.toULongLong();
- }
-
- QSqlQuery query(simpleQuery(QString("SELECT id, parentthreadid FROM mailmessages WHERE parentthreadid IN %1 ORDER BY stamp").arg(expandValueList(bindValues)),
- bindValues,
- "deleteMessages select messages info query"));
- if (query.lastError().type() != QSqlError::NoError)
- return false;
-
- while (query.next()) {
- existedMessagesMap.insertMulti(QMailThreadId(extractValue<quint64>(query.value(1))),
- QMailMessageId(extractValue<quint64>(query.value(0))));
- }
- }
-
- foreach (const QMailThreadId& threadId, modifiedThreadIds)
- {
- // if all thread's messages were deleted we should delete thread as well.
- if (!existedMessagesMap.keys().contains(threadId)) {
- deletedThreadIds.append(threadId);
- continue;
- }
-
- // it's easier to recalculate and reset all additable thread's columns then to find out what column was changed by
- // this message(s) deletion
- QMailThread thread(threadId);
- uint messagesCount = 0;
- uint unreadCount = 0;
- quint64 status = 0;
- QStringList senders;
- const QMailMessageIdList &threadsMessagesList = existedMessagesMap.values(threadId);
- messagesCount = threadsMessagesList.count();
- foreach (const QMailMessageId& messageId, threadsMessagesList)
- {
- QMailMessageMetaData data(messageId);
- if (!senders.contains(data.from().toString()))
- senders.append(data.from().toString());
- status |= data.status();
- if ((data.status() & QMailMessage::Read) == 0) {
- ++unreadCount;
- }
- }
- // messages are sorted by time stamp, so we can set preview, lastDate, subject and startedDate easily by taking them from last and first message in the list
- QMailMessageMetaData lastMessage(threadsMessagesList.at(0));
- QMailMessageMetaData firstMessage(threadsMessagesList.at(threadsMessagesList.count()-1));
- thread.setLastDate(QMailTimeStamp(lastMessage.date().toLocalTime()));
- thread.setPreview(lastMessage.preview());
- thread.setStartedDate(QMailTimeStamp(firstMessage.date().toLocalTime()));
- thread.setSubject(firstMessage.subject());
- thread.setMessageCount(messagesCount);
- thread.setUnreadCount(unreadCount);
- thread.setStatus(status);
- thread.setSenders(QMailAddress::fromStringList(senders));
- QMailThreadKey::Properties props(QMailThreadKey::MessageCount | QMailThreadKey::UnreadCount |
- QMailThreadKey::LastDate | QMailThreadKey::StartedDate |
- QMailThreadKey::Preview | QMailThreadKey::Subject |
- QMailThreadKey::Status | QMailThreadKey::Senders);
-
- QSqlQuery query(simpleQuery(QString("UPDATE mailthreads SET %1 WHERE id=?").arg(expandProperties(props, true)),
- QVariantList() << threadValues(props, thread) << threadId.toULongLong(),
- "deleteMessages mailthreads update query"));
-
- if (query.lastError().type() != QSqlError::NoError)
- return DatabaseFailure;
- }
-
- // remove all empty threads
- if (!deletedThreadIds.isEmpty()) {
- AttemptResult res = updateThreadsValues(deletedThreadIds);
- if (res != Success)
- return res;
- }
-
- }
return true;
}
diff --git a/src/libraries/qmfclient/qmailstore_p.h b/src/libraries/qmfclient/qmailstore_p.h
index f008087b..c6372f6f 100644
--- a/src/libraries/qmfclient/qmailstore_p.h
+++ b/src/libraries/qmfclient/qmailstore_p.h
@@ -410,6 +410,10 @@ private:
template<typename AccessType, typename FunctionType>
bool repeatedly(FunctionType func, const QString &description, Transaction *t = 0) const;
+ quint64 threadId(const QMailMessageId &id);
+ AttemptResult updateLatestInConversation(quint64 threadId, QMailMessageIdList *messagesUpdated, quint64 *updatedTo = 0);
+ AttemptResult updateLatestInConversation(const QSet<quint64> &threadIds, QMailMessageIdList *messagesUpdated);
+
AttemptResult addCustomFields(quint64 id, const QMap<QString, QString> &fields, const QString &tableName);
AttemptResult updateCustomFields(quint64 id, const QMap<QString, QString> &fields, const QString &tableName);
AttemptResult customFields(quint64 id, QMap<QString, QString> *fields, const QString &tableName);
diff --git a/src/libraries/qmfclient/qmailthreadkey.cpp b/src/libraries/qmfclient/qmailthreadkey.cpp
index 2edbdac2..e20fa69f 100644
--- a/src/libraries/qmfclient/qmailthreadkey.cpp
+++ b/src/libraries/qmfclient/qmailthreadkey.cpp
@@ -460,4 +460,3 @@ QMailThreadKey QMailThreadKey::lastDate(const QDateTime &value, QMailDataCompara
{
return QMailThreadKey(LastDate, value, QMailKey::comparator(cmp));
}
-
diff --git a/src/plugins/messageservices/imap/imapstructure.cpp b/src/plugins/messageservices/imap/imapstructure.cpp
index 37fd8589..8663157a 100644
--- a/src/plugins/messageservices/imap/imapstructure.cpp
+++ b/src/plugins/messageservices/imap/imapstructure.cpp
@@ -299,7 +299,7 @@ QMailMessageContentDisposition fromDispositionDescription(const QString &desc, c
}
if (!size.isEmpty() && disposition.size() == -1) {
- // We prefer the Content-Disposition/Size to the body size.
+ // We use the body size only if Content-Disposition/Size is not available.
// From RFC3501 INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1:
// body size
// A number giving the size of the body in octets. Note that
diff --git a/src/plugins/messageservices/smtp/smtpauthenticator.cpp b/src/plugins/messageservices/smtp/smtpauthenticator.cpp
index 855e6a68..e9a494c4 100644
--- a/src/plugins/messageservices/smtp/smtpauthenticator.cpp
+++ b/src/plugins/messageservices/smtp/smtpauthenticator.cpp
@@ -56,7 +56,7 @@ QByteArray SmtpAuthenticator::getAuthentication(const QMailAccountConfiguration:
{
QByteArray result(QMailAuthenticator::getAuthentication(svcCfg, capabilities));
if (!result.isEmpty())
- return result.prepend("AUTH ");;
+ return result.prepend("AUTH ");
#ifndef QT_NO_OPENSSL
SmtpConfiguration smtpCfg(svcCfg);