epoc32/include/cacheman.h
branchSymbian2
changeset 2 2fe1408b6811
parent 0 061f57f2323e
--- a/epoc32/include/cacheman.h	Tue Nov 24 13:55:44 2009 +0000
+++ b/epoc32/include/cacheman.h	Tue Mar 16 16:12:26 2010 +0000
@@ -1,1 +1,295 @@
-cacheman.h
+// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#if !defined (__CACHEMAN_H__)
+#define __CACHEMAN_H__
+
+#include <mentact.h>
+#include <msvstd.h>
+#include <msvapi.h>
+
+_LIT(KMiutWildCard, "*.*");
+
+class CImFinder : public CMsgActive
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	IMPORT_C void FindFirstL(TMsvId aRootEntry, TRequestStatus &aStatus);
+	IMPORT_C ~CImFinder();
+	IMPORT_C virtual void FindNextL(TRequestStatus &aStatus);
+	void FindFirstL(const CMsvEntrySelection& aInitialSelection, TRequestStatus &aStatus);
+
+	class CImEntryStack : public CBase
+		{
+	public:
+		static CImEntryStack* NewL();
+		~CImEntryStack();
+		inline void PushL(TMsvId aId);
+		inline TMsvId PopL();
+		inline TBool Empty() const;
+		inline void Reset();
+
+	private:
+		void ConstructL();
+
+		CMsvEntrySelection* iFolders;
+		};
+
+protected:
+	void ConstructL();
+	CImFinder(CMsvEntry& aEntry);
+
+private:
+	void DoRunL();
+
+	virtual void AddChildEntriesL() = 0;
+	virtual TBool IsRequiredEntryType(TUid aEntryType) const = 0;
+
+protected:
+	CImEntryStack* iEntryStack;
+	CMsvEntry& iCurrentEntry;
+
+private:
+	enum TImmfState
+		{
+		EImmfEntryFound,
+		EImmfFindingEntry,
+		EImmfNothingFound
+		};
+
+	TImmfState iState;
+	};
+
+
+class CImMessageFinder : public CImFinder
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	IMPORT_C static CImMessageFinder* NewL(CMsvEntry& aEntry);
+	IMPORT_C static CImMessageFinder* NewLC(CMsvEntry& aEntry);
+	
+protected:
+	virtual void AddChildEntriesL();
+	virtual TBool IsRequiredEntryType(TUid aEntryType) const;
+
+	CImMessageFinder(CMsvEntry& aEntry);
+	};
+
+
+class CImEntryFinder : public CImFinder
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	IMPORT_C static CImEntryFinder* NewL(CMsvEntry& aEntry);
+	IMPORT_C static CImEntryFinder* NewLC(CMsvEntry& aEntry);
+	
+protected:
+	virtual void AddChildEntriesL();
+	virtual TBool IsRequiredEntryType(TUid aEntryType) const;
+
+	CImEntryFinder(CMsvEntry& aEntry);
+	};
+
+
+class CImMessageCounter : public CImFinder
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	IMPORT_C static CImMessageCounter* NewL(CMsvEntry& aEntry);
+	IMPORT_C static CImMessageCounter* NewLC(CMsvEntry& aEntry);
+	IMPORT_C TInt Count();
+	
+protected:
+	virtual void AddChildEntriesL();
+	virtual TBool IsRequiredEntryType(TUid aEntryType) const;
+
+	CImMessageCounter(CMsvEntry& aEntry);
+
+private:
+	TInt iCount;
+	};
+
+
+class CImPruneMessage : public CMsgActive
+/** Deletes the body text and attachment data from an individually specified message. 
+
+Example uses of this class are:
+
+1. to cleanup after a populating operation has failed
+
+2. to remove body text and attachment data from remote messages, while preserving 
+the message structure 
+@publishedPartner 
+@released
+*/
+	{
+public:
+	IMPORT_C static CImPruneMessage* NewL(CMsvEntry& aEntry, RFs& aFs);
+	IMPORT_C static CImPruneMessage* NewLC(CMsvEntry& aEntry, RFs& aFs);
+
+	IMPORT_C void StartL(TMsvId aMessageEntry, TRequestStatus &aStatus);
+	~CImPruneMessage();
+	
+private:
+	CImPruneMessage(CMsvEntry& aEntry, RFs& aFs);
+	void ConstructL();
+	void DoRunL();
+	void DoComplete(TInt& );
+	void DoCancel();
+	void PruneEntryL();
+	void ResetStoreL();
+
+private:
+	enum TImPruningState
+		{
+		EImPruneUpdatingEntry,
+		EImPruneUpdatingFirstEntry,
+		EImPruneFindingEntry,
+		EImPruneFindFirstEntry,
+		EImPruneFindNextEntry
+		};
+
+	TImPruningState iState;
+
+	CMsvEntry& iCurrentEntry;
+	RFs& iFs;
+	CImEntryFinder* iEntryFinder;
+	CFileMan* iFileManager;
+	TMsvId iRootEntryId;
+	CMsvOperation* iChangeOperation;
+	CMsvStore* iStore;
+	};
+
+struct TImCacheManagerProgress
+/** Holds progress of a cache management cleanup operation.
+
+@see CImCacheManager::ProgressL() 
+@publishedAll
+@released
+*/
+	{
+public:
+	/** Total number of messages to process.
+	
+	Note that, immediately after a CImCacheManager object is started, the progress 
+	operation may return 1 for iTotalMessages and 0 for iMessagesProcessed, regardless 
+	of the total number of messages. This is because the counter for the iTotalMessages 
+	operates asynchronously and may not have counted all of the messages at that 
+	time. */
+	TInt iTotalMessages;
+	/** Number of messages processed so far. */
+	TInt iMessagesProcessed;
+	};
+
+class CImCacheManager : public CMsvOperation
+/** Provides management of the local cache of messages in remote mailboxes.
+
+A mailbox that is being used in disconnected mode allows the user access to 
+message data by opening the message directly from the remote mailbox. If the 
+required message has been downloaded previously, then it will not necessarily 
+need to be downloaded again. This functionality is achieved by preserving 
+the message data locally, under the remote service entry. The preserved message 
+data acts as a cache to allow the user access to the message without the need 
+for it to be downloaded every time. 
+
+The cache management functionality is required to reduce the amount of memory 
+that is consumed by the message cache. CImCacheManager provides a mechanism 
+for asynchronously traversing a message tree and for removing text and attachment 
+data from messages. Deleting more message data will free up more memory but 
+there is a higher chance that a user will need to download a message for a 
+second time. 
+
+CImCacheManager is an abstract base class, which can be specialised to implement 
+a filter (Filter()) that decides if data for a message shoulded be deleted: 
+for example, deletion could be restricted to 'all read messages over a week 
+old,' or, 'all read messages, over 20K in size which are also over a day old.' 
+@publishedAll
+@released
+*/
+	{
+public:
+	IMPORT_C void StartL(TMsvId aRootEntry, TRequestStatus &aStatus);
+	IMPORT_C void StartL(const CMsvEntrySelection& aSelection, TRequestStatus &aStatus);
+	IMPORT_C ~CImCacheManager();
+	IMPORT_C const TDesC8& ProgressL();
+	IMPORT_C void DoCancel();
+
+protected:
+	IMPORT_C void ConstructL();
+	IMPORT_C CImCacheManager(CMsvSession& aSession, TRequestStatus& aObserverRequestStatus);
+
+	IMPORT_C void RunL();
+
+private:
+	// Override this function to filter the currently selected message (iCurrentEntry).
+	// Return TRUE if the current entry is to be pruned.
+	/** Tests if cache cleanup should be performed on a message entry.
+	
+	After StartL() has been called, this is called once for each message entry. 
+	It should return true if the body text and attachment data belonging to the 
+	current message, as held in iCurrentEntry, should be deleted, or false if 
+	the message should be left unchanged.
+	
+	This function must be implemented in any classes derived from CImCacheManager.
+	
+	@return True to clean the entry, false to leave it unchanged */
+	virtual TBool Filter() const = 0;
+
+	void DoRunL();
+
+	// Remove the store from the currently selected entry
+	inline void PruneMessageL();
+	
+protected:
+	/** Message entry currently being processed. */
+	CMsvEntry* iCurrentEntry;
+
+private:
+	CMsvSession& iSession;
+	CImMessageFinder* iMessageFinder;
+	CImMessageCounter* iMessageCounter;
+	CMsvOperation* iDeleteOperation;
+
+	TImCacheManagerProgress iProgress;
+	TRequestStatus* iReport;
+
+	enum TImcmState
+		{
+		EImcmLookingForMessage,
+		EImcmPruningMessages,
+		EImcmCountingMessages,
+		EImcmSkippingPrune
+		};
+
+	TMsvId iRootEntry;
+	TImcmState iState;
+	TPckgBuf<TImCacheManagerProgress> iProgressBuf;
+
+	CMsvEntrySelection* iMessagesToPrune;
+	};
+
+#endif