realtimenetprots/sipfw/SIP/Client/inc/sipclientconnection.h
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Client/inc/sipclientconnection.h	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,709 @@
+/*
+* Copyright (c) 2007-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          : sipclientconnection.h
+* Part of       : SIPClient
+* Version       : SIP/6.0 
+*
+*/
+
+
+
+
+/**
+ @internalComponent
+*/
+
+
+#ifndef CSIPCLIENTCONNECTION_H
+#define CSIPCLIENTCONNECTION_H
+
+#include <e32base.h>
+#include <stringpool.h>
+#include <uri8.h>
+#include <in_sock.h>
+#include "sipconnection.h"
+#include "_sipcodecdefs.h"
+
+class CSIPClient;
+class RSIPConnection;
+class CSIPITCSender;
+class MSIPClientConnectionObserver;
+class CSIPClientConnectionReceiver;
+class CSIPToHeader;
+class CSIPFromHeader;
+class CSIPRouteHeader;
+class CSIPCallIDHeader;
+class CSIPMessageElements;
+class CSIPRequestElements;
+class CSIPResponseElements;
+class CSIPContactHeader;
+
+/**
+ * @brief Class for openening connection using particular IAP and 
+ *        for managing SIP transactions/dialogs using given connection.
+ * 
+ *
+ * Class provides functions for sending and receiving 
+ * SIP requests and SIP responses.
+ * This class also provides functions for creating and destroying SIP dialogs,
+ * sending and receiving SIP requests and responses within SIP dialogs,
+ * canceling the SIP requests.
+ *
+ * All SIP messages will be sent/received using connection (defined using IAP Id)
+ * given by the user.
+ *
+ * If the preconditions or postconditions are not met the 
+ * function will leave with KErrArgument error code.
+ *
+ */
+class CSIPClientConnection : public CBase
+	{
+public:
+
+	/**
+	 * Constructs an instance of CSIPClientConnection
+     * The connection using IAP-Id is initialized during construction.
+     * @param aClient a handle to SIP server session
+     * @param aObserver an observer for receiving notifications
+     * @param aIapId IAP Id that will be used for the connection.
+	 * @returns new instance, the ownership is transferred
+	 */
+
+	static CSIPClientConnection* NewL (CSIPClient& aClient,
+		                               MSIPClientConnectionObserver& aObserver,
+									   TUint32 aIapId);
+
+	/**
+	 * Constructs an instance of CSIPClientConnection and adds a pointer to it 
+     * to the CleanupStack
+     * The connection using IAP-Id is initialized during construction.
+     * @param aClient a handle to SIP server session
+     * @param aObserver an observer for receiving notifications
+     * @param aIapId IAP Id that will be used for the connection.
+	 * @returns new instance, the ownership is transferred
+	 */
+
+	static CSIPClientConnection* NewLC (CSIPClient& aClient,
+		                                MSIPClientConnectionObserver& aObserver,
+										TUint32 aIapId);
+
+	/**
+	 * Destructor
+	 */
+
+	~CSIPClientConnection ();
+
+	/**
+	 * Gets the current state of the connection
+     * @returns the connection state
+	 */
+
+    CSIPConnection::TState State () const;
+
+	/**
+	 * Gets the IAP id of this connection
+     * @returns the IAP id
+	 */
+
+	TUint32 IapId () const;
+	
+    /**
+	 * Gets the local IP address used for this CSIPClientConnection
+	 * when sending SIP messages to the network.
+	 * @pre State() == EActive
+	 * @param aAddr local IP for this CSIPClientConnection.
+     * @leave A system-wide error codes
+     */ 	
+     void GetLocalAddrL(TInetAddr& aAddr) const;	
+	
+    /**
+	 * Sets a RSocket option used for all the sockets used for sending 
+	 * SIP requests and responses in this CSIPConnection.
+	 * @pre State() == EActive
+	 * @param aOptionName An integer constant which identifies an option.
+     * @param aOptionLevel An integer constant which identifies 
+     *        level of an option.
+     * @param aOption Option value packaged in a descriptor.
+     * @leave A system-wide error code
+     */        
+	 void SetOptL(TUint aOptionName,
+	              TUint aOptionLevel,
+	              const TDesC8& aOption=KNullDesC8);
+	         
+    /**
+	 * Sets a RSocket option used for all the sockets used for sending 
+	 * SIP requests and responses in this CSIPConnection.
+	 * @pre State() == EActive
+	 * @param aOptionName An integer constant which identifies an option.
+     * @param aOptionLevel An integer constant which identifies 
+     *        level of an option.
+     * @param aOption Option value as an integer.
+     * @leave A system-wide error codes
+     */ 	                         
+	 void SetOptL(TUint aOptionName,
+	              TUint aOptionLevel,
+	              TInt aOption);  	
+	
+
+	/**
+	 * Sets the Outbound Proxy for a registration binding. 
+	 *
+	 * @param aRegistrationId the value of the registration-Id 
+     *        that was returned in a response to an earlier REGISTER request.
+     *        This value is used to identify the binding for which 
+     *        the outbound proxy setting is to be set.
+	 * @param aOutboundProxy an outbound proxy.
+	 */
+	 
+	void SetOutboundProxyL (TUint32 aRegistrationId,
+	                        const CSIPRouteHeader& aOutboundProxy);
+
+	/**
+	 * Removes the outbound proxy which was used for the particular AOR.
+	 *
+	 * @param aRegistrationId the value of the registration-Id 
+     *        that was returned in a response to an earlier REGISTER request. 
+     *        This value is used to identify the binding for which 
+     *        the outbound proxy setting is to be removed.
+	 * @returns KErrNone if a proxy was found and removed.
+     *          KErrNotFound if a proxy was not found. 
+     *          Otherwise a system wide error code.
+	 */
+
+	TInt RemoveOutboundProxy (TUint32 aRegistrationId);
+
+	/**
+	 * Gets the Outbound Proxy as set by any application for an AOR.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * Applications should retrieve this value first and examine if outbound
+	 * proxy address, for the particular AOR, is suitable before sending SIP
+	 * requests to the sip stack. If not suitable, 
+     * the application may add a Route-header to the SIP Request 
+     * in order to override this setting for that particular request.
+	 *
+	 * @param aRegistrationId the value of the registration-Id 
+     *        that was returned in a response to an earlier REGISTER request.
+     *        This value is used to identify the binding for which 
+     *        the outbound proxy setting is to be fetched.
+	 * @returns An outbound proxy object or 0 if not found,
+	 *          The ownership is transferred.
+	 */
+
+	CSIPRouteHeader* OutboundProxyL (TUint32 aRegistrationId);
+
+	/**
+	 * Gets the AOR for a given registration id.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 *
+	 * @param aRegistrationId the value of the registration-Id 
+     *        that was returned in a response to an earlier REGISTER request.
+     *        This value is used to identify the binding for which 
+     *        the AOR is to be fetched.
+	 * @returns An AOR as a From-header object or 0 if not found,
+	 *          The ownership is transferred.
+	 */
+
+	CSIPFromHeader* AorL (TUint32 aRegistrationId);
+
+	/**
+	 * Creates SIP REGISTER request and sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code
+	 * This function call creates a registration binding.
+	 * The Registration-Id for this REGISTER is returned with a 
+     * future 2xx response received for this REGISTER.
+	 * A 2xx response to this REGISTER creates a binding.
+     * There MUST NOT be more than one Contact-header and 
+     * it MUST NOT be set to STAR.
+	 * 
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+     * @pre aTo.SIPAddress().URI().HasUser()
+     * @pre !aTo.HasTag()
+     * @pre !aFrom.HasTag()
+     * @pre aRemoteUri->IsSIPURI()
+     *
+	 * @param aRequestId the returned request Id,
+     *        to be used to match a response to this request.
+	 * @param aTo a To-header
+	 * @param aTo a From-header 
+	 * @param aElements contains optional SIP message headers and body.
+     * @param aRemoteUri a remote-URI.
+     *        The ownership is NOT transferred.
+     * @param aOutboundProxy the outbound proxy address.
+     *        The ownership is NOT transferred.
+	 * @param aRefresh refresh flag. Refreshing of this REGISTER is requested 
+     *        from the SIP Stack by setting this flag to ETrue.
+ 	 * @param aSendWithExpires when set to EFalse REGISTER message is sent
+	 *        without expires value
+	 * @param aCacheOutboundProxyIP when set to ETrue outbound proxy IP
+	 *        of REGISTER message is cached in registration context
+	 */		
+
+	void SendRegisterL (TUint32& aRequestId,
+		                const CSIPToHeader& aTo,
+						const CSIPFromHeader& aFrom,
+						const CSIPMessageElements& aElements,
+						const CUri8* aRemoteUri=0,
+						const CSIPRouteHeader* aOutboundProxy=0,
+						TBool aRefresh=EFalse,
+						TBool aSendWithExpires=ETrue,
+						TBool aCacheOutboundProxyIP=EFalse);
+
+	/**
+	 * Creates SIP (update) REGISTER request and sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * User of this function does not need to, but can, 
+     * set a new expires values in the expires-param of the SIP REGISTER request.
+	 * This is done to update the refresh interval.
+	 * A 2xx response to this request updates a binding 
+     * as well as the refresh interval.
+	 * 
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+	 * @param aRegistrationId the value of the registration-Id 
+     *        that was returned in a response, to an earlier REGISTER, 
+     *        that created the binding. This value is used to 
+	 *		  identify the binding to be updated.
+	 * @param aNewRequestId the returned request Id, 
+     *        to be used to match a response to this request.
+	 * @param aElements contains optional SIP message headers and body.
+	 */		
+
+	void UpdateRegistrationL (TUint32 aRegistrationId,
+		                      TUint32& aNewRequestId,
+							  const CSIPMessageElements* aElements=0);
+
+	/**
+	 * Creates SIP (un)REGISTER request and sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * User must NOT set any expires values in the
+	 * SIP REGISTER request (aSIPMessageOptionalElements).
+	 * Any SIP response (2xx - 6xx) to this request removes a binding.
+	 * 
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+     * @pre "Contact-headers".Count() == 0
+	 * @param aRegistrationId the value of the registration-Id 
+     *        that was returned in a response, to an earlier REGISTER,
+     *        that created the binding. This value is used to 
+	 *        identify the binding to be removed.
+	 * @param aNewRequestId the returned request Id, 
+     *        to be used to match a response to this request.
+	 * @param aElements contains optional SIP message headers and body.
+	 */
+
+	void UnregisterL (TUint32 aRegistrationId,
+		              TUint32& aNewRequestId,
+					  const CSIPMessageElements* aElements=0);
+
+	/**
+	 * Creates SIP REGISTER request and sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * User must NOT set any expires values 
+     * to the request (aMessageOptionalElements).
+	 * 
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+     * @pre !aElements.RemoteURI()->HasUser()
+     * @pre aElements.ToHeader().SIPAddress().URI().HasUser()
+	 * @pre "Contact-headers".Count() == 0
+	 * @param aElements contains remote address and 
+     *        optionally SIP message headers and body.
+	 * @param aRequestId the returned request Id, 
+     *        to be used to match a response to this request.
+	 */		
+
+	void FetchRegistrationsL (const CSIPRequestElements& aElements,
+		                      TUint32& aRequestId);
+
+	/**
+	 * Creates SIP request and sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * Function returns an error if a SIP request with a known method
+	 * as defined in preconditions is sent. 
+     * This provokes the Non-invite state machine.
+	 * The registration Id is used to select the outbound proxy.
+	 * 
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+	 * @pre aRequestElements.Method() != "REGISTER" | "OPTIONS" | "INVITE" 
+     *      | "BYE" | "CANCEL" | "ACK" | "SUBSCRIBE" | "NOTIFY" | "REFER" 
+     *      | "MESSAGE".
+	 * @param aElements contains local and remote addresses,
+	 *        optional SIP message headers and body.
+	 * @param aRequestId the returned request Id,
+     *        to be used to match a response to this request.
+	 * @param aRegistrationId registration id for the sender's AOR
+	 * @param aRefresh refresh flag. Refreshing of the SIP request is requested
+     *        from the SIP Stack by setting this flag to ETrue.
+	 */		
+
+	void SendRequestL (const CSIPRequestElements& aElements,
+		               TUint32& aRequestId,
+					   TUint32 aRegistrationId=0,
+					   TBool aRefresh=EFalse);
+
+	/**
+	 * Sends a SIP request and updates an existing refresh. 
+     * The method and To- and From-headers
+     * from the original request will be used.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+     * @param aRefreshId the value of the refresh-Id that was returned 
+     *        in a response to an earlier request that created the refresh.
+	 * @param aNewRequestId the returned request Id,
+     *        to be used to match a response to this request.
+	 * @param aElements contains optional SIP message headers and body.
+	 */		
+
+	void SendRequestAndUpdateRefreshL (TUint32 aRefreshId,
+		                               TUint32& aNewRequestId,
+									   const CSIPMessageElements* aElements=0);
+
+
+	/**
+	 * Sends a SIP request and terminates the refresh after sending the request.
+     * The method and To- and From-headers
+     * from the original request will be used.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * Any SIP response (2xx - 6xx) to this request terminates a refresh.
+	 *
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+     * @param aRefreshId the value of the refresh-Id that was returned 
+     *        in a response to an earlier request that created the refresh.
+	 * @param aNewRequestId the returned request Id,
+     *        to be used to match a response to this request.
+	 * @param aElements contains optional SIP message headers and body.
+	 */		
+
+	void SendRequestAndTerminateRefreshL (TUint32 aRefreshId,
+		                                  TUint32& aNewRequestId,
+										  const CSIPMessageElements* aElements=0);
+
+	/**
+	 * Creates SIP response and sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * This response does not create a dialog. This function MUST
+	 * be used only if the request received had no Dialog-Id.
+	 *
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+	 * @param aElements contains Status Code, optional Reason Phrase 
+     *        and optional SIP message headers and body.
+	 * @param aRequestId the value of the request id as returned 
+     *        by an earlier request. The value is used to identify the request
+     *        to which this response is for.
+	 */		
+	
+	void SendResponseL (const CSIPResponseElements& aElements,
+		                TUint32 aRequestId);
+		                
+	/**
+	 * Creates SIP ACK request within a dialog and sends it 
+     * to the given destination. 
+     * Leaves on failure with a system wide or a SIP stack specific error code.
+	 *
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+     * @pre aElements.OptionalElements()->ContactHeaders().Count() == 0
+	 * @param aDialogId the value of the Dialog-Id that was returned 
+     *        in a response to an earlier INVITE, that created the dialog.
+	 * @param aRequestId the value of the INVITE Request-Id.
+	 * @param aElements contains optional SIP message headers and body.
+	 */		
+
+	void SendAckL (TUint32 aDialogId,
+		           TUint32 aRequestId,
+				   const CSIPMessageElements* aElements=0);
+
+	/**
+	 * Creates SIP CANCEL request for an existing INVITE request and 
+	 * sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * 
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+	 * @param aInviteRequestId the id of the INVITE request to be cancelled.
+	 * @param aCancelRequestId the id to be created for the CANCEL request.
+	 */		
+
+	void SendCancelL (TUint32 aInviteRequestId,
+		              TUint32& aCancelRequestId);
+
+	/**
+	 * Creates SIP response and sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * This response creates a dialog. 
+	 *
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+	 * @param aElements contains Status Code, 
+     *        optional Reason Phrase and optional SIP message headers and body.
+	 * @param aRequestId the value of the request id as returned by an 
+     *        earlier received request. This value is used to identify 
+     *        the request to which this response is for.
+	 * @param aDialogId a dialog id of the dialog that this response creates.
+	 * @param aRegistrationId registration id
+	 */		
+
+	void SendResponseAndCreateDialogL (const CSIPResponseElements& aElements,
+		                               TUint32 aRequestId,
+									   TUint32& aDialogId,
+									   TUint32 aRegistrationId);
+	 
+	/**
+	 * Creates SIP response to a request that is within a dialog
+	 * and sends it to the given destination.
+     * Leaves on failure with a system wide or a SIP stack specific error code.
+     * Contact-header MUST NOT be set if aTargetRefresh flag is EFalse.
+	 *
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+	 * @param aElements contains Status Code, optional Reason Phrase
+     *        and optional SIP message headers and body.
+	 * @param aRequestId the value of the request id as returned 
+     *        by an earlier received request.
+	 *        This value identifies the request to which this response is for.
+	 * @param aDialogId the value of the dialog id as returned 
+     *        by an earlier received response.
+	 *        This value identifies the dialog to which this response is for.
+	 * @param aTargetRefresh indicates if a received request 
+     *        sent within a dialog was a target refresh request.
+	 */		
+
+	void SendResponseWithinDialogL (const CSIPResponseElements& aElements,
+		                            TUint32 aRequestId,
+									TUint32 aDialogId,
+									TBool aTargetRefresh=EFalse);
+
+	/**
+	 * Creates a SIP request and sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * The Dialog-Id for this request is returned 
+     * with a future 2xx response received for this request. 
+     * This provokes the Non-invite state machine
+	 * The registration Id is used to select the outbound proxy.
+     * There MUST NOT be more than one Contact-header and 
+     * it MUST NOT be set to STAR.
+	 * 
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+     * @pre aMethod.Length() > 0
+	 * @pre aMethod != "REGISTER" | "OPTIONS" | "BYE" | "CANCEL" |
+     *                 "ACK" | "NOTIFY" | "MESSAGE" | "PRACK" | "UPDATE"
+     * @pre aRemoteUri->IsSIPURI()
+     * @pre !aTo->HasTag()
+     * @pre !aFrom.HasTag()
+     *
+	 * @param aRequestId the returned request Id,
+     *        to be used to match a response to this request.
+	 * @param aRefreshId if the request is refresh,
+	 *        contains on return the id of the created refresh.  
+	 * @param aDialogId the returned dialog Id of the establishing dialog     
+     * @param aMethod the method
+     * @param aRemoteUri a remote-URI.
+	 * @param aFrom a From-header. If not given, aRegistrationId must be given,
+     *        so that the stack can fill in the From-header based on it.
+     *        The ownership is NOT transferred.
+	 * @param aElements contains optional SIP message headers and body.
+	 * @param aTo a To-header. The ownership is NOT transferred.	 
+	 * @param aRegistrationId registration id for the sender's AOR
+	 * @param aRefresh refresh flag. Refreshing of this SIP request is requested 
+     *        from the SIP Stack by setting this flag to ETrue.
+	 */		
+
+	void SendRequestAndCreateDialogL (TUint32& aRequestId,
+	                                  TUint32& aRefreshId,
+	                                  TUint32& aDialogId,
+		                              RStringF aMethod,
+		                              const CUri8& aRemoteUri,
+									  const CSIPFromHeader* aFrom,
+									  const CSIPMessageElements* aElements=0,
+									  const CSIPToHeader* aTo=0,
+									  TUint32 aRegistrationId=0,
+									  TBool aRefresh=EFalse);
+	/**
+	 * Creates a SIP request within a dialog and sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 * Contact header SHOULD NOT be created unless user intends to redirect 
+     * the future requests within this dialog to a different remote target. 
+     * Contact-header MUST NOT be set if aTargetRefresh flag is EFalse.
+	 * This provokes the Non-invite state machine
+	 *
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+     * @pre aMethod.Length() > 0
+	 * @pre aMethod != "REGISTER" | "CANCEL" | "ACK"
+	 * @param aDialogId the value of the Dialog-Id that was returned in 
+     *        a response to an earlier request that created the dialog.
+	 * @param aNewRequestId the returned request Id,
+     *        to be used to match a response to this request.
+	 * @param aRefreshId if the request is refresh,
+	 *        contains on return the id of the created refresh.
+     * @param aMethod the method of the request
+	 * @param aElements contains optional SIP message headers and body.
+	 * @param aTargetRefresh indicates if an unknown request 
+     *        is a target refresh request.
+	 * @param aRefresh refresh flag. Refreshing of this SIP request 
+     *        is requested from the SIP Stack by setting this flag to ETrue.
+	 */		
+
+	void SendRequestWithinDialogL (TUint32 aDialogId,
+		                           TUint32& aNewRequestId,
+		                           TUint32& aRefreshId,
+								   RStringF aMethod,
+								   const CSIPMessageElements* aElements=0,
+								   TBool aTargetRefresh=EFalse,
+								   TBool aRefresh=EFalse);
+
+	/**
+	 * Creates a SIP request within a dialog and sends it to the given destination.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+     * Contact-header MUST NOT be set.
+     * Üpdates an existing refresh within a dialog.
+     * This function can also be used to terminate an existing refresh
+     * by setting the Expires-header's value to zero.
+     * Expires header is mandatory.
+	 *
+	 * @pre CSIPConnection::State() == CSIPConnection::EActive.
+     * @pre aMethod.Length() > 0
+	 * @param aDialogId the value of the Dialog-Id that was returned in 
+     *        a response to an earlier request that created the dialog.
+	 * @param aRefreshId the value of the Refresh-Id that was returned
+     *        in a response to an earlier request that created the refresh.
+	 * @param aNewRequestId the returned request Id,
+     *        to be used to match a response to this request.
+	 * @param aElements contains optional SIP message headers and body.
+	 */		
+
+	void SendRequestWithinDialogL (TUint32 aDialogId,
+		                           TUint32 aRefreshId,
+								   TUint32& aNewRequestId,
+								   const CSIPMessageElements* aElements);
+
+	/**
+	 * Gets the Call-ID for a given dialog id.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 *
+	 * @param aDialogId a dialog id
+	 * @returns A Call-ID header if the dialog was found. 
+	 *          The ownership is transferred.
+	 */
+
+	CSIPCallIDHeader* CallIDL (TUint32 aDialogId);
+	
+	/**
+	 * Gets the local tag for a given dialog id.
+	 * Leaves on failure with a system wide or a SIP stack specific error code.
+	 *
+	 * @param aDialogId a dialog id
+	 * @returns Local tag if the dialog was found. 
+	 *          The ownership is transferred (the caller must call Close).
+	 */
+
+	RStringF LocalTagL (TUint32 aDialogId);	
+
+	/**
+	 * Gets the Contact-header that has been registered
+	 * with the given registration id.
+	 *
+	 * @param aRegistrationId the value of the registration-Id 
+     *        that was returned in a response to an earlier REGISTER request.
+     *        This value is used to identify the binding for which 
+     *        the Contact-header is to be fetched.
+	 * @returns the registered Contact-header
+	 */
+    CSIPContactHeader* ContactL (TUint32 aRegistrationId);
+
+	/**
+	 * Terminates a dialog. This function can be used to terminate a
+	 * dialog abnormally or when the dialog does not have any more
+	 * associations (E.g. After receiving a final response to a BYE request).
+	 *
+	 * @param aDialogId dialog id for the dialog to be terminated.
+	 * @returns system wide or SIP stack specific error code.
+	 */
+	TInt TerminateDialog (TUint32 aDialogId);
+
+	/**
+	 * Terminates a refresh abnormally.
+	 *
+	 * @param aRefreshId refresh id of the refresh to be terminated.
+	 * @returns system wide or SIP stack specific error code.
+	 */
+	TInt TerminateRefresh (TUint32 aRefreshId);
+
+
+    void SetRefreshIntervalL (TUint32 aRefreshId, TUint aInterval);
+
+
+    TUint RefreshIntervalL (TUint32 aRefreshId);
+
+
+	TInt TerminateDialogRefresh (TUint32 aDialogId,
+                                 TUint32 aRefreshId);
+
+    TInt TerminateRegistration (TUint32 aId);
+
+    TInt ResetDialogState (TUint32 aDialogId);
+
+	/**
+	 * Clear the link from CSIPClientConnection to CSIPClient.
+	 */
+	void DetachClient();
+
+	/**
+	 * Refreshes the connection
+	 */
+	void RefreshConnection() const;
+	
+	/**
+	 * Returns the connection error code
+	 */ 
+	TInt ConnectionErrorL() const;
+	
+private:
+
+	CSIPClientConnection (CSIPClient& aClient,
+                          MSIPClientConnectionObserver& aObserver,
+                          TUint32 aIapId);
+
+	void ConstructL ();
+
+    void CheckDialogCreationRequestL (const CSIPToHeader* aTo,
+                                      const CSIPFromHeader* aFrom,
+                                      const CSIPMessageElements* aElements,
+                                      TUint32 aRegistrationId,
+                                      TBool aRefresh=EFalse);
+
+    void CheckContactExpiresL (const CSIPMessageElements& aElements) const;
+	void CheckContactL (const CSIPMessageElements* aElements) const;
+    void CheckContactL (const CSIPMessageElements& aElements) const;
+    void CheckExpiresHeaderL (const CSIPMessageElements* aElements,
+                              TBool aZeroAllowed=EFalse) const;
+    void CheckExpiresHeaderL (const CSIPMessageElements& aElements,
+                              TBool aZeroAllowed=EFalse) const;
+
+                              
+private: // Data                              
+
+    CSIPClient& iClient;
+    MSIPClientConnectionObserver& iObserver;
+    TUint32 iIapId;
+	RSIPConnection* iConnection;
+    CSIPITCSender* iSender;
+	CSIPClientConnectionReceiver* iReceiver;
+    TBool iAdded;
+    RStringF iTag;
+    RStringF iContactHeaderName;
+    RStringF iExpiresHeaderName;
+
+private: // For testing purposes
+
+    UNIT_TEST(CSIPClientConnectionTest)
+    UNIT_TEST(CSIPClientTest)
+	};
+
+#endif // CSIPCLIENTCONNECTION_H
+
+// End of File