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 nsMsgSearchDBView::OnSearchDone(nsresult status) { //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); 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 nsImapMoveCopyMsgTxn::UndoTransaction(void) { nsresult rv; nsCOMPtr<nsIImapService> imapService = do_GetService(NS_IMAPSERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); bool finishInOnStopRunningUrl = false; if (m_isMove || !m_dstFolder) { if (m_srcIsPop3) { rv = UndoMailboxDelete(); NS_ENSURE_SUCCESS(rv, rv); } else { nsCOMPtr<nsIMsgFolder> srcFolder = do_QueryReferent(m_srcFolder, &rv); if (NS_FAILED(rv) || !srcFolder) return rv; nsCOMPtr<nsIUrlListener> srcListener = do_QueryInterface(srcFolder, &rv); if (NS_FAILED(rv)) return rv; m_onStopListener = do_GetWeakReference(srcListener); // ** make sure we are in the selected state; use lite select // folder so we won't hit performance hard rv = imapService->LiteSelectFolder(srcFolder, srcListener, nullptr, nullptr); if (NS_FAILED(rv)) return rv; bool deletedMsgs = true; //default is true unless imapDelete model nsMsgImapDeleteModel deleteModel; rv = GetImapDeleteModel(srcFolder, &deleteModel); // protect against a bogus undo txn without any source keys // see bug #179856 for details NS_ASSERTION(!m_srcKeyArray.IsEmpty(), "no source keys"); if (m_srcKeyArray.IsEmpty()) return NS_ERROR_UNEXPECTED; if (!m_srcMsgIdString.IsEmpty()) { if (NS_SUCCEEDED(rv) && deleteModel == nsMsgImapDeleteModels::IMAPDelete) CheckForToggleDelete(srcFolder, m_srcKeyArray[0], &deletedMsgs); if (deletedMsgs) rv = imapService->SubtractMessageFlags(srcFolder, this, nullptr, m_srcMsgIdString, kImapMsgDeletedFlag, m_idsAreUids); else rv = imapService->AddMessageFlags(srcFolder, srcListener, nullptr, m_srcMsgIdString, kImapMsgDeletedFlag, m_idsAreUids); if (NS_FAILED(rv)) return rv; finishInOnStopRunningUrl = true; if (deleteModel != nsMsgImapDeleteModels::IMAPDelete) rv = imapService->GetHeaders(srcFolder, srcListener, nullptr, m_srcMsgIdString, true); } } } if (!finishInOnStopRunningUrl && !m_dstMsgIdString.IsEmpty()) { nsCOMPtr<nsIMsgFolder> dstFolder = do_QueryReferent(m_dstFolder, &rv); if (NS_FAILED(rv) || !dstFolder) return rv; nsCOMPtr<nsIUrlListener> dstListener; dstListener = do_QueryInterface(dstFolder, &rv); NS_ENSURE_SUCCESS(rv, rv); // ** make sure we are in the selected state; use lite select folder // so we won't potentially download a bunch of headers. rv = imapService->LiteSelectFolder(dstFolder, dstListener, nullptr, nullptr); NS_ENSURE_SUCCESS(rv, rv); rv = imapService->AddMessageFlags(dstFolder, dstListener, nullptr, m_dstMsgIdString, kImapMsgDeletedFlag, m_idsAreUids); } return rv; }
NS_IMETHODIMP nsImapMoveCopyMsgTxn::RedoTransaction(void) { nsresult rv; nsCOMPtr<nsIImapService> imapService = do_GetService(NS_IMAPSERVICE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); if (m_isMove || !m_dstFolder) { if (m_srcIsPop3) { rv = RedoMailboxDelete(); if (NS_FAILED(rv)) return rv; } else if (!m_srcMsgIdString.IsEmpty()) { nsCOMPtr<nsIMsgFolder> srcFolder = do_QueryReferent(m_srcFolder, &rv); if (NS_FAILED(rv) || !srcFolder) return rv; nsCOMPtr<nsIUrlListener> srcListener = do_QueryInterface(srcFolder, &rv); NS_ENSURE_SUCCESS(rv, rv); PRBool deletedMsgs = PR_FALSE; //default will be false unless imapDeleteModel; nsMsgImapDeleteModel deleteModel; rv = GetImapDeleteModel(srcFolder, &deleteModel); // protect against a bogus undo txn without any source keys // see bug #179856 for details NS_ASSERTION(!m_srcKeyArray.IsEmpty(), "no source keys"); if (m_srcKeyArray.IsEmpty()) return NS_ERROR_UNEXPECTED; if (NS_SUCCEEDED(rv) && deleteModel == nsMsgImapDeleteModels::IMAPDelete) rv = CheckForToggleDelete(srcFolder, m_srcKeyArray[0], &deletedMsgs); // Make sure we are in the selected state; use lite select // folder so performance won't suffer. rv = imapService->LiteSelectFolder(m_eventTarget, srcFolder, srcListener, nsnull, nsnull); NS_ENSURE_SUCCESS(rv, rv); if (deletedMsgs) { rv = imapService->SubtractMessageFlags(m_eventTarget, srcFolder, srcListener, nsnull, m_srcMsgIdString, kImapMsgDeletedFlag, m_idsAreUids); } else { rv = imapService->AddMessageFlags(m_eventTarget, srcFolder, srcListener, nsnull, m_srcMsgIdString, kImapMsgDeletedFlag, m_idsAreUids); } } } if (!m_dstMsgIdString.IsEmpty()) { nsCOMPtr<nsIMsgFolder> dstFolder = do_QueryReferent(m_dstFolder, &rv); if (NS_FAILED(rv) || !dstFolder) return rv; nsCOMPtr<nsIUrlListener> dstListener; dstListener = do_QueryInterface(dstFolder, &rv); NS_ENSURE_SUCCESS(rv, rv); // ** make sure we are in the selected state; use lite select // folder so we won't hit performance hard rv = imapService->LiteSelectFolder(m_eventTarget, dstFolder, dstListener, nsnull, nsnull); NS_ENSURE_SUCCESS(rv, rv); rv = imapService->SubtractMessageFlags(m_eventTarget, dstFolder, dstListener, nsnull, m_dstMsgIdString, kImapMsgDeletedFlag, m_idsAreUids); NS_ENSURE_SUCCESS(rv, rv); nsMsgImapDeleteModel deleteModel; rv = GetImapDeleteModel(dstFolder, &deleteModel); if (NS_FAILED(rv) || deleteModel == nsMsgImapDeleteModels::MoveToTrash) { rv = imapService->GetHeaders(m_eventTarget, dstFolder, dstListener, nsnull, m_dstMsgIdString, PR_TRUE); } } return rv; }