realtimenetprots/sipfw/SIP/sipapi/src/SipDialogAssocImplementation.h
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/sipapi/src/SipDialogAssocImplementation.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,216 @@
+/*
+* Copyright (c) 2003-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        : SipDialogAssocImplementation.h
+* Part of     : SIP Client
+* Interface   : SDK API, SIP Client API
+* Version     : 1.0
+*
+*/
+
+
+
+
+/**
+ @internalComponent
+*/
+
+#ifndef CSIPDIALOGASSOCIMPLEMENTATION_H
+#define CSIPDIALOGASSOCIMPLEMENTATION_H
+
+// INCLUDES
+#include <stringpool.h>
+#include "_sipcodecdefs.h"
+#include "transactionassociation.h"
+#include "siprefreshassociation.h"
+
+// FORWARD DECLARATIONS
+class CSIPDialogAssocBase;
+class CSIPClientTransaction;
+class CSIPRefresh;
+class CSIPDialog;
+class CSIPMessageElements;
+class CSIPServerTransaction;
+class CSIPHeaderBase;
+class TMessageHeaderCleanup;
+class CSIPDialogImplementation;
+class CSIPConnectionImplementation;
+
+// CLASS DECLARATION
+
+/**
+*  Implementation class of CSIPDialogAssocBase.
+*/
+class CSIPDialogAssocImplementation :
+    public CBase,
+    public MTransactionAssociation,
+    public MSIPRefreshAssociation
+	{
+	public: // Constructors and destructor
+
+		static CSIPDialogAssocImplementation*
+			NewL(RStringF aType,
+				 CSIPDialogAssocBase& aAssoc,
+				 CSIPDialog& aDialog);
+
+		static CSIPDialogAssocImplementation*
+			NewL(RStringF aType,
+				 CSIPDialogAssocBase& aAssoc,
+				 CSIPDialog& aDialog,
+				 CSIPServerTransaction& aTransaction);
+										
+		/**
+		* Destructor
+		*/
+		virtual ~CSIPDialogAssocImplementation();    
+
+	public: //From MTransactionAssociation
+
+        CSIPClientConnection& ClientConnectionL();
+        
+        CSIPClientConnection* ClientConnection();
+
+        CSIPConnection& SIPConnectionL();
+
+        void AddTransactionL(CSIPTransactionBase& aTransaction);
+
+        void RemoveTransaction(const CSIPTransactionBase& aTransaction);
+
+	public: //From MSIPRefreshAssociation
+
+        CSIPClientTransaction*
+            UpdateRefreshL(CSIPRefresh& aRefresh,
+                           CSIPMessageElements* aElements,
+                           TBool aTerminate);
+
+        void DeletingRefresh(CSIPRefresh& aRefresh, TUint32 aRefreshId);
+        
+        MTransactionAssociation& TransactionAssociation();
+
+		TInt CheckIfStandAlone();
+
+	public: // New functions
+
+		/**
+		* Gets the dialog this dialog association belongs to
+		* @return associated dialog
+		*/
+		const CSIPDialog& Dialog() const;
+
+		/**
+		* Gets dialog this dialog association belongs to
+		* @return associated dialog
+		*/
+		CSIPDialog& Dialog();
+
+		/**
+		* Creates SIP request and sends it to the remote target.
+		* This function should be used for sending SIP extension
+		* requests within dialog assocation that do not cause 
+		* sip dialog associations to be created. In SIP terms
+		* this request is non target refresh request.
+		* @pre SIPDialog().State() != CSIPDialog::EInit &&
+		*      SIPDialog().State() != CSIPDialog::ETerminated
+        * @pre Dialog().Connection().State() == EActive
+		* @pre aMethod != "REGISTER" |"INVITE" | "BYE" | "CANCEL" | "ACK" |
+        *   "SUBSCRIBE" | "NOTIFY" | "UPDATE" | "PRACK"
+		* @param aElements contains optional SIP message headers and body.
+        *   Ownership is transferred.
+		* @return SIP extension client transaction. Ownership is transferred.
+		* @leave KErrSIPInvalidDialogState If dialog's state is not correct
+		* @leave KErrArgument if invalid value has been set to aMethod		
+		* @leave KErrSIPResourceNotAvailable if a required SIP Client API
+		*	object has been deleted
+		*/
+		virtual CSIPClientTransaction*
+            SendNonTargetRefreshRequestL(RStringF aMethod,
+                                         CSIPMessageElements* aElements);
+
+        /**
+        * Gets dialog association type.
+        *
+        * @return dialog association type e.g. "INVITE", "SUBSCRIBE" etc...
+        */
+        RStringF Type() const;		
+	
+        /**
+        * Searches for a transaction with the given aRequestId.        
+        *
+        * @param aRequestId RequestId of a transaction
+        * @return Found transaction, or NULL if not found. Ownership is not
+        *   transferred
+        */
+        CSIPTransactionBase* FindTransaction(TUint32 aRequestId);        
+
+        /**
+		* Checks if this dialog association has a transaction of the given
+        * type.
+        *
+        * @param aType Transaction type
+        * @param aIsClientTransaction ETrue if searching for a client
+        *   transaction, EFalse if searching for a server transaction
+		* @return ETrue if such a transaction exists, EFalse otherwise
+		*/
+        TBool HasTransaction(RStringF aType, TBool aIsClientTransaction);
+
+        /**
+        * The connection used by dialog association has been lost.
+        * Those classes derived from CSIPDialogAssocImplementation, which can contain
+        * refreshes must implement this function for terminating the refresh.                
+        */
+        virtual void ConnectionLost();       	
+
+		/**
+        * Makes a copy of aHeader and adds it into aElements and also into
+        * headerCleanup.
+        * @param aHeader SIP header
+        * @param aElements Message elements
+        * @param aHeaderCleanup Information to detach and delete the copy of
+        *	aHeader from aElements in case leave occurs.
+        */
+		static void CopyHeaderL(const CSIPHeaderBase& aHeader,
+								CSIPMessageElements& aElements,
+								TMessageHeaderCleanup& aHeaderCleanup);
+
+	protected:
+
+        /*
+		* Constructor
+		*/
+        CSIPDialogAssocImplementation(CSIPDialogAssocBase& aAssoc,
+        							  CSIPDialog& aDialog);
+        void ConstructL(RStringF aType);
+        void ConstructL(RStringF aType, CSIPServerTransaction& aTransaction);
+
+    private: // Data
+
+        //Dialog association type
+        RStringF iType;
+
+		CSIPDialogAssocBase& iAssoc;
+
+        CSIPDialog& iDialog;
+
+        //Existing transactions that are related to this dialog association.
+        //CSIPDialogAssocImplementation doesn't own them.
+        RPointerArray<CSIPTransactionBase> iTransactions;
+
+		TBool iStringPoolOpened;
+
+	private: // For testing purposes
+
+        UNIT_TEST(CSIPInviteDialogAssoc_Test)
+	};
+
+#endif