/* -*- 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 "mozilla/Attributes.h" #include "nsIRDFDataSource.h" #include "nsIRDFService.h" #include "nsIFolderListener.h" #include "nsMsgRDFDataSource.h" #include "nsITransactionManager.h" #include "nsCOMArray.h" #include "nsIMutableArray.h" // Disable deprecation warnings generated by nsISupportsArray and associated // classes. #if defined(__GNUC__) #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #elif defined(_MSC_VER) #pragma warning (disable : 4996) #endif #include "nsISupportsArray.h" /** * The mail data source. */ class nsMsgFolderDataSource : public nsMsgRDFDataSource, public nsIFolderListener { public: NS_DECL_ISUPPORTS_INHERITED NS_DECL_NSIFOLDERLISTENER nsMsgFolderDataSource(void); virtual nsresult Init() override; virtual void Cleanup() override; // nsIRDFDataSource methods NS_IMETHOD GetURI(char* *uri) override; NS_IMETHOD GetSource(nsIRDFResource* property, nsIRDFNode* target, bool tv, nsIRDFResource** source /* out */) override; NS_IMETHOD GetTarget(nsIRDFResource* source, nsIRDFResource* property, bool tv, nsIRDFNode** target) override; NS_IMETHOD GetSources(nsIRDFResource* property, nsIRDFNode* target, bool tv, nsISimpleEnumerator** sources) override; NS_IMETHOD GetTargets(nsIRDFResource* source, nsIRDFResource* property, bool tv, nsISimpleEnumerator** targets) override; NS_IMETHOD Assert(nsIRDFResource* source, nsIRDFResource* property, nsIRDFNode* target, bool tv) override; NS_IMETHOD Unassert(nsIRDFResource* source, nsIRDFResource* property, nsIRDFNode* target) override; NS_IMETHOD HasAssertion(nsIRDFResource* source, nsIRDFResource* property, nsIRDFNode* target, bool tv, bool* hasAssertion) override; NS_IMETHOD HasArcOut(nsIRDFResource *aSource, nsIRDFResource *aArc, bool *result) override; NS_IMETHOD ArcLabelsIn(nsIRDFNode* node, nsISimpleEnumerator** labels) override; NS_IMETHOD ArcLabelsOut(nsIRDFResource* source, nsISimpleEnumerator** labels) override; NS_IMETHOD GetAllResources(nsISimpleEnumerator** aResult) override; NS_IMETHOD GetAllCmds(nsIRDFResource* source, nsISimpleEnumerator/**/** commands ) override; NS_IMETHOD IsCommandEnabled(nsISupports/*nsISupportsArray*/* aSources, nsIRDFResource* aCommand, nsISupports/*nsISupportsArray*/* aArguments, bool* aResult) override; NS_IMETHOD DoCommand(nsISupports/*nsISupportsArray*/* aSources, nsIRDFResource* aCommand, nsISupports/*nsISupportsArray*/* aArguments) override; protected: virtual ~nsMsgFolderDataSource(); nsresult GetSenderName(nsAutoString& sender, nsAutoString *senderUserName); nsresult createFolderNode(nsIMsgFolder *folder, nsIRDFResource* property, nsIRDFNode **target); nsresult createFolderNameNode(nsIMsgFolder *folder, nsIRDFNode **target, bool sort); nsresult createFolderOpenNode(nsIMsgFolder *folder,nsIRDFNode **target); nsresult createFolderTreeNameNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderTreeSimpleNameNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderSpecialNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderServerTypeNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createServerIsDeferredNode(nsIMsgFolder* folder, nsIRDFNode **target); nsresult createFolderCanCreateFoldersOnServerNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderCanFileMessagesOnServerNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderIsServerNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderIsSecureNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderCanSubscribeNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderSupportsOfflineNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderCanFileMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderCanCreateSubfoldersNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderCanRenameNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderCanCompactNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createTotalMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createUnreadMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderSizeNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createCharsetNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createBiffStateNodeFromFolder(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createBiffStateNodeFromFlag(uint32_t flag, nsIRDFNode **target); nsresult createHasUnreadMessagesNode(nsIMsgFolder *folder, bool aIncludeSubfolders, nsIRDFNode **target); nsresult createNewMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderNoSelectNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderVirtualNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createInVFEditSearchScopeNode(nsIMsgFolder* folder, nsIRDFNode **target); nsresult createFolderImapSharedNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderSynchronizeNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderSyncDisabledNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createCanSearchMessages(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderChildNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult getFolderArcLabelsOut(nsCOMArray &aArcs); nsresult DoDeleteFromFolder(nsIMsgFolder *folder, nsISupportsArray *arguments, nsIMsgWindow *msgWindow, bool reallyDelete); nsresult DoCopyToFolder(nsIMsgFolder *dstFolder, nsISupportsArray *arguments, nsIMsgWindow *msgWindow, bool isMove); nsresult DoFolderCopyToFolder(nsIMsgFolder *dstFolder, nsISupportsArray *arguments, nsIMsgWindow *msgWindow, bool isMoveFolder); nsresult DoNewFolder(nsIMsgFolder *folder, nsISupportsArray *arguments, nsIMsgWindow *window); nsresult DoFolderAssert(nsIMsgFolder *folder, nsIRDFResource *property, nsIRDFNode *target); nsresult DoFolderUnassert(nsIMsgFolder *folder, nsIRDFResource *property, nsIRDFNode *target); nsresult DoFolderHasAssertion(nsIMsgFolder *folder, nsIRDFResource *property, nsIRDFNode *target, bool tv, bool *hasAssertion); nsresult GetBiffStateString(uint32_t biffState, nsAutoCString & biffStateStr); nsresult CreateUnreadMessagesNameString(int32_t unreadMessages, nsAutoString &nameString); nsresult CreateArcsOutEnumerator(); virtual nsresult OnItemAddedOrRemoved(nsIMsgFolder *parentItem, nsISupports *item, bool added); nsresult OnUnreadMessagePropertyChanged(nsIRDFResource *folderResource, int32_t oldValue, int32_t newValue); nsresult OnTotalMessagePropertyChanged(nsIRDFResource *folderResource, int32_t oldValue, int32_t newValue); nsresult OnFolderSizePropertyChanged(nsIRDFResource *folderResource, int64_t oldValue, int64_t newValue); nsresult OnFolderSortOrderPropertyChanged(nsIRDFResource *folderResource, int32_t oldValue, int32_t newValue); nsresult NotifyFolderTreeNameChanged(nsIMsgFolder *folder, nsIRDFResource *folderResource, int32_t aUnreadMessages); nsresult NotifyFolderTreeSimpleNameChanged(nsIMsgFolder *folder, nsIRDFResource *folderResource); nsresult NotifyFolderNameChanged(nsIMsgFolder *folder, nsIRDFResource *folderResource); nsresult NotifyAncestors(nsIMsgFolder *aFolder, nsIRDFResource *aPropertyResource, nsIRDFNode *aNode); nsresult GetNumMessagesNode(int32_t numMessages, nsIRDFNode **node); nsresult GetFolderSizeNode(int64_t folderSize, nsIRDFNode **node); nsresult CreateLiterals(nsIRDFService *rdf); virtual nsresult GetFolderDisplayName(nsIMsgFolder *folder, nsString& folderName); static nsIRDFResource* kNC_Child; static nsIRDFResource* kNC_Folder; static nsIRDFResource* kNC_Name; static nsIRDFResource* kNC_Open; static nsIRDFResource* kNC_FolderTreeName; static nsIRDFResource* kNC_FolderTreeSimpleName; static nsIRDFResource* kNC_NameSort; static nsIRDFResource* kNC_FolderTreeNameSort; static nsIRDFResource* kNC_Columns; static nsIRDFResource* kNC_MSGFolderRoot; static nsIRDFResource* kNC_SpecialFolder; static nsIRDFResource* kNC_ServerType; static nsIRDFResource* kNC_IsDeferred; static nsIRDFResource* kNC_CanCreateFoldersOnServer; static nsIRDFResource* kNC_CanFileMessagesOnServer; static nsIRDFResource* kNC_IsServer; static nsIRDFResource* kNC_IsSecure; static nsIRDFResource* kNC_CanSubscribe; static nsIRDFResource* kNC_SupportsOffline; static nsIRDFResource* kNC_CanFileMessages; static nsIRDFResource* kNC_CanCreateSubfolders; static nsIRDFResource* kNC_CanRename; static nsIRDFResource* kNC_CanCompact; static nsIRDFResource* kNC_TotalMessages; static nsIRDFResource* kNC_TotalUnreadMessages; static nsIRDFResource* kNC_FolderSize; static nsIRDFResource* kNC_Charset; static nsIRDFResource* kNC_BiffState; static nsIRDFResource* kNC_HasUnreadMessages; static nsIRDFResource* kNC_NewMessages; static nsIRDFResource* kNC_SubfoldersHaveUnreadMessages; static nsIRDFResource* kNC_NoSelect; static nsIRDFResource* kNC_ImapShared; static nsIRDFResource* kNC_Synchronize; static nsIRDFResource* kNC_SyncDisabled; static nsIRDFResource* kNC_CanSearchMessages; static nsIRDFResource* kNC_VirtualFolder; static nsIRDFResource* kNC_InVFEditSearchScope; static nsIRDFResource* kNC_UnreadFolders; // maybe should be in nsMsgFlatFolderDataSource? static nsIRDFResource* kNC_FavoriteFolders; // maybe should be in nsMsgFlatFolderDataSource? static nsIRDFResource* kNC_RecentFolders; // maybe should be in nsMsgFlatFolderDataSource? // commands static nsIRDFResource* kNC_Delete; static nsIRDFResource* kNC_ReallyDelete; static nsIRDFResource* kNC_NewFolder; static nsIRDFResource* kNC_GetNewMessages; static nsIRDFResource* kNC_Copy; static nsIRDFResource* kNC_Move; static nsIRDFResource* kNC_CopyFolder; static nsIRDFResource* kNC_MoveFolder; static nsIRDFResource* kNC_MarkAllMessagesRead; static nsIRDFResource* kNC_Compact; static nsIRDFResource* kNC_CompactAll; static nsIRDFResource* kNC_Rename; static nsIRDFResource* kNC_EmptyTrash; static nsIRDFResource* kNC_DownloadFlagged; //Cached literals nsCOMPtr kTrueLiteral; nsCOMPtr kFalseLiteral; // property atoms static nsIAtom* kTotalMessagesAtom; static nsIAtom* kTotalUnreadMessagesAtom; static nsIAtom* kFolderSizeAtom; static nsIAtom* kBiffStateAtom; static nsIAtom* kSortOrderAtom; static nsIAtom* kNewMessagesAtom; static nsIAtom* kNameAtom; static nsIAtom* kSynchronizeAtom; static nsIAtom* kOpenAtom; static nsIAtom* kIsDeferredAtom; static nsIAtom* kIsSecureAtom; static nsrefcnt gFolderResourceRefCnt; static nsIAtom* kCanFileMessagesAtom; static nsIAtom* kInVFEditSearchScopeAtom; nsCOMArray kFolderArcsOutArray; }; class nsMsgFlatFolderDataSource : public nsMsgFolderDataSource { public: // constructor could take a filter to filter out folders. nsMsgFlatFolderDataSource(); virtual ~nsMsgFlatFolderDataSource(); virtual nsresult Init() override; virtual void Cleanup() override; NS_IMETHOD GetURI(char* *uri) override; NS_IMETHOD GetTargets(nsIRDFResource* source, nsIRDFResource* property, bool tv, nsISimpleEnumerator** targets) override; NS_IMETHOD GetTarget(nsIRDFResource* source, nsIRDFResource* property, bool tv, nsIRDFNode** target) override; NS_IMETHOD HasAssertion(nsIRDFResource* source, nsIRDFResource* property, nsIRDFNode* target, bool tv, bool* hasAssertion) override; protected: virtual nsresult GetFolderDisplayName(nsIMsgFolder *folder, nsString& folderName) override; virtual void EnsureFolders(); virtual bool WantsThisFolder(nsIMsgFolder *folder); bool ResourceIsOurRoot(nsIRDFResource *resource); virtual nsresult OnItemAddedOrRemoved(nsIMsgFolder *parentItem, nsISupports *item, bool added) override; nsCOMArray m_folders; nsCOMPtr m_rootResource; // the resource for our root nsCString m_dsName; bool m_builtFolders; }; class nsMsgUnreadFoldersDataSource : public nsMsgFlatFolderDataSource { public: nsMsgUnreadFoldersDataSource() {m_dsName = "mailnewsunreadfolders";} virtual ~nsMsgUnreadFoldersDataSource() {} virtual nsresult NotifyPropertyChanged(nsIRDFResource *resource, nsIRDFResource *propertyResource, nsIRDFNode *newNode, nsIRDFNode *oldNode = nullptr) override; protected: virtual bool WantsThisFolder(nsIMsgFolder *folder) override; }; class nsMsgFavoriteFoldersDataSource : public nsMsgFlatFolderDataSource { public: nsMsgFavoriteFoldersDataSource() {m_dsName = "mailnewsfavefolders";} virtual ~nsMsgFavoriteFoldersDataSource() {} protected: virtual bool WantsThisFolder(nsIMsgFolder *folder) override; }; class nsMsgRecentFoldersDataSource : public nsMsgFlatFolderDataSource { public: nsMsgRecentFoldersDataSource() {m_dsName = "mailnewsrecentfolders"; m_cutOffDate = 0; m_maxNumFolders = 15;} virtual ~nsMsgRecentFoldersDataSource() {} virtual nsresult NotifyPropertyChanged(nsIRDFResource *resource, nsIRDFResource *property, nsIRDFNode *newNode, nsIRDFNode *oldNode) override; NS_IMETHOD OnItemAdded(nsIMsgFolder *parentItem, nsISupports *item) override; virtual void Cleanup() override; protected: virtual void EnsureFolders() override; uint32_t m_cutOffDate; uint32_t m_maxNumFolders; };