emailservices/emailframework/commonlib/inc/CFSMailMessagePart.h
branchRCL_3
changeset 64 3533d4323edc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailframework/commonlib/inc/CFSMailMessagePart.h	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,553 @@
+/*
+* Copyright (c) 2007-2008 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:  common email part object
+*
+*/
+
+#ifndef __CFSMAILMESSAGEPART_H
+#define __CFSMAILMESSAGEPART_H
+
+#include <e32std.h>
+#include <e32base.h>
+#include <f32file.h>
+#include <badesca.h>
+
+//<cmail>
+#include "cfsmailmessagebase.h"
+#include "mmrinfoobject.h"
+//</cmail>
+
+class CFSMailPlugin;
+class CFSMailMessage;
+class MFSMailRequestObserver;
+
+const TInt KArrayGranularity = 16;
+
+/**
+ *  email parts handling class
+ *
+ *  @lib FSFWCommonLib
+ *  @since S60 v3.1
+ */
+class CFSMailMessagePart : public CFSMailMessageBase
+{
+ public:
+
+    /**
+     * Two-phased constructor.
+     *
+     * @param aMessageId message id in plugin containing email
+     * @param aMessagePartId message part id in plugin containing email
+     */
+     IMPORT_C static CFSMailMessagePart* NewL( TFSMailMsgId aMessageId, TFSMailMsgId aMessagePartId );
+
+    /**
+     * Two-phased constructor.
+     *
+     * @param aMessageId message id in plugin containing email
+     * @param aMessagePartId message part id in plugin containing email
+     */
+     IMPORT_C static CFSMailMessagePart* NewLC( TFSMailMsgId aMessageId, TFSMailMsgId aMessagePartId );
+
+    /**
+     * destructor
+     */  
+     IMPORT_C virtual ~CFSMailMessagePart();
+     
+    /**
+     * email part id accessor
+     *
+     * @return email part id
+     */
+     IMPORT_C TFSMailMsgId GetPartId() const;
+
+    /**
+     * email part content-type accessor (e.g. "text/plain")
+     *
+     * @return email part content type
+     */
+     IMPORT_C const TDesC& GetContentType();
+    
+    /**
+     * email part content-type mutator 
+     *
+     * @param aContentType new content type value
+     */
+     IMPORT_C void SetContentType(const TDesC& aContentType);
+
+    /**
+     * Returns content-type parameters and their associated values.
+     * Updating/setting values should be done by first getting the array and
+     * then modifying it's contents.
+     * 
+     * @return content type parameters
+     */
+     IMPORT_C CDesCArray& ContentTypeParameters();
+     
+    /**
+     * Returns email Content-Description value, includes also parameters,
+     * if any.
+     *
+     * @return email Content-Description
+     */
+     IMPORT_C const TDesC& ContentDescription();
+     
+    /**
+     * Stores email Content-Description value, parameters can be included,
+     * if any.
+     *
+     * @param aContentDescription new email content description value
+     */
+     IMPORT_C void SetContentDescription(const TDesC& aContentDesctiption);
+
+    /**
+     * Returns email Content-Disposition value, includes also parameters,
+     * if any.
+     *
+     * @return email Content-Disposition
+     */
+     IMPORT_C const TDesC& ContentDisposition();
+     
+    /**
+     * Stores email Content-Disposition value, parameters can be included,
+     * if any.
+     *
+     * @param aContentDisposition new email content disposition value
+     */    
+     IMPORT_C void SetContentDisposition(const TDesC& aContentDesctiption);
+
+    /**
+     * Returns email Content-Disposition Parameters and their associated values.
+     * Updating/setting values should be done by first getting the array and
+     * then modifying it's contents.
+     *
+     * @return content disposition parameters
+     */
+     IMPORT_C CDesCArray& ContentDispositionParameters();
+
+    /**
+     * email Content-Id accessor.
+     *
+     * @return email Content-Id
+     */
+     IMPORT_C const TDesC& ContentID();
+     
+    /**
+     * email Content-Id mutator
+     *
+     * @param aContentID new email Content-Id value
+     */
+     IMPORT_C void SetContentIDL(const TDesC& aContentID);
+
+    /**
+     * email Content-Class accessor
+     *
+     * @return email Content-Class
+     */
+     IMPORT_C const TDesC& GetContentClass();
+
+    /**
+     * email Content-Class mutator
+     *
+     * @param aContentClass new email Content-Class value
+     */
+     IMPORT_C void SetContentClass( const TDesC& aContentClass );
+
+    /**
+     * saves this message part 
+     */
+     IMPORT_C void SaveL();
+    
+    /**
+     * lists all direct child parts of this email part
+     *
+     * @param aParts table containing list of child parts owned by user
+     */
+     IMPORT_C void ChildPartsL(RPointerArray<CFSMailMessagePart>& aParts);
+
+    /**
+     * Returns child part of this part identified by part id.
+     * 
+     * @param aPartId defines parent part id
+     * @return child part object, ownership is transferred to user
+     */
+     IMPORT_C CFSMailMessagePart* ChildPartL( const TFSMailMsgId aPartId );
+
+    /**
+     * Returns ETrue if this email part is actually an email,
+     * so it's safe to cast this part to CFSMailMessage
+     * 
+     * @return ETrue if this email part is email
+     */        
+     IMPORT_C virtual TBool IsMessageL() const;
+
+    /**
+     * Creates and adds a new child part to this email part
+     * 
+     * @param aInsertBefore defines place where new child part is created,
+     *        if aInsertBefore is NULL id then new part is added as last.
+     * @param aContentType content type of the new child part
+     *
+     * @return created child part object, ownership is transferred to user
+     */
+     IMPORT_C CFSMailMessagePart* NewChildPartL( const TFSMailMsgId aInsertBefore,
+                                                 const TDesC& aContentType );
+
+    /**
+     * Copies given email object as new child part of this email part or email.
+     *
+     * @param aInsertBefore defines place of where new child part is created,
+     * if aInsertBefore is NULL id then new part is added as last.
+     * @param aMessage message to be copied as child part
+     *
+     * @return new child part, ownership is transferred to user
+     */        
+     IMPORT_C CFSMailMessagePart* CopyMessageAsChildPartL( TFSMailMsgId aInsertBefore,
+                                                           CFSMailMessage* aMessage);
+
+    /**
+     * Removes child part (and it's children, if any) from this email part
+     * 
+     * @param aPartId part id of the email part to be removed
+     */
+     IMPORT_C void RemoveChildPartL(TFSMailMsgId aPartId);
+
+    /**
+     * Retrieves a read-only file handle for the content file of this message part.
+     * The caller must close the file handle.
+     *
+     * @return content file handle 
+     */
+     IMPORT_C RFile GetContentFileL();
+        
+    /**
+     * copies contents of this message part to given file
+     *
+     * @param aContentLocation defines file location as 
+     * a) directory, when plugin finds out corresponding file name
+     *    related to this part id, in this case last character should
+     *    be '/'
+     * b) directory & filename, when both directory and file name
+     *    are given by user
+     * 
+     */        
+     IMPORT_C void CopyContentFileL(const TDesC& aContentLocation);
+
+    /**
+     * Sets email part contents from given file, possible old contents are replaced.
+     *
+     * @param aFilePath defines the target file
+     */
+     IMPORT_C void SetContentFromFileL(const TDesC& aFilePath);
+
+    /**
+     * Removes from message store fetched contents of this part
+     * and possible child parts
+     *
+     */  
+     IMPORT_C void RemoveContentL();
+    
+    /**
+     * returns email part full content size (in bytes)
+     *
+     */
+     IMPORT_C TUint ContentSize() const;
+
+    /**
+     * Sets email part full content size (in bytes)
+     *
+     * @param aContentSize content size to be set
+     */
+     IMPORT_C void SetContentSize(const TUint aContentSize);
+    
+    /**
+     * returns email part currently fetched (local) content size (in bytes).
+     * 
+     */
+     IMPORT_C TUint FetchedContentSize() const;
+
+    /**
+     * Sets email part currently fetched (local) content size (in bytes).
+     * 
+     * @param aContentSize content size to be set
+     */
+     IMPORT_C void SetFetchedContentSize(TUint aContentSize);
+
+    /**
+     * returns email part content current fetch state
+     * Intended as utility function for UI.
+     * If (0 == FetchedContentSize())
+     *    return EFSNone;
+     * else if (FetchedContentSize() < ContentSize()) then
+     *    return EFSPartial
+     * else
+     *    return EFSFull
+     *
+     * @return email fetch state (EFSNone / EFSPartial / EFSFull)
+     */
+     IMPORT_C TFSPartFetchState FetchLoadState() const;
+
+    /**
+     * copies email part contents to buffer given by user
+     *
+     * @param aBuffer buffer owned by user
+     * @param aStartOffset offset from content begin
+     */
+     IMPORT_C void GetContentToBufferL(TDes16& aBuffer, TUint aStartOffset);
+    
+    /**
+     * copies email part contents from buffer given by user
+     *
+     * @param aBuffer buffer given by user
+     */
+     IMPORT_C void SetContent(TDes16& aBuffer); 
+
+    /**
+     * meeting request accessor if email part is a meeting request
+     * 
+     * @return meeting request object
+     */
+     IMPORT_C MMRInfoObject& GetMRInfo();
+    
+    /**
+     * stores given meeting request object as email part
+     * 
+     * @param aMeetingRequest meeting request object
+     */
+     IMPORT_C void SetMRInfo(MMRInfoObject* aMeetingRequest);
+
+    /**
+     * method checks if MRInfo exists
+     * 
+     * @return true / false
+     */
+     IMPORT_C TBool IsMRInfoSet();
+
+    /**
+     * Sets attachment name for email part. Full path can be
+     * given as input even though only filename is saved. 
+     * 
+     * @param aFilePath attachment name
+     */        
+     IMPORT_C void SetAttachmentNameL(const TDesC& aFilePath);
+
+    /**
+     * returns email part attachment name
+     * 
+     * @return attachment name
+     */        
+     IMPORT_C TDesC& AttachmentNameL();
+    
+    /**
+     * finds email body part based on given content type 
+     * (plain text or html body part of email message)
+     * 
+     * @param aContentType body part content type to be searched
+     *
+     * @return email body part or NULL if not found, ownership is transferred to user
+     */
+     IMPORT_C CFSMailMessagePart* FindBodyPartL(const TDesC& aContentType);
+
+    /**
+     * Checks that content type matches given.
+     * 
+     * @param aContentType body part content type to be checked
+     *
+     * @return ETrue if content type of message part matches tto given
+     */
+     IMPORT_C TBool ContentTypeMatches( const TDesC& aContentType );
+
+    /**
+     * starts email part fetching from email server
+     * 
+     * @param aMessagePartId message part id of email part to be fetched
+     * @param aOperationObserver observer to forward fetching progress events
+     * to user
+     * @param aPreferredByteCount indicates how much more content for part(s)
+     *        user wants to fetch. Default value zero indicates that all content
+     *        should be fetched. Actual amount of data fetched may differ from
+     *        requested (possibly all fetched in any case).
+     *
+     * @return err code
+     */        
+     IMPORT_C TInt FetchMessagePartL(   const TFSMailMsgId aMessagePartId,
+                                        MFSMailRequestObserver& aOperationObserver,
+                                        const TUint aPreferredByteCount);
+
+    /**
+     * starts email parts fetching from email server
+     * 
+     * @param aMessagePartIds message part ids of email parts to be fetched
+     * @param aOperationObserver observer to forward fetching progress events
+     * to user
+     * @param aPreferredByteCount indicates how much more content for part(s)
+     *        user wants to fetch. Default value zero indicates that all content
+     *        should be fetched. Actual amount of data fetched may differ from
+     *        requested (possibly all fetched in any case).
+     *
+     * @return err code
+     */        
+     IMPORT_C TInt FetchMessagesPartsL( const RArray<TFSMailMsgId>& aMessagePartIds,
+                                        MFSMailRequestObserver& aOperationObserver,
+                                        const TUint aPreferredByteCount);
+    /**
+     * creates a list containing all email / email part subparts
+     * 
+     * @param aParts email part list given/owned by user
+     */        
+     IMPORT_C void AppendAttachmentsL(RPointerArray<CFSMailMessagePart>& aParts);
+
+    /**
+     * sets email part fetch status
+     * 
+     * @param aMessagePartStatus (EFSMessagePartsKnown)
+     */
+     IMPORT_C void SetMessagePartsStatus(TFSPartFetchState aMessagePartStatus);
+
+    /**
+     * Adds new attachment to this email (part).
+     * 
+     * @param aFilePath full path of new attachment.
+     * @param aInsertBefore defines position of new attachment,
+     *        if NullId then new attachment is created as last part.
+     * @param aContentType attachment content type
+
+     * @return new email part, ownership is transferred to user
+     */ 
+     IMPORT_C CFSMailMessagePart* AddNewAttachmentL( const TDesC& aFilePath, 
+                                                     const TFSMailMsgId aInsertBefore,
+                                                     const TDesC& aContentType );
+    /**
+     * read only part size accessor (character or byte count)
+     *
+     */
+     IMPORT_C TUint ReadOnlyPartSize() const;
+
+    /**
+     * read only part size mutator
+     *
+     * @param aReadOnlyPartSize read only size to be set
+     * (character or byte count)
+     */
+     IMPORT_C void SetReadOnlyPartSize(const TUint aReadOnlyPartSize);
+     
+     /**
+      * removes attachment downloaded contents from local/terminal memory
+      *
+      */
+     IMPORT_C void RemoveDownLoadedAttachmentsL();
+     
+     
+public: // data
+
+protected:
+
+    /**
+     * constructor
+     */
+     CFSMailMessagePart();
+
+    /**
+     * lists subparts
+     */
+     void ListMessagePartsL( RPointerArray<CFSMailMessagePart>& aParts );
+         
+    /**
+     * clears internal part array
+     */
+     void ClearPartsArray(TBool aClearAll);
+     
+    /**
+     * finds id of body part
+     */
+     TFSMailMsgId FindBodyPartIdL(const TDesC& aContentType);
+
+     /**
+     * Returns a flat list of message parts that can be handled as attachments.
+     * Excludes message parts that are multipart and parts that are considered
+     * plain text or html body.
+     * 
+     * @param aParts contains flat list of attachments
+     */        
+     virtual void DoAttachmentListL(RPointerArray<CFSMailMessagePart>& aParts);
+
+protected: // data
+
+    /**
+     * email fetch from email server status
+     */
+     TFSPartFetchState                  iMessagePartsStatus;
+
+    /**
+     * message part MIME type
+     */
+     HBufC                              *iContentType;
+     
+    /** message parts array */
+     RPointerArray<CFSMailMessagePart>  iMessageParts;
+     TBool                              iReadMessageParts;
+
+private:
+
+    /**
+     * Two-phased constructor
+     */
+     void ConstructL( TFSMailMsgId aMessageId, TFSMailMsgId aMessagePartId );
+
+private:    // data
+
+     /** message part id */
+     TFSMailMsgId    iMessagePartId;
+
+     /** email part content size */
+     TUint           iContentSize;
+
+     /** read only part size */
+     TUint           iReadOnlyPartSize;
+
+     /** email part fetched content size */
+     TInt            iFetchedContentSize;
+
+     /** fetched from email server indication */
+     TBool           iIsFetched;
+
+     /** email content decription */
+     HBufC           *iContentDescription;
+
+     /** email content disposition */
+     HBufC           *iContentDisposition;
+     
+     /** attachment name */
+     HBufC           *iAttachmentName;
+
+     /** email content class */
+     HBufC           *iContentClass;
+
+     /** email content id */
+     HBufC           *iContentID;
+
+     /** content disposition parameters */
+     CDesCArray      *iContentDispositionParams;
+
+     /** content type parameters */
+     CDesCArray      *iContentTypeParams;
+
+     /** meeting request object */
+     MMRInfoObject*  iMeetingRequest;                       
+
+     /* temp file handle */
+     RFile           iFile;
+ };
+
+#endif // __CFSMAILMESSAGEPART_H