diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/SigCompController/DefaultPlugin/src/sipsigcompcompartmentctx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/SigCompController/DefaultPlugin/src/sipsigcompcompartmentctx.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,223 @@ +// Copyright (c) 2002-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 : sipSigcompcompartmentctx.cpp +// Part of : SIPSigComp +// Version : SIP/3.0 +// + + + +#include "sipsigcompcompartmentctx.h" +#include "sigcompcompartment.h" +#include "MCompartmentCtxOwner.h" +#include "MCompartmentCtxUser.h" + +const TInt KUserArrayGranularity = 4; + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::NewL +// ----------------------------------------------------------------------------- +// +CSipSigCompCompartmentCtx* CSipSigCompCompartmentCtx::NewL( + MCompartmentCtxOwner& aMyOwner, + const CSigComp& aSigComp, + const TInetAddr& aAddress, + TUint32 aIapId, + TBool aDynamicCompression ) + { + CSipSigCompCompartmentCtx* self = + CSipSigCompCompartmentCtx::NewLC( aMyOwner, + aSigComp, + aAddress, + aIapId, + aDynamicCompression ); + CleanupStack::Pop(); + return self; + } + + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::NewLC +// ----------------------------------------------------------------------------- +// +CSipSigCompCompartmentCtx* CSipSigCompCompartmentCtx::NewLC( + MCompartmentCtxOwner& aMyOwner, + const CSigComp& aSigComp, + const TInetAddr& aAddress, + TUint32 aIapId, + TBool aDynamicCompression ) + { + CSipSigCompCompartmentCtx* self = + new ( ELeave ) CSipSigCompCompartmentCtx( aMyOwner, + aSigComp, + aAddress, + aIapId, + aDynamicCompression ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::ConstructL +// ----------------------------------------------------------------------------- +// +void CSipSigCompCompartmentCtx::ConstructL() + { + iSigCompCompartment = + CSigCompCompartment::NewL( iSigComp, iDynamicCompression ); + } + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::~CSipSigCompCompartmentCtx +// ----------------------------------------------------------------------------- +// +CSipSigCompCompartmentCtx::~CSipSigCompCompartmentCtx() + { + iUserArray.Reset(); + iUserArray.Close(); + delete iSigCompCompartment; + } + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::Compartment +// ----------------------------------------------------------------------------- +// +CSigCompCompartment* CSipSigCompCompartmentCtx::Compartment() + { + return iSigCompCompartment; + } + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::AttachCompartmentUserL +// ----------------------------------------------------------------------------- +// +void CSipSigCompCompartmentCtx::AttachCompartmentUserL( + MCompartmentCtxUser* aUser ) + { + // If entry of aUser existed already in array, fail silently + TInt err = iUserArray.InsertInAddressOrder( aUser ); + if ( err != KErrNone && err != KErrAlreadyExists ) + { + User::Leave( err ); + } + } + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::DetachCompartmentUser +// ----------------------------------------------------------------------------- +// +void CSipSigCompCompartmentCtx::DetachCompartmentUser( + MCompartmentCtxUser* aUser ) + { + TInt index = iUserArray.Find( aUser ); + if ( index != KErrNotFound ) + { + iUserArray.Remove( index ); + iUserArray.Compress(); + } + + // If no more users, compartment can be deleted + if ( iUserArray.Count() == 0 ) + { + iMyOwner.KillMe( this ); + } + } + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::Match +// ----------------------------------------------------------------------------- +// +TBool CSipSigCompCompartmentCtx::Match( + const TInetAddr& aAddress, + TUint32 aIapId ) const + { + // Don't care about address port + return ( !aAddress.IsWildAddr() && + iAddress.Match( aAddress ) && + iIapId == aIapId ); + } + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::SetCurrentState +// ----------------------------------------------------------------------------- +// +void CSipSigCompCompartmentCtx::SetCurrentState( + CSipSigCompCompartmentCtx::TState aCurrentState ) + { + iCurrentState = aCurrentState; + } + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::SendFailedL +// ----------------------------------------------------------------------------- +// +void CSipSigCompCompartmentCtx::SendFailedL() + { + if ( iCurrentState == CSipSigCompCompartmentCtx::EAlive ) + { + ResetCompartmentL(); + } + else + { + NotifyUsersAboutSelfDestruction(); + iMyOwner.KillMe( this ); + } + } + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::NotifyUsersAboutSelfDestruction +// ----------------------------------------------------------------------------- +// +void CSipSigCompCompartmentCtx::NotifyUsersAboutSelfDestruction() + { + TInt lastIndex( iUserArray.Count() - 1 ); + for ( TInt i = lastIndex; i >= 0; i-- ) + { + iUserArray[ i ]->CompartmentDeleted(); + } + } + +// ----------------------------------------------------------------------------- +// CSipSigCompCompartmentCtx::ResetCompartmentL +// ----------------------------------------------------------------------------- +// +void CSipSigCompCompartmentCtx::ResetCompartmentL() + { + delete iSigCompCompartment; + iSigCompCompartment = 0; + iSigCompCompartment = + CSigCompCompartment::NewL( iSigComp, iDynamicCompression ); + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +// +CSipSigCompCompartmentCtx::CSipSigCompCompartmentCtx( + MCompartmentCtxOwner& aMyOwner, + const CSigComp& aSigComp, + const TInetAddr& aAddress, + TUint32 aIapId, + TBool aDynamicCompression ) : + iMyOwner( aMyOwner ), + iSigComp( aSigComp ), + iAddress( aAddress ), + iIapId( aIapId ), + iDynamicCompression( aDynamicCompression ), + iUserArray( KUserArrayGranularity ), + iCurrentState( CSipSigCompCompartmentCtx::EIdle ) + { + } +