email/imap4mtm/imapsession/inc/cimapfetchbody.h
author hgs
Wed, 03 Nov 2010 22:55:44 +0530
changeset 80 8b14b30db193
permissions -rw-r--r--
201044_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80
8b14b30db193 201044_02
hgs
parents:
diff changeset
     1
// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
8b14b30db193 201044_02
hgs
parents:
diff changeset
     2
// All rights reserved.
8b14b30db193 201044_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
8b14b30db193 201044_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
8b14b30db193 201044_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
8b14b30db193 201044_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
8b14b30db193 201044_02
hgs
parents:
diff changeset
     7
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
8b14b30db193 201044_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    10
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    11
// Contributors:
8b14b30db193 201044_02
hgs
parents:
diff changeset
    12
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    13
// Description:
8b14b30db193 201044_02
hgs
parents:
diff changeset
    14
//
8b14b30db193 201044_02
hgs
parents:
diff changeset
    15
8b14b30db193 201044_02
hgs
parents:
diff changeset
    16
#ifndef __CIMAPFETCHBODY_H__
8b14b30db193 201044_02
hgs
parents:
diff changeset
    17
#define __CIMAPFETCHBODY_H__
8b14b30db193 201044_02
hgs
parents:
diff changeset
    18
8b14b30db193 201044_02
hgs
parents:
diff changeset
    19
#include <e32std.h>
8b14b30db193 201044_02
hgs
parents:
diff changeset
    20
8b14b30db193 201044_02
hgs
parents:
diff changeset
    21
#include "cimapcommand.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    22
#include "cimapmailstore.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    23
#include "tmessageflaginfo.h"
8b14b30db193 201044_02
hgs
parents:
diff changeset
    24
8b14b30db193 201044_02
hgs
parents:
diff changeset
    25
//forward declaration
8b14b30db193 201044_02
hgs
parents:
diff changeset
    26
class CImapSession;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    27
class CImapSettings;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    28
class CImapMimeHeaderFieldsParser;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    29
class CFetchBodyInfo;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    30
class CImapFetchBodyResponse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    31
8b14b30db193 201044_02
hgs
parents:
diff changeset
    32
/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
    33
@internalTechnology
8b14b30db193 201044_02
hgs
parents:
diff changeset
    34
@prototype
8b14b30db193 201044_02
hgs
parents:
diff changeset
    35
*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
    36
class CImapFetchBody : public CImapCommand, public MMailStoreObserver, public MChunkOutOfOrderObserver
8b14b30db193 201044_02
hgs
parents:
diff changeset
    37
	{
8b14b30db193 201044_02
hgs
parents:
diff changeset
    38
private:
8b14b30db193 201044_02
hgs
parents:
diff changeset
    39
	enum TState
8b14b30db193 201044_02
hgs
parents:
diff changeset
    40
		{		
8b14b30db193 201044_02
hgs
parents:
diff changeset
    41
		/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
    42
		Looking for the next data item(s), in the current line.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    43
		This state can transition to EStateBodyStructureLiteral or EStateHeaderFieldsLiteral if 
8b14b30db193 201044_02
hgs
parents:
diff changeset
    44
		either of these data items are found, or EStateComplete if no data items are found.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    45
		*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
    46
		EStateDataItemLine,
8b14b30db193 201044_02
hgs
parents:
diff changeset
    47
		/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
    48
		Waiting for a literal that will be delivered to the body  parser.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    49
		*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
    50
		EStateBodyLiteral,
8b14b30db193 201044_02
hgs
parents:
diff changeset
    51
		/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
    52
		Processing the data for BODY[x.MIME]
8b14b30db193 201044_02
hgs
parents:
diff changeset
    53
		*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
    54
		EStateMime,
8b14b30db193 201044_02
hgs
parents:
diff changeset
    55
		/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
    56
		This state occurs after EStateHeaderFieldsLiteral.  It means that a data item line
8b14b30db193 201044_02
hgs
parents:
diff changeset
    57
		is expected, but it has yet to be fetched from the input stream.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    58
		This differs to EStateDataItemLine, which means that the current block of data
8b14b30db193 201044_02
hgs
parents:
diff changeset
    59
		still has data items in it.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    60
		*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
    61
		EStateFetchNextDataItemLine,
8b14b30db193 201044_02
hgs
parents:
diff changeset
    62
		/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
    63
		Either all data has been parsed, or the data was not recognised.
8b14b30db193 201044_02
hgs
parents:
diff changeset
    64
		*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
    65
		EStateComplete,
8b14b30db193 201044_02
hgs
parents:
diff changeset
    66
		};
8b14b30db193 201044_02
hgs
parents:
diff changeset
    67
8b14b30db193 201044_02
hgs
parents:
diff changeset
    68
public:
8b14b30db193 201044_02
hgs
parents:
diff changeset
    69
	// Construction and Destruction
8b14b30db193 201044_02
hgs
parents:
diff changeset
    70
	static CImapFetchBody* NewL(CImapFolderInfo* aSelectedFolderData, TInt aLogId, TUint aMessageUid, TBool aPeek, CFetchBodyInfo& aFetchBodyInfo, CImapFetchBodyResponse& aFetchBodyResponse, CImapSettings& aImapSettings, CImapMailStore& aImapMailStore, CImapSession& aParent);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    71
	~CImapFetchBody();
8b14b30db193 201044_02
hgs
parents:
diff changeset
    72
8b14b30db193 201044_02
hgs
parents:
diff changeset
    73
	// Overrides CImapCommand
8b14b30db193 201044_02
hgs
parents:
diff changeset
    74
	void Cancel();
8b14b30db193 201044_02
hgs
parents:
diff changeset
    75
8b14b30db193 201044_02
hgs
parents:
diff changeset
    76
	// Fetch Body specific
8b14b30db193 201044_02
hgs
parents:
diff changeset
    77
	TBool IsStoreOperationComplete();
8b14b30db193 201044_02
hgs
parents:
diff changeset
    78
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    79
	// Overrides CImapCommand::SendDataCnfL
8b14b30db193 201044_02
hgs
parents:
diff changeset
    80
	virtual void SendDataCnfL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
    81
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    82
private:
8b14b30db193 201044_02
hgs
parents:
diff changeset
    83
	CImapFetchBody(CImapFolderInfo* aSelectedFolderData, TInt aLogId, TUint aMessageUid, TBool aPeek, CFetchBodyInfo& aFetchBodyInfo, CImapFetchBodyResponse& aFetchBodyResponse, CImapSettings& aImapSettings, CImapMailStore& aImapMailStore, CImapSession& aParent);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    84
	void ConstructL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
    85
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    86
	// Implements CImapCommand
8b14b30db193 201044_02
hgs
parents:
diff changeset
    87
	void SendMessageL(TInt aTagId, MOutputStream& aStream);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    88
	CImapCommand::TParseBlockResult DoParseBlockL(const TDesC8& aData);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    89
	TInt NumberOfTaggedResponsesExpected() const;
8b14b30db193 201044_02
hgs
parents:
diff changeset
    90
8b14b30db193 201044_02
hgs
parents:
diff changeset
    91
	// from MMailStoreObserver
8b14b30db193 201044_02
hgs
parents:
diff changeset
    92
	void StoreOperationComplete(TMsvId aId,TInt aErrorCode);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    93
8b14b30db193 201044_02
hgs
parents:
diff changeset
    94
	// from MChunkOutOfOrderObserver.		
8b14b30db193 201044_02
hgs
parents:
diff changeset
    95
	void  EnableSendFetch();
8b14b30db193 201044_02
hgs
parents:
diff changeset
    96
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
    97
	void SendMessageL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
    98
	TInt CalculateChunk(TInt aPos);
8b14b30db193 201044_02
hgs
parents:
diff changeset
    99
	TInt TotalRequestsRequired(TInt aSize);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   100
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   101
	TParseBlockResult ProcessStartL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   102
	TParseBlockResult ProcessDataItemsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   103
	void ProcessStartOfMimeL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   104
	void ProcessRestOfMimeL(const TDesC8& aData);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   105
8b14b30db193 201044_02
hgs
parents:
diff changeset
   106
	TBool GetAndStoreNextPart();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   107
	void ProcessBodyL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   108
	void ProcessFlagsL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   109
	void ProcessUidL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   110
	void ProcessBodyLiteralL(const TDesC8& aData);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   111
	void WriteMimeHeadersToCafL();
8b14b30db193 201044_02
hgs
parents:
diff changeset
   112
	void StoreBodyDataL(TInt aExtraFetchRequest);
8b14b30db193 201044_02
hgs
parents:
diff changeset
   113
8b14b30db193 201044_02
hgs
parents:
diff changeset
   114
private:
8b14b30db193 201044_02
hgs
parents:
diff changeset
   115
	//the uid of the message on the server - used for SEND operations
8b14b30db193 201044_02
hgs
parents:
diff changeset
   116
	TUint iMessageUid;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   117
	//whether we want to peek, controls the /seen flag
8b14b30db193 201044_02
hgs
parents:
diff changeset
   118
	TBool iPeek;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   119
	//the size of the data we want to retrieve
8b14b30db193 201044_02
hgs
parents:
diff changeset
   120
	TInt32 iSizeToFetch;	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   121
	//the total number of requests we need to issue to receive all of the data
8b14b30db193 201044_02
hgs
parents:
diff changeset
   122
	TInt iTotalRequests;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   123
	//running count of requests that have been issued
8b14b30db193 201044_02
hgs
parents:
diff changeset
   124
	TInt iRequestCount;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   125
	//the chunk where the data currently being parsed will be stored
8b14b30db193 201044_02
hgs
parents:
diff changeset
   126
	TInt iCurrentChunk;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   127
	//the output stream used to send the commands
8b14b30db193 201044_02
hgs
parents:
diff changeset
   128
	MOutputStream* iOutStream;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   129
	//the size of the literal being stored
8b14b30db193 201044_02
hgs
parents:
diff changeset
   130
	TInt iLiteralSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   131
	//the maximum fetch size
8b14b30db193 201044_02
hgs
parents:
diff changeset
   132
	TUint iMaxFetchSize;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   133
	//the number of commands that may be pipelined
8b14b30db193 201044_02
hgs
parents:
diff changeset
   134
	TUint iMaxOutstandingRequests;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   135
	//gloabal settings information
8b14b30db193 201044_02
hgs
parents:
diff changeset
   136
	CImapSettings& iImapSettings;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   137
	//info about this specific fetch
8b14b30db193 201044_02
hgs
parents:
diff changeset
   138
	CFetchBodyInfo& iFetchBodyInfo;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   139
	//the gloabl mailstore object
8b14b30db193 201044_02
hgs
parents:
diff changeset
   140
	CImapMailStore& iImapMailStore;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   141
	//the parent session
8b14b30db193 201044_02
hgs
parents:
diff changeset
   142
	CImapSession& iParent;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   143
	//if the store operation is complete
8b14b30db193 201044_02
hgs
parents:
diff changeset
   144
	TBool iStoreComplete;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   145
	// Mime header fields parser for BODY[x.MIME] response
8b14b30db193 201044_02
hgs
parents:
diff changeset
   146
	CImapMimeHeaderFieldsParser* iHeaderFieldsParser;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   147
	/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   148
	Whether the UID data item was found in the untagged response.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   149
	If the UID data item was NOT found then the response is an unsolicited FETCH response caused
8b14b30db193 201044_02
hgs
parents:
diff changeset
   150
	by a server event (e.g. a user deleting some messages from some other client such as a PC),
8b14b30db193 201044_02
hgs
parents:
diff changeset
   151
	rather than a direct response to our UID FETCH command - which would have included the UID DATA item.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   152
	
8b14b30db193 201044_02
hgs
parents:
diff changeset
   153
	Non-UID FETCH responses should not be returned as the result of a FetchBody request.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   154
	*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   155
	TBool iUidDataItemFoundInResponse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   156
	/**
8b14b30db193 201044_02
hgs
parents:
diff changeset
   157
	Stores the result of parsing the FLAGS data item and the UID data item.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   158
	If both UID and FLAGS data items are included in the response, then the data in this
8b14b30db193 201044_02
hgs
parents:
diff changeset
   159
	object will be copied to the equivalent object in iFetchBodyResponse.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   160
	If only the FLAGS data item included in the response, then this is an unsolicited FETCH response
8b14b30db193 201044_02
hgs
parents:
diff changeset
   161
	and the data is discarded (so as not to corrupt the data in iFetchBodyResponse)
8b14b30db193 201044_02
hgs
parents:
diff changeset
   162
	*/
8b14b30db193 201044_02
hgs
parents:
diff changeset
   163
	TMessageFlagInfo iMessageFlagInfo;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   164
	// Stores fetch body response data
8b14b30db193 201044_02
hgs
parents:
diff changeset
   165
	CImapFetchBodyResponse& iFetchBodyResponse;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   166
	// part thats being parsed
8b14b30db193 201044_02
hgs
parents:
diff changeset
   167
	TPtrC8 iCurrentPart;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   168
	//used to track the state of the response parsing
8b14b30db193 201044_02
hgs
parents:
diff changeset
   169
	TState iState;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   170
	// Stores current body data
8b14b30db193 201044_02
hgs
parents:
diff changeset
   171
	HBufC8* iBuf;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   172
	// Indicates that we have received the MIME headers
8b14b30db193 201044_02
hgs
parents:
diff changeset
   173
	TBool iReceivedMimeHeaders;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   174
	// When pipelining this is the amount of commands that are pipelined.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   175
	TInt iOutstandingRequests;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   176
	// Keeps track of the fetch responses received.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   177
	TInt iResponseCount;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   178
	// to keep track of all tags we expect to receive.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   179
	RArray<TInt>iTagIds;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   180
	// Indicates whether to send FETCH command to server.Sending FETCH command 
8b14b30db193 201044_02
hgs
parents:
diff changeset
   181
	// to server may be disabled if server sends out of order chunks.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   182
	TBool iSendFetch;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   183
	// When server responses with no body length, iUnexpectedFormat is set to ETrue.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   184
	TBool iUnexpectedFormat;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   185
	// Flag to check if we are partially/fully downloading the mail.
8b14b30db193 201044_02
hgs
parents:
diff changeset
   186
	TBool iPartialFetch;
8b14b30db193 201044_02
hgs
parents:
diff changeset
   187
	};
8b14b30db193 201044_02
hgs
parents:
diff changeset
   188
8b14b30db193 201044_02
hgs
parents:
diff changeset
   189
#endif // __CIMAPFETCHBODY_H__