email/imap4mtm/imapprotocolcontroller/inc/cimapopfetchbody.h
changeset 0 72b543305e3a
child 77 da6ac9d688df
equal deleted inserted replaced
-1:000000000000 0:72b543305e3a
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #ifndef __CIMAPOPFETCHBODY_H__
       
    17 #define __CIMAPOPFETCHBODY_H__
       
    18 
       
    19 #include <e32std.h>
       
    20 #include <msvstd.h>
       
    21 #include "cimapoperation.h"
       
    22 #include "cimapbodystructure.h" // for RAttributeValuePairList
       
    23 #include "cimapenvelope.h"		// for RArrayTAddress
       
    24 #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS  
       
    25 #include <miuthdr.h>
       
    26 #include <miutconv.h>
       
    27 #endif
       
    28 
       
    29 class CImapSession;
       
    30 class CImapFolder;
       
    31 class CMsgActive;
       
    32 class CMsvServerEntry;
       
    33 class TImImap4GetPartialMailInfo;
       
    34 class CImapSettings;
       
    35 class CImConvertHeader;
       
    36 class CImapFetchResponse;
       
    37 class CImapFetchBodyResponse;
       
    38 class CImapRfc822HeaderFields;
       
    39 class CFetchBodyInfo;
       
    40 class CImapUtils;
       
    41 class CCnvCharacterSetConverter;
       
    42 class CImConvertCharconv;
       
    43 class CImConvertHeader;
       
    44 class CImCaf;
       
    45 class CImapMailStore;
       
    46 class CImapSyncManager;
       
    47 
       
    48 
       
    49 /**
       
    50 The CImapOpFetchBody class encapsulates fetching of body data from the remote
       
    51 server to the local mirror. It is used when performing requested copy/move to
       
    52 local or populate operations.
       
    53 
       
    54 It is responsible for building the structure of the message in the messaging
       
    55 store, according to the BODYSTRUCTURE returned by the remote server. The
       
    56 BODYSTRUCTURE is requested, along with other message header parts, when first
       
    57 populating a message.
       
    58 
       
    59 From this structure (or during the construction of it), this class also
       
    60 determines which parts of the message are to be fetched according to account
       
    61 settings, or in the case of populate operations, the passed parameters.
       
    62 
       
    63 For each body part to be fetched, a CFetchBodyInfo object is constructed and
       
    64 populated with the information required by the CImapSession and CImapMailStore
       
    65 to fetch and store the body part in the local mailstore. Once parsing of the
       
    66 bodystructure is complete, each part is fetched in turn via the CImapSession.
       
    67 
       
    68 Once a part has been fetched, this class is responsible for updating the 
       
    69 appropriate message flags indicating local message completeness.
       
    70 
       
    71 @internalTechnology
       
    72 @prototype
       
    73 */
       
    74 class CImapOpFetchBody : public CImapOperation
       
    75 	{
       
    76 public:
       
    77 	typedef RArray<TPtrC8> RArrayTPtrC8;
       
    78 	
       
    79 	virtual ~CImapOpFetchBody();
       
    80 
       
    81 	static CImapOpFetchBody* NewL(CImapSession*& aSession, CImapSyncManager& aSyncManager, CMsvServerEntry& aEntry, CImapSettings& aImapSettings, CImapMailStore& aMailStore);
       
    82 	void FetchBodyL(TRequestStatus& aRequestStatus, const TMsvId aPart, const TImImap4GetPartialMailInfo& aGetPartialMailInfo);
       
    83 	void Progress(TImap4GenericProgress& aGenericProgress);
       
    84 	void CancelEnableResume();
       
    85 	
       
    86 private:
       
    87 	CImapOpFetchBody(CImapSession*& aSession, CImapSyncManager& aSyncManager, CMsvServerEntry& aEntry, CImapSettings& aImapSettings, CImapMailStore& aMailStore);
       
    88 	void ConstructL();
       
    89 	
       
    90 	// fetch initialisation
       
    91 	void DoFetchL();
       
    92 	void CheckForPartialPopulate();
       
    93 	void FetchLargeHeaderL();
       
    94 
       
    95 	// methods for constructing an array of items to fetch	
       
    96 	void DoBuildFetchListL();
       
    97 	void AddFetchItemL(CImMimeHeader& aMimeHeader, TMsvEmailEntry& aMessage, TBool aIsText, TInt32 aSizeToFetch);
       
    98 	void AddFilterFetchItemL(CImMimeHeader& aMimeHeader, TMsvEmailEntry& aEntry, TImap4GetMailOptions& aPartTypes);
       
    99 	void AddFilterFetchItemL(CImMimeHeader& aMimeHeader, TMsvEmailEntry& aEntry, TImImap4GetPartialMailInfo& aGetPartialMailInfo);
       
   100 	void BuildFetchListL(TMsvId aPart);
       
   101 	void RemoveHtmlPart(TMsvId aPart);
       
   102 
       
   103 	TInt32 Minimum(TInt32 aThisPartTypeSizeLimit, TInt32 aTotalMailSizeLimit);
       
   104 
       
   105 	// Requsts a specified item to be fetched.	
       
   106 	TBool FetchPartL();
       
   107 	
       
   108 	// Registers an application part with the CAF framework
       
   109 	void  RegisterWithCafL(CFetchBodyInfo& fetchInfo);
       
   110 	
       
   111 	// Header and bodystructure parsing
       
   112 	TBool ProcessBodyStructureL();
       
   113 	void PopulateImHeaderL(CImapRfc822HeaderFields& aHeaderFields, TMsvEmailEntry& aEntry, CImHeader& imHeader);
       
   114 	void BuildTreeL(TMsvId aParent, CImapBodyStructure* aBodyStructure, const TDesC8& aPath, const TMsvId aThisMessage, TInt& aAttachments, TBool& aIsMHTML, TInt& aRelatedAttachments);
       
   115 	void BuildContentEntryL(const TMsvId aParent, CImapBodyStructure* aBodyStructure, const TDesC8& aPath, const TMsvId aThisMessage, TInt& aAttachments, TBool& aIsMHTML, TInt& aRelatedAttachments);
       
   116 	void ProcessTextSubtypeL(CImapBodyStructure* aBodyStructure, CImMimeHeader& aMime, TMsvEmailEntry& aMessage, TBool& aIsMHTML);
       
   117 	void ProcessParameterListL(const CImapBodyStructure::RAttributeValuePairList& aParamList, CImMimeHeader& aMime, TMsvEmailEntry& aMessage, TFileName& aAttachmentFilename);
       
   118 	void ProcessExtendedFieldsL(CImapBodyStructure* aBodyStructure, CImMimeHeader& aMime, TMsvEmailEntry& aMessage, TFileName& aAttachmentFilename);
       
   119 	void BuildEmbeddedMessageL(CImapBodyStructure* aBodyStructure, CImMimeHeader& aMime, TMsvEmailEntry& aMessage, const TDesC8& aPath, TInt& aAttachments);
       
   120 	void BuildNonMessageEntryL(const TMsvId& aParent, CImMimeHeader& aMime, TMsvEmailEntry& aMessage, TInt& aAttachments, TInt& aRelatedAttachments);
       
   121 
       
   122 	void ProcessEnvelopeL(CImHeader* aHeader, TMsvEntry& aEntry, CImapEnvelope& aImapEnvelope);
       
   123 	void GetDefaultFilenameL(TDes& aName, const TMsvEmailEntry& aMessage, const CImMimeHeader* mime);
       
   124 	void ProcessAddressListL(CDesCArray& aWhere, const CImapEnvelope::RArrayTAddress& aAddressArray);
       
   125 	void ProcessAddressListL(CDesCArray& aWhere, const TDesC8& aAddresses);
       
   126 	TInt FindFilenameL(const CImMimeHeader& aMimeInfo, TPtrC8& aFilename);
       
   127 	void FindFilenameDecodeL(const CImMimeHeader& aMimeInfo, TFileName& aFileName);
       
   128 	void StripIllegalCharactersFromFileName(TDes16& aName);
       
   129 	void CreateAttachmentInfoL(const TMsvEntry& aMsvEmailEntry);
       
   130 
       
   131 	void StoreHeadersL(CImHeader* aImHeader, CImMimeHeader* aMimeHeader);
       
   132 	void UpdateBodyTextRemainingSizeForHtml();
       
   133 	
       
   134 	static TPtrC8 StripAngledBrackets(const TDesC8& aString);
       
   135 	
       
   136 	// Post BodyPart-fetch processing
       
   137 	void FetchPartCompleteL();
       
   138 	void PropagateCompleteFlagL(TMsvId aId, TBool aDoBodyText, TBool aPartialFetched);
       
   139 	
       
   140 	// Server Error handling
       
   141 	TInt ProcessServerError();
       
   142 
       
   143 	// from CMsgActive
       
   144 	virtual void DoRunL();
       
   145 	void DoComplete(TInt& aErr);
       
   146 	void DoCancel();
       
   147 	
       
   148 	void ClearFetchAttemptedL();
       
   149 
       
   150 private:
       
   151 	// These steps are those that need to be performed to fetch all, or part of a message.
       
   152 	// The iNextStep data member is set when asynchronous calls are made to indicate the
       
   153 	// next step that is to be performed on completion of the service request.
       
   154 	enum TFetchSteps
       
   155 		{
       
   156 		EFinished,
       
   157 		EGetBodyStructure,
       
   158 		EProcessBodyStructure,
       
   159 		EBuildFetchList,
       
   160 		EFetchFirstPart,
       
   161 		EFetchNext
       
   162 		};
       
   163 
       
   164 	// Referenced components
       
   165 	CImapSyncManager& iSyncManager;	
       
   166 	CImapSettings& iImapSettings;
       
   167 	CImapMailStore& iMailStore;
       
   168 	
       
   169 	// State Machine Progress:
       
   170 	TInt iNextStep;
       
   171 	TInt iCurrentStep;
       
   172 	
       
   173 	// Stored fetch parameters.
       
   174 	TImImap4GetPartialMailInfo iGetPartialMailInfo;
       
   175 	
       
   176 	// Requested message/message-part information
       
   177 	TMsvId iRequestedPart;
       
   178 	TUint  iMessageUid;
       
   179 	TMsvId iMessageMsvId;
       
   180 
       
   181 	// Header/bodystructure fetch response
       
   182 	CImapFetchResponse* iFetchResponse;
       
   183 
       
   184 	// Fetch body response information
       
   185 	CImapFetchBodyResponse* iFetchBodyResponse;
       
   186 
       
   187 	// Array of items to be fetched
       
   188 	RPointerArray<CFetchBodyInfo> iFetchList;
       
   189 	
       
   190 	// Stats
       
   191 	TInt  iPartsToDo;
       
   192 	TInt  iPartsDone;
       
   193 	TInt  iBytesToDo;
       
   194 	TInt  iBytesDone;
       
   195 	TBool iHasTextParts;
       
   196 
       
   197 	// used for calculating parts to fetch when limits are being used
       
   198 	TInt32 iBodyTextSize;
       
   199 	TInt32 iHtmlEntrySize;
       
   200 	TInt32 iSizeOfToBeFetchedAttachments;
       
   201 	TInt32 iBodyPartRemainingSize;
       
   202 	TMsvId iHtmlEntryPart; 
       
   203 	
       
   204 	// things to spot when processing the bodystructure
       
   205 	TBool iFetchPartialMail;
       
   206 	TBool iIsVCalendar;
       
   207 	TBool iIsICalendar;
       
   208 	TInt  iDecodedSizeOfAllParts;
       
   209 	TFileName iAttachmentName;
       
   210 	
       
   211 	// converter objects
       
   212 	CCnvCharacterSetConverter* iCharacterConverter;
       
   213 	CImConvertCharconv* iCharConv;
       
   214 	CImConvertHeader* iHeaderConverter;
       
   215 	
       
   216 	// CAF support
       
   217 	CImCaf* iCaf;
       
   218 	};
       
   219 
       
   220 #endif	//__CIMAPOPFETCHBODY_H__