diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Registration/src/csipregistered.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Registration/src/csipregistered.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,203 @@ +// 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 : csipregistered.cpp +// Part of : SIP Registration +// Version : SIP/4.0 +// + + + +#include "csipregistered.h" +#include "csip423responsereceived.h" +#include "SipAssert.h" +#include "siprequest.h" +#include "sipresponse.h" +#include "sipminexpiresheader.h" +#include "CSIPResponseUtility.h" +#include "MRegistrationOwner.h" +#include "sipstrings.h" +#include "sipstrconsts.h" +#include "siperr.h" + +// ----------------------------------------------------------------------------- +// CSIPRegistered::NewL +// ----------------------------------------------------------------------------- +// +CSIPRegistered* CSIPRegistered::NewL(MRegistrationContext& aRegistration) + { + CSIPRegistered* self = CSIPRegistered::NewLC(aRegistration); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistered::NewLC +// ----------------------------------------------------------------------------- +// +CSIPRegistered* CSIPRegistered::NewLC(MRegistrationContext& aRegistration) + { + CSIPRegistered* self = new (ELeave) CSIPRegistered(aRegistration); + CleanupStack::PushL(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistered::SetNeighbourStates +// ----------------------------------------------------------------------------- +// +void CSIPRegistered::SetNeighbourStates( + CSIPRegistrationState* aUpdating, + CSIPRegistrationState* aUnregistering, + CSIPRegistrationState* aUnregistered, + CSIPRegistrationState* aResponse423Received) + { + __SIP_ASSERT_RETURN(aUpdating, KErrArgument); + __SIP_ASSERT_RETURN(aUnregistering, KErrArgument); + __SIP_ASSERT_RETURN(aUnregistered, KErrArgument); + __SIP_ASSERT_RETURN(aResponse423Received, KErrArgument); + + iUpdating = aUpdating; + iUnregistering = aUnregistering; + iUnregistered = aUnregistered; + iResponse423Received = aResponse423Received; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistered::~CSIPRegistered +// ----------------------------------------------------------------------------- +// +CSIPRegistered::~CSIPRegistered() + { + } + +// ----------------------------------------------------------------------------- +// CSIPRegistered::UpdateL +// ----------------------------------------------------------------------------- +// +void CSIPRegistered::UpdateL(TTransactionId& aTransactionId, + CSIPRequest* aRequest) + { + __SIP_ASSERT_LEAVE(aRequest, KErrArgument); + + iRegistration.ChangeState(iUpdating); + iRegistration.CurrentState().UpdateL(aTransactionId, aRequest); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistered::UnregisterL +// ----------------------------------------------------------------------------- +// +void CSIPRegistered::UnregisterL(TTransactionId& aTransactionId, + CSIPRequest* aRequest) + { + __SIP_ASSERT_LEAVE(aRequest, KErrArgument); + + iRegistration.ChangeState(iUnregistering); + iRegistration.CurrentState().UnregisterL(aTransactionId, aRequest); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistered::ReceiveL +// +// this function is called when subsequent refresh response is received +// ----------------------------------------------------------------------------- +// +void CSIPRegistered::ReceiveL(TTransactionId aTransactionId, + CSIPResponse* aResponse) + { + __SIP_ASSERT_LEAVE(aResponse, KErrArgument); + + if (aResponse->Type() == CSIPResponse::E2XX) // 200-299 + { + if (!iRegistration.ServiceRouteOk(*aResponse)) + { + iRegistration.ReceivedErrorResponseL(); + User::LeaveIfError( + PassErrorToOwner(KErrSIPTransportFailure,aTransactionId, + iRegistration.RegistrationId())); + delete aResponse; + iRegistration.SelfDetach(ETrue); + iRegistration.ChangeState(iUnregistered); + return; + } + iRegistration.SetRouteHeaderFromResponseL(*aResponse); + iRegistration.Received2XXResponseL(*aResponse,aTransactionId); + if (iRegistration.Request()) + { + iRegistration.Request()->DeleteHeaders( + SIPStrings::StringF(SipStrConsts::ERouteHeader)); + } + + // don't forward subsequent 2xx response to owner + delete aResponse; + } + else if (aResponse->IsErrorResponse()) // 300- + { + const RStringF KMinExpiresHeaderName = + SIPStrings::StringF(SipStrConsts::EMinExpiresHeader); + + if (aResponse->ResponseCode() == K423Response && + aResponse->HasHeader(KMinExpiresHeaderName)) + { + iRegistration.Received423ResponseL(*aResponse); + iRegistration.ChangeState(iResponse423Received); + static_cast(iResponse423Received)-> + SetUpdate(ETrue); + iRegistration.CurrentState().RegisterL( + aTransactionId,iRegistration.Request(),NULL); + delete aResponse; + } + // this happens when error response received from subsequent register. + else + { + // ReceivedErrorResponseL, remove binding + iRegistration.ReceivedErrorResponseL(); + // pass response to owner + PassResponseToOwnerL(aResponse, aTransactionId, + iRegistration.RegistrationId()); + iRegistration.SelfDetach(ETrue); + iRegistration.ChangeState(iUnregistered); + } + } + else // is provisional response 100-199 + { + // do not forward subsequent 1xx response to owner + delete aResponse; + } + } + +// ----------------------------------------------------------------------------- +// CSIPRegistered::TransactionEnded +// ----------------------------------------------------------------------------- +// +TInt CSIPRegistered::TransactionEnded(TTransactionId aTransactionId, + TInt aReason) + { + if (aReason != KErrNone) + { + iRegistration.ChangeState(iUnregistered); + } + // pass error to owner. + return (PassErrorToOwner(aReason, aTransactionId, + iRegistration.RegistrationId())); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistered::CSIPRegistered +// ----------------------------------------------------------------------------- +// +CSIPRegistered::CSIPRegistered(MRegistrationContext& aRegistration) + : CSIPRegistrationState (aRegistration) + { + }