/* -*- Mode: C++; tab-width: 4; 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 _nsImapOfflineSync_H_ #define _nsImapOfflineSync_H_ #include "mozilla/Attributes.h" #include "nsIMsgDatabase.h" #include "nsIUrlListener.h" #include "nsIMsgOfflineImapOperation.h" #include "nsIMsgWindow.h" #include "nsIMsgFolder.h" #include "nsCOMArray.h" #include "nsIDBChangeListener.h" class nsImapOfflineSync : public nsIUrlListener, public nsIMsgCopyServiceListener, public nsIDBChangeListener { public: // set to one folder to playback one folder only nsImapOfflineSync(nsIMsgWindow *window, nsIUrlListener *listener, nsIMsgFolder *singleFolderOnly = nullptr, bool isPseudoOffline = false); NS_DECL_ISUPPORTS NS_DECL_NSIURLLISTENER NS_DECL_NSIMSGCOPYSERVICELISTENER NS_DECL_NSIDBCHANGELISTENER virtual nsresult ProcessNextOperation(); // this kicks off playback int32_t GetCurrentUIDValidity(); void SetCurrentUIDValidity(int32_t uidvalidity) { mCurrentUIDValidity = uidvalidity; } void SetPseudoOffline(bool pseudoOffline) {m_pseudoOffline = pseudoOffline;} bool ProcessingStaleFolderUpdate() { return m_singleFolderToUpdate != nullptr; } bool CreateOfflineFolder(nsIMsgFolder *folder); void SetWindow(nsIMsgWindow *window); protected: virtual ~nsImapOfflineSync(); bool CreateOfflineFolders(); bool DestFolderOnSameServer(nsIMsgFolder *destFolder); bool AdvanceToNextServer(); bool AdvanceToNextFolder(); void AdvanceToFirstIMAPFolder(); void DeleteAllOfflineOpsForCurrentDB(); void ClearCurrentOps(); // Clears m_currentDB, and unregister listener. void ClearDB(); void ProcessFlagOperation(nsIMsgOfflineImapOperation *currentOp); void ProcessKeywordOperation(nsIMsgOfflineImapOperation *op); void ProcessMoveOperation(nsIMsgOfflineImapOperation *currentOp); void ProcessCopyOperation(nsIMsgOfflineImapOperation *currentOp); void ProcessEmptyTrash(); void ProcessAppendMsgOperation(nsIMsgOfflineImapOperation *currentOp, nsOfflineImapOperationType opType); nsCOMPtr m_currentFolder; nsCOMPtr m_singleFolderToUpdate; nsCOMPtr m_window; nsCOMPtr m_allServers; nsCOMPtr m_allFolders; nsCOMPtr m_currentServer; nsCOMPtr m_serverEnumerator; nsCOMPtr m_curTempFile; nsTArray m_CurrentKeys; nsCOMArray m_currentOpsToClear; uint32_t m_KeyIndex; nsCOMPtr m_currentDB; nsCOMPtr m_listener; int32_t mCurrentUIDValidity; int32_t mCurrentPlaybackOpType; // kFlagsChanged -> kMsgCopy -> kMsgMoved bool m_mailboxupdatesStarted; bool m_mailboxupdatesFinished; bool m_pseudoOffline; // for queueing online events in offline db bool m_createdOfflineFolders; }; class nsImapOfflineDownloader : public nsImapOfflineSync { public: nsImapOfflineDownloader(nsIMsgWindow *window, nsIUrlListener *listener); virtual ~nsImapOfflineDownloader(); virtual nsresult ProcessNextOperation() override; // this kicks off download }; #endif