From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../base/src/nsMsgFolderNotificationService.cpp | 174 +++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 comm/mailnews/base/src/nsMsgFolderNotificationService.cpp (limited to 'comm/mailnews/base/src/nsMsgFolderNotificationService.cpp') diff --git a/comm/mailnews/base/src/nsMsgFolderNotificationService.cpp b/comm/mailnews/base/src/nsMsgFolderNotificationService.cpp new file mode 100644 index 0000000000..7983a8ec56 --- /dev/null +++ b/comm/mailnews/base/src/nsMsgFolderNotificationService.cpp @@ -0,0 +1,174 @@ +/* -*- 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; +} -- cgit v1.2.3