diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/IETF_Agent/src/sipietfprofileagent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/ProfileAgent/IETF_Agent/src/sipietfprofileagent.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,770 @@ +// Copyright (c) 2003-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 : sipietfprofileagent.cpp +// Part of : sip ietf plugin +// implementation +// Version : 1.0 +// + + + + +// INCLUDE FILES +#include "sipietfprofileagent.h" +#include "sipconcreteprofile.h" +#include "sipprofileagentobserver.h" +#include "sipconnection.h" +#include "sipprflinitstate.h" +#include "sipprflresolvingproxiesstate.h" +#include "sipprflregisterrequestedstate.h" +#include "sipprflregisterdelayrequestedstate.h" +#include "sipprflregistrationinprogressstate.h" +#include "sipprflregisteredstate.h" +#include "sipprflderegistrationinprogressstate.h" +#include "sipprflderegisterrequestedstate.h" +#include "sipprflstatebase.h" +#include "sipietfprofilecontext.h" +#include "sipgendefs.h" +#include "SipProfileLog.h" +#include "sipstrings.h" +#include "sipstrconsts.h" +#include "sipprofilequeuehandling.h" +#include +#include +#include +#include + +_LIT8(KSIPIETFProfileType, "IETF"); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSIPIetfProfileAgent* CSIPIetfProfileAgent::NewL(TAny* aInitParams) + { + CSIPIetfProfileAgent* self = new (ELeave) CSIPIetfProfileAgent( + static_cast(aInitParams)); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::CSIPIetfProfileAgent +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSIPIetfProfileAgent::CSIPIetfProfileAgent( + TSIPProfileAgentInitParams* aInitParams) + : iSIPProfileAgentObserver(aInitParams->iSIPProfileAgentObserver), + iDeltaTimer(aInitParams->iDeltaTimer) + { + iType.iSIPProfileClass = TSIPProfileTypeInfo::EInternet; + iType.iSIPProfileName = KSIPIetfType(); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::ConstructL() + { + SIPStrings::OpenL(); + iInit = CSIPPrflInitState::NewL(*this); + iResolvingProxies = CSIPPrflResolvingProxiesState::NewL(*this); + iRegRequested = CSIPPrflRegisterRequestedState::NewL(*this); + iRegInProgress = CSIPPrflRegistrationInProgressState::NewL(*this); + iRegistered = CSIPPrflRegisteredState::NewL(*this); + iDeregRequested = CSIPPrflDeregisterRequestedState::NewL(*this); + iDeregInProgress = CSIPPrflDeregistrationInProgressState::NewL(*this); + iRegDelayRequested = CSIPPrflRegisterDelayRequestedState::NewL(*this); + iInit->LinkStates(*iResolvingProxies, *iRegRequested, *iRegInProgress); + iResolvingProxies->LinkStates(*iInit, *iRegRequested, *iRegInProgress); + iRegRequested->LinkStates(*iInit, *iResolvingProxies, *iRegInProgress); + iRegInProgress->LinkStates(*iRegRequested, *iInit, *iRegistered, + *iRegDelayRequested); + iRegistered->LinkStates(*iDeregRequested, *iDeregInProgress, + *iInit, *iRegRequested,*iRegDelayRequested); + iDeregRequested->LinkStates(*iInit, *iRegistered, *iDeregInProgress); + iDeregInProgress->LinkStates(*iInit); + iRegDelayRequested->LinkStates(*iInit); + iProfileQueueHandling = CSIPProfileQueueHandling::NewL(*this); + + iSIP = CSIP::NewL(TUid::Null(),*this); + iHttpDigest = CSIPHttpDigest::NewL(*iSIP,*this); + iConfigExtension = NULL; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::~CSIPIetfProfileAgent +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +CSIPIetfProfileAgent::~CSIPIetfProfileAgent() + { + delete iInit; + delete iResolvingProxies; + delete iRegRequested; + delete iRegistered; + delete iRegInProgress; + delete iDeregRequested; + delete iDeregInProgress; + delete iRegDelayRequested; + delete iProfileQueueHandling; + iConnectionCtxArray.ResetAndDestroy(); + iConnectionCtxArray.Close(); + SIPStrings::Close(); + delete iHttpDigest; + delete iSIP; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::SIPProfileAgentType +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +const TSIPProfileTypeInfo& CSIPIetfProfileAgent::Type() const + { + return iType; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::CreateL +// ----------------------------------------------------------------------------- +// +CSIPConcreteProfile* CSIPIetfProfileAgent::CreateL() + { + TSIPProfileTypeInfo type; + type.iSIPProfileClass = TSIPProfileTypeInfo::EInternet; + type.iSIPProfileName = KSIPIETFProfileType; + + CSIPConcreteProfile* profile = CSIPConcreteProfile::NewL(); + profile->SetProfileType(type); + return profile; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::RegisterL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::RegisterL( + CSIPConcreteProfile& aSIPConcreteProfile) + { + __ASSERT_ALWAYS (aSIPConcreteProfile.AOR().Length() > 0, + User::Leave(KErrArgument)); + __ASSERT_ALWAYS (aSIPConcreteProfile.Server(KSIPRegistrar).Length(), + User::Leave(KErrArgument)); + + PROFILE_DEBUG3("CSIPIetfProfileAgent::RegisterL", aSIPConcreteProfile.Id()) + + if (!iProfileQueueHandling->AddRegisterToQueueL( aSIPConcreteProfile, + EFalse )) + { + CSIPIetfProfileContext* context = FindProfileContext(aSIPConcreteProfile); + if (!context) + { + context = &ProvideProfileContextL(aSIPConcreteProfile); + } + context->RegisterL(); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::UpdateL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::UpdateL( + CSIPConcreteProfile& aNewProfile, + CSIPConcreteProfile& aOldProfile) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::UpdateL", aOldProfile.Id()) + iProfileQueueHandling->Cleanup(aOldProfile,&aNewProfile); + CSIPIetfProfileContext* context = FindProfileContext(aOldProfile); + if (!context) + { + User::Leave(KErrNotFound); + } + context->UpdateL(aNewProfile); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::DeregisterL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::DeregisterL( + CSIPConcreteProfile& aSIPConcreteProfile) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::DeregisterL", aSIPConcreteProfile.Id()) + CSIPIetfProfileContext* context = FindProfileContext(aSIPConcreteProfile); + if ( context ) + { + if ( !DeregisterToWaitingQueueL( context )) + { + context->DeregisterL(); + } + } + else + { + iProfileQueueHandling->RemoveProfileFromRegQueueL(aSIPConcreteProfile); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::GetProfileState +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CSIPIetfProfileAgent::GetProfileState( + CSIPConcreteProfile::TStatus& aState, + CSIPConcreteProfile& aProfile) const + { + CSIPIetfProfileContext* context = FindProfileContext(aProfile); + if (context) + { + aState = context->CurrentMappedState(); + return KErrNone; + } + else + { + return KErrNotFound; + } + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::IsIdle +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIetfProfileAgent::IsIdle() + { + CleanIdleConnectionContexts(); + return (iConnectionCtxArray.Count()==0); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::RegisterPending +// ----------------------------------------------------------------------------- +// +TBool CSIPIetfProfileAgent::RegisterPending( + CSIPConcreteProfile& aSIPProfile) const + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::IsRegisterPending", aSIPProfile.Id()) + + CSIPIetfProfileContext* context = FindProfileContext(aSIPProfile); + if (context) + { + return context->IsRegisterPending(); + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::TerminateHandling +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CSIPIetfProfileAgent::TerminateHandling(CSIPConcreteProfile& aProfile) + { + CSIPIetfProfileContext* context = FindProfileContext(aProfile); + if (context) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::TerminateHandling", aProfile.Id()) + context->SetNextState(*iInit); + context->TerminateHandling(); + return KErrNone; + } + else + { + return KErrNotFound; + } + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::Extension +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CSIPIetfProfileAgent::Extension(TInt aOperationCode, TAny* aParams) + { + TInt err(KErrNone); + if(aParams && aOperationCode == KSipProfileAgentConfigExtension) + iConfigExtension = static_cast(aParams); + else + err = KErrNotSupported; + return err; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::SIPProfileStatusEvent +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::SIPProfileStatusEvent( + CSIPConcreteProfile& aProfile, + TUint32 aContextId) + { + PROFILE_DEBUG4("CSIPIetfProfileAgent::SIPProfileStatusEvent",\ + aProfile.Id(), aContextId) + + + RegisterQueue( aProfile, ETrue ); + + iSIPProfileAgentObserver.SIPProfileStatusEvent( aProfile, aContextId ); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::SIPProfileErrorEvent +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::SIPProfileErrorEvent( + CSIPConcreteProfile& aProfile, + TInt aError) + { + PROFILE_DEBUG4("CSIPIetfProfileAgent::ErrorEvent", aProfile.Id(), aError) + CSIPIetfProfileContext* context = FindProfileContext(aProfile.Id()); + + if (context && context->IgnoreErrorEvent()) + { + PROFILE_DEBUG4("CSIPIetfProfileAgent::Error ignored",\ + aProfile.Id(), aError) + } + else + { + PROFILE_DEBUG4("CSIPIetfProfileAgent::Error sent", + aProfile.Id(), aError) + + RegisterQueue( aProfile, EFalse ); + + iSIPProfileAgentObserver.SIPProfileErrorEvent(aProfile,aError); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::ProceedRegistration +// ----------------------------------------------------------------------------- +// +TBool CSIPIetfProfileAgent::ProceedRegistration( + CSIPConcreteProfile& aProfile, + TInt aError) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::ProceedRegistration", aProfile.Id()) + return iSIPProfileAgentObserver.ProceedRegistration(aProfile, aError); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::GetFailedProfilesL +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::GetFailedProfilesL( + const TSIPProfileTypeInfo& /*aType*/, + RPointerArray& /*aFailedProfiles*/) const + { + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::RegisterProfileL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::RegisterProfileL( + CSIPConcreteProfile& aSIPProfile) + { + RegisterL(aSIPProfile); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::DeregisterProfileL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::DeregisterProfileL( + CSIPConcreteProfile& aSIPProfile) + { + DeregisterL(aSIPProfile); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::RetryProfileRegistrationL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::RetryProfileRegistrationL( + CSIPConcreteProfile& aSIPProfile) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::RetryProfileRegistrationL", + aSIPProfile.Id()) + + if (!iProfileQueueHandling->AddRegisterToQueueL(aSIPProfile, ETrue)) + { + CSIPIetfProfileContext* context = FindProfileContext(aSIPProfile); + if (!context) + { + User::Leave(KErrNotFound); + } + context->RetryRegistration(); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::AddProfileIntoQueue +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +TBool CSIPIetfProfileAgent::AddProfileIntoQueue( + CSIPConcreteProfile& aSIPProfile) const + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::AddProfileIntoQueue", + aSIPProfile.Id()) + + TBool found = EFalse; + for (TInt i=0; i < iConnectionCtxArray.Count() && !found; i++) + { + found = iConnectionCtxArray[i]->AddIntoQueue( + aSIPProfile.Server(KSIPRegistrar)); + } + return found; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::RegisterProfileAfterQueueL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::RegisterProfileAfterQueueL( + CSIPConcreteProfile& aSIPProfile) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::RegisterProfileAfterQueueL", + aSIPProfile.Id()) + + CSIPIetfProfileContext* context = FindProfileContext(aSIPProfile); + if (!context) + { + context = &ProvideProfileContextL(aSIPProfile); + } + context->RegisterL(); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::DeregisterProfileAfterQueueL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::DeregisterProfileAfterQueueL( + CSIPConcreteProfile& aSIPProfile) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::DeregisterProfileAfterQueueL", + aSIPProfile.Id()) + + CSIPIetfProfileContext* context = FindProfileContext(aSIPProfile); + __ASSERT_ALWAYS(context != NULL, User::Leave(KErrNotFound)); + context->DeregisterL(); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::RetryProfileRegistrationAfterQueueL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::RetryProfileRegistrationAfterQueueL( + CSIPConcreteProfile& aSIPProfile) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::RetryProfileRegistrationAfterQueueL", + aSIPProfile.Id()) + + CSIPIetfProfileContext* context = FindProfileContext(aSIPProfile); + __ASSERT_ALWAYS(context != NULL, User::Leave(KErrNotFound)); + context->RetryRegistration(); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::IsInQueue +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +TBool CSIPIetfProfileAgent::IsInQueue( + CSIPConcreteProfile& aSIPProfile) const + { + PROFILE_DEBUG1("CSIPIetfProfileAgent::IsInQueue") + PROFILE_DEBUG3("CSIPIetfProfileAgent::IsInQueue", + aSIPProfile.Id()) + return iProfileQueueHandling->IsInQueue(aSIPProfile); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::SetInterimProfile +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::SetInterimProfile( CSIPConcreteProfile* /*aSIPConcreteProfile*/ ) + { + + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::IncomingRequest +// From MSIPObserver +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::IncomingRequest( + TUint32 /*aIapId*/, + CSIPServerTransaction* aTransaction) + { + // Should not be called, because CSIP is created with a NULL UID + // Delete the transaction to prevent amemory leak + delete aTransaction; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::TimedOut +// From MSIPObserver +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::TimedOut(CSIPServerTransaction& /*aTransaction*/) + { + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::ChallengeReceived +// From MSIPHttpDigestChallengeObserver2 +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::ChallengeReceived( + const CSIPClientTransaction& aTransaction) + { + TBool found = EFalse; + for (TInt i=0; i < iConnectionCtxArray.Count() && !found; i++) + { + found = + iConnectionCtxArray[i]->SetCredentials(aTransaction,*iHttpDigest); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::ChallengeReceived +// From MSIPHttpDigestChallengeObserver2 +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::ChallengeReceived(const CSIPRefresh& aRefresh) + { + TBool found = EFalse; + for (TInt i=0; i < iConnectionCtxArray.Count() && !found; i++) + { + found = iConnectionCtxArray[i]->SetCredentials(aRefresh,*iHttpDigest); + } + } + +// ---------------------------------------------------------------------------- +// CSIPIetfProfileAgent::RegisterQueue +// ---------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::RegisterQueue( + CSIPConcreteProfile& aProfile, + TBool aReportError ) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::RegisterQueue", aProfile.Id()) + + TInt err( KErrNone ); + + if ( AllowedTakeFromQueue( aProfile ) ) + { + TRAP( err, iProfileQueueHandling->RegisterFromQueueL( aProfile ) ); + } + + if ( err && aReportError ) + { + iSIPProfileAgentObserver.SIPProfileErrorEvent( aProfile, err ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::AllowedTakeFromQueue +// ----------------------------------------------------------------------------- +// +TBool CSIPIetfProfileAgent::AllowedTakeFromQueue( + CSIPConcreteProfile& aSIPConcreteProfile ) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::AllowedTakeFromQueueL", + aSIPConcreteProfile.Id()) + + return !AddProfileIntoQueue( aSIPConcreteProfile ); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::DeregisterToWaitingQueueL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIetfProfileAgent::DeregisterToWaitingQueueL( + CSIPIetfProfileContext* aContext ) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::DeregisterToWaitingQueueL", + aContext->Profile()->Id()) + return iProfileQueueHandling->AddDeregisterToQueueL( *aContext->Profile() ); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::FindProfileContext +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPIetfProfileContext* CSIPIetfProfileAgent::FindProfileContext( + CSIPConcreteProfile& aSIPConcreteProfile) const + { + return FindProfileContext(aSIPConcreteProfile.Id()); + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::FindProfileContext +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPIetfProfileContext* CSIPIetfProfileAgent::FindProfileContext( + TUint32 aProfileId) const + { + for (TInt i=0; i < iConnectionCtxArray.Count(); i++) + { + CSIPIetfProfileContext *context = + iConnectionCtxArray[i]->FindContext(aProfileId); + if (context) + { + return context; + } + } + return 0; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::FindConnectionContext +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPIetfConnectionContext* CSIPIetfProfileAgent::FindConnectionContext( + CSIPConcreteProfile& aProfile) const + { + CSIPIetfConnectionContext* context =0; + TBool found = EFalse; + for (TInt i=0; i < iConnectionCtxArray.Count() && !found; i++) + { + if ( iConnectionCtxArray[i]->ConnectionUser( aProfile ) ) + { + context = iConnectionCtxArray[i]; + found = ETrue; + } + } + return context; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::FindConnectionContext +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPIetfConnectionContext* CSIPIetfProfileAgent::FindConnectionContext( + TUint32 aIapId ) const + { + CSIPIetfConnectionContext* context =0; + TBool found = EFalse; + for (TInt i=0; i < iConnectionCtxArray.Count() && !found; i++) + { + if ( iConnectionCtxArray[i]->Connection()->IapId() == aIapId ) + { + context = iConnectionCtxArray[i]; + found = ETrue; + } + } + return context; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::ProvideContextL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPIetfProfileContext& CSIPIetfProfileAgent::ProvideProfileContextL( + CSIPConcreteProfile& aProfile) + { + PROFILE_DEBUG3("CSIPIetfProfileAgent::ProvideProfileContextL", + aProfile.Id()) + + CSIPIetfConnectionContext* connContext = FindConnectionContext(aProfile); + if (!connContext) + { + // Must create connection first + connContext = CSIPIetfConnectionContext::NewLC(); + + // If there's several profiles using the same iap, other ones need + // new csip instance as once csip instance cannot contain several + // csipconnections having the same iap id. + // + TUint32 iapId( aProfile.IapId() ); + CSIPConnection* connection = NULL; + if ( FindConnectionContext( iapId ) ) + { + CSIP& sip = connContext->CreateSipL( *this, *this ); + connection = CSIPConnection::NewL( sip, iapId, *connContext ); + } + else + { + connection = CSIPConnection::NewL( *iSIP, iapId, *connContext ); + } + connContext->SetConnection( connection ); + + // Connection should be set before setting user + connContext->SetConnectionUserL( aProfile ); + + User::LeaveIfError( iConnectionCtxArray.Append( connContext ) ); + CleanupStack::Pop();//connContext + } + CSIPIetfProfileContext* profilectx = CSIPIetfProfileContext::NewLC( + *iSIP, *connContext, *this, + *iInit, aProfile, iDeltaTimer,*iConfigExtension); + connContext->AddProfileContextL(profilectx); + CleanupStack::Pop();//profilectx + return *profilectx; + } + +// ----------------------------------------------------------------------------- +// CSIPIetfProfileAgent::ProvideContextL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIetfProfileAgent::CleanIdleConnectionContexts() + { + CSIPIetfConnectionContext* context = 0; + + for (TInt i=iConnectionCtxArray.Count()-1; i>= 0;) + { + iConnectionCtxArray[i]->CleanIdleContexts(); + if (iConnectionCtxArray[i]->IsIdle()) + { + PROFILE_DEBUG1("CSIPIetfProfileAgent::CleanIdleConnectionContexts,\ + ConnectionContext removed") + context = iConnectionCtxArray[i]; + iConnectionCtxArray.Remove(i); + delete context; + context = NULL; + } + i--; + } + + iConnectionCtxArray.Compress(); + }