williamr@2: /*
williamr@2: * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2: * All rights reserved.
williamr@2: * This component and the accompanying materials are made available
williamr@4: * under the terms of "Eclipse Public License v1.0"
williamr@2: * which accompanies this distribution, and is available
williamr@4: * at the URL "http://www.eclipse.org/legal/epl-v10.html".
williamr@2: *
williamr@2: * Initial Contributors:
williamr@2: * Nokia Corporation - initial contribution.
williamr@2: *
williamr@2: * Contributors:
williamr@2: *
williamr@2: * Description:
williamr@2: * Name        : sipservertransaction.h
williamr@2: * Part of     : SIP Client
williamr@2: * Interface   : SDK API, SIP API
williamr@2: * Version     : 1.0
williamr@2: *
williamr@2: */
williamr@2: 
williamr@2: 
williamr@2: 
williamr@2: #ifndef CSIPSERVERTRANSACTION_H
williamr@2: #define CSIPSERVERTRANSACTION_H
williamr@2: 
williamr@2: // INCLUDES
williamr@2: #include "siptransactionbase.h"
williamr@2: 
williamr@2: // FORWARD DECLARATIONS
williamr@2: class CSIPRequestElements;
williamr@2: class MSIPResponseSender;
williamr@2: class CSIPConnection;
williamr@2: class CSIPDialogImplementation;
williamr@2: 
williamr@2: // CLASS DECLARATION
williamr@2: 
williamr@2: /**
williamr@2: *  @publishedAll
williamr@2: *  @released
williamr@2: *
williamr@2: *  Class for managing SIP server transactions.
williamr@2: *  It provides services for creating, ending
williamr@2: *  and getting SIP transaction parameters.
williamr@2: *  Client cannot instantiate this class.
williamr@2: *  
williamr@2: *  @lib sipclient
williamr@2: */
williamr@2: class CSIPServerTransaction: public CSIPTransactionBase
williamr@2: 	{
williamr@2: 	public: // Destructor
williamr@2:     
williamr@2:         /**
williamr@2:         * Destructor
williamr@2: 		*/
williamr@2: 		IMPORT_C ~CSIPServerTransaction();
williamr@2: 
williamr@2: 	public: // New functions
williamr@2: 	
williamr@2:         /**
williamr@2: 		* Sends response and ends the transaction;
williamr@2: 		* The user must not send 100 Trying response. Leaves on failure.
williamr@2:         * @pre aElements!=0
williamr@2:         * @pre State()==ETrying || State()==EProceeding
williamr@2: 		* @pre CSIPConnection::State()==EActive
williamr@2: 		* @pre ResponseAllowed()==ETrue		
williamr@2: 		* @param aElements contains Status Code, optional Reason Phrase and
williamr@2:         *   optional SIP message headers and body. Ownership is transferred.
williamr@2: 		* @leave KErrArgument if aElements == NULL
williamr@2: 		* @leave KErrGeneral if ResponseAllowed() == EFalse
williamr@2: 		* @leave KErrSIPInvalidTransactionState if State()!=ETrying and
williamr@2: 		*	State()!=EProceeding
williamr@2: 		* @leave KErrSIPInvalidDialogState if sending response to a request
williamr@2: 		*	within dialog, and the dialog is in terminated state.
williamr@2: 		* @leave KErrSIPResourceNotAvailable if a required SIP Client API
williamr@2: 		*	object has been deleted
williamr@2: 		* @capability NetworkServices
williamr@2: 		*/
williamr@2: 		IMPORT_C void SendResponseL(CSIPResponseElements *aElements);
williamr@2: 
williamr@2: 	    /**
williamr@2: 		* Gets the request elements
williamr@2: 		* @return Request elements. Ownership is not transferred.
williamr@2: 		*/
williamr@2: 		IMPORT_C const CSIPRequestElements* RequestElements() const;
williamr@2: 
williamr@2:         /**
williamr@2: 		* Checks if the response sending is allowed for this server
williamr@2:         * transaction. For instance response is not allowed in ACK transaction.
williamr@2: 		* @return ETrue if response sending is allowed, EFalse otherwise
williamr@2: 		*/
williamr@2: 		IMPORT_C TBool ResponseAllowed() const;
williamr@2:         
williamr@2: 	public: // New functions, for internal use
williamr@2: 	
williamr@2:         /**
williamr@2: 		* Sets a new respose sender, replacing the current sender.
williamr@2: 		*
williamr@2:         * @param aSender Response sender to be used from now on. Ownership is
williamr@2:         *   	 transferred.		
williamr@2: 		*/
williamr@2:         void SetResponseSender(MSIPResponseSender* aSender);
williamr@2: 
williamr@2: 		/**
williamr@2: 		* If the request was received inside a dialog, returns the dialog.		
williamr@2: 		*
williamr@2:         * @return CSIPDialogImplementation* The dialog inside which the request
williamr@2:         *	was received, or NULL. Ownership is not transferred.
williamr@2: 		*/
williamr@2: 		CSIPDialogImplementation* Dialog() const;
williamr@2: 
williamr@2:         /**
williamr@2: 	    * Obtains the associated CSIPConnection instance. If connection can't
williamr@2:         * be accessed anymore, this function leaves.
williamr@2:         *	
williamr@2: 	    * @return CSIPConnection
williamr@2: 	    */
williamr@2:         CSIPConnection& SIPConnectionL();
williamr@2: 
williamr@2:         /**
williamr@2: 		* Update the MTransactionAssociation to point to aAssociation.
williamr@2: 		*
williamr@2:         * @param aAssociation Associated object		
williamr@2: 		*/
williamr@2:         void ReAssociateL(MTransactionAssociation& aAssociation);
williamr@2: 
williamr@2:         /**
williamr@2: 		* Removes, but does not delete, request elements from
williamr@2:         * aServerTransaction.
williamr@2:         *
williamr@2: 		* @param aServerTransaction Server transaction from which response
williamr@2:         *   elements are removed. Ownership is not transferred.
williamr@2: 		*/
williamr@2:         static void DetachRequestElements(TAny* aServerTransaction);
williamr@2: 
williamr@2: 	public: // Constructors, for internal use
williamr@2:         /**
williamr@2: 		* Creates a server transaction.
williamr@2: 		*
williamr@2:         * @param aRequestId RequestId for the transaction to use
williamr@2:         * @param aAssociation Object with which the transaction is associated
williamr@2:         * @param aElements Request elements. Ownership is transferred.
williamr@2:         * @return New object. Ownership is transferred.
williamr@2: 		*/
williamr@2: 		static CSIPServerTransaction*
williamr@2:             NewL(TUint32 aRequestId,
williamr@2:                  MTransactionAssociation& aAssociation,
williamr@2:                  CSIPRequestElements* aElements);
williamr@2: 
williamr@2:         /**
williamr@2: 		* Creates a server transaction and pushes it to cleanup stack.
williamr@2: 		*
williamr@2:         * @param aRequestId RequestId for the transaction to use
williamr@2:         * @param aAssociation Object with which the transaction is associated
williamr@2:         * @param aElements Request elements. Ownership is transferred.
williamr@2:         * @return New object. Ownership is transferred.
williamr@2: 		*/
williamr@2: 		static CSIPServerTransaction*
williamr@2:             NewLC(TUint32 aRequestId,
williamr@2:                   MTransactionAssociation& aAssociation,
williamr@2:                   CSIPRequestElements* aElements);
williamr@2: 
williamr@2: 	private: // Constructors
williamr@2: 		CSIPServerTransaction(TUint32 aRequestId,
williamr@2:                               MTransactionAssociation& aAssociation);
williamr@2: 
williamr@2:         /**
williamr@2: 		* Second phase constructor.
williamr@2: 		*
williamr@2: 		* @pre aElements!=0
williamr@2:         * @param aElements Request elements. Ownership is transferred.        
williamr@2: 		*/
williamr@2:         void ConstructL(CSIPRequestElements* aElements);
williamr@2: 
williamr@2: 	private: // Data
williamr@2:         CSIPRequestElements* iRequestElements;
williamr@2: 
williamr@2:         //This interface is used for sending the response.
williamr@2:         //CSIPServerTransaction owns iResponseSender.
williamr@2:         MSIPResponseSender* iResponseSender;
williamr@2: 
williamr@2: 	private: // For testing purposes        
williamr@4: #ifdef CPPUNIT_TEST
williamr@4: 	    friend class CSIPServerTransaction_Test;
williamr@4:         friend class CSIP_Test;
williamr@4: #endif
williamr@4: 		void __DbgTestInvariant() const;
williamr@2: 
williamr@2: 	};
williamr@2: 
williamr@2: #endif