email/pop3andsmtpmtm/imapservermtm/inc/IMAPSESS.H
changeset 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/imapservermtm/inc/IMAPSESS.H	Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,784 @@
+// Copyright (c) 1998-2009 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:
+// CImImap4Session header
+// 
+//
+
+#if !defined(__IMAPSESS_H__)
+#define __IMAPSESS_H__
+
+#include <e32base.h>
+#include <e32cons.h>
+#include <mentact.h>
+#include <msvstd.h>
+#include <miuthdr.h>
+#include <imcvcodc.h>
+#include <imcvsend.h>
+#include "impsmtm.h"
+#include <miutatch.h>
+#include <cimcaf.h>
+
+#include "imapio.h"
+#include "fldindex.h"
+
+// Forward declarations
+class CMsvBodyText;
+class CRichText;
+class CParaFormatLayer;
+class CCharFormatLayer;
+class CImQPDecode;
+class CImImap4Settings;
+class CImImap4Synchronise;
+class CImImap4FolderSync;
+class CImCalculateMsgSize;
+class CImSendConvert;
+class CImConvertCharconv;
+class CCnvCharacterSetConverter;
+class CImConvertHeader;
+class CImapCancelTimer;
+class MImapSessionObserver;
+
+// States of ImapSession
+/**
+@internalComponent
+@released
+*/
+enum TImapState
+	{
+	EImapStateDisconnected=0,
+
+	EImapStateConnectWait,
+	EImapStateGreetingWait,
+	EImapStateCapabilityWait,
+	EImapStateLoginSendUser,
+	EImapStateLoginSendPassword, // 5
+	EImapStateLoginWait,
+	EImapStateNoSelect,
+	EImapStateSelectWait,
+	EImapStateSelected,
+	EImapStateCreateWait,		// 10
+	EImapStateDeleteWait,
+	EImapStateDeleteAllWait,
+	EImapStateDeleteFolderWait,
+	EImapStateRenameWait,
+	EImapStateSynchroniseWait,	// 15
+	EImapStateFetchWait,
+	EImapStateListWait,
+	EImapStateLsubWait,
+	EImapStateSubscribeWait,
+	EImapStateUnsubscribeWait,	// 20
+	EImapStateSeparatorWait,
+	EImapStateCommandWait,
+	EImapStateAppendSizeWait,
+	EImapStateAppendPromptWait,
+	EImapStateAppendWait,		// 25
+	EImapStateAppendResultWait,
+	EImapStateDeleteMarkWait,
+	EImapStateExpungeWait,
+	EImapStateExpungeAllWait,
+	EImapStateCloseWait,		// 30
+	EImapStateLogoutWait,
+	EImapStateMoveEntryWait,
+	EImapStateStartTLSWait,
+	EImapStateSetSeenWait,
+	EImapStateClearSeenWait,	// 35
+	EImapStateSendLiteral,
+	EImapStateIdleWait,
+	EImapStateIdling,
+	EImapStateStopIdleWait,
+	EImapStateFetchCancelWait	// 40
+	};
+
+// States of a synchronise
+/**
+@internalComponent
+@released
+*/
+enum TImapSyncState
+	{
+	ENotSyncing=0,
+
+	ESyncOld,
+	ESyncNew,
+	EFetching,
+	ESyncSearch,	
+	ESyncListOld,	
+	ESyncListNew,
+	EGettingStructure
+	};
+
+// Modes updating Seen flag
+enum TSeenFlagUpdateMode
+	{
+	EClearSeenFlag=0,
+	ESetSeenFlag
+	};
+
+
+// Positive completion errors
+const TInt KErrIMAPNO				=1;
+const TInt KErrRFC2231Encoded		=2;
+
+// IMAP text
+_LIT(KIMAP_INBOX, "INBOX");
+_LIT8(KIMAP_OK, "OK");
+
+//TDes8 over flow handler
+class TDes8OverflowHandler : public TDes8Overflow
+/**
+@internalComponent
+@released
+*/
+	{
+	public:
+		void Overflow(TDes8&){return;} //nullifies USER:23 panic
+	};
+
+//cached TMsvEntry data
+class TMsvCacheData
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	TBool iOrphan;
+	TUint32 iUid;
+	};
+
+// Remote directory structure
+class CImImap4DirStruct : public CBase
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	CImImap4DirStruct();
+	~CImImap4DirStruct();
+
+	void SetLeafnameL(const TDesC& aName);
+	TPtrC Leafname();
+	
+private:
+	HBufC*			iLeafname;
+
+public:	
+	TBool			iIsMailbox;
+	TBool			iIsFolder;
+	};
+
+// Class which will defeat the timeout
+class CIdleTimeoutTimer : public CTimer
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	static CIdleTimeoutTimer* NewL(CImImap4Session& aOperation);
+private:
+	CIdleTimeoutTimer(CImImap4Session& aOperation);
+	void RunL();
+private:
+	CImImap4Session& iOperation;
+	};
+
+class CImImap4SessionDummyRead : public CActive
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	static CImImap4SessionDummyRead* NewL(CImImap4Session& aOperation, CImapIO& aImapIO, TInt aPriority);
+	~CImImap4SessionDummyRead();
+	void Start();
+
+private:
+	CImImap4SessionDummyRead(CImImap4Session& aOperation, CImapIO& aImapIO, TInt aPriority);
+	void DoCancel();
+	void RunL();
+
+	CImImap4Session& iSession;
+	CImapIO& iImapIO;
+	};
+
+
+class CImImap4SessionIdleRead : public CActive
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+	static CImImap4SessionIdleRead* NewL(CImImap4Session& aOperation, TInt aPriority);
+	~CImImap4SessionIdleRead();
+	void Start(TRequestStatus& aStatus);
+
+private:
+	CImImap4SessionIdleRead(CImImap4Session& aOperation, TInt aPriority);
+	void DoCancel();
+	void RunL();
+
+	CImImap4Session& iOperation;
+	TRequestStatus* iOperationStatus;
+	};
+
+
+// The session class
+class CImImap4Session : public CMsgActive
+/**
+@internalComponent
+@released
+*/
+	{
+public: // functions
+	// construct/destruct
+	~CImImap4Session();
+	static CImImap4Session *NewL(TInt aId, MImapSessionObserver& aObserver);
+	static CImImap4Session *NewLC(TInt aId, MImapSessionObserver& aObserver);
+
+	// Return the service settings of the current service
+	CImImap4Settings* ServiceSettings();
+
+	// Connect & disconnect to/from a server, and 'are we connected' status
+	void ConnectL(TRequestStatus& aStatus, const TMsvId aService);
+	void DisconnectL(TRequestStatus& aStatus);
+	TBool Connected();
+	TBool Busy();
+	TBool IsCancelling() const;
+	void CancelAndIdleL(TBool aReissueIdle);
+
+	// Folder information/manipulation
+	void ListL(TRequestStatus& aStatus, const TMsvId aFolder, CArrayPtr<CImImap4DirStruct>* aList);
+	void LsubL(TRequestStatus& aStatus);
+	void LocalSubscribeL(const TMsvId aTarget, const TBool aSubscribe);
+	void RemoteSubscribeL(TRequestStatus& aStatus, const TMsvId aTarget, const TBool aSubscribe);
+	void Create(TRequestStatus& aStatus, const TMsvId aParent, const TDesC& aLeafName, const TBool aFolder);	
+	void CreateL(TRequestStatus& aStatus, const TMsvId aParent, const TDesC& aLeafName, const TBool aFolder);
+	void Rename(TRequestStatus& aStatus, const TMsvId aTarget, const TDesC& aNewName);
+	void RenameL(TRequestStatus& aStatus, const TMsvId aTarget, const TDesC& aNewName);
+	
+	void Delete(TRequestStatus& aStatus, const TMsvId aTarget);
+	void Delete(TRequestStatus& aRequestStatus, const CMsvEntrySelection& aTargetSel);
+	void DeleteL(TRequestStatus& aRequestStatus, const CMsvEntrySelection& aTargetSel);
+	void DeleteAllMessagesL(TRequestStatus& aStatus);
+
+	// Append to a folder
+	void Append(TRequestStatus& aStatus, const TMsvId aEntry, const TMsvId aDestination);
+	void AppendL(TRequestStatus& aStatus, const TMsvId aEntry, const TMsvId aDestination);
+
+	// Folder selection
+	void Select(TRequestStatus& aStatus, const TMsvId aFolder, const TBool aReadWrite);
+	void SelectL(TRequestStatus& aStatus, const TMsvId aFolder, const TBool aReadWrite);
+
+	// Post-folder selection commands
+	void Synchronise(TRequestStatus& aStatus, const TBool aNewOnly);
+	void SynchroniseL(TRequestStatus& aStatus, const TBool aNewOnly);
+	void Copy(TRequestStatus& aStatus, const TMsvId aSource, const TMsvId aDestination, TBool aUnSelectIfSameFolder);
+	void CopyL(TRequestStatus& aStatus, const TMsvId aSource, const TMsvId aDestination, TBool aUnSelectIfSameFolder);
+	void Close(TRequestStatus& aStatus, const TBool aExpunge);
+	void CloseL(TRequestStatus& aStatus, const TBool aExpunge);
+	void FetchBody(TRequestStatus& aRequestStatus, const TMsvId aPart,TImImap4GetPartialMailInfo aGetPartialMailInfo);
+
+	void StartIdle(TRequestStatus& aRequestStatus);
+	void StartIdleL(TRequestStatus& aRequestStatus);
+	void StopIdle(TRequestStatus& aRequestStatus);
+	void SyncStopIdleL(TRequestStatus& aRequestStatus);
+	void StopIdleL(TRequestStatus& aRequestStatus);
+
+	void DoIdleRead(TRequestStatus& aIdleReadStatus);
+	void CancelIdleRead();
+	void IdleReadError(TInt aError);
+	void IdleTimerExpiredL();
+	void CancelTimerExpired();
+
+	// Progress
+	void IncSyncStats(TImap4SyncProgress& aSync);
+	TImap4GenericProgress Progress();
+	void ResetStats();
+
+	TBool FolderChanged() const;
+	TBool ImapIdleSupported() const;
+	TBool IsIdling() const;
+	
+	// Save msvserverentry that Mtm hands us
+	void SetEntry(CMsvServerEntry *aEntry);
+
+	// Log stuff
+	void LogText(const TDesC8& aString);
+	void LogText(TRefByValue<const TDesC8> aFmt,...);
+
+	// Orphan a local message
+	void OrphanMessageL(const TMsvId aMessage);
+
+	// Delete a local message
+	void DeleteMessageL(const TMsvId aMessage);
+
+	// Copy a message, leaving the structure behind (with a new TMsvId)
+	void CopyMessage(TRequestStatus& aStatus, const TMsvId iSourceFolder, const TMsvId iSource, const TMsvId iDestinationFolder, TMsvId* iNewSource, const TBool aRemoveOriginal);
+
+	// Park entries
+	void Park();
+
+	void ReissueIdleL();
+	void ReissueDummy();
+
+	void DummyComplete(TInt aError);
+	TInt CommandFailure() const;
+
+	// Calculate the total size of the messages to be downloaderd in this selection.
+	TInt CalculateDownloadSizeL(const CMsvEntrySelection& aSelection);
+
+	// This selection should not be deleted during a synchronisation
+	void SetSynchronisationSelectionL(CMsvEntrySelection& aSelection);
+
+	void SetInbox(TMsvId aInbox);
+	TMsvId GetInbox();
+	
+	// Only going to be set on the secondary session
+	void SetPrimarySession(CActiveWrapper* aPrimarySession);
+	
+	// Returns Current TextServerSession 
+	CImTextServerSession* GetTextServerSession();
+		
+private:	
+	CImImap4Session(MImapSessionObserver& aObserver);
+	void ConstructL(TInt aId);
+
+	void RunL();
+	void DoRunL();
+	void DoComplete(TInt& aStatus);
+
+	// The get more/send some calls
+	void GetReply(const TBool aPartial);
+	void SendMessageL(const TDesC8 &theMessage);
+	void SendUntaggedMessageL(const TDesC8 &theMessage);
+	void SendUntaggedMessageWithTimeoutL(const TDesC8 &theMessage, TInt aTimeout);
+	void NewTag();
+	void NewTagSent();
+	
+	void LostConnection(TInt aError);
+	void IssueIdleRead();	
+
+	void Fail(const TInt aError);
+	void DoDisconnect();
+
+	// Construct full mailbox/folder path from a TMsvId
+	HBufC8* MakePathL(const TMsvId aTarget, const TBool aIncludeLeaf);
+
+	// Cancel current operation
+	void DoCancel();
+
+	// convert to and from Modified UTF-7 if needed
+	HBufC* DoUnModUTF7LC(TDesC8& aBuffer);
+
+	// Enquote string if needed
+	void DoQuoteL(HBufC8*& aBuffer);
+
+	// Update last sync date on folder
+	void SyncCompleteL();
+
+	// Get children of a folder: ONLY the message ones, though
+	void GetMessageChildrenL(const TMsvId aFolder, CMsvEntrySelection* aChildren);
+
+	// Make sorted folder index
+	void MakeSortedFolderIndexL(TBool aUseCachedEntryData=EFalse);
+
+	// Show atom tree (debug only)
+	void showtree(CImapAtom* aAtom,TInt aIndent);
+
+	// Reset subscription flags (recursive)
+	void ResetSubscriptionFlagsL(const TMsvId aFolder);
+
+	// Start new synchronise phase
+	void SynchroniseNewL();
+	void SynchroniseNewL(const TUint32 aLowUid,const TUint32 aHighUid);
+
+	// Process replies
+	TInt ProcessGreetingL();
+	TInt ProcessCommandReplyL();
+	TInt ProcessContinuationResponse(CImapAtom *aAtom);
+	TInt ProcessUntaggedL(CImapAtom* aAtom, const TBool aCancelled);
+	TInt ProcessFetchL(const TUint aMsgnr, CImapAtom* aAtom);
+	void ProcessListL(CImapAtom* aAtom);
+	void ProcessLsubL(CImapAtom* aAtom);
+	TBool ProcessFlagsL(CImapAtom* aAtom, TMsvEmailEntry& aMessage);
+	void AppendExtendL(HBufC8** aBufferPtr, const TDesC8& aText, TBool aOnStack=ETrue);
+	void ProcessAddressL(HBufC8** aBuffer, CImapAtom* aAtom);
+	
+	// processing address list using envelope
+	void ProcessAddressListL(HBufC8** aBuffer, CDesCArray& aWhere, CImapAtom* aAtom);
+	// proccessing address list without using envelope
+	void ProcessAddressListL(CDesCArray& aWhere, HBufC8** aAddresses);
+
+	void ProcessEnvelopeL(CImHeader* aHeader, TMsvEntry& aEntry, CImapAtom *aAtom);
+	void ProcessHeaderExtraL(CImHeader* aHeader, CImMimeHeader* aMimeHeader, TMsvEmailEntry* aEntry, TPtrC8 aText);
+	void ProcessSearchL(CImapAtom *aAtom);
+
+	// generate a file name for an attachment based on its type
+	void GetDefaultFilename(TDes& aName, const TMsvEmailEntry& aMessage, const CImMimeHeader* mime);
+
+	void BuildTreeL(TMsvId aParent, CImapAtom *aAtom, const TDesC8& aPath,
+		            const TMsvId aThisMessage, TInt& aAttachments, TBool& aIsMHTML, TInt& aRelatedAttachments);
+	void BuildTreeOneL(const TMsvId aParent, CImapAtom *aAtom, const TDesC8& aPath,
+			           const TMsvId aThisMessage, TInt& aAttachments, TBool& aIsMHTML, TInt& aRelatedAttachments);
+
+	// Fetch helpers
+	// AddFetchItem adds item and appropriate fetchable children to
+	// the current fetch list
+	void AddFetchItemL(TMsvId aPart, TImap4GetMailOptions aPartTypes, TBool& aHasTextParts);
+	void AddFetchItemL(TMsvId aPart, TImImap4GetPartialMailInfo aGetPartialMailInfo, TBool& aHasTextParts);
+
+	// FetchAnItem issues command to fetch a fetchable part
+	void FetchAnItemL(const TMsvId aItem);
+
+	// Decode received data
+	void DecodeAndStoreL(const TPtrC8& aData, const TBool aEndOfStream);
+	TInt WriteToAttachmentL(const TDesC8& aText);
+	void WriteToBodyL(const TDesC8& aText);
+
+	// Helper function to decode UUEncoded attachment in MIME emails
+	TBool CheckUUEStartL(const TDesC8& aSourceLine);
+
+	// Called when we get a tagged completion code
+	void CommandCompleteL(TInt aResult);
+
+	// Dummy read operation queueing
+	void IssueDummy();
+	void CancelDummy();
+
+	// Set entry, leave if error (not related to setentry() which sets iEntry)
+	void SetEntryL(const TMsvId aId);
+
+	// Change entry, leave if error
+	void ChangeEntryL(const TMsvEntry& aEntry);
+
+	// Change entry, leave if error
+	void ChangeEntryBulkL(const TMsvEntry& aEntry);
+	// Get children, leave if error
+	void GetChildrenL(CMsvEntrySelection& aSelection);
+
+	// Scan content-type list for filename information, copy if necessary
+	TInt FindFilename(const CImMimeHeader& aMimeInfo, TPtrC8& aFilename);
+
+	// call FindFilename, default if necessary and QP decode it
+	void FindFilenameDecodeL(const CImMimeHeader& aMimeInfo, TFileName& aFilename);
+
+	// Copy a message, leaving the structure behind (with a new TMsvId) - use CopyMessage() instead
+	void CopyMessageL(TRequestStatus& aStatus, const TMsvId iSourceFolder, const TMsvId iSource, const TMsvId iDestinationFolder, TMsvId* iNewSource, const TBool aRemoveOriginal);
+
+	// private leaving versions of public non-leaving versions
+	void FetchBodyL(TRequestStatus& aStatus, const TMsvId aPart);
+	void DeleteL(TRequestStatus& aStatus, const TMsvId aTarget);
+
+	void DeleteEntryL( const TMsvId aTarget);
+
+	// convenience function to fix up the colon-separated header list
+	// into a space separated list
+	void ColonSeparatorToSpace(TDes8& buf);
+	void StripSpace(HBufC8* aBuf);
+
+	void PropagateCompleteFlagL(TMsvId aId, TBool aDoBodyText, TBool aPartialFetched);
+	void SendLoginL();
+	void SendCapabilityL();
+	TPtrC FileNameFromRFC2231(const TDesC8& aEncodedFileName);
+	static void SetMessageFlagsL(TMsvEmailEntry& aMessageEntry, CImapAtom* aRootAtom);
+
+	void FetchLargeHeaderL(TUint aUid, TBool aRange);  
+	void FetchHeaderL(TUint aUid);
+   
+  	void DoFetchL();
+
+	// Set or clear a set of message \Seen flags
+	TBool ProcessSeenFlagsL(TSeenFlagUpdateMode aUpdateMode);
+
+	// Search through all Sibling Atoms for an Attachment
+	TBool DoesAtomContainAttachment(CImapAtom *aAtom);
+	TInt32 Minimum(TInt32 aThisPartTypeSizeLimit,TInt32 aTotalMailSizeLimit);
+	TInt32 GetFetchSizeL(TInt32 aSizeLeft, TInt32 aSizeDownLoaded);
+	void AttachFooterInfoL();
+	void CheckForDiskSpaceL(TInt aSizeToBeDownloaded);
+	TInt32 FetchSize(TInt32 aMinimumLimit,TInt32 aSizeDownLoaded, TInt32 aSizeLeft);
+	void CheckForPartialPopulate(TImImap4GetPartialMailInfo aGetPartialMailInfo);
+	void RemoveHtmlPart(TMsvId aPart);
+	void ProcessFooterMessageL(TInt aSizeLeft);
+	
+	void DoSynchroniseL(TBool aNewOnly);
+	void DoStartIdleL();
+	void DoStopIdleL();
+	void DoDisconnectL();
+	void CreateAttachmentInfoL(TMsvEmailEntry& aMsvEmailEntry);
+	void CreateUidStringL();
+	void DoSelectL(const TMsvId aFolder, const TBool aReadWrite);	
+private:
+	enum TImap4SecurityState
+		{
+		EUnknown,
+		ENegotiating,
+		ESecure,
+		EUnsecure
+		};
+	
+private:
+	// Copy of the service's settings
+	CImImap4Settings*		iServiceSettings;
+	// Copy of the service's iap settings
+	CImIAPPreferences*		iPrefs;
+
+	// Our connection
+	CImapIO*				iImapIO;
+
+	// FS handle
+	RFs						iFs;
+
+	// Current state and line being processed
+	TImapState				iState;
+	TImapState				iSavedState;
+	TBool					iSendQueued;
+	TBool					iReceiveQueued;
+	TBool					iGotWholeLine;
+	TInt					iCommandsOutstanding;
+	TBool					iSizeWait;
+
+	// Generic space to store completion information about commands in progress
+	TBool					iCommandFlags[4];
+	TMsvId					iCommandIds[4];
+	TBuf<256>				iCommandBuf;
+	TInt					iCommandSize;
+
+	// Synchronisation state
+	TImapSyncState			iSyncState;
+	TInt					iFolderPosition;
+	TUint					iHighestUid;
+	TInt32					iSyncLimit;
+
+	// Current tag
+	TInt					iTag;
+	TInt					iCancelledTag;
+
+	// Mailbox hierarchy
+	TBuf8<1>				iHierarchySeparator;
+	TBuf8<64>				iFolderPath;
+
+	// List bits
+	CArrayPtr<CImImap4DirStruct>* iList;
+
+	// Seen IMAP4rev1 capability?
+	// IMAP capabilities
+	TBool					iSeenVersion;
+	TBool					iCapabilityStartTLS;
+	TBool					iCapabilityLoginDisabled;
+	TBool					iCapabilityIdleSupport;
+
+	TImap4SecurityState		iSecurityState;
+
+	// Host/username/password
+	TBuf<64>				iHost;
+	TInt					iPort;
+	HBufC8* 				iUsername;
+	HBufC8* 				iPassword;
+	TBool					iLiteralUsername;
+	TBool					iLiteralPassword;
+
+	// Mailbox state information from remote host
+	TMsvId					iMailboxId;
+	//TBool					iMailboxIsInbox;
+	CImImap4FolderIndex		iFolderIndex;
+	TBool					iMailboxReceivedExpunge;
+	TBool					iMailboxReceivedExists;
+	TBool					iMailboxReceivedFlags;
+	TBufC8<128>				iMailboxName;
+	TInt					iMailboxSize;
+	TInt					iMailboxRecent;
+	TBool					iMailboxWritable;
+	TUint					iUidValidity;
+	TUint					iUidNext;
+	CArrayFix<TMsvId>*		iDeletedUids;
+	TBool					iSomeUnread;
+
+	CArrayFix<TUint32>*		iSearchList;
+	TUint32					iMissingUidLow;
+	TUint32					iMissingUidHigh;
+
+	// Fetch in progress
+	TMsvId					iMessageId;
+	//TMsvId				iMessageDestination;
+	TUint					iMessageUid;
+	TUint					iMessageFetching;
+	
+	CBufBase*				iBodyBuf;
+	CMsvBodyText*			iBodyText;
+	CRichText*				iMessageBody;
+	CParaFormatLayer*		iParaLayer;
+	CCharFormatLayer*		iCharLayer;
+	
+	CArrayFix<TMsvId>*		iFetchList;
+	TBool					iFetchIsText;
+	TFileName				iAttachmentName;
+	CImMimeHeader*			iAttachmentMimeInfo;
+
+	TImAttachmentFile*		iAttachmentFile;
+	TImAttachmentFileState	iAttachmentFileState;
+	HBufC*					iAttachmentFullPath;
+	TInt					iSizeOfThisPart;
+	TInt					iDecodedSizeOfAllParts;
+	TInt 					iSizeLeftToFetch;
+	
+	// Bool to indicate that we are in between of a UUEncoded start and end tag.
+	TBool					iUUDecoding;
+	
+	// Decoder used for fetch in progres
+	TImCodecB64				iB64Decoder;
+	TImCodecUU				iUUDecoder;
+	TImCodecQP				iQPDecoder;
+	TImEncodingType			iEncodingType;
+	HBufC8*					iPartialLine;
+	HBufC*					iDefaultAttachmentName;
+
+	// Characterset conversion
+	CImConvertCharconv*		iCharConv;
+	CCnvCharacterSetConverter* iCharacterConverter;
+	CImConvertHeader*		iHeaderConverter;
+	TBool					iPreparedToConvert;
+	TBuf8<20>				iLeftOver;
+
+	// Bits used when appending
+	CImCalculateMsgSize*	iMessageSizer;
+	CImSendMessage*			iMessageSender;
+	TTime					iMessageDate;
+	HBufC8*					iLineBuffer;
+
+	// Tree of atoms
+	CImapAtom*				iRootAtom;
+
+	// Access to message database
+	CMsvServerEntry*		iEntry;
+	CMsvServerEntry*		iMoveEntry;
+	TMsvId					iMoveSource;		// What we're moving
+	TMsvId					iMoveSourceFolder;	// Where we're moving it from
+	TMsvId*					iNewSource;			// Where we save the newly created TMsvId in the source folder
+	CMsvEntrySelection*		iSelection;
+	CMsvEntrySelection*		iSynchronisationSelection;
+
+	// Dummy operation issued to CImapIO to notify us of connection problems?
+	CImImap4SessionDummyRead*	iDummyRead;
+	
+	// Used to issue and handle responses for IMAP IDLE
+	CImImap4SessionIdleRead* iIdleRead;
+
+	TBool					iUseIdleCommand;
+	CIdleTimeoutTimer*		iIdleTimer;
+	TBool					iReissueIdle;
+	TBool					iDisconnectAfterIdleStopped;
+	TMsvId					iInbox;
+	TBool 					iIdleTimerExpired;
+
+	// Hideous kludge for brain-dead CC:Mail servers
+	TBool					iTalkingToCCMail;
+	TBool					iTalkingToOpenMail;
+
+	TRequestStatus*			iRequestStatus;
+	TUint					iCharset;
+
+	TInt					iHeadersFetched;
+	TInt					iOrphanedMessages;
+	TInt					iRemoteMessagesDeleteTagged;
+	TInt					iMsgsDone;
+	TInt					iCheckDiskSpaceCounter;
+	TInt					iCurrentDrive;
+
+	CArrayFixFlat<TMsvCacheData>* iCachedEntryData;
+	CArrayFixFlat<TMsvId>* iSetSeenList;
+	CArrayFixFlat<TMsvId>* iClearSeenList;
+
+ 	TBool					iJustSentFetch;
+ 
+ 	// 
+ 	TImap4GetMailOptions	iGetOptions;
+	TImImap4GetPartialMailInfo	iGetPartialMailInfo;
+ 	TMsvId					iGetPart;
+
+	// If a Copy/Move/Delete fails with IMAP server. 
+	// Store the fact. May need information.
+	TInt					iCommandFailure;
+
+	// bearer timeout value in microseconds
+	TInt					iIdleTimeout;
+
+	TInt					iStore8BitData;
+	TBool					iFetchPartialMail;
+	TInt32					iBodyTextSize;
+	TInt32					iHtmlEntrySize;
+	TInt32					iBodyPartRemainingSize;
+	HBufC*					iFooterString;
+	TBool					iIsDiskSpaceChecked;
+	TMsvId					iHtmlEntryPart; 
+	TInt32					iSizeOfToBeFetchedAttachments;
+	// if set, the there is no IDLE reissued after a synch
+	TBool					iCompoundStopIdle;
+	CImCaf*					iCaf;
+
+	TBool					iIsICalendar;
+	TBool					iIsVCalendar;
+
+	HBufC8*					iUidString;
+	
+	// test to see if the uid is present in the fetch response. If it is, then it is part
+	// of the fetch command sent by the client. Otherwise it is a server message flag update,
+	// so just process flags
+	TBool iFoundUid;
+
+	// Indicates that we are stopping idle at the request of the synchronise active object
+	TBool iStoppingIdleForSync;
+
+	// Observer for callback notifications from session
+	MImapSessionObserver& iObserver;
+	
+	// Only going to be set on the secondary session to take ownership of primarysession
+	CActiveWrapper*			iPrimarySession; 
+	
+protected:
+	// Progress information
+	TImap4GenericProgress	iProgress;
+
+	// The service we're connected to
+	TMsvId					iServiceId;
+	// If we sent FETCH BODY MIME
+	TBool					iParsedTime;
+	CImapCancelTimer*		iCancelTimer;
+	TBool					iCancelAndIdle;
+	};
+
+#if 0
+class CImImapMoveWait: public CActive
+	{
+public:
+	CImImapMoveWait();
+	~CImImapMoveWait();
+	inline void Start();
+protected:
+	void RunL();
+	void DoCancel();
+	};
+
+inline void CImImapMoveWait::Start()
+	{
+	SetActive();
+	}
+#endif
+
+#endif
+