diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Client/src/CSIPClientConnection.cpp --- /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 addrBuf; + TIpcArgs args(TIpcArgs::ENothing); + args.Set(ESipItcArgLocalAddr, &addrBuf); + // SIP ids always required by the SIP server + TSIPIds dummyIds; + TPckgBuf 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 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 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 opt(TSIPSockOpt(aOptionName,aOptionLevel,aOption)); + TIpcArgs args(TIpcArgs::ENothing); + args.Set(ESipItcArgSockOpt, &opt); + // SIP ids always required by the SIP server + TSIPIds dummyIds; + TPckgBuf 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( + 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( + 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 expireHeaders = + aElements->UserHeadersL(iExpiresHeaderName); + CleanupClosePushL(expireHeaders); + if (expireHeaders.Count() == 1) + { + CSIPExpiresHeader* expires = + static_cast(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( + 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 contacts = + aElements.UserHeadersL(iContactHeaderName); + CleanupClosePushL(contacts); + + if (contacts.Count() != 1) + { + User::Leave(KErrArgument); + } + + CSIPContactHeader* contact = static_cast(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 contacts = + aElements.UserHeadersL(iContactHeaderName); + CleanupClosePushL(contacts); + TInt contactCount = contacts.Count(); + if (contactCount > 1) + { + User::Leave(KErrArgument); + } + if (contactCount==1 && + static_cast(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 expireHeaders = + aElements.UserHeadersL(iExpiresHeaderName); + CleanupClosePushL(expireHeaders); + if (expireHeaders.Count() != 1) + { + User::Leave(KErrArgument); + } + if (!aZeroAllowed && + static_cast(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; + }