diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Registration/src/CSIPRegistrar.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Registration/src/CSIPRegistrar.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,213 @@ +// 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 : CSIPRegistrar.cpp +// Part of : Registration +// Version : SIP/4.0 +// + + + +#include "CSIPRegistrar.h" +#include "CSIPRegistrarStore.h" +#include "TSIPRegistrationUtility.h" +#include "uricontainer.h" +#include "siprequest.h" +#include "sipcallidheader.h" +#include "sipcseqheader.h" +#include "sipstrings.h" +#include "sipstrconsts.h" + + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::NewLC +// ----------------------------------------------------------------------------- +// +CSIPRegistrar* CSIPRegistrar::NewLC(const CURIContainer& aRegistrar, + const TDesC8& aCallId, + TUint aCSeqNumber, + const TRegistrationId aRegistrationId, + CSIPRegistrarStore& aRegistrarStore) + { + CSIPRegistrar* self = + new (ELeave) CSIPRegistrar(aCSeqNumber, aRegistrarStore); + CleanupStack::PushL(self); + self->ConstructL(aRegistrar, aCallId, aRegistrationId); + return self; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::CSIPRegistrar +// ----------------------------------------------------------------------------- +// +CSIPRegistrar::CSIPRegistrar(TUint aCSeqNumber, + CSIPRegistrarStore& aRegistrarStore) + : iCSeqNumber (aCSeqNumber), + iRegistrarStore (aRegistrarStore) + { + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::ConstructL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrar::ConstructL(const CURIContainer& aRegistrar, + const TDesC8& aCallId, + const TRegistrationId aRegistrationId) + { + iRegistrar = CURIContainer::NewL(aRegistrar); + iCallId = aCallId.AllocL(); + User::LeaveIfError(iRegistrationIds.Append(aRegistrationId)); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::~CSIPRegistrar +// ----------------------------------------------------------------------------- +// +CSIPRegistrar::~CSIPRegistrar() + { + delete iCallId; + delete iRegistrar; + iRegistrationIds.Reset(); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::Registrar +// ----------------------------------------------------------------------------- +// +const CURIContainer& CSIPRegistrar::Registrar() const + { + return *iRegistrar; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::IncreaseCSeqNumber +// ----------------------------------------------------------------------------- +// +void CSIPRegistrar::IncreaseCSeqNumber() + { + iCSeqNumber++; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::FillCallIdAndCSeqL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrar::FillCallIdAndCSeqL(CSIPRequest& aSIPRequest) + { + CSIPCallIDHeader* callId = CSIPCallIDHeader::DecodeL(*iCallId); + CleanupStack::PushL(callId); + // fill in callid header, and add it to request + CSIPCallIDHeader* oldCallId = aSIPRequest.CallID(); + if (oldCallId) + { + aSIPRequest.ReplaceHeaderL(oldCallId, callId); + } + else // there are callId header in request + { + aSIPRequest.AddHeaderL(callId); + } + CleanupStack::Pop(callId); + + // increase the CSeqNumber by one + IncreaseCSeqNumber(); + + CSIPCSeqHeader* oldCSeqHeader = aSIPRequest.CSeq(); + if (oldCSeqHeader) + { + oldCSeqHeader->SetSeq(iCSeqNumber); + } + else + { + // create a CSIPCSeqHeader header, and add it to request + CSIPCSeqHeader* cseqHeader = CSIPCSeqHeader::NewLC( + iCSeqNumber, SIPStrings::StringF(SipStrConsts::ERegister)); + aSIPRequest.AddHeaderL(cseqHeader); + CleanupStack::Pop(cseqHeader); + } + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::AddRegistrationIdL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrar::AddRegistrationIdL(const TRegistrationId aRegistrationId) + { + User::LeaveIfError(iRegistrationIds.Append(aRegistrationId)); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::BindingRemoved +// ----------------------------------------------------------------------------- +// +TBool CSIPRegistrar::BindingRemoved(const TRegistrationId aRegistrationId) + { + TInt idFound = FindRegistrationId(aRegistrationId); + + // there is no registration binding relate to this registrar, + // remove the registrar + if (idFound != KErrNotFound) + { + if (iRegistrationIds.Count() == 1) + { + // if registration is added to delete mgr succeed, + // remove registration id + TInt res = iRegistrarStore.RemoveRegistrar(this); + if (res == KErrNone) + { + iRegistrationIds.Remove(idFound); + return ETrue; + } + else + { + return EFalse; + } + } + else + { + iRegistrationIds.Remove(idFound); + return ETrue; + } + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::FindRegistrationId +// ----------------------------------------------------------------------------- +// +TInt CSIPRegistrar::FindRegistrationId (const TRegistrationId aRegistrationId) + { + TInt idFound = KErrNotFound; + + for (TInt i=iRegistrationIds.Count()-1; (i>=0 && idFound==KErrNotFound); i--) + { + if (iRegistrationIds[i] == aRegistrationId) + { + return i; + } + } + return idFound; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrar::CSeqNumber +// ----------------------------------------------------------------------------- +// +TUint CSIPRegistrar::CSeqNumber() const + { + return iCSeqNumber; + } + +