applayerpluginsandutils/httpprotocolplugins/WspProtocolHandler/CWspCOProtocolHandler.h
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerpluginsandutils/httpprotocolplugins/WspProtocolHandler/CWspCOProtocolHandler.h	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,559 @@
+// Copyright (c) 2001-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	__CWSPCOPROTOCOLHANDLER_H__
+#define __CWSPCOPROTOCOLHANDLER_H__
+
+// System includes
+#include <e32base.h>
+#include <http/framework/cprotocolhandler.h>
+#include <wsp/mwspcosessioncallback.h>
+#include <wsp/mwspcapabilityprovider.h>
+#include <wsp/mwspsessionheadersprovider.h>
+
+// User includes
+#include "mconnectiontimercallback.h"
+#include "mwspprimitivesendercallback.h"
+#include "mwspcomethodobserver.h"
+
+// Forward declarations
+class CWspCapabilityInfo;
+class CWspProxyInfoProvider;
+class CWspTransportHandler;
+class MWspCOSessionInvoker;
+class MWspCOMethodInvoker;
+class CConnectionTimer;
+class CWspPrimitiveSender;
+class CRxData;
+class CWspHeaderUtils;
+
+// @todo docing
+//##ModelId=3BBD7DB402C4
+class CWspCOProtocolHandler : public CProtocolHandler, public MWspCOSessionCallback,
+													   public MWspCapabilityProvider,
+													   public MWspSessionHeadersProvider,
+													   public MConnectionTimerCallback,
+													   public MWspPrimitiveSenderCallback,
+													   public MWspCOMethodObserver,
+													   public MProtHandlerInterface
+	{
+public:	// Methods
+
+/**	Static factory constructor.
+	@since			7.0
+	@leave			Leaves with KErrNoMemory if there was not enough memory to
+					create the object.
+	@param			aSession	A pointer to an RHTTPSession object.
+	@return			A pointer to newly created object.
+*/
+	//##ModelId=3C4C439101F4
+	static CWspCOProtocolHandler* NewL(TAny* aSession);
+
+/** Standard destructor.
+	@since			7.0
+*/
+	//##ModelId=3C4C439101D6
+  ~CWspCOProtocolHandler();
+
+private:	// Methods from CProtocolHandler
+
+/** 
+	@see			CProtocolHandler
+*/
+	//##ModelId=3C4C43910172
+	virtual void CreateCodecL();
+
+/** 
+	@see			CProtocolHandler
+*/
+	//##ModelId=3C4C439100BD
+	virtual CProtTransaction* CreateProtTransactionL(RHTTPTransaction aTransaction);
+
+/** 
+	@see			CProtocolHandler
+*/
+	//##ModelId=3C4C43910009
+	virtual TBool ServiceL(CProtTransaction& aTrans);
+
+/** 
+	@see			CProtocolHandler
+*/
+	//##ModelId=3C4C4390033D
+	virtual void ClosedTransactionHook(CProtTransaction* aTrans);
+
+/** 
+	@see			CProtocolHandler
+*/
+	//##ModelId=3C4C4390029D
+	virtual void CancelTransactionHook(CProtTransaction& aTransaction);
+
+/** 
+	@see			CProtocolHandler
+*/
+	//##ModelId=3C4C439001F2
+	virtual void NotifyNewRequestBodyPart(CProtTransaction& aTransaction);
+
+	virtual void GetInterfaceL(TUid aInterfaceId, MProtHandlerInterface*& aInterfacePtr);
+
+	/** Get the Server Certificate for the current session.
+	@param	aServerCert A TCertInfo which will be filled with the certificate information
+	@return	An error code.  KErrNone if aServerCert has been completed, otherwise one of 
+			the system wide error codes
+	*/
+	TInt SessionServerCert(TCertInfo& aServerCert);
+
+	/** Get the Server Certificate for the specified transaction.  This function returns
+	KErrNotSupported because for WSP the certificate applies to the whole session.
+	@param	aServerCert A TCertInfo which will be filled with the certificate information
+	@param	aTransaction The transaction for which the certificate info is requested
+	@return	KErrNotSupported
+	*/
+	TInt TransactionServerCert(TCertInfo& aServerCert, RHTTPTransaction aTransaction);
+
+
+private:	// Methods from MHTTPFilterBase
+
+/**
+	@see			MHTTPFilterBase
+*/
+	//##ModelId=3C4C43900152
+	virtual void MHFSessionRunL(const THTTPSessionEvent& aEvent);
+
+/**
+	@see			MHTTPFilterBase
+*/
+	//##ModelId=3C4C43900076
+	virtual TInt MHFSessionRunError(TInt aError, const THTTPSessionEvent& aEvent);
+
+private:	// Methods from MWspCOSessionCallback
+
+/**
+	@see			MWspCOSessionCallback
+*/
+	//##ModelId=3C4C43900026
+	virtual void ConnectCnf();
+
+/**
+	@see			MWspCOSessionCallback
+*/
+	//##ModelId=3C4C438F03B4
+	virtual void ResumeCnf();
+
+/**
+	@see			MWspCOSessionCallback
+*/
+	//##ModelId=3C4C438F0223
+	virtual void DisconnectInd(
+							  TWspReason				aReason, 
+							  TBool						aRedirectSecurity, 
+							  TWspRedirectedAddress&	aRedirectAddress, 
+							  const TDesC8&				aErrorHeader, 
+							  const TDesC8&				aErrorBody
+							  );
+
+/**
+	@see			MWspCOSessionCallback
+*/
+	//##ModelId=3C4C438F0197
+	virtual void SuspendInd(TWspReason aReason);
+
+/**
+	@see			MWspCOSessionCallback
+*/
+	//##ModelId=3C4C438F0115
+	virtual void ExceptionInd(const TDesC8& aExceptionData);
+
+private:	// Methods from MWspCapabilityProvider
+
+/**
+	@see			MWspCapabilityProvider		
+*/
+	//##ModelId=3C4C438F00CF
+	virtual const MWspCapabilityViewer& ClientCapabilities() const;
+
+/**
+	@see			MWspCapabilityProvider		
+*/
+	//##ModelId=3C4C438F0092
+	virtual MWspCapabilitySetter& ServerCapabilities() const;
+
+private:	// Methods from MWspSessionHeadersProvider
+
+/**
+	@see			MWspSessionHeadersProvider		
+*/
+	//##ModelId=3C4C438F004C
+	virtual const TDesC8& ClientHeaders() const;
+
+/** 
+	@see			MWspSessionHeadersProvider		
+*/
+	//##ModelId=3C4C438E03C6
+	virtual void SetServerHeadersL(const TDesC8& aBuffer);
+
+private:	// Methods from MConnectionTimerCallback
+
+/**
+	@see			MConnectionTimerCallback
+*/
+	//##ModelId=3C4C438E038A
+	virtual void HandleConnectionTimedOut();
+
+private:	// Methods from MWspPrimitiveSenderCallback
+
+/**
+	@see			MWspPrimitiveSenderCallback
+*/
+	//##ModelId=3C4C438E0326
+	virtual void SendPrimitiveL(TWspPrimitive aPrimitive);
+
+/**
+	@see			MWspPrimitiveSenderCallback
+*/
+	//##ModelId=3C4C438E02C2
+	virtual TInt WspPrimitiveSenderCallbackError(TInt aError);
+
+private:	// Methods from MWspCOMethodObserver
+
+/**
+	@see			MWspCOMethodObserver
+*/
+	//##ModelId=3C4C438E025E
+	virtual void HandleMethodAbort(CWspCOTransaction& aTransaction);
+
+/**
+	@see			MWspCOMethodObserver
+*/
+	virtual void NotifyPendingCompletingMethod();
+
+/**
+	@see			MWspCOMethodObserver
+*/
+	virtual void NotifyMethodComplete();
+
+private:	// Methods from MRxDataObserver, inherited via MWspCOMethodObserver
+
+/**
+	@see			MRxDataObserver
+*/
+	//##ModelId=3C4C438E01DC
+	virtual void SetStatusL(CRxData& aRecv, TInt aStatus);
+
+private:	// Methods from MProtHandlerInterface
+
+	/** Get the Server Certificate for the specified transaction.  This function returns
+	NULL because for WSP the certificate applies to the whole session.
+	@return	NULL
+	*/
+	const CCertificate* SessionServerCert();
+
+
+	/** Get the Server Certificate for the current session.
+	@param	aTransaction The transaction for which the certificate is requested
+	@return	A pointer to CCertificate, or NULL if not found.
+	*/
+	const CCertificate* TransactionServerCert(RHTTPTransaction aTransaction);
+
+
+private:	// Methods
+
+/**
+	@since			7.0
+	@param			aSession	The HTTP session.
+*/
+	//##ModelId=3C4C438E013B
+	CWspCOProtocolHandler(RHTTPSession aSession);
+
+/**
+	@since			7.0
+	@todo			leaves
+	@pre			First phase construction has been done.
+	@post			The object is fully initialised.
+*/
+	//##ModelId=3C4C438E0127
+	void ConstructL();
+
+/**Initiates a session connection.
+	@since			7.0
+	@warning		This function will panic with KWspPanicSessionNotInValidState
+					if the WSP session cannot be connected.
+	@todo			leaves
+	@pre			The WSP session is in the Null state.
+	@post			The WSP session is in the Connecting state. The connection 
+					timer has been started.
+*/
+	//##ModelId=3C4C438E0109
+	void SessionConnectL();
+
+/**Initiates a session resume.
+	@since			7.0
+	@warning		This function will panic with KWspPanicSessionNotInValidState
+					if the WSP session cannot be resumed.
+	@todo			leaves
+	@pre			The WSP session is in the Connected, Suspending or 
+					Suspended state. The Suspend Resume facility is supported
+					in this WSP session.
+	@post			The WSP session is in the Resuming state. The connection 
+					timer has been started.
+*/
+	//##ModelId=3C4C438E00EB
+	void SessionResumeL();
+	
+/**The session should be disconnected.
+	@since			7.0
+	@warning		This function will panic with KWspPanicSessionNotInValidState
+					if the WSP session cannot be disconnected.
+	@todo			leaves
+	@pre			The WSP session is in the Connecting, Connected, Suspending,
+					Suspended, or Resuming state.
+	@post			The WSP session is in the Closing state. The connection 
+					timer has been cancelled.
+*/
+	//##ModelId=3C4C438E00A5
+	void SessionDisconnect(TWspReason aReason);
+
+/**The session should be suspended.
+	@since			7.0
+	@warning		This function will panic with KWspPanicSessionNotInValidState
+					if the WSP session cannot be suspended.
+	@todo			leaves
+	@pre			The WSP session is in the Connected or Resuming state. The 
+					Suspend Resume facility is supported in this WSP session.
+	@post			The WSP session is in the Closing state. The connection 
+					timer has been cancelled.
+*/
+	//##ModelId=3C4C438E0087
+	void SessionSuspend();
+
+/**Processes the session connected event.
+	@since			7.0
+	@pre			
+	@post			
+*/
+	//##ModelId=3C4C438E0073
+	void DoSessionConnectedL();
+
+/**Processes the session connected event, this is a non-leaving
+						method of DoSessionConnectedL()
+	@since			7.0
+	@pre			
+	@post			
+*/
+	void DoSessionConnected();
+
+/**	@since			7.0
+	@todo			docing
+	@param			aEvent	The session event to send.
+	@pre
+	@post
+*/
+	//##ModelId=3C4C438E0037
+	void SendSessionEvent(THTTPSessionEvent aEvent);
+
+/**@since			7.0
+	@todo			docing
+	@leave			Leaves with KErrNotFound if the WSP transport handler cannot
+					be found. Leaves with KErrNotSupported if the loaded WSP
+					transport handler does not support Connection-Orientated 
+					Session Management facility and Method Invocation facility.
+	@post			The
+*/
+	//##ModelId=3C4C438D03BB
+	void CreateWspTransportHandlerL();
+
+/**Updates the client session headers that is supplied to 
+						the transport handler
+	@since			7.0
+	@leave			Leaves with KErrNoMemory if the header buffer cannot be 
+					created.
+	@post			The client session headers buffer is upto date.
+*/
+	//##ModelId=3C4C438D039D
+	void UpdateClientSessionHeadersL();
+
+/**Checks the properties in the HTTP session for any client
+						proposed capablities and a specified connection time-out
+						value.
+	@since			7.0
+	@post			The client proposed capabilities and the connection time-out
+					value have been updated.
+*/
+	//##ModelId=3C4C438D0389
+	void CheckClientCapabilities();
+
+/**Checks the client-requested capabilities against the 
+						corresponding negotiated capabilities to see if they 
+						have been reduced or denied.
+	@since			7.0
+	@todo			leaves
+	@return			A boolean value of ETrue if one or more of the client-
+					requested capabilities have been reduced or denied.
+	@pre			The negotiated capabilities have been passed up from the
+					transport handler. The S-Connect.cnf primitive has been
+					received.
+	@post			If any of the client-requested capabilities have been 
+					reduced or rejected, the session property representing that
+					capabililty is set the appropriate negotiated value.
+*/
+	//##ModelId=3C4C438D0375
+	TBool UpdateNegotiatedCapabilitiesL();
+
+/**
+	Handles the receipt of a EConnect session event. Will inform the client if
+	the WSP session is not in the appropriate state to receive this event.
+	@since			7.0
+	@leave		This function will leave if the session connect/resume fails.
+*/
+	//##ModelId=3C4C438D0361
+	void HandleConnectRequestL();
+
+/**
+	Handles the receipt of a EDisconnect session event. Will inform the client if
+	the WSP session is not in the appropriate state to receive this event.
+	@since			7.0
+*/
+	//##ModelId=3C4C438D034D
+	void HandleDisconnectRequest();
+
+/**
+	Checks to see if a method is waiting. If so it sets the base class active
+	so that the next pending transaction gets serviced.
+	@since			7.0
+*/
+	//##ModelId=3C4C438D0339
+	void CheckWaitingMethod();
+
+/**
+	Indicates if the Suspend Resume facility is supported by
+						the WSP session.
+	@since			7.0
+	@return			A boolean value of ETrue if the WSP session can support the 
+					Suspend Resume facility.
+*/
+	//##ModelId=3C4C438D0325
+	TBool SupportSuspendResume() const;
+
+/**Indicates whether the WSP session can be resumed. The 
+						Suspend Resume facility must be supported and the WSP
+						session must in the Connected, Suspending or Suspended
+						state.
+	@since			7.0
+	@return			A boolean value of ETrue if the WSP session can be resumed.
+*/
+	//##ModelId=3C4C438D0311
+	TBool CanResume() const;
+
+/**Indicates whether the WSP session can be suspended. The
+						Suspend Resume facility must be supported and the WSP
+						session must in the Connected or Resuming state.
+	@since			7.0
+	@return			A boolean value of ETrue if the WSP session can be suspended.
+*/
+	//##ModelId=3C4C438D02F2
+	TBool CanSuspend() const;
+
+/**Resets the state of the protocol handler to that upon
+						initial construction, without changing the transport
+						handler.  This is NOT a published mechanism!
+	@since			7.0
+*/
+	//##ModelId=3C4C438D02E8
+	void ResetAll();
+
+private:	// Attributes
+
+	/** A pointer to the Wsp Transport Handler.
+	*/
+	//##ModelId=3C4C438D02CA
+	CWspTransportHandler*		iTransportHandler;
+
+	/** A pointer to the CO Session Invoker object. Owned by the transport 
+		handler.
+	*/
+	//##ModelId=3C4C438D02B6
+	MWspCOSessionInvoker*		iSessionInvoker;
+
+	/** An object that holds the negotiated capabilties for the current Wsp 
+		session.
+	*/
+	//##ModelId=3C4C438D02A2
+	CWspCapabilityInfo*			iNegotiatedCapInfo;
+
+	/** An object that holds the proposed client capabilities.
+	*/
+	//##ModelId=3C4C438D0284
+	CWspCapabilityInfo*			iClientCapInfo;
+
+	/** A pointer to the proxy info provider.
+	*/
+	//##ModelId=3C4C438D0272
+	CWspProxyInfoProvider*		iProxyInfoProvider;
+
+	/** The state of the WSP session.
+	*/
+	//##ModelId=3C4C438D0266
+	TWspSessionState			iSessionState;
+
+	/** The connection timed-out value in microseconds. The protocol handler 
+		will abort a session connect after this time if a connection has not 
+		been established.
+	*/
+	//##ModelId=3C4C438D0252
+	TInt						iTimedOutValue;
+
+	/** A pointer to the connection timed-out timer.
+	*/
+	//##ModelId=3C4C438D023E
+	CConnectionTimer*			iConnectionTimer;
+
+	/** An active object that is used to invoke the sending of certain WSP
+		primitives.
+	*/
+	//##ModelId=3C4C438D022A
+	CWspPrimitiveSender*		iPrimitiveSender;
+
+	/** A buffer holding the encoded client session headers.
+	*/
+	//##ModelId=3C4C438D0218
+	HBufC8*						iClientSessionHeaders;
+
+	/** A flag indicating that a session connect or resume has timed-out.
+	*/
+	//##ModelId=3C4C438D020C
+	TBool						iConnectTimedOut;
+
+	/** A flag indicating that there is a method transaction waiting to be 
+		serviced.
+	*/
+	//##ModelId=3C4C438D01F8
+	TBool						iWaitingMethod;
+
+	/** A pointer to the WSP header utils
+	*/
+	//##ModelId=3C4C438D01E4
+	CWspHeaderUtils*			iHdrUtils;
+
+	/** The number of methods in Completing state waiting to send the final .res
+		primitive.
+	*/
+	TInt						iPendingCompletingMethods;
+
+	/** A flag indicating that the client has requested a disconnect.
+	*/
+	TBool						iDisconnectRequested;
+
+	};
+
+#endif	// __CWSPCOPROTOCOLHANDLER_H__