realtimenetprots/sipfw/SIP/Dialogs/inc/CSipDialogMgr.h
author Petteri Saari <petteri.saari@digia.com>
Thu, 25 Nov 2010 13:59:42 +0200
branchMSRP_FrameWork
changeset 58 cdb720e67852
parent 0 307788aac0a8
permissions -rw-r--r--
This release addresses the following issues: 1. The crash bug fix when receiving file 2. Now the sending is based on MSRP messages, there is no longer file receiving or sending. Client sends data as MSRP was designed. 3. Soma MSRP stack was created so that the client told the correct session-id, Symbian stack generated it by itself. This is not allowed, it was changed so that clients tell the session-id (same as used in SIP INVITE). 4. Unnecessary division of data to chunks removed when there is no need to interrupt sending. The message is sent in as few chunks as possible. 5. Stack can now receive files and chunks with ?unlimited? size. Old stack wrote the incoming data to memory and did not utilize disk space until the end of chunk was reached (large chunks from another client crashed it). 6. Now when writing the incoming data to file, it will take into account the byte-range header values. So, this complies with the RFC4975 requirements that stack must be able to handle chunks that come in any sequence. 7. Some buffering changes to outgoing/incoming data. 8. The outgoing data is now checked that it does not contain the created transaction-id before sending the data. 9. MSRP success reports are now implemented and tested against servers. 10. Progress report system fixed so progress is now visible on client (all the way to 100%). 11. Message Cancel receiving / Cancel sending now corrected and made to work as rfc4975 requires. (termination from sender and error code from receiver when cancelling). 12. Bug correction related to messages received not belonging to any session, old stack implementation did send error response, but after response was written it did give the buffer to client anyway. Now corrected.

/*
* Copyright (c) 2005-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          : CSipDialogMgr.h
* Part of       : SIPDialogs
* Version       : SIP/4.0 
*
*/




/**
 @internalComponent
*/

#ifndef CSIPDIALOGMGR_H
#define CSIPDIALOGMGR_H

#include <e32base.h>
#include <stringpool.h>
#include "SipStackServerDefs.h"
#include "sipinternalstates.h"
#include "MSipDialogs.h"
#include "MConnectionStateObserver.h"

class CSipDialogItem;
class CDialogsStore;
class MSipRegistrationContact;
class MTransactionUser;
class MTransactionHeaders;
class MSipRefreshMgr;
class MDialogOwner;
class CDeleteMgr;
class CSIPFromToHeaderBase;
class CSIPFromHeader;
class CSIPToHeader;
class CSIPRouteHeaderBase;
class CURIContainer;
class CSIPContactHeader;
class CSIPCallIDHeader;
class CSIPMessage;
class CEstablishing;
class CEarly;
class CConfirmed;
class CTerminated;
class CSIPSec;
class MSIPSecUser;
class MSigComp;
class TSIPTransportParams;


/**
 * Dialog manager creates, controls and deletes dialogs.
 * Dialog manager provides requests and responses from server core to transaction user.
 * Transaction user responses for requests provided by dialog manager and dialog manager
 * creates dialogs for successfull requests. 
 * Dialog manager includes dialogs, which contain states. When provisional response is got
 * for a request dialog is created. Dialogs states are also provided.
 */
class CSipDialogMgr : public CBase,
					  public MSipDialogs,
					  public MConnectionStateObserver
    {
public: // Constructors and destructor
	
    static CSipDialogMgr* NewL(MTransactionUser& aTU,
                               MSipRefreshMgr& aRefreshMgr,
                               MSipRegistrationContact& aRegistrationContact,
                               CSIPSec& aSIPSec,
                               MSigComp& aSigComp);
    ~CSipDialogMgr ();


public: // From MSipDialogs

	MTransactionOwner* TransactionOwnerL(CSIPRequest& aRequest,
	                                     CSIPResponse** aResponse);


public: // From MConnectionStateObserver

	void ConnectionStateChangedL(TUint32 aIapId,
                                 CSIPConnection::TState aState);


public: // New functions

	/**
	* Dialog manager creates dialog and 
    * sends request provided by server core to TU or Refreshes.
	*
    * @pre aSipRequest != 0
    * @pre aOwner != 0
    *
	* @param aTransactionId on return contains the id 
	*        of the created transaction
	* @param aRefreshId if the request is refreshed 
	*        on return contains the id of the created refresh	
	* @param aRegistrationId a registration id with 
	*        which a possible outbound proxy is used in TU.
	* @param aDialogId on return contains the id of the created dialog
	* @param aSipRequest a SIP Request to be sent. 
	*        The ownership is transferred.
    * @param aRemoteTarget; a remote target to be copied 
    *        to the dialog to be established.
	* @param aOwner Dialog owner
	* @param aSIPSecUser a user of SIPSec
	* @param aRefresh If EFalse, the request will be sent to TU. 
    *        Otherwise a refresh is created.
	*/
	void SendAndCreateDialogL(TTransactionId& aTransactionId,
	                          TRefreshId& aRefreshId,
	                          TRegistrationId aRegistrationId,
	                          TDialogId& aDialogId,
	                          CSIPRequest* aSipRequest,
	                          CURIContainer& aRemoteTarget,
	                          MDialogOwner* aOwner,
	                          MSIPSecUser& aSIPSecUser,
	                          TBool aRefresh=EFalse);

	/**
	* Dialog already created. Request is sent within a dialog.
	*	 
	* @param aTransactionId on return contains the id 
	*        of the created transaction
	* @param aRefreshId if the request is refreshed 
	*        on return contains the id of the created refresh
	* @param aDialogId an existing dialog id
	* @param aSipRequest SIP Request. The ownership is transferred.
	* @param aOwner Dialog owner
	* @param aRefresh If EFalse, request will be sent TU.
    *        Otherwise a new refresh is created. 
	* @param aAllowOverlap If ETrue, any requests can be sent.
    *        Otherwise requests with the same method are not allowed
	*		  while this request is pending.
	* @param aTargetRefresh If ETrue, localand remote target will be updated.
	*/	                           
	void SendWithinDialogL(TTransactionId& aTransactionId,
	                       TRefreshId& aRefreshId,
	                       const TDialogId& aDialogId,
	                       CSIPRequest* aSipRequest,
	                       const MDialogOwner* aOwner,
	                       TBool aRefresh=EFalse,
	                       TBool aAllowOverlap=ETrue,
	                       TBool aTargetRefresh=EFalse);

	/**
	* Dialog already created. Request is sent within a dialog and
    * an exiting refresh is updated.
	*	
	* @param aTransactionId transaction id
    * @param aRefreshId an existing refresh id
	* @param aDialogId an existing dialog id
	* @param aSipRequest SIP Request. The ownership is transferred.
	* @param aOwner Dialog owner
	*/
	void SendAndUpdateRefreshL(TTransactionId& aTransactionId,
	                           const TRefreshId& aRefreshId,
	                           const TDialogId& aDialogId,
	                           CSIPRequest* aSipRequest,
	                           const MDialogOwner* aOwner);

	/**
	* Dialog manager creates dialog and sends the response to TU.
	*
	* @param aTransactionId Transaction id
	* @param aRegistrationId a registration id with 
	*        which a possible outbound proxy is used in TU.
	* @param aDialogId Dialog id 
	* @param aSipResponse SIP Response. The ownership is transferred.
	* @param aOwner Dialog owner
	* @param aSIPSecUser a user of SIPSec
	*/
	void SendAndCreateDialogL(const TTransactionId& aTransactionId,
							  TRegistrationId aRegistrationId,
	                          TDialogId& aDialogId,
	                          CSIPResponse* aSipResponse,
	                          MDialogOwner* aOwner,
	                          MSIPSecUser& aSIPSecUser);

	/**
	* Dialog already created. Response is sent within a dialog. 
	*
	* @param aTransactionId transaction id
	* @param aDialogId an existing dialog id
	* @param aSipResponse SIP Response. The ownership is transferred.
	* @param aOwner Dialog owner
	* @param aTargetRefresh If ETrue, remote and local targets are updated.
	*/
	void SendWithinDialogL(const TTransactionId& aTransactionId,
	                       const TDialogId& aDialogId,
	                       CSIPResponse* aSipResponse,
	                       const MDialogOwner* aOwner,
	                       TBool aTargetRefresh=EFalse);

    /**
	* The dialog is removed. 
    * Dialogs will not anymore call the dialog owner.
	*
	* @param aDialogId an existing dialog id
	* @param aOwner Dialog owner
    * @returns KErrNone if the dialog was found, otherwise KErrNotFound
	*/
	TInt TerminateDialog(const TDialogId& aDialogId,
	                     const MDialogOwner* aOwner);

	/**
	* All the dialogs for a dialog owner are removed.
    * Dialogs will not anymore call the dialog owner.
	*
	* @param aDialogId	an existing dialog id
    * @returns KErrNone if dialogs for the owner were found,
    *          otherwise KErrNotFound.
	*/
    TInt TerminateDialogsFor(const MDialogOwner* aOwner);
	
    /**
    * Terminates a refresh within a dialog abnormally. 
    *
    * @param aDialogId an existing dialog id
    * @param aRefreshId an existing refresh id
    * @param aOwner Dialog owner
    * @returns KErrNone if the dialog and the refrsh were found,
    *          otherwise KErrNotFound.
    */	
    TInt TerminateDialogRefresh(const TDialogId& aDialogId,
                                const TRefreshId& aRefreshId,
                                const MDialogOwner* aOwner);

    /**
    * Gets existing dialogs state if the dialog is not found
    * leaves with KErrNotFound
    *
    * @param aDialogId an existing dialog id
    * @param aState contains dialog state 
    */
	void GetStateL(const TDialogId& aDialogId,
	               CSIPInternalStates::TState& aState);

    /**
    * Gets a Call-ID-header related the given dialog id.
    * Leaves with KErrNotFound if the dialog was not found.
    *
    * @param aDialogId an existing dialog id
    * @param aOwner Dialog owner
    * @returns a Call-ID-header related to the dialog
    */
	const CSIPCallIDHeader& CallIDL(const TDialogId& aDialogId,
	                                const MDialogOwner* aOwner);
	 
    /**
    * Gets the local tag related the given dialog id.
    * Leaves with KErrNotFound if the dialog was not found.
    *
    * @param aDialogId an existing dialog id
    * @param aOwner Dialog owner
    * @returns the local tag related to the dialog
    */	                                
	const TDesC8& LocalTagL(const TDialogId& aDialogId,
	                        const MDialogOwner* aOwner);

    /**
	* Resets the state of the dialog but keeps the data such as 
	* Call-ID, CSeq, local and remote target, local tag and route set.
	*
	* @param aDialogId an existing dialog id
	* @param aOwner Dialog owner
	*/    
	void ResetStateL(const TDialogId& aDialogId,
	                 const MDialogOwner* aOwner);
	                 
	/**
	 * Gets a MSIPSecUser related to a transaction.
     *
     * @param aTransactionId the transaction id
     *
     * @return MSIPSecUser related to the given transaction id, if found,
     *         otherwise NULL.
	 */    
    const MSIPSecUser* SIPSecUserForTransaction(
        const TTransactionId& aTransactionId);	                 


private: // New functions

    CSipDialogMgr (MTransactionUser& aTU,
                   MSipRefreshMgr& aRefreshMgr,
                   MSipRegistrationContact& aRegistratinonContact,
                   CSIPSec& aSIPSec,
                   MSigComp& aSigComp);
    
	void ConstructL ();
	
    CSIPContactHeader* ExtractContactL (
        TTransactionId aTransactionId,
        MTransactionHeaders& aHeaders,
        const TSIPTransportParams& aParams,
        TBool aContactMandatory);
                                        
    void CheckRecordRouteL (TTransactionId aTransactionId,
                            RPointerArray<CSIPRouteHeaderBase>& aRecordRoute,
                            const TSIPTransportParams& aParams);                                   

    void AddContactHeaderL (TUint32 aIapId,
                            TRegistrationId aRegistrationId,
                            CSIPRequest& aRequest,
                            const CSIPFromHeader* aFrom);

    void AddContactHeaderL (TUint32 aIapId,
                            CSIPResponse& aResponse,
                            const CSIPToHeader* aTo,
							const CURIContainer& aRequestUri);

	void AddContactHeaderL (CSipDialogItem& aDialog,
                            CSIPMessage& aMessage,
                            const CSIPFromToHeaderBase* aFromTo,
                            TBool aTargetRefresh);

	void CreateAndAddContactL (TUint32 aIapId,
	                           TRegistrationId aRegistrationId,
                               CSIPMessage& aMessage,
                               const CSIPFromToHeaderBase* aFromTo);

	void FillHostInContactL (TUint32 aIapId,
	                         TRegistrationId aRegistrationId,
		                     CSIPMessage& aMessage,
							 const CSIPFromToHeaderBase* aFromTo);

	void CreateAndAddContactL (const CURIContainer& aUri,
	                           CSIPMessage& aMessage);
	                                                    
	void SendErrorResponseAndLeaveL (TTransactionId aTransactionId,
	                                 TInt aLeaveCode,
	                                 const TSIPTransportParams& aParams);
	                                 
	static void DeleteTransactionHeaders (TAny* aTransactionHeaders);
	
	static void DeleteRouteSet (TAny* aRouteSet);
	
	static void DeleteContacts (TAny* aContacts);	


private: // Data

    MTransactionUser& iTU;
	MSipRefreshMgr& iRefreshMgr;
	MSipRegistrationContact& iRegistrationContact;
	CSIPSec& iSIPSec;
	MSigComp& iSigComp;
	CDeleteMgr*	iDeleteMgr;
	CDialogsStore* iDialogsStore;
	RStringF iContactHeaderName;
	RStringF iRouteHeaderName;
	RStringF iTagParamName;
	RStringF iPhraseCallTransactionDoesNotExist;
	RStringF iPhraseBadRequest;
    
private: // For testing purposes

	UNIT_TEST(CSipDialogMgrTest)
    };

#endif // CSIPDIALOGMGR_H

// End of File