зеркало из https://github.com/mozilla/gecko-dev.git
fix 210614, sr=mscott make pop3 incoming filters capable of filtering to imap folders
This commit is contained in:
Родитель
c1a3588c96
Коммит
eb3a5998d1
|
@ -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
|
||||
|
|
0
mailnews/imap/src/nsImapMoveCoalescer.cpp → mailnews/base/util/nsImapMoveCoalescer.cpp
Normal file → Executable file
0
mailnews/imap/src/nsImapMoveCoalescer.cpp → mailnews/base/util/nsImapMoveCoalescer.cpp
Normal file → Executable file
2
mailnews/imap/src/nsImapMoveCoalescer.h → mailnews/base/util/nsImapMoveCoalescer.h
Normal file → Executable file
2
mailnews/imap/src/nsImapMoveCoalescer.h → mailnews/base/util/nsImapMoveCoalescer.h
Normal file → Executable file
|
@ -52,7 +52,7 @@ class nsImapMailFolder;
|
|||
|
||||
#include "nsISupportsArray.h"
|
||||
|
||||
class nsImapMoveCoalescer : public nsISupports
|
||||
class NS_MSG_BASE nsImapMoveCoalescer : public nsISupports
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
|
@ -107,7 +107,6 @@ CPPSRCS = \
|
|||
nsImapService.cpp \
|
||||
nsImapUrl.cpp \
|
||||
nsImapFlagAndUidState.cpp \
|
||||
nsImapMoveCoalescer.cpp \
|
||||
nsImapUndoTxn.cpp \
|
||||
nsImapStringBundle.cpp \
|
||||
nsImapOfflineSync.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<nsIRDFService> rdf(do_GetService(kRDFServiceCID, &err));
|
||||
NS_ENSURE_SUCCESS(err, err);
|
||||
nsCOMPtr<nsIRDFResource> res;
|
||||
err = rdf->GetResource(actionTargetFolderUri, getter_AddRefs(res));
|
||||
if (NS_FAILED(err))
|
||||
return err;
|
||||
|
||||
nsCOMPtr<nsIMsgFolder> 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<nsIRDFService> rdf(do_GetService(kRDFServiceCID, &err));
|
||||
NS_ENSURE_SUCCESS(err, err);
|
||||
nsCOMPtr<nsIRDFResource> res;
|
||||
err = rdf->GetResource(destFolderUri, getter_AddRefs(res));
|
||||
if (NS_FAILED(err))
|
||||
return err;
|
||||
|
||||
nsCOMPtr<nsIMsgFolder> 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 <nsIFileSpec> destIFolderSpec;
|
||||
|
||||
|
||||
nsFileSpec destFolderSpec;
|
||||
destIFolder->GetPath(getter_AddRefs(destIFolderSpec));
|
||||
err = destIFolderSpec->GetFileSpec(&destFolderSpec);
|
||||
|
|
|
@ -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 <nsIMsgWindow> m_msgWindow;
|
||||
nsCOMPtr <nsIMsgFolder> m_downloadFolder;
|
||||
nsCOMArray <nsIMsgFolder> m_filterTargetFolders;
|
||||
|
||||
nsImapMoveCoalescer *m_moveCoalescer; // strictly owned by nsParseNewMailState;
|
||||
|
||||
nsIOFileStream *m_inboxFileStream;
|
||||
nsFileSpec m_inboxFileSpec;
|
||||
PRBool m_disableFilters;
|
||||
|
|
Загрузка…
Ссылка в новой задаче