realtimenetprots/sipfw/SIP/Client/src/CSIPClientConnection.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Client/src/CSIPClientConnection.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,952 @@
+// 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          : CSIPClientConnection.cpp
+// Part of       : SIPClient
+// Version       : SIP/6.0 
+//
+
+
+
+
+#include "sipclientserver.h"
+#include "sipclientconnection.h"
+#include "sipclient.h"
+#include "RSIPConnection.h"
+#include "CSIPITCSender.h"
+#include "CSIPClientConnectionReceiver.h"
+#include "sipmessageelements.h"
+#include "siprequestelements.h"
+#include "sipresponseelements.h"
+#include "siptoheader.h"
+#include "sipfromheader.h"
+#include "sipcontactheader.h"
+#include "sipexpiresheader.h"
+#include "siptoheader.h"
+#include "siprouteheader.h"
+#include "sipcallidheader.h"
+#include "sipaddress.h"
+#include "uricontainer.h"
+#include "sipuri.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPClientConnection* 
+CSIPClientConnection::NewL (CSIPClient& aClient,
+                            MSIPClientConnectionObserver& aObserver,
+                            TUint32 aIapId)
+	{
+    CSIPClientConnection* self = 
+        CSIPClientConnection::NewLC (aClient,aObserver,aIapId);
+    CleanupStack::Pop (self);
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPClientConnection* 
+CSIPClientConnection::NewLC (CSIPClient& aClient,
+                             MSIPClientConnectionObserver& aObserver,
+                             TUint32 aIapId)
+	{
+	CSIPClientConnection* self = 
+        new(ELeave)CSIPClientConnection(aClient,aObserver,aIapId);
+    CleanupStack::PushL (self);
+    self->ConstructL ();
+    return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::CSIPClientConnection
+// -----------------------------------------------------------------------------
+//
+CSIPClientConnection::CSIPClientConnection (
+                                        CSIPClient& aClient,
+                                        MSIPClientConnectionObserver& aObserver,
+                                        TUint32 aIapId)
+ : iClient (aClient),
+   iObserver (aObserver),
+   iIapId (aIapId),
+   iAdded (EFalse)
+	{
+	iTag = SIPStrings::StringF(SipStrConsts::ETag);
+    iContactHeaderName = SIPStrings::StringF(SipStrConsts::EContactHeader);
+    iExpiresHeaderName = SIPStrings::StringF(SipStrConsts::EExpiresHeader);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::ConstructL ()
+	{
+	iConnection = new(ELeave)RSIPConnection(iIapId);
+    TInt err = iConnection->Open(iClient.SIP());
+    if (err != KErrNone)
+        {
+        User::Leave(err);
+        }
+    iSender = CSIPITCSender::NewL(*iConnection);
+    iReceiver = new(ELeave)CSIPClientConnectionReceiver(*iConnection,iObserver);
+    iClient.AddL(this);
+    iAdded = ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::~CSIPClientConnection
+// -----------------------------------------------------------------------------
+//
+CSIPClientConnection::~CSIPClientConnection()
+	{
+    if (iAdded)
+        {
+        iClient.Remove(this);
+        }
+    delete iSender;
+    delete iReceiver;
+	if (iConnection)
+        {
+        iConnection->Close();
+        }
+    delete iConnection;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::State
+// -----------------------------------------------------------------------------
+//
+CSIPConnection::TState CSIPClientConnection::State () const
+    {
+    return iConnection->State();
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::IapId
+// -----------------------------------------------------------------------------
+//
+TUint32 CSIPClientConnection::IapId () const
+    {
+    return iIapId;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::GetLocalAddrL
+// -----------------------------------------------------------------------------
+//    
+void CSIPClientConnection::GetLocalAddrL(TInetAddr& aAddr) const
+    {
+    TPckgBuf<TInetAddr> addrBuf;
+    TIpcArgs args(TIpcArgs::ENothing);
+    args.Set(ESipItcArgLocalAddr, &addrBuf);
+    // SIP ids always required by the SIP server
+    TSIPIds dummyIds;
+    TPckgBuf<TSIPIds> dummySipIdsPckg(dummyIds);
+    args.Set(ESipItcArgIds, &dummySipIdsPckg);
+	TInt err = iConnection->Send(ESipItcGetLocalAddr,args);
+	if (err != KErrNone)
+	    {
+	    User::Leave(err);
+	    }
+	aAddr = addrBuf();
+    }
+    
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SetOptL
+// -----------------------------------------------------------------------------
+//    
+void CSIPClientConnection::SetOptL (TUint aOptionName,
+                                    TUint aOptionLevel,
+                                    const TDesC8& aOption)
+    {
+    TPckgBuf<TSIPSockOpt> opt(TSIPSockOpt(aOptionName,aOptionLevel));
+    TIpcArgs args(TIpcArgs::ENothing);
+    args.Set(ESipItcArgSockOpt, &opt);
+    args.Set(ESipItcArgSockOptDes, &aOption);
+    // SIP ids always required by the SIP server
+    TSIPIds dummyIds;
+    TPckgBuf<TSIPIds> dummySipIdsPckg(dummyIds);
+    args.Set(ESipItcArgIds, &dummySipIdsPckg);
+	TInt err = iConnection->Send(ESipItcSetSIPSockOptWithDes,args);
+	if (err != KErrNone)
+	    {
+	    User::Leave(err);
+	    }
+    }
+	   
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SetOptL
+// -----------------------------------------------------------------------------
+// 	         	                         
+void CSIPClientConnection::SetOptL (TUint aOptionName,
+                                    TUint aOptionLevel,
+                                    TInt aOption)
+    {
+    TPckgBuf<TSIPSockOpt> opt(TSIPSockOpt(aOptionName,aOptionLevel,aOption));
+    TIpcArgs args(TIpcArgs::ENothing);
+    args.Set(ESipItcArgSockOpt, &opt);    
+    // SIP ids always required by the SIP server
+    TSIPIds dummyIds;
+    TPckgBuf<TSIPIds> dummySipIdsPckg(dummyIds);
+    args.Set(ESipItcArgIds, &dummySipIdsPckg);
+	TInt err = iConnection->Send(ESipItcSetSIPSockOpt,args);
+	if (err != KErrNone)
+	    {
+	    User::Leave(err);
+	    }  
+    }
+    
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SetOutboundProxyL
+// -----------------------------------------------------------------------------
+//    
+void 
+CSIPClientConnection::SetOutboundProxyL (TUint32 aRegistrationId,
+                                         const CSIPRouteHeader& aOutboundProxy)
+    {
+    __ASSERT_ALWAYS (aRegistrationId > 0, User::Leave(KErrArgument));
+    
+	TSIPIds ids;
+	ids.iRegistrationId = aRegistrationId;
+	iSender->SetOutboundProxyL(ids,aOutboundProxy);    
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::RemoveOutboundProxy
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClientConnection::RemoveOutboundProxy (TUint32 aRegistrationId)
+	{
+    if (!aRegistrationId)
+        {
+        return KErrArgument;
+        }
+	TSIPIds ids;
+	ids.iRegistrationId = aRegistrationId;
+	return iSender->Send(ids,ESipItcRemoveOutboundProxy);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::OutboundProxyL
+// -----------------------------------------------------------------------------
+//
+CSIPRouteHeader* CSIPClientConnection::OutboundProxyL (TUint32 aRegistrationId)
+	{
+    __ASSERT_ALWAYS (aRegistrationId > 0, User::Leave(KErrArgument));
+
+	TSIPIds ids;
+	ids.iRegistrationId = aRegistrationId;
+	return static_cast<CSIPRouteHeader*>(
+	    iSender->ReadSIPHeaderL(ids,ESipItcOutboundProxy,
+	        SIPStrings::StringF(SipStrConsts::ERouteHeader)));
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::AorL
+// -----------------------------------------------------------------------------
+//
+CSIPFromHeader* CSIPClientConnection::AorL (TUint32 aRegistrationId)
+    {
+    __ASSERT_ALWAYS (aRegistrationId > 0, User::Leave(KErrArgument));
+
+	TSIPIds ids;
+	ids.iRegistrationId = aRegistrationId;
+	return static_cast<CSIPFromHeader*>(
+	    iSender->ReadSIPHeaderL(ids,ESipItcGetFromHeader,
+	        SIPStrings::StringF(SipStrConsts::EFromHeader)));
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendRegisterL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendRegisterL (TUint32& aRequestId,
+										  const CSIPToHeader& aTo,
+										  const CSIPFromHeader& aFrom,
+										  const CSIPMessageElements& aElements,
+										  const CUri8* aRemoteUri,
+										  const CSIPRouteHeader* aProxy,
+										  TBool aRefresh,
+										  TBool aSendWithExpires,
+										  TBool aCacheOutboundProxyIP)
+    {
+    __ASSERT_ALWAYS (!aTo.HasParam(iTag), User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (!aFrom.HasParam(iTag), User::Leave(KErrArgument));
+
+    CheckContactExpiresL(aElements);
+    if (aElements.UserHeaderCount(iExpiresHeaderName) > 0)
+        {
+        CheckExpiresHeaderL(aElements);
+        }
+    TSipItcFunctions func;
+	TSIPIds ids;
+	ids.iRefresh = aRefresh;
+	ids.iSendWithExpires = aSendWithExpires;
+	ids.iCacheOutboundProxyIP = aCacheOutboundProxyIP;
+    if (aProxy)
+    	{
+        func = ESipItcRegisterAndSetOutboundProxy;
+        }
+    else
+        {
+		func = ESipItcRegister;
+		}
+	iSender->SendL(ids,func,SIPStrings::StringF(SipStrConsts::EEmpty),
+	               aRemoteUri,&aFrom,&aTo,&aElements,aProxy);
+	aRequestId = ids.iRequestId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::UpdateRegistrationL
+// -----------------------------------------------------------------------------
+//
+void 
+CSIPClientConnection::UpdateRegistrationL (TUint32 aRegistrationId,
+                                           TUint32& aNewRequestId,
+                                           const CSIPMessageElements* aElements)
+	{
+    __ASSERT_ALWAYS (aRegistrationId > 0, User::Leave(KErrArgument));
+    if (aElements && aElements->UserHeaderCount(iContactHeaderName) > 0)
+        {
+        CheckContactExpiresL(*aElements);
+        }
+    if (aElements && aElements->UserHeaderCount(iExpiresHeaderName) > 0)
+        {
+        CheckExpiresHeaderL(*aElements);
+        }
+
+	TSIPIds ids;
+	ids.iRegistrationId = aRegistrationId;
+	iSender->SendL(ids,ESipItcUpdateRegistration,aElements);
+	aNewRequestId = ids.iRequestId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::UnregisterL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::UnregisterL (TUint32 aRegistrationId,
+				                        TUint32& aNewRequestId,
+                                        const CSIPMessageElements* aElements)
+	{
+    __ASSERT_ALWAYS (aRegistrationId > 0, User::Leave(KErrArgument));
+	if (aElements != 0)
+		{
+		__ASSERT_ALWAYS (aElements->UserHeaderCount(iContactHeaderName) == 0,
+		                 User::Leave(KErrArgument));
+        __ASSERT_ALWAYS (aElements->UserHeaderCount(iExpiresHeaderName) == 0,
+		                 User::Leave(KErrArgument)); 
+		}
+	TSIPIds ids;
+	ids.iRegistrationId = aRegistrationId;
+	iSender->SendL(ids,ESipItcUnRegister,aElements);
+	aNewRequestId = ids.iRequestId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::FetchRegistrationsL
+// -----------------------------------------------------------------------------
+//
+void 
+CSIPClientConnection::FetchRegistrationsL (const CSIPRequestElements& aElements,
+                                           TUint32& aRequestId)
+	{
+    __ASSERT_ALWAYS (aElements.Method().DesC().Length()==0,
+                     User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aElements.FromHeader() != 0, User::Leave(KErrArgument));
+	__ASSERT_ALWAYS (
+        aElements.MessageElements().UserHeaderCount(iContactHeaderName) == 0,
+        User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (
+        aElements.MessageElements().UserHeaderCount(iExpiresHeaderName) == 0,
+		User::Leave(KErrArgument));
+
+	TSIPIds ids;
+	iSender->SendL(ids,ESipItcFetchRegistrations,aElements);
+	aRequestId = ids.iRequestId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendRequestL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendRequestL (const CSIPRequestElements& aElements,
+                                         TUint32& aRequestId,
+                                         TUint32 aRegistrationId,
+                                         TBool aRefresh)
+	{
+    __ASSERT_ALWAYS (aElements.Method().DesC().Length() > 0,
+                     User::Leave(KErrArgument));
+    if (aRefresh)
+        {
+        CheckExpiresHeaderL(aElements.MessageElements());
+        }
+	TSIPIds ids;
+	ids.iRegistrationId = aRegistrationId;
+	if (!aRegistrationId)
+        {
+        __ASSERT_ALWAYS(aElements.FromHeader()!=0, User::Leave(KErrArgument));
+        }
+    ids.iRefresh = aRefresh;    
+	iSender->SendL(ids,ESipItcSendRequest,aElements);
+	aRequestId = ids.iRequestId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendRequestAndUpdateRefreshL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendRequestAndUpdateRefreshL (
+                                        TUint32 aRefreshId,
+                                        TUint32& aNewRequestId,
+						                const CSIPMessageElements* aElements)
+	{
+    __ASSERT_ALWAYS (aRefreshId > 0, User::Leave(KErrArgument));
+
+    TSIPIds ids;
+	ids.iRefreshId = aRefreshId;
+	iSender->SendL(ids,ESipItcSendRequestAndUpdateRefresh,aElements);
+	aNewRequestId = ids.iRequestId;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendRequestAndTerminateRefreshL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendRequestAndTerminateRefreshL (
+                            TUint32 aRefreshId,
+                            TUint32& aNewRequestId,
+						    const CSIPMessageElements* aElements)
+	{
+    __ASSERT_ALWAYS (aRefreshId > 0, User::Leave(KErrArgument));
+
+    if (aElements)
+        {
+        RPointerArray<CSIPHeaderBase> expireHeaders = 
+            aElements->UserHeadersL(iExpiresHeaderName);
+        CleanupClosePushL(expireHeaders);
+        if (expireHeaders.Count() == 1)
+            {
+            CSIPExpiresHeader* expires = 
+                static_cast<CSIPExpiresHeader*>(expireHeaders[0]);
+            __ASSERT_ALWAYS (expires->Value()==0, User::Leave(KErrArgument));
+            }
+        CleanupStack::PopAndDestroy(1); // expireHeaders
+        }
+	
+    TSIPIds ids;
+	ids.iRefreshId = aRefreshId;
+	iSender->SendL(ids,ESipItcSendRequestAndTerminateRefresh,aElements);
+	aNewRequestId = ids.iRequestId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendResponseL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendResponseL (const CSIPResponseElements& aElements,
+										  TUint32 aRequestId)
+	{
+    __ASSERT_ALWAYS (aRequestId > 0, User::Leave(KErrArgument));
+
+	TSIPIds ids;
+	ids.iRequestId = aRequestId;
+	iSender->SendL(ids,ESipItcSendResponse,aElements);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendAckL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendAckL (TUint32 aDialogId,
+									 TUint32 aRequestId,
+									 const CSIPMessageElements* aElements)
+	{
+    __ASSERT_ALWAYS (aRequestId > 0, User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aDialogId > 0, User::Leave(KErrArgument));
+
+	TSIPIds ids;
+	ids.iDialogId = aDialogId;
+	ids.iRequestId = aRequestId;
+	iSender->SendL(ids,ESipItcSendRequestInDialog,
+	               SIPStrings::StringF(SipStrConsts::EAck),aElements);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendCancelL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendCancelL (TUint32 aInviteRequestId,
+										TUint32& aCancelRequestId)
+	{
+    __ASSERT_ALWAYS (aInviteRequestId > 0, User::Leave(KErrArgument));
+
+	TSIPIds ids;
+    ids.iRequestId = aInviteRequestId;
+	iSender->SendL(ids,ESipItcSendCancel);
+	aCancelRequestId = ids.iRequestId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendResponseAndCreateDialogL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendResponseAndCreateDialogL (
+                                    const CSIPResponseElements& aElements,
+								    TUint32 aRequestId,
+								    TUint32& aDialogId,
+								    TUint32 aRegistrationId)
+	{
+    __ASSERT_ALWAYS (aRequestId > 0, User::Leave(KErrArgument));
+    
+    CheckContactL(aElements.MessageElements());
+
+	TSIPIds ids;
+	ids.iRequestId = aRequestId;
+	ids.iRegistrationId = aRegistrationId;
+	iSender->SendL(ids,ESipItcSendResponseAndCreateDialog,aElements);
+	aDialogId= ids.iDialogId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendResponseWithinDialogL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendResponseWithinDialogL (
+                                 const CSIPResponseElements& aElements,
+								 TUint32 aRequestId,
+								 TUint32 aDialogId,
+								 TBool aTargetRefresh)
+	{
+    __ASSERT_ALWAYS (aRequestId > 0, User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aDialogId > 0, User::Leave(KErrArgument));
+
+	TSIPIds ids;
+	ids.iRequestId = aRequestId;
+	ids.iDialogId = aDialogId;
+	ids.iTargetRefresh = aTargetRefresh;
+    if (aTargetRefresh)
+        {
+        CheckContactL(aElements.MessageElements());
+        }
+    iSender->SendL(ids,ESipItcSendResponseInDialog,aElements);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendRequestAndCreateDialogL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendRequestAndCreateDialogL (
+                                    TUint32& aRequestId,
+                                    TUint32& aRefreshId,
+                                    TUint32& aDialogId,
+                                    RStringF aMethod,
+                                    const CUri8& aRemoteUri,
+                                    const CSIPFromHeader* aFrom,
+                                    const CSIPMessageElements* aElements,
+                                    const CSIPToHeader* aTo,
+                                    TUint32 aRegistrationId,
+                                    TBool aRefresh)
+	{
+    __ASSERT_ALWAYS (aMethod.DesC().Length() > 0,User::Leave(KErrArgument));
+    CheckDialogCreationRequestL (aTo,aFrom,aElements,aRegistrationId,aRefresh);
+	TSIPIds ids;
+	ids.iDialogId = aDialogId;
+    ids.iRegistrationId = aRegistrationId;
+    TSipItcFunctions func = ESipItcSendRequestAndCreateDialog;
+    ids.iRefresh = aRefresh;
+    iSender->SendL(ids,func,aMethod,&aRemoteUri,aFrom,aTo,aElements);
+	aRequestId = ids.iRequestId;
+	aRefreshId = ids.iRefreshId;
+	aDialogId= ids.iDialogId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendRequestWithinDialogL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendRequestWithinDialogL (
+                                TUint32 aDialogId,
+							    TUint32& aNewRequestId,
+							    TUint32& aRefreshId,
+                                RStringF aMethod,
+							    const CSIPMessageElements* aElements,
+								TBool aTargetRefresh,
+								TBool aRefresh)
+	{
+    __ASSERT_ALWAYS (aDialogId > 0, User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aMethod.DesC().Length() > 0, User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aMethod != SIPStrings::StringF(SipStrConsts::ERegister),
+                     User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aMethod != SIPStrings::StringF(SipStrConsts::ECancel),
+                     User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aMethod != SIPStrings::StringF(SipStrConsts::EAck),
+                     User::Leave(KErrArgument));    
+    if (aTargetRefresh)
+        {
+        CheckContactL(aElements);
+        }
+	TSIPIds ids;
+    ids.iDialogId = aDialogId;
+    ids.iTargetRefresh = aTargetRefresh;    
+    ids.iRefresh = aRefresh;
+	if (aRefresh)
+		{
+        __ASSERT_ALWAYS(aMethod != SIPStrings::StringF(SipStrConsts::EMessage),
+                        User::Leave(KErrArgument));
+		CheckExpiresHeaderL(aElements);
+		}
+    iSender->SendL(ids,ESipItcSendRequestInDialog,aMethod,aElements);
+	aNewRequestId = ids.iRequestId;
+	aRefreshId = ids.iRefreshId;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SendRequestWithinDialogL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::SendRequestWithinDialogL (
+                                    TUint32 aDialogId,
+                                    TUint32 aRefreshId,
+							        TUint32& aNewRequestId,
+							        const CSIPMessageElements* aElements)
+	{
+    __ASSERT_ALWAYS (aDialogId > 0, User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aRefreshId > 0, User::Leave(KErrArgument));
+    CheckContactL(aElements);
+    CheckExpiresHeaderL(aElements,ETrue);
+
+	TSIPIds ids;
+    ids.iDialogId = aDialogId;
+    ids.iRefreshId = aRefreshId;
+    iSender->SendL(ids,ESipItcSendRequestInDialogAndUpdateRefresh,aElements);
+	aNewRequestId = ids.iRequestId;
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::CallIDL
+// -----------------------------------------------------------------------------
+//	
+CSIPCallIDHeader* CSIPClientConnection::CallIDL (TUint32 aDialogId)
+    {
+    __ASSERT_ALWAYS (aDialogId > 0, User::Leave(KErrArgument));
+
+	TSIPIds ids;
+	ids.iDialogId = aDialogId;
+	return iSender->ReadCallIDHeaderL(ids);   
+    }
+    
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::LocalTagL
+// -----------------------------------------------------------------------------
+//	
+RStringF CSIPClientConnection::LocalTagL (TUint32 aDialogId)
+    {
+    __ASSERT_ALWAYS (aDialogId > 0, User::Leave(KErrArgument));
+
+	TSIPIds ids;
+	ids.iDialogId = aDialogId;
+	return iSender->ReadLocalTagL(ids);   
+    }    
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::ContactL
+// -----------------------------------------------------------------------------
+//	
+CSIPContactHeader* CSIPClientConnection::ContactL (TUint32 aRegistrationId)
+    {
+    __ASSERT_ALWAYS (aRegistrationId > 0, User::Leave(KErrArgument));
+
+	TSIPIds ids;
+	ids.iRegistrationId = aRegistrationId;
+	return static_cast<CSIPContactHeader*>(
+	    iSender->ReadSIPHeaderL(ids,ESipItcGetRegisteredContact,
+	        SIPStrings::StringF(SipStrConsts::EContactHeader)));
+    }
+	
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::TerminateDialog
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClientConnection::TerminateDialog (TUint32 aDialogId)
+	{
+    if (!aDialogId) 
+        {
+        return KErrArgument;
+        }
+	TSIPIds ids;
+	ids.iDialogId = aDialogId;
+	return iSender->Send(ids,ESipItcTerminateDialog);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::TerminateRefresh
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClientConnection::TerminateRefresh (TUint32 aRefreshId)
+	{
+    if (!aRefreshId)
+        {
+        return KErrArgument;
+        }
+	TSIPIds ids;
+	ids.iRefreshId = aRefreshId;
+	return iSender->Send(ids,ESipItcTerminateRefresh);
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::SetRefreshIntervalL
+// -----------------------------------------------------------------------------
+//	
+void CSIPClientConnection::SetRefreshIntervalL (TUint32 aRefreshId,
+                                                TUint aInterval)
+    {
+    __ASSERT_ALWAYS (aRefreshId > 0, User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aInterval > 0, User::Leave(KErrArgument));
+    __ASSERT_ALWAYS (aInterval <= KMaxTInt, User::Leave(KErrArgument));        
+	TSIPIds ids;
+	ids.iRefreshId = aRefreshId;
+    iSender->SetRefreshIntervalL(ids,aInterval);    
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::RefreshIntervalL
+// -----------------------------------------------------------------------------
+//
+TUint CSIPClientConnection::RefreshIntervalL (TUint32 aRefreshId)
+    {
+    __ASSERT_ALWAYS (aRefreshId > 0, User::Leave(KErrArgument));   
+	TSIPIds ids;
+	ids.iRefreshId = aRefreshId;
+	TInt interval = 0;
+	iSender->GetRefreshIntervalL(ids, interval);
+	__ASSERT_ALWAYS (interval >= 0, User::Leave(KErrUnderflow));
+    return interval;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::TerminateDialogRefresh
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClientConnection::TerminateDialogRefresh (TUint32 aDialogId,
+                                                   TUint32 aRefreshId)
+    {
+    if (!aDialogId || !aRefreshId)
+        {
+        return KErrArgument;
+        }
+	TSIPIds ids;
+    ids.iDialogId = aDialogId;
+	ids.iRefreshId = aRefreshId;
+	return iSender->Send(ids,ESipItcTerminateDialogRefresh);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::TerminateRegistration
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClientConnection::TerminateRegistration (TUint32 aId)
+    {
+    if (!aId)
+        {
+        return KErrArgument;
+        }
+	TSIPIds ids;
+	ids.iRegistrationId = aId;
+	return iSender->Send(ids,ESipItcTerminateRegistration);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::ResetDialogState
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClientConnection::ResetDialogState (TUint32 aDialogId)
+    {
+    if (!aDialogId) 
+        {
+        return KErrArgument;
+        }
+	TSIPIds ids;
+	ids.iDialogId = aDialogId;
+	return iSender->Send(ids,ESipItcResetDialogState);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::DetachClient
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::DetachClient()
+	{
+	iAdded = EFalse;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::CheckDialogCreationRequestL
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::CheckDialogCreationRequestL (
+    const CSIPToHeader* aTo,
+    const CSIPFromHeader* aFrom,
+    const CSIPMessageElements* aElements,
+    TUint32 aRegistrationId,
+    TBool aRefresh)
+    {
+    if (aTo)
+        {
+        __ASSERT_ALWAYS (!aTo->HasParam(iTag), User::Leave(KErrArgument));       
+        }
+    CheckContactL(aElements);
+	if (!aRegistrationId)
+        {
+        __ASSERT_ALWAYS(aFrom!=0,User::Leave(KErrArgument));
+        }
+    if (aRefresh)
+        {
+        CheckExpiresHeaderL(aElements);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::CheckContactExpiresL
+// -----------------------------------------------------------------------------
+//
+void 
+CSIPClientConnection::CheckContactExpiresL (
+                                    const CSIPMessageElements& aElements) const
+    {
+    RPointerArray<CSIPHeaderBase> contacts = 
+        aElements.UserHeadersL(iContactHeaderName);
+    CleanupClosePushL(contacts);
+
+	if (contacts.Count() != 1)
+        {
+        User::Leave(KErrArgument);
+        }
+
+    CSIPContactHeader* contact = static_cast<CSIPContactHeader*>(contacts[0]);
+	if (contact->Star())
+        {
+        User::Leave(KErrArgument);
+        }
+
+	if (contact->ExpiresParameter() == 0)
+        {
+        User::Leave(KErrArgument);
+		}
+
+    CleanupStack::PopAndDestroy(1); // contacts
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::CheckContactL
+// -----------------------------------------------------------------------------
+//
+void 
+CSIPClientConnection::CheckContactL (const CSIPMessageElements* aElements) const
+	{
+    if (aElements != 0)
+        {
+        CheckContactL(*aElements);
+        }
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::CheckContactL
+// -----------------------------------------------------------------------------
+//
+void 
+CSIPClientConnection::CheckContactL (const CSIPMessageElements& aElements) const
+	{
+    RPointerArray<CSIPHeaderBase> contacts = 
+        aElements.UserHeadersL(iContactHeaderName);
+    CleanupClosePushL(contacts);
+    TInt contactCount = contacts.Count();
+	if (contactCount > 1)
+        {
+        User::Leave(KErrArgument);
+        }
+	if (contactCount==1 && 
+        static_cast<CSIPContactHeader*>(contacts[0])->Star())
+        {
+        User::Leave(KErrArgument);
+        }
+    CleanupStack::PopAndDestroy(1); // contacts
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::CheckExpiresHeaderL
+// -----------------------------------------------------------------------------
+//
+void
+CSIPClientConnection::CheckExpiresHeaderL (const CSIPMessageElements* aElements,
+                                           TBool aZeroAllowed) const
+    {
+	if (aElements == 0) 
+        {
+        User::Leave(KErrArgument);
+        }
+    CheckExpiresHeaderL (*aElements,aZeroAllowed);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::CheckExpiresHeaderL
+// -----------------------------------------------------------------------------
+//
+void
+CSIPClientConnection::CheckExpiresHeaderL (const CSIPMessageElements& aElements,
+                                           TBool aZeroAllowed) const
+    {
+    RPointerArray<CSIPHeaderBase> expireHeaders = 
+        aElements.UserHeadersL(iExpiresHeaderName);
+    CleanupClosePushL(expireHeaders);
+    if (expireHeaders.Count() != 1)
+        {
+        User::Leave(KErrArgument);
+        }
+    if (!aZeroAllowed &&
+        static_cast<const CSIPExpiresHeader*>(expireHeaders[0])->Value() == 0)
+        {
+        User::Leave(KErrArgument);
+        }
+    CleanupStack::PopAndDestroy(1); // expireHeaders
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::RefreshConnection
+// -----------------------------------------------------------------------------
+//
+void CSIPClientConnection::RefreshConnection() const
+	{
+	TSIPIds ids;
+	ids.iIapId = iIapId;
+	iSender->Send(ids,ESipItcRefreshConnection);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPClientConnection::ConnectionErrorL
+// -----------------------------------------------------------------------------
+//
+TInt CSIPClientConnection::ConnectionErrorL() const
+	{
+	TSIPIds ids;
+	ids.iIapId = iIapId;
+	iSender->SendL(ids,ESipItcGetConnectionError);
+	return ids.iConnectionError;
+	}