applayerprotocols/httpexamples/nwsswsptrhnd/CNwssWspCOSession.h
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httpexamples/nwsswsptrhnd/CNwssWspCOSession.h	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,616 @@
+// Copyright (c) 2002-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:
+//
+
+/**
+ @file CNwssWspCOSession.h
+ @warning : This file contains Rose Model ID comments - please do not delete
+*/
+
+#ifndef	__CNWSSWSPCOSESSION_H__
+#define __CNWSSWSPCOSESSION_H__
+
+// System includes
+#include <wapcli.h> // NWSS Wap Stack
+#include <wsp/mwspcosessioninvoker.h>
+#include <wsp/mwspcomethodinvoker.h>
+#include <http/framework/logging.h>
+
+// Local includes
+#include "cnwsswspsession.h"
+#include "cnwsstranslookuptable.h"
+#include "mnwsssessioneventhandler.h"
+#include "mnwsstransactioneventhandler.h"
+#include "mnwssoomhandler.h"
+
+// Forward declarations
+class MNwssWapServer;
+class MConnectionInfoProvider;
+class MWspCOSessionCallback;
+class CNwssWspCOEventDispatcher;
+class CCapCodec;
+class CNwssConnectGuard;
+class CNwssWspTransactionEventFilter;
+class CNwssWspSessionEventFilter;
+
+/**
+	@since			7.0
+	This class encapsulates a Connection-Oriented WSP session by specialising
+	CNwssWspSession.  It is responsible for making the majority of the calls on the
+	underlying NWSS WAP protocol stack.  It has five main areas of functionality:
+	1.	Opening, and connecting, the handle for a WSP CO session using the proxy
+		information supplied by the client (::OpenWspSession() and
+		::CompleteProxyConnectionL())
+	2.	Converting the requested client capabilities from the M-class interfaces
+		supplied by the client into a CCapCodec object, as used by the NWSS WAP
+		stack (::PrepareClientCapabilities())
+	3.	Doing the reverse for negotiated capabilities that are received from the
+		WAP Proxy before passing back to the client (::SetNegotiatedCapabilitiesL()).
+	4.	Implementing the MWspCOSessionInvoker and MWspCOMethodInvoker interfaces,
+		and translating each of the primitives exposed by these interfaces into
+		calls on the underlying NWSS WAP Stack.
+	5.	Implementing the MNwssSessionEventHandler and MNwssTransactionEventHandler
+		interfaces, in order that events received from the underlying WAP Stack (by
+		the class CNwssWspCOEventDispatcher) may be converted into the primitives
+		exposed by the client's callback interfaces MWspCOSessionCallback and
+		MWspCOMethodCallback.
+ */
+
+//##ModelId=3BBDCF00036A
+class CNwssWspCOSession : public CNwssWspSession,
+						  public MWspCOSessionInvoker,
+						  public MWspCOMethodInvoker,
+						  public MNwssSessionEventHandler,
+						  public MNwssTransactionEventHandler,
+						  public MNwssOomHandler
+	{
+// Unit testing only - give friendship to a public state accessor 
+#ifdef __UNIT_TESTING__
+	friend class TNwssWspCOSession_StateAccessor;
+#endif
+
+public: // methods
+
+/**
+	Factory construction of the CNwssWspCOSession class.
+	@since			7.0
+	@param			aStringPool			(in) The client's string pool.
+	@param			aWapStackProvider	(in) An owner of a WAP stack server session.
+	@param			aConnInfoProvider	(in) A collection of client interfaces that
+											 provide connection-related information
+	@param			aSecurityPolicy		(in) A security policy provider.
+	@param			aSessionCB			(in) The client's callback for receiving
+											 WSP session events
+	@return			The newly constructed CNwssWspCOSession instance.
+	@leave			System error codes, e.g. KErrNoMemory.
+*/
+	//##ModelId=3C4C49D202E6
+	static CNwssWspCOSession* NewL(RStringPool& aStringPool,
+								   MNwssWapServer& aWapStackProvider,
+								   MConnectionInfoProvider& aConnInfoProvider,
+								   MSecurityPolicy& aSecurityPolicy,
+								   MWspCOSessionCallback& aSessionCB);
+
+/** Destructor.
+	@since			7.0
+*/
+	//##ModelId=3C4C49D2021E
+	virtual ~CNwssWspCOSession();
+
+private: // methods inherited from CNwssWspSession
+
+/** Hook provided to the parent class allowing it to cause a
+					Connection-Oriented WSP session to the specified proxy to be
+					opened.
+	@since			7.0
+	@param			aRemoteHost	(in) The bearer-dependent address of the proxy.
+	@param			aRemotePort	(in) The proxy port to which a connection is made.
+	@param			aLocalPort	(in) (optional) The local port to which proxy replies
+									 are sent. A value of zero means 'don't care'.
+	@param			aBearer		(in) The bearer on which the connection is made.
+	@param			aSecureConn	(in) Flag indicating whether WTLS is to be used.
+	@return			A system error code originating from the NWSS WAP Stack.
+ */
+	//##ModelId=3C4C49D10014
+	virtual TInt OpenWspSession(const TDesC8& aRemoteHost,
+								RWAPConn::TPort aRemotePort,
+								RWAPConn::TPort aLocalPort,
+								TBearer aBearer,
+								TBool aSecureConn);
+
+/** Hook provided to the parent class allowing it to cause an
+					opened Connection-Oriented WSP session to be closed.
+	@since			7.0
+	@return			A system error code originating from the NWSS WAP Stack.
+ */
+	//##ModelId=3C591A9A0171
+	virtual TInt CloseWspSession();
+
+/** 	Hook provided to the parent class allowing it to perform any
+					required actions to complete a connection to the WAP Proxy
+					after the WSP session has been opened, and optionally a WTLS
+					handshake performed.
+					For connection-oriented WSP, this implies the use of
+					RWSPCOConn::Connect() to send the S-Connect.cnf primitive to
+					the proxy.  This initiates the connection, with an exchange of
+					capability information and session headers.
+	@since			7.0
+	@leave			A system error code originating from the NWSS WAP Stack.
+ */
+	//##ModelId=3C4C49D002F7
+	virtual void CompleteProxyConnectionL();
+
+/** Hook provided to the parent class allowing it to obtain the
+					WTLS handle from the current opened Connection-Oriented WSP
+					session.
+	@since			7.0
+	@return			A handle for the WTLS layer of the WAP protocol stack.
+ */
+	//##ModelId=3C4C49D001FD
+	virtual RWTLS WtlsHnd();
+
+/** Allows this class to to perform specific actions in response to
+					the parent class' RunError().  This is called in the EReady
+					state.
+					This handles situations where CompleteProxyConnectionL() has
+					left.  In practice, this handles errors arising from the use
+					of RWSPCOConn::Connect().
+	@since			7.0
+	@param			aError	(in) The error code to be handled, with which
+					CompleteProxyConnectionL() left.
+ */
+	//##ModelId=3C4C49D0001C
+	virtual void DoRunError(TInt aError);
+
+/** Called from DoCancel ofthe parent class' RunError() in the
+					EReady state.  This class cancels outstanding asynchronous
+					requests it makes from the Event Dispatcher.
+	@since			7.0
+	@return			Flag indicating whether, following cancellation, this class
+					must return to the EDisconnected state.
+ */
+	//##ModelId=3C591A9A0103
+	virtual TBool SubDoCancel();
+
+private: // methods inherited from MWspCOSessionInvoker
+
+	/** This represents the S-Connect.req primitive. 
+		@see MWspCOSessionInvoker
+	*/
+	//##ModelId=3C4C49CF030A
+	virtual void ConnectReq();
+
+	/** This represents the S-Disconnect.req primitive.
+		@see MWspCOSessionInvoker
+	*/
+	//##ModelId=3C4C49CF0133
+	virtual void DisconnectReq(TWspReason aReason);
+
+	/** This represents the S-Suspend.req primitive.
+		@see MWspCOSessionInvoker
+	*/
+	//##ModelId=3C4C49CF0043
+	virtual void SuspendReq();
+
+	/** This represents the S-Resume.req primitive. 
+		@see MWspCOSessionInvoker
+	*/
+	//##ModelId=3C4C49CE0345
+	virtual void ResumeReq();
+
+private: // methods inherited from MWspCOMethodInvoker
+
+	/** This represents the S-MethodInvoke.req primitive.
+		@see MWspCOSessionInvoker
+	*/
+	//##ModelId=3C4C49CD01D1
+	virtual void MethodInvokeReq(
+								MWspCOMethodCallback&		aTransactionCallback, 
+								RStringF					aMethod, 
+								const TUriC8&				aRequestUri, 
+								const TDesC8&				aRequestHeaders, 
+								const TDesC8&				aRequestBody,
+								TBool						aMoreData
+								);
+
+	/** This represents the S-MethodInvokeData.req primitive. 
+		@see MWspCOSessionInvoker
+	*/
+	//##ModelId=3C4C49CC031A
+	virtual void MethodInvokeDataReq(
+									MWspCOMethodCallback&	aTransactionCallback,
+									const TDesC8&			aRequestBody,
+									const TDesC8&			aTrailerHeaders,
+									TBool					aMoreData
+									);
+
+	/** This represents the S-MethodAbort.req primitive.
+		@see MWspCOSessionInvoker
+	*/
+	//##ModelId=3C4C49CC0161
+	virtual void MethodAbortReq(MWspCOMethodCallback& aTransactionCallback);
+
+	/** This represents the S-MethodResult.res primitive.
+		@see MWspCOSessionInvoker
+	*/
+	//##ModelId=3C4C49CB02BE
+	virtual void MethodResultRes(
+								MWspCOMethodCallback&	aTransactionCallback, 
+								const TDesC8&				aAckHeaders
+								);
+
+	/** This represents the S-MethodResultData.res primitive. 
+		@see MWspCOSessionInvoker
+	*/
+	//##ModelId=3C4C49CB0047
+	virtual void MethodResultDataRes(
+									MWspCOMethodCallback&	aTransactionCallback, 
+									const TDesC8&				aAckHeaders
+									);
+
+
+private: // methods inherited from MNwssSessionEventHandler,
+
+	/** This represents the S-Disconnect.ind primitive.
+		@see MNwssSessionEventHandler
+	*/
+	//##ModelId=3C4C49CA035D
+	virtual void HandleDisconnectIndL();
+
+	/** This represents the S-Suspend.ind primitive.
+		@see MNwssSessionEventHandler
+	*/
+	//##ModelId=3C4C49CA0231
+	virtual void HandleSuspendIndL();
+
+	/** This represents the S-Resume.cnf primitive.
+		@see MNwssSessionEventHandler
+	*/
+	//##ModelId=3C4C49CA0168
+	virtual void HandleResumeCnfL();
+
+	/** This represents the S-Connect.cnf primitive.
+		@see MNwssSessionEventHandler
+	*/
+	//##ModelId=3C4C49CA00AA
+	virtual void HandleConnectCnfL();
+
+	/** This represents the S-Disconnect.ind (redirect) primitive.
+		@see MNwssSessionEventHandler
+	*/
+	//##ModelId=3C4C49C903D4
+	virtual void HandleRedirectIndL();
+
+	/** This represents the E-Exception.ind primitive.
+		@see MNwssSessionEventHandler
+	*/
+	//##ModelId=3C4C49C9031F
+	virtual void HandleExceptionIndL();
+
+private: // methods inherited from MNwssTransactionEventHandler
+
+	/** This represents the T-MethodInvoke.cnf primitive.
+		@see MNwssTransactionEventHandler
+	*/
+	//##ModelId=3C4C49C901AD
+	virtual void HandleMethodInvokeCnfL(RWSPCOTrans::TTransID aTransId);
+
+	/** This represents the T-MethodResult.ind primitive.
+		@see MNwssTransactionEventHandler
+	*/
+	//##ModelId=3C4C49C90044
+	virtual void HandleMethodResultIndL(RWSPCOTrans::TTransID aTransId);
+
+	/** This represents the T-MethodAbort.ind primitive.
+		@see MNwssTransactionEventHandler
+	*/
+	//##ModelId=3C4C49C802CE
+	virtual void HandleAbortIndL(RWSPCOTrans::TTransID aTransId);
+
+private: // structure used to hold items sent to the delayed OOM handling for methodabort below
+
+	struct TDelayedMethodAbortPckg
+		{
+		CNwssWspCOSession* iSession;
+		MWspCOMethodCallback* iCallback;
+		TBool iAbortOnStack;
+		};
+	//##ModelId=3C9B09540101
+	void ScheduleDelayedOomMethodAbort(MWspCOMethodCallback& aMethodToAbort, TBool aAbortOnStack);
+	//##ModelId=3C9B0954001A
+	static TInt DelayedSendOomMethodAbort(TAny* aPtr);
+
+private: // structure used to hold items sent to the delayed OOM handling for disconnect below
+
+	struct TDelayedDisconnectPckg
+		{
+		CNwssWspCOSession* iSession;
+		TBool iDisconnectOnStack;
+		};
+	//##ModelId=3C9B09530344
+	void ScheduleDelayedOomDisconnect(TBool aDisconnectOnStack);
+	//##ModelId=3C9B09530268
+	static TInt DelayedSendOomDisconnect(TAny* aPtr);
+
+private: // methods inherited from MNwssOomHandler
+
+/**		Used as an asynchronous callback, in an OOM situation, to cause the method that
+					couldn't complete at the moment of OOM, to be cleanly aborted for the client.
+	@param			aMethodToAbort	(in) The method which is to be aborted due to the OOM situation
+	@param			aAbortOnStack	(in) Flag indicating whether the method must be aborted on the
+										 WAP stack as well.
+	@since			7.0
+ */
+	//##ModelId=3C9B095203C5
+	virtual void SendOomMethodAbort(MWspCOMethodCallback& aMethodToAbort, TBool aAbortOnStack);
+
+/**	Used as an asynchronous callback, in an OOM situation, to cause the method that
+					couldn't complete at the moment of OOM, to be cleanly aborted for the client.
+	@param			aTransId		(in) A WAP stack transaction ID that identifies the method which
+										 is to be aborted due to the OOM situation
+	@param			aAbortOnStack	(in) Flag indicating whether the method must be aborted on the
+										 WAP stack as well.
+	@since			7.0
+ */
+	//##ModelId=3C9B09530131
+	virtual void SendOomMethodAbort(RWSPCOTrans::TTransID aTransId, TBool aAbortOnStack);
+
+/**		Used as an asynchronous callback, in an OOM situation, to cause the session that
+					couldn't connect at the moment of OOM, to be cleanly disconnected for the client.
+	@param			aDisconnectOnStack	(in) Flag indicating whether the session must be disconnected
+											 on the WAP stack as well.
+	@since			7.0
+ */
+	//##ModelId=3C9B095202F2
+	virtual void SendOomDisconnect(TBool aDisconnectOnStack);
+
+private: // methods
+
+/** Normal constructor.  Creates an instance of the session, keeping
+					references to the supplied providers from the client.
+	@since			7.0
+	@param			aStringPool			(in) The client's string pool.
+	@param			aWapStackProvider	(in) An owner of a WAP stack server session.
+	@param			aConnInfoProvider	(in) A collection of client interfaces that
+											 provide connection-related information
+	@param			aSecurityPolicy		(in) A security policy provider.
+	@param			aSessionCB			(in) The client's callback for receiving
+											 WSP session events
+ */
+	//##ModelId=3C4C49C702A4
+	CNwssWspCOSession(RStringPool& aStringPool,
+					  MNwssWapServer& aWapStackProvider,
+				      MConnectionInfoProvider& aConnInfoProvider,
+					  MSecurityPolicy& aSecurityPolicy,
+					  MWspCOSessionCallback& aSessionCB);
+
+/**	Second phase of construction.  Allocations may be made here.
+	@since			7.0
+	@leave			System error codes, e.g. KErrNoMemory.
+ */
+	//##ModelId=3C4C49C70236
+	void ConstructL();
+
+/** 	Helper to ConnectReq, configures a capability codec to reflect
+					the capabilities proposed by the client.
+	@since			7.0
+ */
+	//##ModelId=3C4C49C701C8
+	void PrepareClientCapabilities();
+
+/**	Helper to HandleConnectCnf, uses the capability codec to return
+					the capabilities negotiated with the proxy.
+	@since			7.0
+	@leave			System error codes, e.g. KErrNoMemory.
+ */
+	//##ModelId=3C4C49C7015A
+	void SetNegotiatedCapabilitiesL();
+
+/** Helper in the extraction of WSP session data from the NWSS WAP
+					stack.  Should be used when the data size is known in advance
+					and may be passed as a buffer like TPckgBuf<TUint> for example.
+	@warning		It will Panic the client if there is more data available than
+					the buffer can hold!
+	@since			7.0
+	@param			aBuffer		(in) The client's pre-allocated buffer
+	@param			aType		(in) The type of the session data to be extracted
+	@return			A WAP stack error code
+ */
+	//##ModelId=3C4C49C6037F
+	TInt GetSessionData(TDes8& aBuffer, RWSPCOConn::TSessionDataType aType);
+
+/** Helper in the extraction of WSP session data from the NWSS WAP
+					stack.  This method retrieves all data of a named type,
+					allocating a heap descriptor large enough to hold it all.
+					Should be used for data of unknown size.
+	@since			7.0
+	@param			aType		(in) The type of the session data to be extracted
+	@return			A heap-allocated 8-bit buffer to contain the session data. This
+					buffer is left on the clean-up stack.
+	@leave			System error codes, e.g. KErrNoMemory
+ */
+	//##ModelId=3C4C49C6025D
+	HBufC8* GetAllSessionDataLC(RWSPCOConn::TSessionDataType aType);
+
+/**	Helper in the extraction of WSP transaction data from the NWSS
+					WAP stack.  Should be used when the data size is known in
+					advance and may be passed as a buffer like TPckgBuf<TUint> for
+					example.
+	@warning		It will Panic the client if there is more data available than
+					the buffer can hold!
+	@since			7.0
+	@param			aTransaction(in) The stack transaction handle
+	@param			aBuffer		(in) The client's pre-allocated buffer
+	@param			aType		(in) The type of the transaction data to be extracted
+	@return			A WAP stack error code
+ */
+	//##ModelId=3C4C49C503CE
+	TInt GetTransactionData(RWSPCOTrans aTransaction,
+							TDes8& aBuffer,
+							RWSPCOTrans::TDataType aType);
+
+/** Helper in the extraction of WSP transaction data from the NWSS
+					WAP stack.  This method retrieves all data of a named type,
+					allocating a heap descriptor large enough to hold it all.
+					Should be used for data of unknown size.
+	@since			7.0
+	@param			aTransaction(in) The stack transaction handle
+	@param			aType		(in) The type of the transaction data to be extracted
+	@return			A heap-allocated 8-bit buffer to contain the transaction data. This
+					buffer is left on the clean-up stack.
+	@leave			System error codes, e.g. KErrNoMemory
+ */
+	//##ModelId=3C4C49C5020B
+	HBufC8* GetAllTransactionDataLC(RWSPCOTrans aTransaction,
+									RWSPCOTrans::TDataType aType);
+
+/** Utility to convert a buffer received as the 'redirect addresses'
+					after an S-Disconnect.ind (Redirect) event, into the structure
+					used in the adaptation API to represent a redirect address. The
+					address is written into the structure iRedirectAddr.
+	@since			7.0
+	@param			aRedirectedAddresses (in) The raw WSP-encoded address data
+	@leave			System error codes, e.g. KErrNoMemory
+ */
+	//##ModelId=3C591A9A0027
+	void ExtractRedirectedProxyInfoL(const TDesC8& aRedirectedAddresses);
+
+	//##ModelId=3C9B0952008F
+	void DoSendDisconnectInd(Wap::TWspReason			aReason, 
+							  TBool						aRedirectSecurity, 
+							  TWspRedirectedAddress&	aRedirectAddress, 
+							  const TDesC8&				aErrorHeader, 
+							  const TDesC8&				aErrorBody);
+
+private: // type definitions
+
+	/** An enumeration of the reasons for aborting a transaction. Not all might
+		might have meaning for both CO and CL WSP sessions.  Note that this type
+		should be in <wapcli.h> but was omitted there for some reason.
+	 */
+	enum TAbortReason 
+		{
+		EUnknown = -1,
+		EWapStackTimeout = 8,
+		// abort reason code assignments - taken from NWSS source file wps/source/wsp/common/common_dmu,h)
+		EProtoErr      =  0xe0,
+		EDisconnect    =  0xe1,
+		ESuspend       =  0xe2,
+		EResume        =  0xe3,
+		ECongestion    =  0xe4,
+		EConnectErr    =  0xe5,
+		EMRUExceeded   =  0xe6,
+		EMORExceeded   =  0xe7,
+		EPeerReq       =  0xe8,
+		ENetErr        =  0xe9,
+		EUserReq       =  0xea
+		};
+
+private: // attributes
+
+	/** Connection-oriented WAP Stack session
+	*/
+	//##ModelId=3C4C49C50201
+	RWSPCOConn iWspCOSession;
+
+	/** The transaction look-up table
+	*/
+	//##ModelId=3C4C49C501ED
+	CNwssTransLookUpTable* iCOTransTable;
+
+	/** The client's callback for session events
+	*/
+	//##ModelId=3C4C49C501D9
+	MWspCOSessionCallback& iSessionCB;
+
+	/** A hub to receive events from the WAP stack
+	*/
+	//##ModelId=3C4C49C501C5
+	CNwssWspCOEventDispatcher* iEventDispatcher;
+
+	/** A codec for client and server capabilities
+	*/
+	//##ModelId=3C4C49C501B1
+	CCapCodec* iCapabilityCodec;
+
+	/** A scratch buffer used for URLs, which must be converted from 8-bit to Unicode
+		when submitting transactions to the WAP stack
+	*/
+	//##ModelId=3C4D9875006F
+	HBufC* iUriBuffer;
+
+	/** A scratch buffer used for retrieving session data
+	*/
+	//##ModelId=3C4D9865036F
+	HBufC8* iSessDataBuffer;
+
+	/** The negotiated Method Maximum Outstanding Requests (MOR) value
+	*/
+	//##ModelId=3C4D984301D6
+	TUint8 iMethodMOR;
+
+	/** The negotiated 'Use Acknowledgement Headers' protocol option
+	*/
+	//##ModelId=3C4D982503C7
+	TBool iUseAckHdrs;
+
+	/** A parsed redirect address
+	*/
+	//##ModelId=3C591A9903C9
+	TWspRedirectedAddress iRedirectAddr;
+
+	/** A flag indicating that S-Connect.req has been sent by the client but has
+		yet to be sent to the WAP Stack.
+	*/
+	//##ModelId=3C9B0952007B
+	TBool	iInConnectLimbo;
+
+	/** Object that handles the connect limbo state.
+	*/
+	//##ModelId=3C9B09520053
+	CNwssConnectGuard*	iConnectGuard;
+
+	/** Object used to filter transaction events from the NWSS stack and to ensure
+		that T-MethodAbort.ind events are sent for transactions in EDone state.
+	*/
+	//##ModelId=3C9B0952002B
+	CNwssWspTransactionEventFilter* iTransEventFilter;
+
+	/** Object used to filter session events from the NWSS stack to ensure WSP
+		spec compliance.		
+	*/
+	//##ModelId=3C9B0952000D
+	CNwssWspSessionEventFilter* iSessionEventFilter;
+
+	/** Object used to get an asynchronous, one-off callback, in order to break the callstack
+		from the client when OOM forces us to abort their T-MethodInvoke.req
+	*/
+	//##ModelId=3C9B095103CD
+	CAsyncCallBack* iOOMCallBack;
+
+	/** Structure that holds some info needed by the TCallback method that sends a deferred
+		T-MethodAbort.ind in OOM situations experienced during a T-MethodInvoke.req
+	*/
+	//##ModelId=3C9B095103A5
+	TDelayedMethodAbortPckg iAbortPckg;
+
+	/** Structure that holds some info needed by the TCallback method that sends a deferred
+		S-Disconnect.ind in OOM situations experienced during a S-Disconnect.req
+	*/
+	//##ModelId=3C9B09510387
+	TDelayedDisconnectPckg iDisconnectPckg;
+	};
+
+
+#endif // __CNWSSWSPCOSESSION_H__