From 8fa21d0d612c5eff643da0daedee6d95423e7271 Mon Sep 17 00:00:00 2001 From: "bienvenu%nventure.com" Date: Wed, 8 Feb 2006 22:32:27 +0000 Subject: [PATCH] update unread counts for single folder virtual folder on an imap folder with a body criteria search, sr=mscott 277843 sr=mscott --- mailnews/base/src/nsMsgQuickSearchDBView.cpp | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/mailnews/base/src/nsMsgQuickSearchDBView.cpp b/mailnews/base/src/nsMsgQuickSearchDBView.cpp index efb91d4eed29..972a6d1415db 100644 --- a/mailnews/base/src/nsMsgQuickSearchDBView.cpp +++ b/mailnews/base/src/nsMsgQuickSearchDBView.cpp @@ -44,6 +44,7 @@ #include "nsIMsgImapMailFolder.h" #include "nsImapCore.h" #include "nsIMsgHdr.h" +#include "nsIDBFolderInfo.h" nsMsgQuickSearchDBView::nsMsgQuickSearchDBView() { @@ -155,6 +156,46 @@ NS_IMETHODIMP nsMsgQuickSearchDBView::OnHdrChange(nsIMsgDBHdr *aHdrChanged, PRUi } } } + else if (m_viewFolder && (aOldFlags & MSG_FLAG_READ) != (aNewFlags & MSG_FLAG_READ)) + { + // if we're displaying a single folder virtual folder for an imap folder, + // the search criteria might be on message body, and we might not have the + // message body offline, in which case we can't tell if the message + // matched or not. But if the unread flag changed, we need to update the + // unread counts. Normally, VirtualFolderChangeListener::OnHdrChange will + // handle this, but it won't work for body criteria when we don't have the + // body offline. + nsCOMPtr imapFolder = do_QueryInterface(m_viewFolder); + if (imapFolder) + { + nsMsgViewIndex hdrIndex = FindHdr(aHdrChanged); + if (hdrIndex != nsMsgViewIndex_None) + { + nsCOMPtr searchSession = do_QueryReferent(m_searchSession); + if (searchSession) + { + PRBool oldMatch, newMatch; + rv = searchSession->MatchHdr(aHdrChanged, m_db, &newMatch); + aHdrChanged->SetFlags(aOldFlags); + rv = searchSession->MatchHdr(aHdrChanged, m_db, &oldMatch); + aHdrChanged->SetFlags(aNewFlags); + // if it doesn't match the criteria, VirtualFolderChangeListener::OnHdrChange + // won't tweak the read/unread counts. So do it here: + if (!oldMatch && !newMatch) + { + nsCOMPtr virtDatabase; + nsCOMPtr dbFolderInfo; + + rv = m_viewFolder->GetDBFolderInfoAndDB(getter_AddRefs(dbFolderInfo), getter_AddRefs(virtDatabase)); + NS_ENSURE_SUCCESS(rv, rv); + dbFolderInfo->ChangeNumUnreadMessages((aOldFlags & MSG_FLAG_READ) ? 1 : -1); + m_viewFolder->UpdateSummaryTotals(PR_TRUE); // force update from db. + virtDatabase->Commit(nsMsgDBCommitType::kLargeCommit); + } + } + } + } + } return rv; }