diff -r 07a122eea281 -r 4eff64595c44 wapstack/wapmessageapi/sws/ActiveSocket.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wapstack/wapmessageapi/sws/ActiveSocket.h Thu Sep 02 15:59:13 2010 +0100 @@ -0,0 +1,385 @@ +// Copyright (c) 2003-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: +// + +#ifndef __ACTIVESOCKET_H__ +#define __ACTIVESOCKET_H__ + +#include +#include +#include "WapSwsTimeOut.h" + + +class CActiveSocketSMS; +class CActiveSocketUDP; +class MProgressNotify; + +enum TWapMessageState + { + /** + The state that is no outstanding request. + */ + EIdle, + /** + The state that the messaging API client is requesting data length + */ + ERequestingLength, + /** + The state the the messaging API client is requesting data + */ + ERequestingData, + /** + The state that the data size is ready to be read + */ + EPendingLength, + /** + The state that the messaging API client got the data length + */ + EGotLength, + /** + The state that the received data is ready to be read + */ + EPendingData, + /** + The state the data is being reading, but not finished + */ + EReading, + /** + The state that there are more data to be received from ESock (PRT 1.5) + */ + EContinuous + }; +enum TWapMessageType + { + /** + Wsp message + */ + EWapWsp, + /** + Wdp message + */ + EWapWdp + }; +enum TWapActiveSocketState + { + /** + No outstanding request state + */ + ESocketIdle, + /** + Waiting for the PDU length state + */ + ESocketWaitingForLength, + /** + Waiting for the PDU data state + */ + ESocketWaitingForData + }; +enum TWapNotificationEvent + { + /** + The event that PDU length is ready. + */ + EPduLengthReceived, + /** + The event thst PDU us ready + */ + EPduReceived + }; + +class TWapNotificationInfo + { +public: + inline TWapNotificationInfo(Wap::TBearer aBearer, TInt aError); + Wap::TBearer iBearer; + TInt iError; + }; + +inline TWapNotificationInfo::TWapNotificationInfo(Wap::TBearer aBearer, TInt aError): +iBearer(aBearer), iError(aError) + { + } + +typedef TPckgBuf TWapNotificationInfoBuf; + +const TUint KMaxUdpBearerDataBufferLength=1024; + +class CWapMessageRecord: public CBase +/** +The Base class to represent the received WSP and WDP PDU +@internalComponent +@released +@since v8.0 +*/ + { +public: + static CWapMessageRecord* NewL(TWapMessageType aType); + virtual ~CWapMessageRecord(); + TWapMessageState GetDataState(); + void SetDataState(TWapMessageState aStatus); + void CreatePduBufferL(TBool aFixLengthFlag); + TPckgBuf* GetPduSizeRef(); + void SetPduSize(TUint32 aLength); + TUint32 GetPduSize(); + HBufC8*& GetPduPtr(); + /** + To read the received Wdp pdu + @internalComponent + @released + @since v8.0 + @param aBuffer(out) the buffer to contain the received wdp pdu + @param aTruncated(out) the flag to represent if the data is truncated or not + @returns KErrNone on successful completion, or one of the system error codes on failure. + */ + virtual TInt GetPduData(TDes8& aBuffer, TBool& aTruncated)=0; + /** + To unpack the received wdp pdu to wsp message. + @internalComponent + @released + @since v8.0 + */ + virtual void UnpackPduToWspDataL()=0; + /** + To read the wsp message from the buffer + @internalComponent + @released + @since v8.0 + @param aWspHeader(out) the buffer to contain the wsp header + @param aWspBody(out) the buffer to contain the wsp body + @param iTransactionId(out) the received transaction ID + @param aWspStatus(out) the received wsp status + @returns KErrNone on successful completion, or one of the system error codes on failure. + */ + virtual TInt GetWspData(TDes8& aWspHeader, TDes8& aWspBody, TUint8& aTransactionId, TWSPStatus& aWspStatus)=0; + virtual void CleanUpData(); +public: + /**The received WDP PDU Data buffer + */ + HBufC8* iPdu; + /**The received WDP PDU length buffer + */ + TPckgBuf iDataLength; + +protected: + CWapMessageRecord(); + /**The state of the received the WSP or WDP data + */ + TWapMessageState iState; + }; + +class CWspMessageRecord: public CWapMessageRecord +/** +The class to represent the received WSP PDU +@internalComponent +@released +@since v8.0 +*/ + { +public: + CWspMessageRecord(); + ~CWspMessageRecord(); + void UnpackPduToWspDataL(); + TInt GetWspData(TDes8& aWspHeader, TDes8& aWspBody, TUint8& aTransactionId, TWSPStatus& aWspStatus); + TInt GetPduData(TDes8& aBuffer, TBool& aTruncated); + void CleanUpData(); +private: + /** + The buffer for received Wsp header. + */ + HBufC8* iWspHeader; + /** + The buffer for received Wsp body. + */ + HBufC8* iWspBody; + /** + The received the transaction Id. + */ + TUint8 iTransactionId; + /** + The received WSP layer status + */ + TWSPStatus iWspStatus; + /** + The offset of the header for next reading + */ + TInt iHeaderOffset; + /** + The offset of the body for next reading + */ + TInt iBodyOffset; + }; + +class CWdpMessageRecord: public CWapMessageRecord +/** +The class to represent the received WDP PDU +@internalComponent +@released +@since v8.0 +*/ + { +public: + CWdpMessageRecord(); + ~CWdpMessageRecord(); + void UnpackPduToWspDataL(); + TInt GetWspData(TDes8& aWspHeader, TDes8& aWspBody, TUint8& aTransactionId, TWSPStatus& aWspStatus); + TInt GetPduData(TDes8& aBuffer, TBool& aTruncated); + void CleanUpData(); +private: + /** + The offset of the pdu for next reading + */ + TUint32 iPduOffset; + }; + +class CActiveSocket: public CActive +/** +The base class for the different bearer classes. +@internalComponent +@released +@since v8.0 +*/ + { +public: + static void NewL(RSocketServ& aSocketServ, RPointerArray& aActiveSockets, Wap::TBearer aBearer, TWapMessageType aType, MProgressNotify* aNotify, Wap::TPort aLocalPort, RConnection* aConnection=NULL); + static void NewL(RSocketServ& aSocketServ, RPointerArray& aActiveSockets, Wap::TBearer aBearer, TWapMessageType aType, MProgressNotify* aNotify, const TSockAddr& aRemoteAddr, RConnection* aConnection=NULL); + virtual ~CActiveSocket(); + virtual void ConstructL(TWapMessageType aType); + /** + Read the received Wdp pdu length. + @internalComponent + @released + @since v8.0 + @returns KErrNone on successful completion, or one of the system error codes on failure. + */ + virtual TInt AwaitRecvDataSize() = 0; + /** + Read the received Wdp pdu. + @internalComponent + @released + @since v8.0 + @returns KErrNone on successful completion, or one of the system error codes on failure. + */ + virtual TInt Receive() = 0; + TSockAddr& GetLocalAddress(); + TInt GetLocalPort(Wap::TPort& aLocalPort); + TInt GetRemoteAddress(HBufC8*& aAddr); + TSockAddr& GetRemoteAddress(); + + TWapMessageState GetDataState(); + void SetDataState(TWapMessageState aState); + TUint32 GetPduSize(); + TInt GetPduData(TDes8& aBuffer, TBool& aTruncated); + TInt GetWspData(TDes8& aWspHeader, TDes8& aWspBody, TUint8& aTransactionId, TWSPStatus& aStatus); + void UnpackPduToWspDataL(); + Wap::TBearer GetBearerType(); + RSocket& Socket(); + void CleanUpData(); + +public: + /**The RSocket instance to send and receive WDP PDU. + */ + RSocket iSocket; + /**The remote address for the last received message + */ + TSockAddr iRemoteAddr; + /**The local address for the last received message + */ + TSockAddr iLocalAddr; + +protected: + CActiveSocket(RSocketServ& aSocketServ, Wap::TBearer aBearerType, MProgressNotify* aNotify, Wap::TPort aLocalPort); + CActiveSocket(RSocketServ& aSocketServ, Wap::TBearer aBearerType, MProgressNotify* aNotify, const TSockAddr& aRemoteAddr, Wap::TPort aLocalPort); + +protected: + /**The data buffer to receive WDP or WSP message + */ + CWapMessageRecord* iMessageRecord; + /**The RSocketServ reference from WAP message API + */ + RSocketServ& iSocketServ; + /**The Bearer type + */ + Wap::TBearer iBearerType; + /**The port number for the last received message + */ + Wap::TPort iLocalPort; + /**The state of the bearer + */ + TWapActiveSocketState iSocketState; + /** + The instance that to be notified when data is received + */ + MProgressNotify* iNotify; + /** + Buffer for the first read from ESock + */ + TPtr8 iBuf; + /** + Reported remaining length for PRT 1.5 + */ + TSockXfrLength iRxlength; + /** + Buffer for continious read from ESock + */ + TPtr8 iBufCon; + }; + +class CActiveSocketSMS : public CActiveSocket +/** +The class represent the SMS bearer. It will open a RSocket over WapSMS protocol, send and +receive WDP PDU. +@internalComponent +@released +@since v8.0 +*/ +{ +public: + CActiveSocketSMS(RSocketServ& aSocketServ, MProgressNotify* aNotify, Wap::TBearer aBearer, Wap::TPort aLocalPort); + CActiveSocketSMS(RSocketServ& aSocketServ, MProgressNotify* aNotify, Wap::TBearer aBearer, const TSockAddr& aRemoteAddr); + virtual ~CActiveSocketSMS(); + TInt AwaitRecvDataSize(); + TInt Receive(); + void ConstructL(TWapMessageType aType); +private: + void RunL(); + void DoCancel(); +}; + +class CActiveSocketUDP : public CActiveSocket +/** +The class represent the UDP bearer. It will open a RSocket over UDP protocol, send and +receive WDP PDU. It is not supported in released v8.0. +@internalComponent +@released +@since v8.0 +*/ +{ +public: + CActiveSocketUDP(RSocketServ& aSocketServ, MProgressNotify* aNotify, Wap::TBearer aBearer, Wap::TPort aLocalPort, RConnection* aConnection); + CActiveSocketUDP(RSocketServ& aSocketServ, MProgressNotify* aNotify, Wap::TBearer aBearer, const TSockAddr& aRemoteAddr, RConnection* aConnection); + virtual ~CActiveSocketUDP(); + TInt AwaitRecvDataSize(); + TInt Receive(); + void ConstructL(TWapMessageType aType); +private: + void RunL(); + void DoCancel(); + /** + The RConnection shared with the WAP message API client. + */ + RConnection* iConnection; +}; + +#endif // __ACTIVESOCKET_H__ +