diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Refreshes/src/CSipRegisterRefresh.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Refreshes/src/CSipRegisterRefresh.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,270 @@ +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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 : CSipRegisterRefresh.cpp +// Part of : SIPRefreshes +// Version : SIP/4.0 +// + + + +#include "SipStackServerDefs.h" +#include "MTransactionUser.h" +#include "MRefreshOwner.h" +#include "CSipRefreshMgr.h" +#include "siprequest.h" +#include "sipresponse.h" +#include "sipcontactheader.h" +#include "sipaddress.h" +#include "sipcseqheader.h" +#include "siptoheader.h" +#include "sipfromheader.h" +#include "SipLogs.h" +#include "sipcallidheader.h" +#include "sipuri.h" +#include "siprouteheader.h" +#include "siprecordrouteheader.h" +#include "SipAssert.h" +#include "CSipRegisterRefresh.h" +#include "sipstrings.h" +#include "sipstrconsts.h" +#include "CSIPResponseUtility.h" + + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::NewLC +// ----------------------------------------------------------------------------- +// +CSipRegisterRefresh* CSipRegisterRefresh::NewLC( + MTransactionUser& aTU, + MTimerManager& aTimerMgr, + CSIPSec& aSIPSec, + CSipRefreshMgr& aRefreshMgr, + TRegistrationId aRegistrationId, + CSIPRequest* aRequest, + MRefreshOwner* aOwner, + MSIPSecUser& aSIPSecUser, + CURIContainer& aRemoteTarget) + { + __SIP_ASSERT_LEAVE (aOwner, KErrArgument); + + CSipRegisterRefresh* self = + new(ELeave)CSipRegisterRefresh(aTU, aTimerMgr, aSIPSec, aRefreshMgr, + aRegistrationId, aOwner, aSIPSecUser); + + CleanupStack::PushL (self); + self->ConstructL(aRequest, aRemoteTarget); + return self; + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::~CSipRegisterRefresh +// ----------------------------------------------------------------------------- +// +CSipRegisterRefresh::~CSipRegisterRefresh () + { + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::CSipRegisterRefresh +// ----------------------------------------------------------------------------- +// +CSipRegisterRefresh::CSipRegisterRefresh (MTransactionUser& aTU, + MTimerManager& aTimerMgr, + CSIPSec& aSIPSec, + CSipRefreshMgr& aRefreshMgr, + TRegistrationId aRegistrationId, + MRefreshOwner* aOwner, + MSIPSecUser& aSIPSecUser) + : CSipRefreshBase (aTU, aTimerMgr, aSIPSec, aRefreshMgr, + aRegistrationId, aOwner, aSIPSecUser) + { + iContactHeaderName = SIPStrings::StringF(SipStrConsts::EContactHeader); + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::ConstructL +// ----------------------------------------------------------------------------- +// +void CSipRegisterRefresh::ConstructL (CSIPRequest* aRequest, + CURIContainer& aRemoteTarget) + { + __SIP_ASSERT_LEAVE (aRequest, KErrArgument); + + __SIP_ASSERT_LEAVE ( + aRequest->Method() == SIPStrings::StringF(SipStrConsts::ERegister), + KErrArgument); + + CSIPContactHeader* contact = + static_cast(aRequest->Header(iContactHeaderName,0)); + + __SIP_ASSERT_LEAVE (contact, KErrArgument); + + CSipRefreshBase::BaseConstructL(aRemoteTarget,*aRequest); + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::SIPSecUser +// From MTransactionOwner +// ----------------------------------------------------------------------------- +// +const MSIPSecUser* CSipRegisterRefresh::SIPSecUser() const + { + // In case of REGISTER, the refresh must not act as a middle man. + // This is to make the MSIPSecUser::TrustedUser() work correctly. + return &iSIPSecUser; + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::Forward2xxResponseToCallerL +// ----------------------------------------------------------------------------- +// +void CSipRegisterRefresh::Forward2xxResponseToCallerL (CSIPResponse* aResponse) + { + RefreshReceivedL(iCurrentTransactionId, aResponse); + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::SetExpirationTimeToRequestL +// ----------------------------------------------------------------------------- +// +void CSipRegisterRefresh::SetExpirationTimeToRequestL ( + CSIPRequest& aRequest, + TUint aExpirationTimeInSeconds) + { + CSIPContactHeader* contact = static_cast( + aRequest.Header(iContactHeaderName,0)); + + __SIP_ASSERT_LEAVE (contact, KErrArgument); + + contact->SetExpiresParameterL(aExpirationTimeInSeconds); + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::ExpirationTimeFromResponseContact +// ----------------------------------------------------------------------------- +// +TInt CSipRegisterRefresh::ExpirationTimeFromResponseContact ( + CSIPResponse& aResponse) + { + TSglQueIter iter = + iRequest->Headers(iContactHeaderName); + if (iter != 0) + { + CSIPHeaderBase* header = iter; + CSIPContactHeader* reqContact = static_cast(header); + + // search the contact header of the response which match to one + // defined in the request + CSIPContactHeader* resContact = + CSIPResponseUtility::ContactHeader( *reqContact, aResponse ); + + if ( resContact && resContact->ExpiresParameter() >= 0 ) + { + return resContact->ExpiresParameter(); + } + } + + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::SetExpirationTimeToResponseL +// ----------------------------------------------------------------------------- +// +void CSipRegisterRefresh::SetExpirationTimeToResponseL( + CSIPResponse& aResponse, + TUint aExpirationTimeInSeconds) + { + TBool setExpiresInContact = EFalse; + + if (aResponse.HasHeader(iContactHeaderName)) + { + __SIP_ASSERT_LEAVE ( + iRequest->HasHeader(iContactHeaderName), KErrGeneral); + + CSIPContactHeader* reqContact = + static_cast( + iRequest->Header(iContactHeaderName,0)); + + CSIPContactHeader* resContact = + CSIPResponseUtility::ContactHeader( *reqContact, aResponse ); + + if ( resContact ) + { + resContact->SetExpiresParameterL(aExpirationTimeInSeconds); + setExpiresInContact = ETrue; + } + } + + if (!setExpiresInContact) + { + SetExpireTimeToResponseExpiresHeaderL(aResponse, + aExpirationTimeInSeconds); + } + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::ExpirationTimeFromRequestL +// ----------------------------------------------------------------------------- +// +TInt CSipRegisterRefresh::ExpirationTimeFromRequestL(CSIPRequest& /*aRequest*/) + { + return iOwner->RefreshDurationL(); + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::ExpirationTimeFromResponse +// ----------------------------------------------------------------------------- +// +TInt CSipRegisterRefresh::ExpirationTimeFromResponse (CSIPResponse& aResponse) + { + TInt time = 0; + + time = ExpirationTimeFromResponseContact(aResponse); + + if(time == KErrNotFound) + { + time = ExpireTimeFromResponseExpiresHeader(aResponse); + } + + return time; + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::CheckUpdateRequestExpiresValueL +// ----------------------------------------------------------------------------- +// +void CSipRegisterRefresh::CheckUpdateRequestExpiresValueL( + CSIPRequest& aRequest) + { + CSIPContactHeader* contact = static_cast( + aRequest.Header(iContactHeaderName,0)); + + __SIP_ASSERT_LEAVE (contact, KErrArgument); + } + +// ----------------------------------------------------------------------------- +// CSipRegisterRefresh::CheckTerminateRequestExpiresValueL +// ----------------------------------------------------------------------------- +// +void CSipRegisterRefresh::CheckTerminateRequestExpiresValueL( + CSIPRequest& aRequest) + { + CSIPContactHeader* contact = static_cast( + aRequest.Header(iContactHeaderName,0)); + + __SIP_ASSERT_LEAVE (contact, KErrGeneral); + + contact->SetExpiresParameterL(0); + }