diff options
Diffstat (limited to 'mailnews/imap/src/nsAutoSyncState.h')
-rw-r--r-- | mailnews/imap/src/nsAutoSyncState.h | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/mailnews/imap/src/nsAutoSyncState.h b/mailnews/imap/src/nsAutoSyncState.h new file mode 100644 index 000000000..c28c10d60 --- /dev/null +++ b/mailnews/imap/src/nsAutoSyncState.h @@ -0,0 +1,107 @@ +/* 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 nsAutoSyncState_h__ +#define nsAutoSyncState_h__ + +#include "MailNewsTypes.h" +#include "nsIAutoSyncState.h" +#include "nsIAutoSyncManager.h" +#include "nsIUrlListener.h" +#include "nsWeakPtr.h" +#include "nsTHashtable.h" +#include "nsHashKeys.h" +#include "nsTArray.h" +#include "prlog.h" +#include "nsIWeakReferenceUtils.h" + +class nsImapMailFolder; +class nsIAutoSyncMsgStrategy; +class nsIMsgDatabase; + +/** + * An adaptor class to make msg strategy nsTArray.Sort() + * compatible. + */ +class MsgStrategyComparatorAdaptor +{ + public: + MsgStrategyComparatorAdaptor(nsIAutoSyncMsgStrategy* aStrategy, + nsIMsgFolder *aFolder, nsIMsgDatabase *aDatabase); + + /** @return True if the elements are equals; false otherwise. */ + bool Equals(const nsMsgKey& a, const nsMsgKey& b) const; + + /** @return True if (a < b); false otherwise. */ + bool LessThan(const nsMsgKey& a, const nsMsgKey& b) const; + + private: + MsgStrategyComparatorAdaptor(); + + private: + nsIAutoSyncMsgStrategy *mStrategy; + nsIMsgFolder *mFolder; + nsIMsgDatabase *mDatabase; +}; + + +/** + * Facilitates auto-sync capabilities for imap folders. + */ +class nsAutoSyncState final : public nsIAutoSyncState, public nsIUrlListener +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIAUTOSYNCSTATE + NS_DECL_NSIURLLISTENER + + nsAutoSyncState(nsImapMailFolder *aOwnerFolder, PRTime aLastSyncTime = 0UL); + + /// Called by owner folder when new headers are fetched from the server + void OnNewHeaderFetchCompleted(const nsTArray<nsMsgKey> &aMsgKeyList); + + /// Sets the last sync time in lower precision (seconds) + void SetLastSyncTimeInSec(int32_t aLastSyncTime); + + /// Manages storage space for auto-sync operations + nsresult ManageStorageSpace(); + + void SetServerCounts(int32_t total, int32_t recent, int32_t unseen, + int32_t nextUID); + + private: + ~nsAutoSyncState(); + + nsresult PlaceIntoDownloadQ(const nsTArray<nsMsgKey> &aMsgKeyList); + nsresult SortQueueBasedOnStrategy(nsTArray<nsMsgKey> &aQueue); + nsresult SortSubQueueBasedOnStrategy(nsTArray<nsMsgKey> &aQueue, + uint32_t aStartingOffset); + + void LogOwnerFolderName(const char *s); + void LogQWithSize(nsTArray<nsMsgKey>& q, uint32_t toOffset = 0); + void LogQWithSize(nsIMutableArray *q, uint32_t toOffset = 0); + + private: + int32_t mSyncState; + nsWeakPtr mOwnerFolder; + uint32_t mOffset; + uint32_t mLastOffset; + + // used to tell if the Server counts have changed. + int32_t mLastServerTotal; + int32_t mLastServerRecent; + int32_t mLastServerUnseen; + int32_t mLastNextUID; + + PRTime mLastSyncTime; + PRTime mLastUpdateTime; + uint32_t mProcessPointer; + bool mIsDownloadQChanged; + uint32_t mRetryCounter; + nsTHashtable<nsUint32HashKey> mDownloadSet; + nsTArray<nsMsgKey> mDownloadQ; + nsTArray<nsMsgKey> mExistingHeadersQ; +}; + +#endif |