emailuis/emailui/inc/FreestyleEmailDownloadInformationMediator.h
branchRCL_3
changeset 25 3533d4323edc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/inc/FreestyleEmailDownloadInformationMediator.h	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,356 @@
+/*
+* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Freestyle Email application attachment download info mediator
+*
+*/
+
+#ifndef FSEMAILDOWNLOADINFORMATIONMEDIATOR_H
+#define FSEMAILDOWNLOADINFORMATIONMEDIATOR_H
+
+//  INCLUDES
+#include <e32base.h>
+//<cmail>
+#include "mfsmailrequestobserver.h"
+//</cmail>
+#include <AknGlobalMsgQuery.h>
+#include "FreestyleEmailUiConstants.h"
+
+class CFSMailClient;
+
+// CONSTANTS
+
+class MFSEmailDownloadInformationObserver
+	{
+    /**
+    * RequestResposeL
+    * Download information callback
+    * @param aEvent event information
+    * @param aPart message part which the event belongs
+    */
+
+	public:
+		virtual void RequestResponseL( const TFSProgress& aEvent, const TPartData& aPart ) = 0;
+	};
+
+// CLASS DECLARATION
+class CFSEmailDownloadInfoMediator : public CActive, public MFSMailRequestObserver
+    {
+    public:
+	/**
+	 * Two-phased class constructor.
+	 */
+	static CFSEmailDownloadInfoMediator* NewL( CFSMailClient& aMailClient );
+
+	// destroys the instance
+	static void Destroy();
+	
+	// from MFSMailRequestObserver
+    virtual void RequestResponseL( TFSProgress aEvent, TInt aRequestId );
+    
+    /**
+    * AddObserver
+    * Adds observer to receive download information callbacks from one message  
+    * @param aObserver observer, ownership is not transferred
+    * @param aMessageId message to observe
+    */
+	void AddObserver( MFSEmailDownloadInformationObserver* aObserver, TFSMailMsgId aMessageId );
+    
+	/**
+    * AddObserver
+    * Adds observer to receive download information callbacks from all messages
+    * @param aObserver observer, ownership is not transferred
+    */
+	void AddObserver( MFSEmailDownloadInformationObserver* aObserver );
+
+    /**
+    * StopObserving
+    * Removes observer  
+    * @param aObserver observer to be removed, ownership is not transferred
+    * @param aMessageId message which should not be observed anymore
+    */
+	void StopObserving( MFSEmailDownloadInformationObserver* aObserver, TFSMailMsgId aMessageId );
+
+    /**
+    * StopObserving
+    * Removes observer  
+    * @param aObserver observer to be removed, ownership is not transferred
+    */
+	void StopObserving( MFSEmailDownloadInformationObserver* aObserver );	
+	
+    /**
+    * DownloadL
+    * Starts attachment download
+    * @param aPartData message part to download
+    * @param aCompleteNote show download compete note
+    */
+	void DownloadL( TPartData aPart, TBool aCompleteNote=ETrue );
+
+    /**
+    * DownloadAndSaveL
+    * Starts attachment download and saves the file after download is complete 
+    * @param aPart message part to download
+    * @param aSaveFileName file name to save
+    * @param aCompleteNote show download compete note
+    */
+	void DownloadAndSaveL( TPartData aPart, const TDesC& aSaveFileName, TBool aCompleteNote = ETrue );
+
+    /**
+    * CancelDownloadL
+    * Cancels attachment download
+    * @param aMessagePartId message part id to cancel
+    */
+	void CancelDownloadL( TFSMailMsgId aMessagePartId );
+
+
+	/**
+	* CancelAllDownloadsL
+	* Cancels all mailbox downloads
+	* @param aMailBoxId mailbox id of cancelled downloads
+	*/
+	void CancelAllDownloadsL( TFSMailMsgId aMailBoxId );
+	
+    /**
+    * IsAnyAttachmentDownloads
+    * Checks if there has been at least one download since program has been started
+    * @return has there been a download status
+    */
+	TBool IsAnyAttachmentDownloads();
+
+    /**
+    * IsAnyAttachmentDownloads
+    * Checks if there is at least one ongoing download for a message
+    * @param aMessageId message id
+    * @return current download status
+    */
+	TBool IsAnyAttachmentDownloads( TFSMailMsgId aMessageId );
+	
+    /**
+    * GetDownloadPercentage
+    * Checks if there is at least one ongoing download for a message
+    * @param aMessageId ID of the message for which downloads are checked
+    * @return           Percentage (0...100) of downloaded content out of all content currently under downloading
+    *                   KErrNotFound if there are no ongoing downloads for the given message.
+    */
+	TInt GetDownloadPercentageL( TFSMailMsgId aMessageId );
+	
+    /**
+    * IsDownloadableL
+	* Checks if the message part is in "downloadable state" ( not downloaded and not downloading at the moment )
+    * @param aPart message information
+    * @return downloadable state
+    */
+	TBool IsDownloadableL( TPartData aPart );
+
+    /**
+    * IsDownloading
+    * Checks if the message part is currently being downloaded
+    * @return download status
+    * @param aMessagePart message part
+    */
+	TBool IsDownloading( TFSMailMsgId aMessagePart );
+
+    /**
+    * Check if attachments of a message have been fully downloaded and notify observers 
+    * if they are. This is used to inform the observers about the completion of 
+    * automatic attachment download which takes place with POP protocol.
+    * @param aMessageId The mailbox, folder, and message IDs identifying the message.
+    *                   Member aMessageId.messagePartId is ignored.
+    */
+    void NotifyObserversIfAttachmentsDownloadedL( TPartData aMessageId );
+    
+public: // construction
+
+	/**
+	 * Destructor of CFSEmailDownloadInfoMediator class.
+	 */
+
+	CFSEmailDownloadInfoMediator( CFSMailClient& aMailClient );
+   	
+	/**
+	 * Second phase class constructor.
+	 */
+	void ConstructL();  	
+
+public: // from CActive
+    /**
+    * @see CActive.
+    */
+    void RunL();
+
+    /**
+    * @see CActive.
+    */
+    void DoCancel();
+    
+    /**
+    * @see CActive.
+    */
+    TInt RunError( TInt aError );
+
+    /**
+    * Cancels querys.
+    */
+    void Cancel();
+
+private: // methods
+
+	struct TRequestObserver
+		{
+		MFSEmailDownloadInformationObserver* iObserver;
+		TFSMailMsgId iMessageId;
+        TBool iDeleted;
+		};
+
+	class TDownload
+		{
+	public: // members
+		TInt iRequestId;
+		TPartData iPartData;
+		TFileName iSaveFileName;
+		TBool iNotifyComplete;
+		TInt iCounter;
+		TInt iMaxCount;
+		
+	public: // constructors
+		inline TDownload() 
+		    : iRequestId(0), iPartData(), iSaveFileName(), iNotifyComplete(EFalse), iCounter(0), iMaxCount(0) {}
+		inline TDownload( TInt aRequestId, TPartData aPartData, const TDesC& aFileName, TBool aNotifyComplete )
+		    : iRequestId( aRequestId ), iPartData( aPartData ), iSaveFileName( aFileName ), 
+		      iNotifyComplete( aNotifyComplete ), iCounter( 0 ), iMaxCount( 0 ) {}
+		};
+
+	class TDownloadCount
+		{
+	public: // members
+		TFSMailMsgId iMessageId;
+		TInt iDownloadsStartedCount;
+		TInt iDownloadsCompletedCount;
+		TInt iSaveRequestedCount;
+		
+	public: // constructors	
+		inline TDownloadCount()
+		    : iMessageId(), iDownloadsStartedCount(0), iDownloadsCompletedCount(0), iSaveRequestedCount(0) {}
+		inline TDownloadCount( TFSMailMsgId aMessageId )
+		    : iMessageId( aMessageId ), iDownloadsStartedCount(0), iDownloadsCompletedCount(0), iSaveRequestedCount(0) {}
+		};
+
+	/**
+	 * Appends a new download to internal arrays iDownloadArray and iDonwloadCountArray.
+	 * The function makes sure that there's no previous downloads with the same request ID.
+	 */
+	void AppendDownloadToInternalArraysL( const TDownload& aNewDownload );
+	
+	/**
+	 * Checks if download complete notification should be show for this message part
+	 */
+	TBool CompletionNotesInUseL() const;
+	
+	/**
+	* Launches a global note about completed download(s).
+	* @param    aPart   A bundle of IDs identifying the message for which the note is shown.
+	* @param    aCompletedCount How many attachments were succesfully downloaded.
+	*/
+	void LaunchDownloadCompleteNoteL( const TPartData& aPart, TInt aCompletedCount );
+	void OpenAttachmentL( const TPartData& aPart, const TInt aCompletedCount );
+	
+	/**
+	* Notify all the registered observers about a download event.
+	*/
+	void NotifyObserversL( const TFSProgress& aEvent, const TPartData& aPart );
+
+	/**
+	* Notify all the registered observers for a particular message part about a download event.
+	*/
+	void NotifyPartObserversL( const TFSProgress& aEvent, const TPartData& aPart );
+
+    /**
+     * Removes deleted observers from the observer array.
+     */
+    void CleanUpObservers();
+
+    /**
+     * Safely removes an entry from the observer array in case notifications
+     * are currently in process.
+     */
+    void RemoveObserver( TInt aIdx );
+
+	/**
+	* Updates the entry in iDownloadCountArray according a progress event and gets a copy of 
+	* its data. The original entry may be removed from the array as a result.
+	* @param    aCountObject       Input/output argument for the count array entry. The entries are matched by the iMessageId.
+	* @param    aEvent             The event which causes the entry to be updated.
+	*/
+	void GetAndUpdateDownloadCountL( TDownloadCount& aCountObject, const TFSProgress& aEvent );
+	
+	/**
+	 * Updates missing iMaxCount values to match the file sizes of the corresponding attachments.
+	 * @param  aMessageData    Identifies the message for which the update is done. The member
+	 *                         messagePartId is ignored.
+	 */
+	void UpdateAttachmentSizesL( const TPartData& aMessageData );
+	
+	/**
+	* Identity relation which chekcs if two TDownloadCount objects have matchinng
+	* message ID. 
+	*/
+	static TBool EqualMessageId( const TDownloadCount& aFirst, const TDownloadCount& aSecond );
+	
+    /**
+    * Identity relation which chekcs if two TDownload objects have matchinng
+    * message part ID. 
+    */
+    static TBool EqualMessagePartId( const TDownload& aFirst, const TDownload& aSecond );
+
+    /**
+	 * Destructor of CFSEmailDownloadInfoMediator class.
+	 */
+	virtual ~CFSEmailDownloadInfoMediator();
+        
+private: // data
+
+	// mail client 
+	CFSMailClient& iMailClient;
+
+	// download complete query
+	CAknGlobalMsgQuery* iGlobalMsgQuery;
+	
+	// message view data or attachment data to launch from user query response
+	TPartData iPopupLaunchData;
+	
+	// array of current downloads
+	RArray<TDownload> iDownloadArray;
+	
+	// array of download counts of one message
+	RArray<TDownloadCount> iDownloadCountArray;
+
+    // array of download information observers (one message)
+    RArray<TRequestObserver> iObserverArray;
+    
+	// array of download observers (all messages)
+	RPointerArray<MFSEmailDownloadInformationObserver> iAllObserverArray;
+
+	// has there been any downloads since program started
+	TBool iDownloadsStarted;
+
+    // counter indicating how many observer notification operations are
+    // currently in progress
+    TInt iNotificationsInProgress;
+
+    // have any observers been deleted during notification
+    TBool iObserverDeleted;
+    };
+
+#endif  // FSEMAILDOWNLOADINFORMATIONMEDIATOR_H
+
+// end of file