diff --git a/mailnews/base/util/Makefile.in b/mailnews/base/util/Makefile.in index fea947945c20..da968c09e30e 100644 --- a/mailnews/base/util/Makefile.in +++ b/mailnews/base/util/Makefile.in @@ -106,6 +106,7 @@ CPPSRCS = \ nsMsgTxn.cpp \ nsMsgI18N.cpp \ nsAdapterEnumerator.cpp \ + nsImapMoveCoalescer.cpp \ $(NULL) EXPORTS = \ @@ -126,6 +127,7 @@ EXPORTS = \ nsMsgTxn.h \ nsMsgI18N.h \ nsAdapterEnumerator.h \ + nsImapMoveCoalescer.h \ $(NULL) ifndef MOZ_STATIC_MAIL_BUILD diff --git a/mailnews/imap/src/nsImapMoveCoalescer.cpp b/mailnews/base/util/nsImapMoveCoalescer.cpp old mode 100644 new mode 100755 similarity index 100% rename from mailnews/imap/src/nsImapMoveCoalescer.cpp rename to mailnews/base/util/nsImapMoveCoalescer.cpp diff --git a/mailnews/imap/src/nsImapMoveCoalescer.h b/mailnews/base/util/nsImapMoveCoalescer.h old mode 100644 new mode 100755 similarity index 98% rename from mailnews/imap/src/nsImapMoveCoalescer.h rename to mailnews/base/util/nsImapMoveCoalescer.h index 02e1a1c311be..34ca42f45caf --- a/mailnews/imap/src/nsImapMoveCoalescer.h +++ b/mailnews/base/util/nsImapMoveCoalescer.h @@ -52,7 +52,7 @@ class nsImapMailFolder; #include "nsISupportsArray.h" -class nsImapMoveCoalescer : public nsISupports +class NS_MSG_BASE nsImapMoveCoalescer : public nsISupports { public: NS_DECL_ISUPPORTS diff --git a/mailnews/imap/src/Makefile.in b/mailnews/imap/src/Makefile.in index 6a2f75deb022..51ecc7244ff9 100644 --- a/mailnews/imap/src/Makefile.in +++ b/mailnews/imap/src/Makefile.in @@ -107,7 +107,6 @@ CPPSRCS = \ nsImapService.cpp \ nsImapUrl.cpp \ nsImapFlagAndUidState.cpp \ - nsImapMoveCoalescer.cpp \ nsImapUndoTxn.cpp \ nsImapStringBundle.cpp \ nsImapOfflineSync.cpp \ diff --git a/mailnews/local/src/nsParseMailbox.cpp b/mailnews/local/src/nsParseMailbox.cpp index 292928b73920..835420a45318 100644 --- a/mailnews/local/src/nsParseMailbox.cpp +++ b/mailnews/local/src/nsParseMailbox.cpp @@ -1437,6 +1437,7 @@ nsParseNewMailState::nsParseNewMailState() m_ibuffer = nsnull; m_ibuffer_size = 0; m_ibuffer_fp = 0; + m_moveCoalescer = nsnull; } NS_IMPL_ISUPPORTS_INHERITED1(nsParseNewMailState, nsMsgMailboxParser, nsIMsgFilterHitNotify) @@ -1668,15 +1669,41 @@ NS_IMETHODIMP nsParseNewMailState::ApplyFilterHit(nsIMsgFilter *filter, nsIMsgWi if ((const char*)actionTargetFolderUri && nsCRT::strcasecmp(m_inboxUri, actionTargetFolderUri)) { - nsresult err = MoveIncorporatedMessage(msgHdr, m_mailDB, actionTargetFolderUri, filter, msgWindow); + nsresult err; + nsCOMPtr rdf(do_GetService(kRDFServiceCID, &err)); + NS_ENSURE_SUCCESS(err, err); + nsCOMPtr res; + err = rdf->GetResource(actionTargetFolderUri, getter_AddRefs(res)); + if (NS_FAILED(err)) + return err; + + nsCOMPtr destIFolder(do_QueryInterface(res, &err)); + if (NS_FAILED(err)) + return err; + + + if (StringBeginsWith(actionTargetFolderUri, NS_LITERAL_CSTRING("imap:"))) + { + if (!m_moveCoalescer) + m_moveCoalescer = new nsImapMoveCoalescer(m_downloadFolder, m_msgWindow); + NS_ENSURE_TRUE(m_moveCoalescer, NS_ERROR_OUT_OF_MEMORY); + nsMsgKey msgKey; + (void) msgHdr->GetMessageKey(&msgKey); + m_moveCoalescer->AddMove(destIFolder , msgKey); + err = NS_OK; + msgIsNew = PR_FALSE; + } + else + { + err = MoveIncorporatedMessage(msgHdr, m_mailDB, destIFolder, filter, msgWindow); + // cleanup after mailHdr in source DB because we moved the message. + m_mailDB->RemoveHeaderMdbRow(msgHdr); + m_msgMovedByFilter = PR_TRUE; + } if (NS_SUCCEEDED(err)) { if (loggingEnabled) (void)filter->LogRuleHit(filterAction, msgHdr); - - // cleanup after mailHdr in source DB because we moved the message. - m_mailDB->RemoveHeaderMdbRow(msgHdr); - m_msgMovedByFilter = PR_TRUE; } } *applyMore = PR_FALSE; @@ -1798,6 +1825,9 @@ int nsParseNewMailState::MarkFilteredMessageRead(nsIMsgDBHdr *msgHdr) nsresult nsParseNewMailState::EndMsgDownload() { + if (m_moveCoalescer) + m_moveCoalescer->PlaybackMoves(); + // need to do this for all folders that had messages filtered into them PRUint32 serverCount = m_filterTargetFolders.Count(); nsresult rv; @@ -1824,24 +1854,13 @@ nsresult nsParseNewMailState::EndMsgDownload() nsresult nsParseNewMailState::MoveIncorporatedMessage(nsIMsgDBHdr *mailHdr, nsIMsgDatabase *sourceDB, - const nsACString& destFolderUri, + nsIMsgFolder *destIFolder, nsIMsgFilter *filter, nsIMsgWindow *msgWindow) { nsresult err = 0; nsIOFileStream *destFile; - nsCOMPtr rdf(do_GetService(kRDFServiceCID, &err)); - NS_ENSURE_SUCCESS(err, err); - nsCOMPtr res; - err = rdf->GetResource(destFolderUri, getter_AddRefs(res)); - if (NS_FAILED(err)) - return err; - - nsCOMPtr destIFolder(do_QueryInterface(res, &err)); - if (NS_FAILED(err)) - return err; - // check if the destination is a real folder (by checking for null parent) // and if it can file messages (e.g., servers or news folders can't file messages). // Or read only imap folders... @@ -1858,7 +1877,7 @@ nsresult nsParseNewMailState::MoveIncorporatedMessage(nsIMsgDBHdr *mailHdr, } nsCOMPtr destIFolderSpec; - + nsFileSpec destFolderSpec; destIFolder->GetPath(getter_AddRefs(destIFolderSpec)); err = destIFolderSpec->GetFileSpec(&destFolderSpec); diff --git a/mailnews/local/src/nsParseMailbox.h b/mailnews/local/src/nsParseMailbox.h index 37b7e677f7b2..0d8b87542343 100644 --- a/mailnews/local/src/nsParseMailbox.h +++ b/mailnews/local/src/nsParseMailbox.h @@ -57,6 +57,7 @@ #include "nsIDBChangeListener.h" #include "nsIWeakReference.h" #include "nsIMsgWindow.h" +#include "nsImapMoveCoalescer.h" #include "nsIMsgFilterList.h" #include "nsIMsgFilterHitNotify.h" @@ -247,7 +248,7 @@ protected: virtual nsresult GetTrashFolder(nsIMsgFolder **pTrashFolder); virtual nsresult MoveIncorporatedMessage(nsIMsgDBHdr *mailHdr, nsIMsgDatabase *sourceDB, - const nsACString& destFolder, + nsIMsgFolder *destIFolder, nsIMsgFilter *filter, nsIMsgWindow *msgWindow); virtual int MarkFilteredMessageRead(nsIMsgDBHdr *msgHdr); @@ -257,6 +258,9 @@ protected: nsCOMPtr m_msgWindow; nsCOMPtr m_downloadFolder; nsCOMArray m_filterTargetFolders; + + nsImapMoveCoalescer *m_moveCoalescer; // strictly owned by nsParseNewMailState; + nsIOFileStream *m_inboxFileStream; nsFileSpec m_inboxFileSpec; PRBool m_disableFilters;