diff -r 2fe1408b6811 -r e1b950c65cb4 epoc32/include/mw/sipinvitedialogassoc.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/epoc32/include/mw/sipinvitedialogassoc.h	Wed Mar 31 12:27:01 2010 +0100
@@ -0,0 +1,423 @@
+/*
+* 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 the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* Name        : sipinvitedialogassoc.h
+* Part of     : SIP Client
+* Interface   : SDK API, SIP Client API
+* Version     : 1.0
+*
+*/
+
+
+
+
+#ifndef CSIPINVITEDIALOGASSOC_H
+#define CSIPINVITEDIALOGASSOC_H
+
+// INCLUDES
+#include "sipdialogassocbase.h"
+
+// CONSTANTS
+
+// FORWARD DECLARATIONS
+class CUri8;
+class CSIPConnection;
+class CSIPServerTransaction;
+class CSIPFromHeader;
+class CSIPToHeader;
+class CSIPContactHeader;
+class MSIPRegistrationContext;
+
+// CLASS DECLARATION
+
+/**
+*  @publishedAll
+*  @released
+*
+*  Class for managing SIP dialog association created with INVITE.
+*  It provides services for creating, using and
+*  terminating SIP INVITE dialog association.
+*
+*  The user can have only one INVITE dialog association per dialog.
+* 
+*  @lib sipclient.lib
+*/
+class CSIPInviteDialogAssoc : public CSIPDialogAssocBase
+	{
+	public: // Constructors and destructor
+
+		/**
+		* Two-phased constructor.
+		* @param aDialog a dialog to be associated with
+        * @return New object, ownership is transferred.
+		*/
+		IMPORT_C static CSIPInviteDialogAssoc* NewL(CSIPDialog& aDialog);
+
+        /**
+		* Two-phased constructor.
+		* @param aDialog a dialog to be associated with
+        * @return New object, ownership is transferred.
+		*/
+		IMPORT_C static CSIPInviteDialogAssoc* NewLC(CSIPDialog& aDialog);
+
+        /**
+        * Two-phased constructor.
+        * Should be used if response to the received SIP request will create
+        * a SIP dialog association.
+        * The server transaction must be a INVITE transaction.
+        * If SIP server transaction was received within an existing SIP dialog
+        * the created SIP dialog association will be correlated to that SIP
+        * dialog. Otherwise a new SIP dialog is created.
+        * @pre aTransaction.State() == CSIPTransactionBase::EProceeding
+        * @pre aTransaction.Type() == SipStrConsts::EInvite
+        * @param aTransaction a SIP server transaction 
+        * @return New object, ownership is transferred.
+        * @leave KErrArgument if aTransaction.Type() != SipStrConsts::EInvite
+        * @leave KErrSIPInvalidTransactionState if aTransaction.State() !=
+        *	CSIPTransactionBase::EProceeding
+        * @leave KErrSIPResourceNotAvailable if a required SIP Client API
+		*	object has been deleted
+        */
+        IMPORT_C static CSIPInviteDialogAssoc*
+            NewL(CSIPServerTransaction& aTransaction);
+
+        /**
+        * Two-phased constructor.
+        * Should be used if response to the received SIP request will create a
+        * SIP dialog association.
+        * The server transaction must be a INVITE transaction.
+        * If SIP server transaction was received within the existing SIP dialog
+        * the created SIP dialog association will be correlated to that
+        * SIP dialog.  Otherwise a new SIP dialog is created.
+		* @pre aTransaction.State() == CSIPTransactionBase::EProceeding
+		* @pre aTransaction.Type() == SipStrConsts::EInvite
+        * @param aTransaction a SIP server transaction
+        * @return New object, ownership is transferred.
+        * @leave KErrArgument if aTransaction.Type() != SipStrConsts::EInvite
+        * @leave KErrSIPInvalidTransactionState if aTransaction.State() !=
+        *	CSIPTransactionBase::EProceeding
+        * @leave KErrSIPResourceNotAvailable if a required SIP Client API
+		*	object has been deleted
+        */
+        IMPORT_C static CSIPInviteDialogAssoc*
+            NewLC(CSIPServerTransaction& aTransaction);
+
+        /**
+        * Two-phased constructor.
+        * Should be used if response to the received SIP request will create
+        * a SIP dialog association.
+        * The server transaction must be a INVITE transaction.
+        * If SIP server transaction was received within an existing SIP dialog
+        * the created SIP dialog association will be correlated to that SIP
+        * dialog. Otherwise a new SIP dialog is created.
+        * @pre aTransaction.State() == CSIPTransactionBase::EProceeding
+        * @pre aTransaction.Type() == SipStrConsts::EInvite
+		* @pre aContext.IsContextActive() == ETrue        
+        * @param aTransaction a SIP server transaction 
+        * @param aContext that will be used for populating 
+        *        the Contact-header of the response to aTransaction
+        * @return New object, ownership is transferred.
+        * @leave KErrArgument if aTransaction.Type() != SipStrConsts::EInvite
+        * @leave KErrSIPInvalidTransactionState if aTransaction.State() !=
+        *	CSIPTransactionBase::EProceeding
+        * @leave KErrSIPResourceNotAvailable if a required SIP Client API
+		*	object has been deleted
+        */
+        IMPORT_C static CSIPInviteDialogAssoc*
+            NewL(CSIPServerTransaction& aTransaction,
+                 const MSIPRegistrationContext& aContext);
+
+        /**
+        * Two-phased constructor.
+        * Should be used if response to the received SIP request will create a
+        * SIP dialog association.
+        * The server transaction must be a INVITE transaction.
+        * If SIP server transaction was received within the existing SIP dialog
+        * the created SIP dialog association will be correlated to that
+        * SIP dialog.  Otherwise a new SIP dialog is created.
+		* @pre aTransaction.State() == CSIPTransactionBase::EProceeding
+		* @pre aTransaction.Type() == SipStrConsts::EInvite
+		* @pre aContext.IsContextActive() == ETrue 
+        * @param aTransaction a SIP server transaction
+        * @param aContext that will be used for populating 
+        *        the Contact-header of the response to aTransaction        
+        * @return New object, ownership is transferred.
+        * @leave KErrArgument if aTransaction.Type() != SipStrConsts::EInvite
+        * @leave KErrSIPInvalidTransactionState if aTransaction.State() !=
+        *	CSIPTransactionBase::EProceeding
+        * @leave KErrSIPResourceNotAvailable if a required SIP Client API
+		*	object has been deleted
+        */
+        IMPORT_C static CSIPInviteDialogAssoc*
+            NewLC(CSIPServerTransaction& aTransaction,
+                  const MSIPRegistrationContext& aContext);
+
+        /**
+        * Two-phased constructor
+        * @pre aFrom != 0
+        * @pre aRemoteUri != 0
+		* The user of the class must not define tags in From-header
+		* and To-header.        
+        * @param aConnection a SIP connection to be used with
+        *        dialog association
+        * @param aFrom originator's address; the ownership is transfered
+        * @param aRemoteUri a remote target URI that identifies a resource that
+        *		 the request is addressed to. The ownership is transferred.
+        * @param aTo logical recipient's address; if not defined
+        *        the remote target uri will be used for To-header
+        *        construction; the ownership is transfered
+        * @param aContact a contact to be used in dialog creation. Must be
+        *        given only if user intends to re-direct future requests; 
+        *        the ownership is transfered        
+        * @return New object, ownership is transferred.
+        * @leave KErrArgument if aFrom == 0 or aRemoteUri == 0
+        */
+        IMPORT_C static CSIPInviteDialogAssoc*
+            NewL(CSIPConnection& aConnection,
+                 CSIPFromHeader* aFrom,
+                 CUri8* aRemoteUri,
+                 CSIPToHeader* aTo=0,
+                 CSIPContactHeader* aContact=0);
+
+        /**
+        * Two-phased constructor
+        * @pre aFrom != 0
+        * @pre aRemoteUri != 0
+		* The user of the class must not define tags in From-header
+		* and To-header.
+        * @param aSIPConnection a SIP connection to be used with
+        *        dialog association
+        * @param aFrom originator's address; the ownership is transfered
+        * @param aRemoteUri a remote target URI that identifies a resource that
+        *		 the request is addressed to. The ownership is transferred.
+        * @param aTo logical recipient's address; if not defined
+        *        the remote target uri will be used for To-header
+        *        construction; the ownership is transfered
+        * @param aContact a contact to be used in dialog creation. Must be
+        *        given only if user intends to re-direct future requests; 
+        *        the ownership is transfered
+        * @return New object, ownership is transferred.
+        * @leave KErrArgument if aFrom == 0 or aRemoteUri == 0
+        */
+        IMPORT_C static CSIPInviteDialogAssoc*
+            NewLC(CSIPConnection& aConnection,
+                  CSIPFromHeader* aFrom,
+                  CUri8* aRemoteUri,
+                  CSIPToHeader* aTo=0,
+                  CSIPContactHeader* aContact=0);
+
+        /**
+        * Two-phased constructor
+		* @pre aRemoteUri != 0
+		* The user of the class must not define tags in From-header
+		* and To-header.
+        * @pre aContext.IsContextActive() == ETrue
+        * @param aConnection a SIP connection to be used with
+        *        dialog association        
+        * @param aRemoteUri a remote target URI that identifies a resource
+        *		 that the request is targeted to. The ownership is transferred.
+        * @param aContext used for selecting outbound 
+        *        proxy and originator's address (AOR) and contact
+        * @param aFrom originator's address. If not defined it will
+        *        constructed using registration context (User's AOR);
+        *        the ownership is transfered
+        * @param aTo logical recipient's address; if not defined
+        *        the remote target uri will be used for To-header
+        *        construction; the ownership is transfered
+        * @param aContact a contact to be used in dialog creation. Must be
+        *        given only if user intends to re-direct future requests; 
+        *        the ownership is transfered
+        * @return New object, ownership is transferred.
+        * @leave KErrArgument if aRemoteUri == 0
+        * @leave KErrSIPInvalidRegistrationState
+        *		 if aContext.IsContextActive() == EFalse
+        */
+        IMPORT_C static CSIPInviteDialogAssoc*
+            NewL(CSIPConnection& aConnection,                                    
+                 CUri8* aRemoteUri,
+                 const MSIPRegistrationContext& aContext,
+                 CSIPFromHeader* aFrom=0,
+	             CSIPToHeader* aTo=0,
+	             CSIPContactHeader* aContact=0);
+
+        /**
+		* Two-phased constructor		
+		* @pre aRemoteUri != 0
+		* The user of the class must not define tags in From-header
+		* and To-header.
+		* @pre aContext.IsContextActive() == ETrue
+		* @param aConnection a SIP connection to be used with
+		*        dialog association		
+		* @param aRemoteUri a remote target URI that identifies a resource
+		*		 that the request is targeted to. The ownership is transferred.
+        * @param aContext used for selecting outbound 
+        *        proxy and originator's address (AOR) and contact
+        * @param aFrom originator's address. If not defined it will
+        *        constructed using registration context (User's AOR);
+        *        the ownership is transfered
+        * @param aTo logical recipient's address; if not defined
+        *        the remote target uri will be used for To-header
+        *        construction; the ownership is transfered
+        * @param aContact a contact to be used in dialog creation. Must be
+        *        given only if user intends to re-direct future requests; 
+        *        the ownership is transfered
+        * @return New object, ownership is transferred.
+        * @leave KErrArgument if aRemoteUri == 0
+        * @leave KErrSIPInvalidRegistrationState
+        *		 if aContext.IsContextActive() == EFalse
+		*/
+        IMPORT_C static CSIPInviteDialogAssoc*
+            NewLC(CSIPConnection& aConnection,			                        
+			      CUri8* aRemoteUri,
+                  const MSIPRegistrationContext& aContext,
+                  CSIPFromHeader* aFrom=0,
+	              CSIPToHeader* aTo=0,
+	              CSIPContactHeader* aContact=0);
+
+		/**
+		* Destructor
+		*/
+		IMPORT_C ~CSIPInviteDialogAssoc();
+			                                  
+	public: // New functions
+
+		/**
+		* Creates INVITE and sends it to the remote target.
+		* 101-199 or 2xx response will create INVITE dialog association in case
+		* of first INVITE within this dialog association. Subsequent INVITE
+		* requests are re-INVITEs.
+		* @pre Dialog().Connection().State()==EActive
+		* @pre Dialog().State()==CSIPDialog::EInit ||
+		*      Dialog().State()==CSIPDialog::EConfirmed
+		* @param aElements contains user SIP headers and content. Ownership is
+        *   transferred.
+		* @return INVITE SIP transaction. Ownership is transferred.
+		* @leave KErrSIPInvalidDialogState if dialog is not in a correct state
+		* @leave KErrSIPResourceNotAvailable if a required SIP Client API
+		*	object has been deleted
+		* @capability NetworkServices
+		*/
+		IMPORT_C CSIPClientTransaction*
+            SendInviteL(CSIPMessageElements* aElements=0);
+
+        /**
+		* Creates PRACK and sends it to the remote target.		
+		* @pre Dialog().Connection().State()==EActive
+		* @pre Dialog().State()==CSIPDialog::EEarly || 
+		*      Dialog().State()==CSIPDialog::EConfirmed
+        * @pre aElements must not contain Contact headers
+		* @param aElements contains user SIP headers and content. Ownership is
+        *   transferred.
+		* @return PRACK SIP transaction. Ownership is transferred.
+		* @leave KErrSIPInvalidDialogState if dialog is not in a correct state
+		* @leave KErrSIPResourceNotAvailable if a required SIP Client API
+		*	object has been deleted
+		* @capability NetworkServices
+		*/
+		IMPORT_C CSIPClientTransaction*
+            SendPrackL(CSIPMessageElements* aElements=0);
+
+	    /**
+		* Creates UPDATE and sends it to the remote target.
+		* @pre Dialog().Connection().State()==EActive
+		* @pre Dialog().State()==CSIPDialog::EEarly || 
+		*      Dialog().State()==CSIPDialog::EConfirmed
+		* @param aElements contains user SIP headers and content. Ownership is
+        *   transferred.
+		* @return UPDATE SIP transaction. Ownership is transferred.
+		* @leave KErrSIPInvalidDialogState if dialog is not in a correct state
+		* @leave KErrSIPResourceNotAvailable if a required SIP Client API
+		*	object has been deleted
+		* @capability NetworkServices
+		*/
+		IMPORT_C CSIPClientTransaction*
+            SendUpdateL(CSIPMessageElements* aElements=0);
+
+		/**
+		* Creates SIP ACK request and sends it to the remote target.
+		* The client transaction must be an INVITE transaction.
+		* @pre Dialog().Connection().State()==EActive
+		* @pre Dialog().State()==CSIPDialog::EConfirmed
+		* @param aTransaction a SIP INVITE client transaction to acknowledge
+		* @param aElements optional SIP message headers and body. Ownership is
+        *   transferred.
+        * @leave KErrArgument if aTransaction is not an INVITE transaction.
+        * @leave KErrSIPInvalidDialogState if ACK can't be sent in the current
+		*	dialog state
+        * @leave KErrSIPResourceNotAvailable if a required SIP Client API
+		*	object has been deleted
+		* @capability NetworkServices
+		*/
+		IMPORT_C void SendAckL(const CSIPClientTransaction& aTransaction,
+			                   CSIPMessageElements* aElements=0);
+
+	    /**
+		* Creates SIP BYE request and sends it to the remote target.		
+		* @pre Dialog().Connection().State()==EActive
+		* @pre Dialog().State()==CSIPDialog::EEarly || 
+		*      Dialog().State()==CSIPDialog::EConfirmed
+		* @param aElements contains user SIP headers and content. Ownership is
+        *   transferred.
+		* @return SIP BYE transaction. Ownership is transferred.
+		* @leave KErrSIPInvalidDialogState if BYE can't be sent in the current
+		*	dialog state
+		* @leave KErrSIPResourceNotAvailable if a required SIP Client API
+		*	object has been deleted
+		* @capability NetworkServices
+		*/		
+		IMPORT_C CSIPClientTransaction*
+            SendByeL(CSIPMessageElements* aElements=0);
+
+	public: // New functions, for internal use
+	
+        /**
+		* Sends initial INVITE creating a dialog and creates a transaction for
+        * it.
+		* @param aElements contains user SIP headers and content. Ownership is
+        *   transferred.
+		* @return INVITE SIP transaction. Ownership is transferred.
+		*/
+        CSIPClientTransaction* DoSendInviteL(CSIPMessageElements* aElements);
+
+        /**
+		* Sends ACK		
+		* @param aTransaction a SIP INVITE client transaction to acknowledge
+		* @param aElements optional SIP message headers and body. Ownership is
+        *   transferred.
+		*/
+        void DoSendAckL(const CSIPClientTransaction& aTransaction,
+                        CSIPMessageElements* aElements);
+
+		CSIPClientTransaction*
+			DoSendRequestWithinDialogL(RStringF aMethod,
+									   CSIPMessageElements* aElements);
+
+        CSIPClientTransaction* DoSendCancelL(TUint32 aRequestId);
+
+   	private: // Constructors
+   	   	
+		static CSIPInviteDialogAssoc* NewLC(CSIPConnection& aConnection,
+								 CUri8* aRemoteUri,
+	                             CSIPFromHeader* aFrom,
+	                             CSIPToHeader* aTo,
+		                         CSIPContactHeader* aContact,
+		                         const MSIPRegistrationContext* aContext);
+
+		CSIPInviteDialogAssoc();
+		
+		void ConstructL(CSIPServerTransaction& aTransaction,
+                        const MSIPRegistrationContext* aContext);
+	};
+
+#endif