--- /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 <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