diff -r 238255e8b033 -r 84d9eb65b26f email/pop3andsmtpmtm/imapservermtm/inc/IMAPIO.H --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/pop3andsmtpmtm/imapservermtm/inc/IMAPIO.H Mon May 03 12:29:07 2010 +0300 @@ -0,0 +1,272 @@ +// 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: +// CImapIO header +// +// + +#if !defined(__IMAPIO_H__) +#define __IMAPIO_H__ + +#include +#include +#include +#include +#include + +// Receive buffer size (max to read in one go). Should really be MTU related, +// as that's what we'll get in a chunk. +const TInt KReceiveBuffer=2048; + +// Transmit buffer to keep data static when sending +const TInt KTransmitBuffer=1024; + +// What we return with if we find an EOL and have been asked to do a partial +// read +const TInt KErrFoundEOL=1; + +// States of async machine +/** +@internalComponent +@released +*/ +enum TIOState + { + EIOStateDisconnected, + EIOStateConnectQueued, + EIOStateConnected, + EIOStateReadQueued, + EIOStateWriteQueued, + EIOStateDummyQueued + }; + +// States of reply parser +/** +@internalComponent +@released +*/ +enum TIOParserState + { + EIOStateAtomWait, + EIOStateInAtom, + EIOStateWaitLF, + EIOStateLiteralLength, + EIOStateLiteralSkip, + EIOStateLiteralFetch + }; + +class CImapAtom : public CBase +/** +@internalComponent +@released +*/ + { +public: + CImapAtom(); + ~CImapAtom(); + + void Set(const TDesC8& aAtom); + void AddChild(CImapAtom *aNewChild); + void AddNext(CImapAtom *aNewNext); + + // Get child/next pointers + CImapAtom* Child(); + CImapAtom* Next(); + + // As above, but with leave if null + CImapAtom* ToChildL(); + CImapAtom* ToNextL(); + + TPtrC8 Atom(); + TBool Compare(const TDesC8& aValue); + TBool CompareTail(const TDesC8& aValue); + TInt Value(TUint& aValue); + TInt Value(TInt& aValue); + TInt Value(TInt32& aValue); + void FixupL(const HBufC8 *aNewBuffer, const TText8 *aOldBuffer); + TPtrC8 AtomNoAngleBrackets(); + +private: + TPtrC8 iAtom; + CImapAtom* iChild; + CImapAtom* iNext; + }; + + +class CImapIO : public CMsgActive +/** +@internalComponent +@released +*/ + { +public: + ~CImapIO(); + + static CImapIO* NewLC(TInt aId); + static CImapIO* NewL(TInt aId); + + // Queue a connect + void ConnectL(TRequestStatus& aStatus, const TDesC& aHost, const TUint aPort, const CImIAPPreferences& aPrefs, TBool aSSLWrappedSocket); + + // Queue a line read + TInt GetReply(TRequestStatus& aStatus); + TInt GetReply(TRequestStatus& aStatus, const TInt aFetchSize, const TBool aPartialReturn); + + // Queue a line write + TInt Send(TRequestStatus& aStatus, TRefByValue aFmt,...); + void SendL(TRequestStatus& aStatus, TRefByValue aFmt,...); + void SendWithTimeoutL(TRequestStatus& aStatus, TInt aTimeout, TRefByValue aFmt,...); + + // Logging + void PerformLogging(TBool aLogging); + + // Queue a dummy read for connection status notification + void QueueDummy(TRequestStatus& aStatus); + + // Get the root atom of the parse tree + CImapAtom* RootAtom(); + + // Get bytes in/out totals + TInt RXbytes(const TBool aReset); + TInt TXbytes(const TBool aReset); + + // Disconnect + void Disconnect(); + + // Security + void SetTLSResponseL(); + + // From IMSK + void LogText(const TDesC8& aString); + void LogText(TRefByValue aFmt,...); + +/** + @fn TInt GetIAPValue(TUint32& aIap) + Intended Usage : Gets the value of the currently connecting/connected IAP + @param aIap will be value of the currently connecting/connected IAP or KErrNotFound if an error occurs + @return KErrNone if succesful, KErrNotFound is the session does not exist or a system-wide error code. + + */ + TInt GetIAPValue(TUint32& aIap); + +/** + @fn GetRConnectionName() + Intended Usage : On return, the unique name of the RConnection. + @since 9.1 + @return KErrNone if succesful, or another of the system-wide error codes. + */ + TInt GetRConnectionName(TName &aName); + +/** + @fn GetLastSocketActivityTimeout(TUint32& aTimeout) + Intended Usage : Returns the last socket activity timeout value + @since 9.1 + @param aTimeout is a return argument containing the timeout if it was found + @post aTimeout will be filled with the timeout value + @return Returns KErrNone, KErrNotFound or KErrBadHandle + */ + TInt GetLastSocketActivityTimeout(TUint32& aTimeout); + +/** + @fn TInt GetConnectionStage() + Intended Usage : Gets the stage of the connection process as defined in nifvar.h and csdprog.h + @since 7.0s + @return The current connection stage, KErrNotFound is the session does not exist or a system-wide error code. + + */ + TInt GetConnectionStage(); + +/** + @fn SetPrimaryTextServerSession(CImTextServerSession* aPrimaryTextServerSession) + Intended Usage : Sets the local primaryTextSeverSession from PrimarySession's TextServerSession. + Going to be use on the secondary session + @since 9.2 + @param aPrimaryTextServerSession is to store the primary session's TextServerSession + */ + void SetPrimaryTextServerSession(CImTextServerSession* aPrimaryTextServerSession); + +/** + @fn GetTextServerSession() + Intended Usage : Returns CImTextServerSession + @since 9.2 + @return CImTextServerSession + */ + CImTextServerSession* GetTextServerSession(); + +private: + CImapIO(TInt aId); + void ConstructL(); + void DoComplete(TInt& /*aStatus*/); + void DoRunL(); + void DoCancel(); + void ProcessBufferL(); + void QueueRead(); + void BufferAppendL(const TChar aChar); + + void PushL(CImapAtom *aItem); + CImapAtom* PopL(); + + void AddAtomL(); + void AddAtomL(const TInt); + TInt Send(TRequestStatus& aStatus, const TDesC8& aCommand); + TInt SendWithTimeout(TRequestStatus& aStatus, TInt aTimeout, const TDesC8& aCommand); + +private: + TIOState iState; + TIOParserState iParserState; + TBool iParserQuoted; + TBool iGotEscape; + TInt iLineStatus; + TInt iLiteralSkip; + TInt iLiteralLength; + TInt iBytesRead; + TInt iBytesToRead; + TBool iReturnPartialLine; + + HBufC8* iBuffer; + TInt iBufferSize; + TBuf8 iReceive; + TBuf8 iTransmit; + TInt iLen; + TBuf8<1> iDummyBuffer; + + CImapAtom* iRootAtom; + CImapAtom* iAtom; + TPtrC8 iCurrentAtom; + TInt iAtomStart; + + CArrayPtrFlat iAtomStack; + TBool iNextIsChild; + + // Byte I/O totals + TInt iTXbytes; + TInt iRXbytes; + + // Actual connection + CImTextServerSession* iSession; + + // Extra logging + CImLog* iImapLog; + + // Atom array + RPointerArray iAtomArray; + + TInt iID; + + // Take ownership of primary session's Textserversession object + // Only going to be set on the secondary session + CImTextServerSession* iPrimaryTextServerSession; + + }; + +#endif