fix 210614, sr=mscott make pop3 incoming filters capable of filtering to imap folders

This commit is contained in:
bienvenu%nventure.com 2004-11-23 04:50:23 +00:00
Родитель c1a3588c96
Коммит eb3a5998d1
6 изменённых файлов: 45 добавлений и 21 удалений

Просмотреть файл

@ -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

Просмотреть файл

Просмотреть файл

@ -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;