diff -r d189ee25cf9d -r 3533d4323edc emailuis/emailui/inc/FreestyleEmailDownloadInformationMediator.h --- /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 +// +#include "mfsmailrequestobserver.h" +// +#include +#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 iDownloadArray; + + // array of download counts of one message + RArray iDownloadCountArray; + + // array of download information observers (one message) + RArray iObserverArray; + + // array of download observers (all messages) + RPointerArray 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