/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "msgCore.h" #include "nsMsgFolderNotificationService.h" #include "nsIMsgHdr.h" #include "nsIMsgFolder.h" #include "nsIMsgImapMailFolder.h" #include "nsIImapIncomingServer.h" // // nsMsgFolderNotificationService // NS_IMPL_ISUPPORTS(nsMsgFolderNotificationService, nsIMsgFolderNotificationService) nsMsgFolderNotificationService::nsMsgFolderNotificationService() {} nsMsgFolderNotificationService::~nsMsgFolderNotificationService() { /* destructor code */ } NS_IMETHODIMP nsMsgFolderNotificationService::GetHasListeners( bool* aHasListeners) { NS_ENSURE_ARG_POINTER(aHasListeners); *aHasListeners = mListeners.Length() > 0; return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::AddListener( nsIMsgFolderListener* aListener, msgFolderListenerFlag aFlags) { NS_ENSURE_ARG_POINTER(aListener); MsgFolderListener listener(aListener, aFlags); mListeners.AppendElementUnlessExists(listener); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::RemoveListener( nsIMsgFolderListener* aListener) { NS_ENSURE_ARG_POINTER(aListener); mListeners.RemoveElement(aListener); return NS_OK; } #define NOTIFY_MSGFOLDER_LISTENERS(propertyflag_, propertyfunc_, params_) \ PR_BEGIN_MACRO \ nsTObserverArray::ForwardIterator iter(mListeners); \ while (iter.HasMore()) { \ const MsgFolderListener& listener = iter.GetNext(); \ if (listener.mFlags & propertyflag_) \ listener.mListener->propertyfunc_ params_; \ } \ PR_END_MACRO NS_IMETHODIMP nsMsgFolderNotificationService::NotifyMsgAdded( nsIMsgDBHdr* aMsg) { NOTIFY_MSGFOLDER_LISTENERS(msgAdded, MsgAdded, (aMsg)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyMsgsClassified( const nsTArray>& aMsgs, bool aJunkProcessed, bool aTraitProcessed) { NOTIFY_MSGFOLDER_LISTENERS(msgsClassified, MsgsClassified, (aMsgs, aJunkProcessed, aTraitProcessed)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyMsgsJunkStatusChanged( const nsTArray>& messages) { NOTIFY_MSGFOLDER_LISTENERS(msgsJunkStatusChanged, MsgsJunkStatusChanged, (messages)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyMsgsDeleted( const nsTArray>& aMsgs) { NOTIFY_MSGFOLDER_LISTENERS(msgsDeleted, MsgsDeleted, (aMsgs)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyMsgsMoveCopyCompleted( bool aMove, const nsTArray>& aSrcMsgs, nsIMsgFolder* aDestFolder, const nsTArray>& aDestMsgs) { // IMAP delete model means that a "move" isn't really a move, it is a copy, // followed by storing the IMAP deleted flag on the message. bool isReallyMove = aMove; if (aMove && !mListeners.IsEmpty() && !aSrcMsgs.IsEmpty()) { nsresult rv; // Assume that all the source messages are from the same server. nsCOMPtr msgFolder; rv = aSrcMsgs[0]->GetFolder(getter_AddRefs(msgFolder)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr imapFolder(do_QueryInterface(msgFolder)); if (imapFolder) { nsCOMPtr imapServer; imapFolder->GetImapIncomingServer(getter_AddRefs(imapServer)); if (imapServer) { nsMsgImapDeleteModel deleteModel; imapServer->GetDeleteModel(&deleteModel); if (deleteModel == nsMsgImapDeleteModels::IMAPDelete) isReallyMove = false; } } } NOTIFY_MSGFOLDER_LISTENERS(msgsMoveCopyCompleted, MsgsMoveCopyCompleted, (isReallyMove, aSrcMsgs, aDestFolder, aDestMsgs)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyMsgKeyChanged(nsMsgKey aOldKey, nsIMsgDBHdr* aNewHdr) { NOTIFY_MSGFOLDER_LISTENERS(msgKeyChanged, MsgKeyChanged, (aOldKey, aNewHdr)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyMsgUnincorporatedMoved( nsIMsgFolder* srcFolder, nsIMsgDBHdr* msg) { NOTIFY_MSGFOLDER_LISTENERS(msgUnincorporatedMoved, MsgUnincorporatedMoved, (srcFolder, msg)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyFolderAdded( nsIMsgFolder* aFolder) { NOTIFY_MSGFOLDER_LISTENERS(folderAdded, FolderAdded, (aFolder)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyFolderDeleted( nsIMsgFolder* aFolder) { NOTIFY_MSGFOLDER_LISTENERS(folderDeleted, FolderDeleted, (aFolder)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyFolderMoveCopyCompleted( bool aMove, nsIMsgFolder* aSrcFolder, nsIMsgFolder* aDestFolder) { NOTIFY_MSGFOLDER_LISTENERS(folderMoveCopyCompleted, FolderMoveCopyCompleted, (aMove, aSrcFolder, aDestFolder)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyFolderRenamed( nsIMsgFolder* aOrigFolder, nsIMsgFolder* aNewFolder) { NOTIFY_MSGFOLDER_LISTENERS(folderRenamed, FolderRenamed, (aOrigFolder, aNewFolder)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyFolderCompactStart( nsIMsgFolder* folder) { NOTIFY_MSGFOLDER_LISTENERS(folderCompactStart, FolderCompactStart, (folder)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyFolderCompactFinish( nsIMsgFolder* folder) { NOTIFY_MSGFOLDER_LISTENERS(folderCompactFinish, FolderCompactFinish, (folder)); return NS_OK; } NS_IMETHODIMP nsMsgFolderNotificationService::NotifyFolderReindexTriggered( nsIMsgFolder* folder) { NOTIFY_MSGFOLDER_LISTENERS(folderReindexTriggered, FolderReindexTriggered, (folder)); return NS_OK; }