NS_IMETHODIMP nsMsgXFVirtualFolderDBView::OnSearchDone(nsresult status) { NS_ENSURE_TRUE(m_viewFolder, NS_ERROR_NOT_INITIALIZED); // handle any non verified hits we haven't handled yet. if (NS_SUCCEEDED(status) && !m_doingQuickSearch && status != NS_MSG_SEARCH_INTERRUPTED) UpdateCacheAndViewForPrevSearchedFolders(nullptr); m_doingSearch = false; //we want to set imap delete model once the search is over because setting next //message after deletion will happen before deleting the message and search scope //can change with every search. mDeleteModel = nsMsgImapDeleteModels::MoveToTrash; //set to default in case it is non-imap folder nsIMsgFolder *curFolder = m_folders.SafeObjectAt(0); if (curFolder) GetImapDeleteModel(curFolder); nsCOMPtr<nsIMsgDatabase> virtDatabase; nsCOMPtr<nsIDBFolderInfo> dbFolderInfo; nsresult rv = m_viewFolder->GetDBFolderInfoAndDB(getter_AddRefs(dbFolderInfo), getter_AddRefs(virtDatabase)); NS_ENSURE_SUCCESS(rv, rv); // count up the number of unread and total messages from the view, and set those in the // folder - easier than trying to keep the count up to date in the face of // search hits coming in while the user is reading/deleting messages. uint32_t numUnread = 0; for (uint32_t i = 0; i < m_flags.Length(); i++) if (m_flags[i] & nsMsgMessageFlags::Elided) { nsCOMPtr<nsIMsgThread> thread; GetThreadContainingIndex(i, getter_AddRefs(thread)); if (thread) { uint32_t unreadInThread; thread->GetNumUnreadChildren(&unreadInThread); numUnread += unreadInThread; } } else { if (!(m_flags[i] & nsMsgMessageFlags::Read)) numUnread++; } dbFolderInfo->SetNumUnreadMessages(numUnread); dbFolderInfo->SetNumMessages(m_totalMessagesInView); m_viewFolder->UpdateSummaryTotals(true); // force update from db. virtDatabase->Commit(nsMsgDBCommitType::kLargeCommit); if (!m_sortValid && m_sortType != nsMsgViewSortType::byThread && !(m_viewFlags & nsMsgViewFlagsType::kThreadedDisplay)) { m_sortValid = false; //sort the results Sort(m_sortType, m_sortOrder); } m_foldersSearchingOver.Clear(); m_curFolderGettingHits = nullptr; return rv; }
NS_IMETHODIMP nsMsgXFVirtualFolderDBView::OnSearchHit(nsIMsgDBHdr* aMsgHdr, nsIMsgFolder *aFolder) { NS_ENSURE_ARG(aMsgHdr); NS_ENSURE_ARG(aFolder); nsCOMPtr<nsIMsgDatabase> dbToUse; nsCOMPtr<nsIDBFolderInfo> folderInfo; aFolder->GetDBFolderInfoAndDB(getter_AddRefs(folderInfo), getter_AddRefs(dbToUse)); if (m_curFolderGettingHits != aFolder && m_doingSearch && !m_doingQuickSearch) { m_curFolderHasCachedHits = false; // since we've gotten a hit for a new folder, the searches for // any previous folders are done, so deal with stale cached hits // for those folders now. UpdateCacheAndViewForPrevSearchedFolders(aFolder); m_curFolderGettingHits = aFolder; m_hdrHits.Clear(); m_curFolderStartKeyIndex = m_keys.Length(); } bool hdrInCache = false; nsCString searchUri; if (!m_doingQuickSearch) { m_viewFolder->GetURI(searchUri); dbToUse->HdrIsInCache(searchUri.get(), aMsgHdr, &hdrInCache); } if (!m_doingSearch || !m_curFolderHasCachedHits || !hdrInCache) { if (m_viewFlags & nsMsgViewFlagsType::kGroupBySort) nsMsgGroupView::OnNewHeader(aMsgHdr, nsMsgKey_None, true); else if (m_sortValid) InsertHdrFromFolder(aMsgHdr, aFolder); else AddHdrFromFolder(aMsgHdr, aFolder); } m_hdrHits.AppendObject(aMsgHdr); m_totalMessagesInView++; return NS_OK; }
NS_IMETHODIMP nsMsgXFVirtualFolderDBView::OnSearchDone(nsresult status) { // handle any non verified hits we haven't handled yet. UpdateCacheAndViewForPrevSearchedFolders(nsnull); m_doingSearch = PR_FALSE; //we want to set imap delete model once the search is over because setting next //message after deletion will happen before deleting the message and search scope //can change with every search. mDeleteModel = nsMsgImapDeleteModels::MoveToTrash; //set to default in case it is non-imap folder nsCOMPtr <nsIMsgFolder> curFolder = do_QueryElementAt(m_folders, 0); if (curFolder) GetImapDeleteModel(curFolder); nsCOMPtr <nsIMsgDatabase> virtDatabase; nsCOMPtr <nsIDBFolderInfo> dbFolderInfo; nsresult rv = m_viewFolder->GetDBFolderInfoAndDB(getter_AddRefs(dbFolderInfo), getter_AddRefs(virtDatabase)); NS_ENSURE_SUCCESS(rv, rv); // count up the number of unread and total messages from the view, and set those in the // folder - easier than trying to keep the count up to date in the face of // search hits coming in while the user is reading/deleting messages. PRInt32 numUnread = 0; for (PRUint32 i = 0; i < m_flags.Length(); i++) if (!(m_flags[i] & MSG_FLAG_READ)) numUnread++; dbFolderInfo->SetNumUnreadMessages(numUnread); dbFolderInfo->SetNumMessages(GetSize()); m_viewFolder->UpdateSummaryTotals(true); // force update from db. virtDatabase->Commit(nsMsgDBCommitType::kLargeCommit); if (!m_sortValid && m_sortType != nsMsgViewSortType::byThread) { m_sortValid = PR_FALSE; //sort the results Sort(m_sortType, m_sortOrder); } m_foldersSearchingOver.Clear(); m_curFolderGettingHits = nsnull; return rv; }
NS_IMETHODIMP nsMsgXFVirtualFolderDBView::OnSearchHit(nsIMsgDBHdr* aMsgHdr, nsIMsgFolder *folder) { NS_ENSURE_ARG(aMsgHdr); NS_ENSURE_ARG(folder); nsCOMPtr <nsISupports> supports = do_QueryInterface(folder); nsCOMPtr<nsIMsgDatabase> dbToUse; nsCOMPtr<nsIDBFolderInfo> folderInfo; folder->GetDBFolderInfoAndDB(getter_AddRefs(folderInfo), getter_AddRefs(dbToUse)); if (m_curFolderGettingHits != folder && m_doingSearch) { m_curFolderHasCachedHits = PR_FALSE; // since we've gotten a hit for a new folder, the searches for // any previous folders are done, so deal with stale cached hits // for those folders now. UpdateCacheAndViewForPrevSearchedFolders(folder); m_curFolderGettingHits = folder; m_hdrHits.Clear(); m_curFolderStartKeyIndex = m_keys.Length(); } PRBool hdrInCache = PR_FALSE; nsCString searchUri; m_viewFolder->GetURI(searchUri); dbToUse->HdrIsInCache(searchUri.get(), aMsgHdr, &hdrInCache); if (!m_doingSearch || !m_curFolderHasCachedHits || !hdrInCache) { if (m_sortValid) InsertHdrFromFolder(aMsgHdr, supports); else AddHdrFromFolder(aMsgHdr, supports); } m_hdrHits.AppendObject(aMsgHdr); return NS_OK; }