realtimenetprots/sipfw/SIP/TransactionUser/src/UserAgentServer.h
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/TransactionUser/src/UserAgentServer.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,321 @@
+/*
+* Copyright (c) 2006-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:
+* Name          : UserAgentServer.h
+* Part of       : TransactionUser
+* Version       : SIP/5.0
+*
+*/
+
+
+
+
+/**
+ @internalComponent
+*/
+
+#ifndef USERAGENTSERVER_H
+#define USERAGENTSERVER_H
+
+// INCLUDES
+#include <stringpool.h>
+
+#include "MSIPRequestRouterObserver.h"
+
+#include "CUserAgent.h"
+
+// FORWARD DECLARATIONS
+class MSIPRequestRouter;
+class MSipDialogs;
+class CTimerOwnerResolver;
+
+// CLASS DECLARATION
+
+class CUserAgentServer :
+	public CUserAgent,
+	public MSIPRequestRouterObserver
+	{
+public: // Destructor
+
+	virtual ~CUserAgentServer();
+
+public: // From CUserAgent
+
+	TBool IsUAS() const;
+
+protected: // From CUserAgent
+
+	virtual void CreateTransactionL() = 0;
+
+private: // From CUserAgent
+
+	TRegistrationId RegistrationId() const;
+
+public: // From MSIPRequestRouterObserver
+
+	void OwnerFoundL(TUint32 aRequestId, MTransactionOwner* aOwner);
+
+	void OwnerNotFoundL(TUint32 aRequestId, CSIPResponse* aResp);
+
+	void ErrorOccurred(TUint32 aRequestId, TInt aError);
+
+public: // New functions
+
+	/**
+	 * The initial request has been received by the UAS.
+	 *
+	 * @pre aReq != NULL
+	 *
+	 * @param aReq SIP request received from network. Ownership is transferred.
+	 * @param aGetTxOwner State the UAS enters if it tries to obtain
+	 * 	MTranactionOwner.
+	 * @param aWaitRespFromApp State the UAS enters if the request belongs to
+	 *	an existing dialog.
+	 * @param aErrorRespSent State the UAS enters when either Dialog subsystem
+	 *	or UAS itself decides to send a final response without passing the
+	 *	request.	 
+	 */
+	void InitialRequestReceivedL(CSIPRequest* aReq,
+								 const CUserAgentState& aGetTxOwner,
+								 const CUserAgentState& aWaitRespFromApp,
+								 const CUserAgentState& aErrorRespSent);
+
+	/**
+	 * Callback to upper layer has been obtained. UAS passes the request there
+	 * and starts waiting for a response.
+	 *
+	 * @pre aOwner != NULL
+	 *
+	 * @param aOwner Callback to upper layer, ownership isn't transferred
+	 * @param aWaitRespFromApp State which UAS enters next.	 
+	 */
+	void HandleOwnerFoundL(MTransactionOwner* aOwner,
+						   const CUserAgentState& aWaitRespFromApp);
+
+	/**
+	 * Application to receive the request was not found. Instead a SIP response
+	 * will be sent to network.
+	 *
+	 * @pre aResp != NULL
+	 *
+	 * @param aResp Final response. May not be 2xx in case of INVITE.
+	 *	Ownership is transferred.
+	 * @param aErrorRespSent State which UAS enters next.	 
+	 */
+	void HandleOwnerNotFoundL(CSIPResponse* aResp,
+							  const CUserAgentState& aFinalRespSent);
+
+    /**
+	 * Error occurred during the routing of an incoming SIP request.
+	 */
+    void RequestRouterErrorL();
+
+    /**
+	 * Sends error response to remote endpoint.
+	 *
+     * @param aErrorRespSent UserAgent enters this state	 
+	 */
+    void HandleRequestRouterErrorL(const CUserAgentState& aErrorRespSent);
+
+	/**
+	 * Upper layer sends response. UAS checks that response is correct and
+	 * fills the transaction related headers.
+	 *
+	 * @pre aResp != NULL
+	 *
+	 * @param aResp SIP response, ownership isn't transferred
+	 * @param aParam Transport parameters to use when sending the response	 
+	 */
+	void HandleSendResponseL(CSIPResponse* aResp,
+							 const TSIPTransportParams& aParams);
+
+	/**
+	 * Checks that the SIP response message given by upper layer has the
+	 * required parts filled. If the response isn't ok, function leaves.
+	 *
+	 * @param aResp SIP response	 
+	 */
+	void CheckResponseL(const CSIPResponse& aResp) const;
+	
+	/**
+	 * Fills the transaction related parts into the SIP response.	 
+	 *
+	 * @param aResp IN/OUT: Partially filled SIP response from upper layer.	 
+	 */
+	void FillResponseL(CSIPResponse& aResp);
+
+	/**
+	 * Contacts Dialogs subsystem to find out if there is a dialog for the
+	 * received request
+	 *
+	 * @pre iObserver = NULL, iOutgoingMsg = NULL
+	 *
+	 * @param aReq Request received from network
+	 * @return value ETrue: Dialog exists, EFalse: otherwise
+	 */
+	TBool DoesDialogExistForRequestL(CSIPRequest& aReq);
+
+	/**
+	 * Pass the SIP response to transaction for sending.
+	 *
+	 * @pre iTransaction != NULL, aResp != NULL
+	 *
+	 * @param aResp SIP response to send, ownership is transferred.	 
+	 */
+	void SendResponseToTransactionL(CSIPResponse* aResp) const;
+
+	/**
+	 * Checks the request received from network is correct.
+	 *
+	 * @pre aReasonPhrase != NULL	 
+	 *
+	 * @param aReq SIP request received from network
+	 * @param aResponseCode If function returns EFalse, this parameter will
+	 *  contain the response code of the response that should be sent back to
+     *  the sender of the invalid request.
+	 * @param aReasonPhrase If function returns EFalse, this parameter will
+	 *  have the reason phrase that should be sent back to the sender of the
+	 *  invalid request.
+	 * @return value ETrue if the request is ok, EFalse otherwise.	 
+	 */
+	TBool CheckReceivedRequest(CSIPRequest& aReq,
+							   TInt& aResponseCode,
+							   RStringF& aReasonPhrase) const;
+
+	/**
+	 * Obtains the To tag
+	 *	 	 
+	 * @return value To tag
+	 */
+	RStringF ToTag() const;
+
+protected:
+
+	CUserAgentServer(CUserAgentCreateParams& aParams,
+					 MSipDialogs& aDialogs,
+					 MSIPRequestRouter& aRouter);	
+
+	/**
+	 * Creates and sends a final response
+	 *
+	 * @pre aResponseCode >= 300
+	 *	 
+	 * @param aResponseCode Response code to be put into the response
+	 * @param aReasonPhrase Reason phrase to be put in the response
+	 * @param aErrorRespSent State which UAS enters after sending the response	 
+	 */
+	void SendErrorResponseL(TInt aResponseCode,
+						    RStringF aReasonPhrase,
+						    const CUserAgentState& aErrorRespSent);
+
+    /**
+	 * Cancels the asynchronous request to obtain MTransactionOwner callback.
+	 */
+	void CancelGetOwnerRequest() const;
+
+    void StopTimerOwnerResolver();
+
+    /**
+	 * Store the tag of To-header, if it exists.
+	 *
+	 * @pre iToTag.DesC().Length() == 0
+	 *	 
+	 * @param aMsg SIP message
+	 */
+    void StoreToTag(CSIPMessage& aMsg);
+
+protected: // Data
+
+    //Dialog subsystem
+	MSipDialogs& iDialogs;
+
+    //Timer specifying how long UAS waits for RequestRouter to provide the
+    //MTransactionOwner of upper layer or an error response. Owned.
+    CTimerOwnerResolver* iTimerOwnerResolver;
+
+private:
+
+	/**
+	 * The received request doesn't belong to any dialog
+	 *
+	 * @pre aReq != NULL
+	 *
+	 * @param aReq SIP request. Ownership is transferred.
+	 * @param aGetTxOwner State which UAS enters if it contacts AssocMgr for
+	 *	obtaining MTranactionOwner.
+	 * @param aErrorRespSent State which UAS enters when either Dialog
+	 * subsystem or UAS itself decides to send a final response without passing
+	 *	the request.
+	 */
+	void RequestOutsideDialogL(CSIPRequest* aReq,
+							   const CUserAgentState& aGetTxOwner,
+							   const CUserAgentState& aErrorRespSent);
+
+	/**
+	 * Fill and send the SIP response got from Dialogs subsystem. The
+	 * response is located in the send buffer (iOutgoingMsg).
+	 * Ownership of the response is passed to transaction.
+	 *
+	 * @pre iOutgoingMsg != NULL
+	 * @pre SIP response in iOutgoingMsg must be a 3xx-6xx
+	 * @post iOutgoingMsg == NULL
+	 *
+	 * @param aNextState State where UserAgent moves after sending the response	 
+	 */
+	void HandleResponseFromDialogsL(const CUserAgentState& aNextState);
+
+    /**
+	 * Send the stored SIP request located in the receive buffer
+     * (iIncomingMsg) to MTransactionOwner.
+	 *
+	 * @pre iIncomingMsg != NULL
+	 * @post iIncomingMsg == NULL	 
+	 */
+	void PassStoredRequestToTransactionOwnerL();    
+
+    /**
+	 * Start timer determining how long UAS waits for OwnerResolver to
+	 * return a callback to upper layer.
+     * Timer duration must be shorter than timer F2.
+	 *
+	 * @pre iTimerOwnerResolver = NULL
+	 */
+    void StartTimerOwnerResolverL();
+
+private: // Data
+
+	//Router which decides where the incoming SIP request will be forwarded.
+	MSIPRequestRouter& iRouter;
+
+	//RequestId received from iRouter
+	TUint32 iRouterRequestId;
+
+	//Tag to be inserted into the To-header of SIP responses
+	RStringF iToTag;
+
+private: // For testing purposes
+
+#ifdef CPPUNIT_TEST	
+	friend class CNormalUAS_GetTxOwner_Test;
+	friend class CUserAgentServer_Test;
+	friend class CTransactionUser_Test;
+#endif
+
+	void __DbgTestInvariant() const;
+
+	};
+
+#endif // end of USERAGENTSERVER_H
+
+// End of File