/* -*- 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/. */ #ifndef nsMsgMailSession_h___ #define nsMsgMailSession_h___ #include "nsIMsgMailSession.h" #include "nsISupports.h" #include "nsCOMPtr.h" #include "nsIMsgStatusFeedback.h" #include "nsIMsgWindow.h" #include "nsCOMArray.h" #include "nsIMsgShutdown.h" #include "nsIObserver.h" #include "nsIMsgProgress.h" #include "nsTObserverArray.h" #include "nsIMsgUserFeedbackListener.h" #include "nsIUrlListener.h" /////////////////////////////////////////////////////////////////////////////////// // The mail session is a replacement for the old 4.x MSG_Master object. It // contains mail session generic information such as the user's current mail // identity, .... I'm starting this off as an empty interface and as people feel // they need to add more information to it, they can. I think this is a better // approach than trying to port over the old MSG_Master in its entirety as that // had a lot of cruft in it.... ////////////////////////////////////////////////////////////////////////////////// // nsMsgMailSession also implements nsIFolderListener, in order to relay // notifications to its registered listeners. // Calling a method on the MailSession causes that method to be invoked upon // all the registered listeners (but not listeners directly attached to // folders!) // In normal operation, most notifications will originate from the // nsIMsgFolder.Notify*() functions, which invoke both folder-local // listeners, and the global MailSession-registered ones). class nsMsgMailSession : public nsIMsgMailSession, public nsIFolderListener { public: nsMsgMailSession(); NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIMSGMAILSESSION NS_DECL_NSIFOLDERLISTENER nsresult Init(); nsresult GetSelectedLocaleDataDir(nsIFile* defaultsDir); protected: virtual ~nsMsgMailSession(); struct folderListener { nsCOMPtr mListener; uint32_t mNotifyFlags; folderListener(nsIFolderListener* aListener, uint32_t aNotifyFlags) : mListener(aListener), mNotifyFlags(aNotifyFlags) {} folderListener(const folderListener& aListener) : mListener(aListener.mListener), mNotifyFlags(aListener.mNotifyFlags) {} ~folderListener() {} int operator==(nsIFolderListener* aListener) const { return mListener == aListener; } int operator==(const folderListener& aListener) const { return mListener == aListener.mListener && mNotifyFlags == aListener.mNotifyFlags; } }; nsTObserverArray mListeners; nsTObserverArray > mFeedbackListeners; nsCOMArray mWindows; // stick this here temporarily nsCOMPtr m_temporaryMsgWindow; }; /********************************************************************************/ class nsMsgShutdownService : public nsIMsgShutdownService, public nsIUrlListener, public nsIObserver { public: nsMsgShutdownService(); NS_DECL_ISUPPORTS NS_DECL_NSIMSGSHUTDOWNSERVICE NS_DECL_NSIURLLISTENER NS_DECL_NSIOBSERVER protected: nsresult ProcessNextTask(); void AttemptShutdown(); private: virtual ~nsMsgShutdownService(); nsCOMArray mShutdownTasks; nsCOMPtr mMsgProgress; uint32_t mTaskIndex; uint32_t mQuitMode; bool mProcessedShutdown; bool mQuitForced; bool mReadyToQuit; }; #endif /* nsMsgMailSession_h__ */