wapstack/wapmessageapi/sws/ActiveSocket.h
branchRCL_3
changeset 18 50bae5c5c85f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wapstack/wapmessageapi/sws/ActiveSocket.h	Tue Apr 20 17:00:49 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 <e32std.h>
+#include <wapmessage.h>
+#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<TWapNotificationInfo> 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<TUint32>* 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<TUint32> 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<CActiveSocket>& aActiveSockets, Wap::TBearer aBearer, TWapMessageType aType, MProgressNotify* aNotify, Wap::TPort aLocalPort, RConnection* aConnection=NULL);
+	static void NewL(RSocketServ& aSocketServ, RPointerArray<CActiveSocket>& 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__
+