diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Dialogs/inc/CSipDialogMgr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Dialogs/inc/CSipDialogMgr.h Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,377 @@ +/* +* 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 +#include +#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& 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