void nsMsgXFVirtualFolderDBView::UpdateCacheAndViewForFolder(nsIMsgFolder *folder, nsMsgKey *newHits, PRUint32 numNewHits) { nsCOMPtr <nsIMsgDatabase> db; nsresult rv = folder->GetMsgDatabase(nsnull, getter_AddRefs(db)); if (NS_SUCCEEDED(rv) && db) { nsCString searchUri; m_viewFolder->GetURI(searchUri); PRUint32 numBadHits; nsMsgKey *badHits; rv = db->RefreshCache(searchUri.get(), numNewHits, newHits, &numBadHits, &badHits); if (NS_SUCCEEDED(rv)) { for (PRUint32 badHitIndex = 0; badHitIndex < numBadHits; badHitIndex++) { // of course, this isn't quite right nsMsgViewIndex staleHitIndex = FindKey(badHits[badHitIndex], PR_TRUE); if (staleHitIndex != nsMsgViewIndex_None) RemoveByIndex(staleHitIndex); } delete [] badHits; } } }
NS_IMETHODIMP nsMsgXFVirtualFolderDBView::OnHdrPropertyChanged(nsIMsgDBHdr *aHdrChanged, PRBool aPreChange, PRUint32 *aStatus, nsIDBChangeListener *aInstigator) { // If the junk mail plugin just activated on a new message, then // we'll allow filters to remove from view. // Otherwise, just update the view line. if (aPreChange) return NS_OK; if (aHdrChanged) { nsCOMPtr<nsIMsgSearchSession> searchSession(do_QueryReferent(m_searchSession)); if (searchSession) { nsMsgViewIndex index = FindHdr(aHdrChanged); if (index != nsMsgViewIndex_None) { PRBool match = PR_FALSE; searchSession->MatchHdr(aHdrChanged, m_db, &match); nsCString originStr; PRUint32 flags; aHdrChanged->GetFlags(&flags); (void) aHdrChanged->GetStringProperty("junkscoreorigin", getter_Copies(originStr)); // check for "plugin" with only first character for performance if (!match && originStr.get()[0] == 'p' && flags & MSG_FLAG_NEW) RemoveByIndex(index); // remove hdr from view else NoteChange(index, 1, nsMsgViewNotificationCode::changed); } } } return NS_OK; }
NS_IMETHODIMP nsMsgGroupView::OnHdrDeleted(nsIMsgDBHdr *aHdrDeleted, nsMsgKey aParentKey, int32_t aFlags, nsIDBChangeListener *aInstigator) { if (!(m_viewFlags & nsMsgViewFlagsType::kGroupBySort)) return nsMsgDBView::OnHdrDeleted(aHdrDeleted, aParentKey, aFlags, aInstigator); // check if we're adding a header, and the current day has changed. If it has, we're just going to // close and re-open the view so things will be correctly categorized. if (m_dayChanged) return RebuildView(m_viewFlags); nsCOMPtr <nsIMsgThread> thread; nsMsgKey keyDeleted; aHdrDeleted->GetMessageKey(&keyDeleted); nsresult rv = GetThreadContainingMsgHdr(aHdrDeleted, getter_AddRefs(thread)); NS_ENSURE_SUCCESS(rv, rv); nsMsgViewIndex viewIndexOfThread = GetIndexOfFirstDisplayedKeyInThread( thread, true); // yes to dummy node thread->RemoveChildHdr(aHdrDeleted, nullptr); nsMsgGroupThread *groupThread = static_cast<nsMsgGroupThread *>((nsIMsgThread *) thread); bool rootDeleted = viewIndexOfThread != nsMsgKey_None && m_keys[viewIndexOfThread] == keyDeleted; rv = nsMsgDBView::OnHdrDeleted(aHdrDeleted, aParentKey, aFlags, aInstigator); if (groupThread->m_dummy) { if (!groupThread->NumRealChildren()) { thread->RemoveChildAt(0); // get rid of dummy if (viewIndexOfThread != nsMsgKey_None) { RemoveByIndex(viewIndexOfThread); if (m_deletingRows) mIndicesToNoteChange.AppendElement(viewIndexOfThread); } } else if (rootDeleted) { // reflect new thread root into view.dummy row. nsCOMPtr<nsIMsgDBHdr> hdr; thread->GetChildHdrAt(0, getter_AddRefs(hdr)); if (hdr) { nsMsgKey msgKey; hdr->GetMessageKey(&msgKey); SetMsgHdrAt(hdr, viewIndexOfThread, msgKey, m_flags[viewIndexOfThread], 0); } } } if (!groupThread->m_keys.Length()) { nsString hashKey; rv = HashHdr(aHdrDeleted, hashKey); if (NS_SUCCEEDED(rv)) m_groupsTable.Remove(hashKey); } return rv; }
NS_IMETHODIMP nsMsgQuickSearchDBView::OnHdrPropertyChanged(nsIMsgDBHdr *aHdrChanged, bool aPreChange, uint32_t *aStatus, nsIDBChangeListener *aInstigator) { // If the junk mail plugin just activated on a message, then // we'll allow filters to remove from view. // Otherwise, just update the view line. // // Note this will not add newly matched headers to the view. This is // probably a bug that needs fixing. NS_ENSURE_ARG_POINTER(aStatus); NS_ENSURE_ARG_POINTER(aHdrChanged); nsMsgViewIndex index = FindHdr(aHdrChanged); if (index == nsMsgViewIndex_None) // message does not appear in view return NS_OK; nsCString originStr; (void) aHdrChanged->GetStringProperty("junkscoreorigin", getter_Copies(originStr)); // check for "plugin" with only first character for performance bool plugin = (originStr.get()[0] == 'p'); if (aPreChange) { // first call, done prior to the change *aStatus = plugin; return NS_OK; } // second call, done after the change bool wasPlugin = *aStatus; bool match = true; nsCOMPtr<nsIMsgSearchSession> searchSession(do_QueryReferent(m_searchSession)); if (searchSession) searchSession->MatchHdr(aHdrChanged, m_db, &match); if (!match && plugin && !wasPlugin) RemoveByIndex(index); // remove hdr from view else NoteChange(index, 1, nsMsgViewNotificationCode::changed); return NS_OK; }
NS_IMETHODIMP nsMsgSearchDBView::OnHdrDeleted(nsIMsgDBHdr *aHdrDeleted, nsMsgKey aParentKey, int32_t aFlags, nsIDBChangeListener *aInstigator) { if (m_viewFlags & nsMsgViewFlagsType::kGroupBySort) return nsMsgGroupView::OnHdrDeleted(aHdrDeleted, aParentKey, aFlags, aInstigator); if (m_viewFlags & nsMsgViewFlagsType::kThreadedDisplay) { nsMsgViewIndex deletedIndex = FindHdr(aHdrDeleted); uint32_t savedFlags = 0; if (deletedIndex != nsMsgViewIndex_None) { savedFlags = m_flags[deletedIndex]; RemoveByIndex(deletedIndex); } nsCOMPtr<nsIMsgThread> thread; GetXFThreadFromMsgHdr(aHdrDeleted, getter_AddRefs(thread)); if (thread) { nsMsgXFViewThread *viewThread = static_cast<nsMsgXFViewThread*>(thread.get()); viewThread->RemoveChildHdr(aHdrDeleted, nullptr); if (deletedIndex == nsMsgViewIndex_None && viewThread->MsgCount() == 1) { // remove the last child of a collapsed thread. Need to find the root, // and remove the thread flags on it. nsCOMPtr<nsIMsgDBHdr> rootHdr; thread->GetRootHdr(nullptr, getter_AddRefs(rootHdr)); if (rootHdr) { nsMsgViewIndex threadIndex = GetThreadRootIndex(rootHdr); if (threadIndex != nsMsgViewIndex_None) AndExtraFlag(threadIndex, ~(MSG_VIEW_FLAG_ISTHREAD | nsMsgMessageFlags::Elided | MSG_VIEW_FLAG_HASCHILDREN)); } } else if (savedFlags & MSG_VIEW_FLAG_HASCHILDREN) { if (savedFlags & nsMsgMessageFlags::Elided) { nsCOMPtr<nsIMsgDBHdr> rootHdr; nsresult rv = thread->GetRootHdr(nullptr, getter_AddRefs(rootHdr)); NS_ENSURE_SUCCESS(rv, rv); nsMsgKey msgKey; uint32_t msgFlags; rootHdr->GetMessageKey(&msgKey); rootHdr->GetFlags(&msgFlags); // promote the new thread root if (viewThread->MsgCount() > 1) msgFlags |= MSG_VIEW_FLAG_ISTHREAD | nsMsgMessageFlags::Elided | MSG_VIEW_FLAG_HASCHILDREN; InsertMsgHdrAt(deletedIndex, rootHdr, msgKey, msgFlags, 0); if (!m_deletingRows) NoteChange(deletedIndex, 1, nsMsgViewNotificationCode::insertOrDelete); } else if (viewThread->MsgCount() > 1) { OrExtraFlag(deletedIndex, MSG_VIEW_FLAG_ISTHREAD | MSG_VIEW_FLAG_HASCHILDREN); } } } } else { return nsMsgDBView::OnHdrDeleted(aHdrDeleted, aParentKey, aFlags, aInstigator); } return NS_OK; }
void Dictionary<TKey, TValue>::RemoveByValue(const TValue &value) { // remove by index RemoveByIndex(IndexByValue(value)); }
void Dictionary<TKey, TValue>::RemoveByKey(const TKey &key) { // remove by index RemoveByIndex(IndexByKey(key)); }