diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Src/sipimsprofileagent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Src/sipimsprofileagent.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,1735 @@ +// 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 : sipimsprofileagent.cpp +// Part of : sip ims plugin +// implementation +// Version : 1.0 +// + + + +// INCLUDE FILES +#include +#include +#include +#include +#include "sipimsprofileagent.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 "sipimsprofilecontext.h" +#include "sipmanagedprofile.h" +#include "sipgendefs.h" +#include "SipProfileLog.h" +#include "sipstrings.h" +#include "sipstrconsts.h" +#include "CSIPNotifyXmlBodyParser.h" +#include "Sipimsprofileusimprovider.h" +#include "Sipimsprofilesimrecord.h" +#include "sipprofilequeuehandling.h" +#include "sip.h" +#include "siphttpdigest.h" +#include "sipservertransaction.h" + +_LIT8(KSIPIMSProfileType, "ims"); +const TInt KAuthorizedMicroSecsInSec = 1; +const TUint32 KRegAllowedWithUSIMandISIM = 1; +const TUint32 KRegAllowedWithISIM = 2; + +#ifdef CPPUNIT_TEST +#define CPPUNIT_MEMORYLEAVE { if (err == KErrNoMemory) User::Leave(KErrNoMemory);} +#else +#define CPPUNIT_MEMORYLEAVE +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSIPIMSProfileAgent* CSIPIMSProfileAgent::NewL(TAny* aInitParams) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::NewL") + + CSIPIMSProfileAgent* self = new (ELeave) CSIPIMSProfileAgent( + static_cast(aInitParams)); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::CSIPIMSProfileAgent +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSIPIMSProfileAgent::CSIPIMSProfileAgent( + TSIPProfileAgentInitParams* aInitParams) +: iSIPProfileAgentObserver(aInitParams->iSIPProfileAgentObserver), + iDeltaTimer(aInitParams->iDeltaTimer), + iDeltaTimerCallBack(ASyncTimerExpired,this) + { + iType.iSIPProfileClass = TSIPProfileTypeInfo::EIms; + iType.iSIPProfileName = KSIPIMSProfileType(); + iDeltaTimerEntry.Set(iDeltaTimerCallBack); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::ConstructL() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::ConstructL") + + SIPStrings::OpenL(); + + iSIP = CSIP::NewL(TUid::Null(),*this); + iHttpDigest = CSIPHttpDigest::NewL(*iSIP,*this); + + TBuf tsyModuleName; + GetTsyModuleNameL( tsyModuleName ); + User::LeaveIfError(iTelServer.Connect()); + User::LeaveIfError(iTelServer.LoadPhoneModule(tsyModuleName)); + + TInt numPhone(0); + User::LeaveIfError(iTelServer.EnumeratePhones(numPhone)); + TName tsyName; + TBool found = EFalse; + RTelServer::TPhoneInfo phoneInfo; + TInt i(0); + while ( !found && i < numPhone ) + { + User::LeaveIfError( iTelServer.GetPhoneInfo( i, phoneInfo ) ); + User::LeaveIfError( iTelServer.GetTsyName( i, tsyName ) ); + if ( tsyName.CompareF( tsyModuleName ) == 0 ) + { + found = ETrue; + } + i++; + } + __ASSERT_ALWAYS(found, User::Leave(KErrNotFound)); + + iXMLParser = CSIPNotifyXmlBodyParser::NewL(); + 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); + + iSIMRecord = CSIPProfileSIMRecord::NewL(); + iProfileQueueHandling = CSIPProfileQueueHandling::NewL(*this); + TRAPD(err, iUsimProvider = + CSIPProfileUsimProvider::NewL( + *iSIMRecord, iTelServer, phoneInfo, *this)); + if(err == KErrNoMemory) + { + User::Leave(err); + } + iConfigExtension = NULL; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::~CSIPIMSProfileAgent +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +CSIPIMSProfileAgent::~CSIPIMSProfileAgent() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::~CSIPIMSProfileAgent") + + delete iInit; + delete iResolvingProxies; + delete iRegRequested; + delete iRegistered; + delete iRegInProgress; + delete iDeregRequested; + delete iDeregInProgress; + delete iRegDelayRequested; + delete iProfileQueueHandling; + iDeltaTimer.Remove(iDeltaTimerEntry); + iConnectionCtxArray.ResetAndDestroy(); + iConnectionCtxArray.Close(); + iWaitForRegisteringArray.Reset(); + iSIMWaitForAuthorizedArray.Reset(); + iUSimWaitForAuthorizedArray.Reset(); + iWaitForAuthorizedArray.Reset(); + iFailedProfilesArray.Reset(); + delete iXMLParser; + delete iUsimProvider; + delete iSIMRecord; + iTelServer.Close(); + delete iHttpDigest; + delete iSIP; + SIPStrings::Close(); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RegAllowedWithUSIMorISIML +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::RegAllowedWithUSIMorISIML(CSIPConcreteProfile& aProfile) + { + TBool allowed = ETrue; + TUint32 confValue = 0; + TInt result = 0; + result = aProfile.ExtensionParameter( KSIPAllowIMSRegistration,confValue ); + if ( result != KErrNotFound ) + { + if (confValue == KRegAllowedWithISIM && !iSIMRecord->IsISIMPresent()) + { + allowed = EFalse; + } + } + return allowed; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RegAllowedWithSIM +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::RegAllowedWithSIM(CSIPConcreteProfile& aProfile) + { + TBool allowed = ETrue; + TUint32 confValue = 0; + TInt result = 0; + result = aProfile.ExtensionParameter( KSIPAllowIMSRegistration,confValue ); + if (result != KErrNotFound) + { + if (confValue == KRegAllowedWithISIM || + confValue == KRegAllowedWithUSIMandISIM) + { + allowed = EFalse; + } + } + return allowed; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::CheckIPSecRulesL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::CheckIPSecRulesL(CSIPConcreteProfile& aProfile) + { + TBool found = EFalse; + TBool isRegInUse = EFalse; + + found = IsIPSecAlreadyInUse(isRegInUse); + if (found) + { + ResetISIMUpdateProfile( &aProfile ); + User::Leave(KErrArgument); + } + + if (isRegInUse) + { + iWaitForRegisteringArray.AppendL(&aProfile); + } + else + { + ProfileToWaitingQueueL( &aProfile ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::ResetISIMUpdateProfile +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::ResetISIMUpdateProfile( CSIPConcreteProfile* aSIPConcreteProfile ) + { + if ( iISIMUpdateProfile && (iISIMUpdateProfile->Id() == aSIPConcreteProfile->Id()) ) + { + iISIMUpdateProfile = 0; + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::IsIPSecAlreadyInUse +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::IsIPSecAlreadyInUse( TBool& aIsRegInProgress ) + { + TBool found = EFalse; + + for (TInt i=0; i < iConnectionCtxArray.Count() && !found; i++) + { + found = iConnectionCtxArray[i]->IsIPSecAlreadyInUse( aIsRegInProgress ); + } + if ( !found && !aIsRegInProgress ) + { + aIsRegInProgress = iProfileQueueHandling->FoundIPSecProfileCandidate(); + } + return found; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::Type +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +const TSIPProfileTypeInfo& CSIPIMSProfileAgent::Type() const + { + return iType; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::CreateL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPConcreteProfile* CSIPIMSProfileAgent::CreateL() + { + TSIPProfileTypeInfo type; + type.iSIPProfileClass = TSIPProfileTypeInfo::EIms; + type.iSIPProfileName = KSIPIMSProfileType; + + CSIPConcreteProfile* profile = CSIPConcreteProfile::NewLC(); + profile->SetProfileType(type); + + profile->EnableSecurityNegotiation(ETrue); + profile->EnableSigComp(ETrue); + _LIT8(KSIPDefaultProxy, "sip:0.0.0.0"); + profile->SetServerL(KSIPOutboundProxy, KSIPDefaultProxy); + + CleanupStack::Pop(profile); + return profile; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RegisterL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::RegisterL( + CSIPConcreteProfile& aSIPConcreteProfile) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::RegisterL", aSIPConcreteProfile.Id()) + __ASSERT_ALWAYS (aSIPConcreteProfile.Server(KSIPOutboundProxy).Length(), + User::Leave(KErrArgument)); + + TBool isClientConfigured = EFalse; + + if (CheckIfConfigured(aSIPConcreteProfile)) + { + if (!MandatoryValuesConfigured(aSIPConcreteProfile)) + { + User::Leave(KErrArgument); + } + isClientConfigured = ETrue; + } + + if (!iUsimProvider && !isClientConfigured) + {//No USIM/SIM access available + User::Leave(KErrArgument); + } + + if (!isClientConfigured) + { + TUint32 confValue = 0; + TInt result = 0; + result = aSIPConcreteProfile.ExtensionParameter( KSIPAllowIMSRegistration,confValue ); + if (result != KErrNotFound) + { + if ((confValue == KRegAllowedWithUSIMandISIM || + confValue == KRegAllowedWithISIM ) + && !iUsimProvider->IsUsimSupported()) + { + User::Leave(KErrNotSupported); + } + } + } + + // If digest settings are configured, no need to do USIM/SIM authorization + if (iUsimProvider && + !CSIPIMSProfileContext::IsHttpDigestSettingsConfigured(aSIPConcreteProfile)) + { + if (!iUsimProvider->IsUsimSupported()) + { + iSIMWaitForAuthorizedArray.AppendL(&aSIPConcreteProfile); + iUsimProvider->RequestL(ETrue); + } + else + { + iUSimWaitForAuthorizedArray.AppendL(&aSIPConcreteProfile); + iUsimProvider->RequestL(); + } + } + else + { + iWaitForAuthorizedArray.AppendL(&aSIPConcreteProfile); + AsyncDeltaTimer(); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::UpdateL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::UpdateL( + CSIPConcreteProfile& aNewProfile, + CSIPConcreteProfile& aOldProfile) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::UpdateL", aOldProfile.Id()) + iProfileQueueHandling->Cleanup(aOldProfile,&aNewProfile); + CSIPIMSProfileContext* context = FindProfileContext(aOldProfile); + if (!context) + { + User::Leave(KErrNotFound); + } + context->UpdateL(aNewProfile); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::DeregisterL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::DeregisterL( + CSIPConcreteProfile& aSIPConcreteProfile) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::DeregisterL", aSIPConcreteProfile.Id()) + CSIPIMSProfileContext* context = FindProfileContext(aSIPConcreteProfile); + if ( context ) + { + if (!DeregisterToWaitingQueueL( context )) + { + context->DeregisterL(); + } + } + else + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::DeregisterL RemoveProfileFromQueue") + if (! iProfileQueueHandling->RemoveProfileFromRegQueueL(aSIPConcreteProfile) ) + { + if (!RemoveProfileFromWaitingQueue(iWaitForRegisteringArray, + aSIPConcreteProfile) ) + { + if (!RemoveProfileFromWaitingQueue(iUSimWaitForAuthorizedArray, + aSIPConcreteProfile)) + { + if (!RemoveProfileFromWaitingQueue(iSIMWaitForAuthorizedArray, + aSIPConcreteProfile)) + { + RemoveProfileFromWaitingQueue(iWaitForAuthorizedArray, + aSIPConcreteProfile); + } + } + } + } + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::GetProfileState +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CSIPIMSProfileAgent::GetProfileState( + CSIPConcreteProfile::TStatus& aState, + CSIPConcreteProfile& aProfile) const + { + CSIPIMSProfileContext* context = FindProfileContext(aProfile); + if (context) + { + aState = context->CurrentMappedState(); + return KErrNone; + } + else + { + return KErrNotFound; + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::IsIdle +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::IsIdle() + { + CleanIdleConnectionContexts(); + return (iConnectionCtxArray.Count()==0 && + iProfileQueueHandling->IsEmpty() && + iWaitForRegisteringArray.Count()==0 && + iUSimWaitForAuthorizedArray.Count()==0 && + iSIMWaitForAuthorizedArray.Count()==0 && + iWaitForAuthorizedArray.Count()==0 && + !iSIMRecord->IsISIMPresent() ); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RegisterPending +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::RegisterPending( + CSIPConcreteProfile& aSIPProfile) const + { + CSIPIMSProfileContext* context = FindProfileContext(aSIPProfile); + if (context) + { + return context->IsRegisterPending(); + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::TerminateHandling +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CSIPIMSProfileAgent::TerminateHandling(CSIPConcreteProfile& aProfile) + { + CSIPIMSProfileContext* context = FindProfileContext(aProfile); + if (context) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::TerminateHandling", aProfile.Id()) + context->SetNextState(*iInit); + context->TerminateHandling(); + return KErrNone; + } + else + { + return KErrNotFound; + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::Extension +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CSIPIMSProfileAgent::Extension(TInt aOperationCode, TAny* aParams) + { + TInt err(KErrNone); + if(aParams && aOperationCode == KSipProfileAgentConfigExtension) + iConfigExtension = static_cast(aParams); + else + err = KErrNotSupported; + return err; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RegisterProfileL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::RegisterProfileL( + CSIPConcreteProfile& aSIPProfile) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::RegisterProfileL", aSIPProfile.Id()) + + RegisterFromAuthorizedArrayL(aSIPProfile); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::DeregisterProfileL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::DeregisterProfileL( + CSIPConcreteProfile& aSIPProfile) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::DeregisterProfileL", aSIPProfile.Id()) + + DeregisterL(aSIPProfile); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RetryProfileRegistrationL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::RetryProfileRegistrationL( + CSIPConcreteProfile& aSIPProfile) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::RetryProfileRegistrationL", + aSIPProfile.Id()) + + if (!iProfileQueueHandling->AddRegisterToQueueL(aSIPProfile, ETrue)) + { + CSIPIMSProfileContext* context = FindProfileContext(aSIPProfile); + if (!context) + { + User::Leave(KErrNotFound); + } + context->RetryRegistration(); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::AddProfileIntoQueue +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::AddProfileIntoQueue( + CSIPConcreteProfile& aSIPProfile) const + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::AddProfileIntoQueue", + aSIPProfile.Id()) + + TBool found = EFalse; + + for (TInt i=0; i < iConnectionCtxArray.Count() && !found; i++) + { + found = iConnectionCtxArray[i]->AddIntoQueue( + aSIPProfile.Server(KSIPRegistrar)); + } + return found; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RegisterProfileAfterQueueL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::RegisterProfileAfterQueueL( + CSIPConcreteProfile& aSIPProfile) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::RegisterProfileAfterQueueL", + aSIPProfile.Id()) + + RegisterFromAuthorizedArrayL(aSIPProfile); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::DeregisterProfileAfterQueueL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::DeregisterProfileAfterQueueL( + CSIPConcreteProfile& aSIPProfile) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::DeregisterProfileAfterQueueL", + aSIPProfile.Id()) + + CSIPIMSProfileContext* context = FindProfileContext(aSIPProfile); + __ASSERT_ALWAYS(context, User::Leave(KErrNotFound)); + context->DeregisterL(); + + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RetryProfileRegistrationAfterQueueL +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::RetryProfileRegistrationAfterQueueL( + CSIPConcreteProfile& aSIPProfile) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::RetryRegisterAfterQueueL", + aSIPProfile.Id()) + + CSIPIMSProfileContext* context = FindProfileContext(aSIPProfile); + __ASSERT_ALWAYS(context, User::Leave(KErrNotFound)); + + context->RetryRegistration(); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::IsInQueue +// From MSIPProfileFSMUser +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::IsInQueue( + CSIPConcreteProfile& aSIPProfile) const + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::IsInQueue", + aSIPProfile.Id()) + return iProfileQueueHandling->IsInQueue(aSIPProfile); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::AllowedTakeFromQueue +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::AllowedTakeFromQueue( + CSIPConcreteProfile& aSIPConcreteProfile ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::AllowedTakeFromQueue") + TBool found = EFalse; + for (TInt i=0; i < iConnectionCtxArray.Count() && !found; i++) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::AllowedTakeFromQueue next AddIntoQueue") + found = iConnectionCtxArray[i]->AddIntoQueue( + aSIPConcreteProfile.Server(KSIPRegistrar) ) ; + } + return !found; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::CheckIfConfigured +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::CheckIfConfigured(CSIPConcreteProfile& aSIPProfile) + { + TBool result = EFalse; + if (aSIPProfile.AOR().Length()) + { + return ETrue; + } + if (aSIPProfile.PrivateIdentity().Length() || + aSIPProfile.ServerParameter(KSIPRegistrar, KSIPDigestUserName).Length()) + { + return ETrue; + } + if (aSIPProfile.ServerParameter(KSIPRegistrar, KSIPDigestRealm).Length()) + { + return ETrue; + } + if (aSIPProfile.ServerParameter(KSIPRegistrar, KSIPDigestPassword).Length()) + { + return ETrue; + } + + if (aSIPProfile.Server(KSIPRegistrar).Length()) + { + return ETrue; + } + + if (aSIPProfile.ServerParameter(KSIPOutboundProxy, KSIPDigestUserName).Length()) + { + return ETrue; + } + if (aSIPProfile.ServerParameter(KSIPOutboundProxy, KSIPDigestRealm).Length()) + { + return ETrue; + } + if (aSIPProfile.ServerParameter(KSIPOutboundProxy, KSIPDigestPassword).Length()) + { + return ETrue; + } + return result; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::MandatoryValuesConfigured +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::MandatoryValuesConfigured( + CSIPConcreteProfile& aSIPProfile) + { + TBool result = ETrue; + if(!aSIPProfile.IapId()) + { + return EFalse; + } + if (!aSIPProfile.AOR().Length()) + { + return EFalse; + } + if (!aSIPProfile.PrivateIdentity().Length() && + !aSIPProfile.ServerParameter(KSIPRegistrar, KSIPDigestUserName).Length()) + { + return EFalse; + } + if (!aSIPProfile.ServerParameter(KSIPRegistrar, KSIPDigestPassword).Length()) + { + return EFalse; + } + if (!aSIPProfile.Server(KSIPRegistrar).Length()) + { + return EFalse; + } + return result; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::SIPProfileStatusEvent +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::SIPProfileStatusEvent( + CSIPConcreteProfile& aProfile, + TUint32 aContextId) + { + TUint32 profileId = aProfile.Id(); + PROFILE_DEBUG4( "CSIPIMSProfileAgent::SIPProfileStatusEvent",\ + profileId, aContextId ) + TBool reportStatusToUser = ETrue; + CSIPIMSProfileContext* context = FindProfileContext( aProfile.Id() ); + TRAPD( err, reportStatusToUser = + HandleISIMUpdateRegistrationEventL( aProfile, context ) ); + if ( err == KErrNone && reportStatusToUser ) + { + RegisterQueue( aProfile, ETrue ); + HandleWaitingForRegisteringArray(); + iSIPProfileAgentObserver.SIPProfileStatusEvent( aProfile, aContextId ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::HandleISIMUpdateRegistrationEventL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::HandleISIMUpdateRegistrationEventL( + CSIPConcreteProfile& aProfile, + CSIPIMSProfileContext* aContext) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::HandleISIMUpdateRegistrationEvent") + TBool notIsimUpdateCase = ETrue; + if ( iISIMUpdateProfile && iISIMUpdateProfile->Id() == aProfile.Id() ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::HandleISIMUpdateRegistrationEvent ISIMUpdateProfile") + TUint32 contextId = 0; + if ( aContext ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::HandleISIMUpdateRegistrationEvent aContext") + if ( aContext->CurrentState() == MSIPProfileContext::ERegistered ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::HandleISIMUpdateRegistrationEvent ERegistered") + contextId = aContext->Registration()->ContextId(); + DeregisterL( *iISIMUpdateProfile ); + notIsimUpdateCase = EFalse; + iSIPProfileAgentObserver.SIPProfileStatusEvent( aProfile, contextId ); + } + } + else + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::HandleISIMUpdateRegistrationEvent no aContext") + FindProfileContextAndRegisterL( *iISIMUpdateProfile ); + notIsimUpdateCase = EFalse; + } + } + if ( iInterimProfile && + iInterimProfile->Id() == aProfile.Id() && + !aContext ) + { + FindProfileContextAndRegisterL( *iInterimProfile ); + notIsimUpdateCase = EFalse; + } + PROFILE_DEBUG1("CSIPIMSProfileAgent::HandleISIMUpdateRegistrationEvent end") + return notIsimUpdateCase; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::HandleWaitingForRegisteringArray +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::HandleWaitingForRegisteringArray() + { + if ( iWaitForRegisteringArray.Count() ) + { + TBool isRegInProgress = EFalse; + + if ( IsIPSecAlreadyInUse( isRegInProgress ) ) + { + //delete all in the que, one by one + DeleteAllProfilesInWaitingQue(); + } + else + { + if ( !isRegInProgress ) + { + //take the first in the que and register + TRAP_IGNORE( RegisterFromWaitingQueL() ) + } + } + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::DeleteAllProfilesInWaitingQue +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::DeleteAllProfilesInWaitingQue() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::DeleteAllProfilesInWaitingQue") + + CSIPConcreteProfile* profile = NULL; + for (TInt i=0; i< iWaitForRegisteringArray.Count();i++) + { + profile = iWaitForRegisteringArray[i]; + if (profile) + { + TerminateAndErrorEvent(*profile, KErrArgument); + iWaitForRegisteringArray.Remove(i); + } + } + iWaitForRegisteringArray.Compress(); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RegisterFromWaitingQueL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::RegisterFromWaitingQueL() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::RegisterFromWaitingQue") + CSIPConcreteProfile* profile = + RemoveFirstProfileFromArray( iWaitForRegisteringArray ); + if ( profile ) + { + ProfileToWaitingQueueL( profile ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RemoveFirstProfileFromArray +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPConcreteProfile* CSIPIMSProfileAgent::RemoveFirstProfileFromArray( + RPointerArray& aProfileArray ) + { + CSIPConcreteProfile* profile = NULL; + if (aProfileArray.Count() > 0) + { + profile = aProfileArray[0]; + aProfileArray.Remove(0); + aProfileArray.Compress(); + } + return profile; + } + +// ---------------------------------------------------------------------------- +// CSIPIMSProfileAgent::TerminateAndErrorEvent +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::TerminateAndErrorEvent( CSIPConcreteProfile& aProfile, + TInt aError ) + { + TerminateHandling(aProfile); + iSIPProfileAgentObserver.SIPProfileErrorEvent(aProfile,aError); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::FoundIPSecProfileCandidate +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::FoundIPSecProfileCandidate() + { + TBool result = EFalse; + if ( iUsimProvider && iUsimProvider->IsUsimSupported() ) + { + result = iProfileQueueHandling->FoundIPSecProfileCandidate(); + } + return result; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::ChooseProfileTypeL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::ChooseProfileTypeL( CSIPConcreteProfile* aProfile, + CSIPIMSProfileContext* context ) + { + if (CheckIfConfigured(*aProfile)) + { + context->SetConfiguredType(CSIPIMSProfileContext::EClientConfiguredType); + } + else + { + if (iUsimProvider && !iUsimProvider->IsUsimSupported()) + { + context->SetConfiguredType(CSIPIMSProfileContext::EEarlyIMSType); + } + if (iUsimProvider && iUsimProvider->IsUsimSupported()) + { + context->SetConfiguredType(CSIPIMSProfileContext::EIMSReleaseType); + } + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RegisterFromAuthorizedArrayL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::RegisterFromAuthorizedArrayL( + CSIPConcreteProfile& aProfile) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::RegisterFromAuthorizedArrayL") + FindProfileContextAndRegisterL( aProfile ); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::ProfileToWaitingQueueL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::ProfileToWaitingQueueL( + CSIPConcreteProfile* aProfile ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::ProfileToWaitingQueueL") + if ( !iProfileQueueHandling->AddRegisterToQueueL( *aProfile, EFalse ) ) + { + RegisterFromAuthorizedArrayL( *aProfile ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::DeregisterToWaitingQueueL +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::DeregisterToWaitingQueueL( + CSIPIMSProfileContext* aContext ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::DeregisterToWaitingQueueL") + return iProfileQueueHandling->AddDeregisterToQueueL( *aContext->Profile() ); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::SetInterimProfile +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::SetInterimProfile( CSIPConcreteProfile* aSIPConcreteProfile ) + { + iInterimProfile = aSIPConcreteProfile; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::SIPProfileErrorEvent +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::SIPProfileErrorEvent( + CSIPConcreteProfile& aProfile, + TInt aError) + { + PROFILE_DEBUG4("CSIPIMSProfileAgent::SIPProfileErrorEvent", + aProfile.Id(), aError) + + CSIPIMSProfileContext* context = FindProfileContext( aProfile.Id() ); + TBool reportStatusToUser = ETrue; + TRAPD( err, reportStatusToUser = + HandleISIMUpdateRegistrationEventL( aProfile, context ) ); + if ( reportStatusToUser ) + { + if ( context && context->IgnoreErrorEvent() ) + { + PROFILE_DEBUG4( "CSIPIMSProfileAgent::Error ignored",\ + aProfile.Id(), aError ) + } + else + { + if ( err == KErrNone ) + { + err = aError; + } + + PROFILE_DEBUG4( "CSIPIMSProfileAgent::Error sent",\ + aProfile.Id(), err ) + + RegisterQueue( aProfile, EFalse ); + HandleWaitingForRegisteringArray(); + iSIPProfileAgentObserver.SIPProfileErrorEvent( aProfile, err ); + } + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::ProceedRegistration +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::ProceedRegistration( + CSIPConcreteProfile& aProfile, + TInt aError) + { + PROFILE_DEBUG3("CSIPIMSProfileAgent::ProceedRegistration", aProfile.Id()) + return iSIPProfileAgentObserver.ProceedRegistration(aProfile, aError); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::GetFailedProfilesL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::GetFailedProfilesL(const TSIPProfileTypeInfo& /*aType*/, + RPointerArray& /*aArray*/ ) const + { + } + + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::AuthorizedL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::AuthorizedL() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::AuthorizedL") + //function called after async call to request for authorization info + CSIPConcreteProfile* profile = NULL; + if (iSIMRecord->PrivateIdentity().Length()) + { + while (iUSimWaitForAuthorizedArray.Count() > 0) + { + profile = NULL; + profile = RemoveFirstProfileFromArray( + iUSimWaitForAuthorizedArray ); + + if (RegAllowedWithUSIMorISIML(*profile)) + { + if (profile->IsSecurityNegotiationEnabled() && + !CSIPIMSProfileContext::IsHttpDigestSettingsConfigured( + *profile)) + { + _LIT8(KSIPIpSec3gpp, "ipsec-3gpp"); + if (CSIPIMSProfileContext::IsSupportedSecurityMechanismL( + *iSIP, KSIPIpSec3gpp)) + { + TRAPD(err, CheckIPSecRulesL(*profile)); + CPPUNIT_MEMORYLEAVE + if (err) + { + TerminateAndErrorEvent(*profile, KErrArgument); + } + } + else + { + TerminateAndErrorEvent(*profile, KErrArgument); + } + } + else + { + ProfileToWaitingQueueL( profile ); + } + } + else + { + TerminateAndErrorEvent(*profile, KErrNotSupported); + } + } + } + if ( iSIMRecord->SIMPrivateIdentity().Length() ) + { + while (iSIMWaitForAuthorizedArray.Count() > 0) + { + profile = RemoveFirstProfileFromArray( + iSIMWaitForAuthorizedArray ); + ProfileToWaitingQueueL( profile ); + } + } + + while (iWaitForAuthorizedArray.Count() > 0) + { + profile = RemoveFirstProfileFromArray( + iWaitForAuthorizedArray ); + ProfileToWaitingQueueL( profile ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::AsyncDeltaTimer +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::AsyncDeltaTimer() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::AsyncDeltaTimer") + if (iDeltaTimerEntryListCount == 0) + { + TTimeIntervalMicroSeconds32 interval(KAuthorizedMicroSecsInSec); + iDeltaTimer.Queue(interval,iDeltaTimerEntry); + } + iDeltaTimerEntryListCount++; + } + +// ---------------------------------------------------------------------------- +// CSIPIMSProfileAgent::ASyncTimerExpired +// ---------------------------------------------------------------------------- +// +TInt CSIPIMSProfileAgent::ASyncTimerExpired(TAny* aPtr) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::ASyncTimerExpired") + CSIPIMSProfileAgent* self = reinterpret_cast(aPtr); + TRAPD(err, self->AuthorizedL()); + CPPUNIT_MEMORYLEAVE + err++; + self->iDeltaTimerEntryListCount = 0; + self->iDeltaTimer.Remove(self->iDeltaTimerEntry); + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::AuthorizationFailed +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::AuthorizationFailed() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::AuthorizationFailed") + TInt error = 0; + //function called after async call to request for authorization info + CSIPConcreteProfile* profile = NULL; + while (iUSimWaitForAuthorizedArray.Count() > 0) + { + profile = RemoveFirstProfileFromArray( + iUSimWaitForAuthorizedArray ); + if (RegAllowedWithSIM(*profile)) + { + TRAP(error, iSIMWaitForAuthorizedArray.AppendL(profile)); + } + else + { + TerminateAndErrorEvent( *profile, KErrNotSupported ); + } + } + if (!error) + { + TRAP(error, iUsimProvider->RequestL()); + } + if(error) + { + AuthorizationSIMFailed(); + AuthorizationUSIMFailed(); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::AuthorizationSIMFailed +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::AuthorizationSIMFailed() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::AuthorizationSIMFailed") + //function called after async call to request for authorization info + CSIPConcreteProfile* profile = NULL; + while (iSIMWaitForAuthorizedArray.Count() > 0) + { + profile = RemoveFirstProfileFromArray( + iSIMWaitForAuthorizedArray ); + TerminateAndErrorEvent( *profile, KErrArgument ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::AuthorizationUSIMFailed +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::AuthorizationUSIMFailed() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::AuthorizationUSIMFailed") + //function called after async call to request for authorization info + CSIPConcreteProfile* profile = NULL; + while (iUSimWaitForAuthorizedArray.Count() > 0) + { + profile = RemoveFirstProfileFromArray( + iUSimWaitForAuthorizedArray ); + TerminateAndErrorEvent( *profile, KErrArgument ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::UpdateRegistrationsL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::UpdateRegistrationsL() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::UpdateRegistrationsL") + //function called after ISIM OTA update notified + CheckIMSReleaseTypeProfilesL(); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::CheckIMSReleaseTypeProfilesL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::CheckIMSReleaseTypeProfilesL() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::CheckIMSReleaseTypeProfilesL") + //check if there is EIMSReleaseType profiles + TBool found = EFalse; + found = CheckRegistrationsL(); + CSIPConcreteProfile* profile = NULL; + if ( !found ) + { + TBool registering = EFalse; + profile = iProfileQueueHandling->IPSecProfileCandidate( registering ); + if ( profile ) + { + iUSimWaitForAuthorizedArray.AppendL( profile ); + found = ETrue; + } + else + { + profile = PreviouslyFailedIMSProfileL(); + if ( profile ) + { + iISIMUpdateProfile = profile; + iUSimWaitForAuthorizedArray.AppendL( profile ); + } + } + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::PreviouslyFailedIMSProfileL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPConcreteProfile* CSIPIMSProfileAgent::PreviouslyFailedIMSProfileL() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::PreviouslyFailedIMSProfile") + iPreviouslyFailedIMSProfile = 0; + iSIPProfileAgentObserver.GetFailedProfilesL(Type(), iFailedProfilesArray); + for (TInt i = 0; i < iFailedProfilesArray.Count(); i++) + { + if (!CheckIfConfigured(*iFailedProfilesArray[i])) + { + iPreviouslyFailedIMSProfile = iFailedProfilesArray[i]; + iFailedProfilesArray.Reset(); + } + } + return iPreviouslyFailedIMSProfile; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RemoveProfileFromWaitingQueue +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPConcreteProfile* CSIPIMSProfileAgent::RemoveProfileFromWaitingQueue( + RPointerArray& aProfileArray, + CSIPConcreteProfile& aSIPConcreteProfile ) + { + TBool found = EFalse; + CSIPConcreteProfile* profile = NULL; + for (TInt i=0; i< aProfileArray.Count() && !found; i++) + { + CSIPConcreteProfile* tmp = aProfileArray[ i ]; + found = ( tmp->Id() == aSIPConcreteProfile.Id() ); + profile = NULL; + if ( found ) + { + profile = tmp; + aProfileArray.Remove( i ); + aProfileArray.Compress(); + } + } + return profile; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::FindProfileContextAndRegisterL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::FindProfileContextAndRegisterL( + CSIPConcreteProfile& aSIPConcreteProfile ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::FindProfileContextAndRegisterL") + CSIPIMSProfileContext* context = FindProfileContext(aSIPConcreteProfile); + if (!context) + { + TRAPD(err, context = &ProvideProfileContextL(aSIPConcreteProfile)); + CPPUNIT_MEMORYLEAVE + if (err) + { + ResetISIMUpdateProfile( iISIMUpdateProfile ); + TerminateAndErrorEvent(aSIPConcreteProfile, KErrArgument); + } + } + if (context) + { + ChooseProfileTypeL( &aSIPConcreteProfile , context ); + TRAPD(err, context->RegisterL()); + CPPUNIT_MEMORYLEAVE + if (err) + { + ResetISIMUpdateProfile( iISIMUpdateProfile ); + TerminateAndErrorEvent(aSIPConcreteProfile, KErrArgument); + } + else + { + if (iISIMUpdateProfile && + ( iISIMUpdateProfile->Id() == aSIPConcreteProfile.Id() )) + { + iISIMUpdateProfile = 0; + TUint32 contextId = context->Registration()->ContextId(); + + iSIPProfileAgentObserver.SIPProfileStatusEvent( + aSIPConcreteProfile, contextId ); + } + else + { + if ( iInterimProfile && + iInterimProfile->Id() == aSIPConcreteProfile.Id() ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::FindProfileContextAndRegisterL iInterimProfile") + iInterimProfile = 0; + TUint32 contextId = context->Registration()->ContextId(); + + iSIPProfileAgentObserver.SIPProfileStatusEvent( + aSIPConcreteProfile, contextId ); + } + } + } + } + PROFILE_DEBUG1("CSIPIMSProfileAgent::FindProfileContextAndRegisterL end") + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::CheckRegistrationsL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSIPIMSProfileAgent::CheckRegistrationsL() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::CheckRegistrationsL") + TBool found = EFalse; + TUint32 profileId = 0; + CSIPConcreteProfile* profile = NULL; + for (TInt i=0; i < iConnectionCtxArray.Count() && !profileId; i++) + { + profileId = iConnectionCtxArray[i]->IsIPSecInUse(); + if (profileId) + { + found = ETrue; + } + } + if ( found ) + { + TBool registering = EFalse; + iProfileQueueHandling->IPSecProfileCandidate( registering ); + if ( registering ) + { + //profile is not found in deregistering que either, so new register is possible + CSIPIMSProfileContext* profilecontext = FindProfileContext( profileId ); + MSIPProfileContext::TSIPProfileState state = + profilecontext->CurrentState(); + if (state == MSIPProfileContext::EProxyResolvingInProgress || + state == MSIPProfileContext::EDelayedRegisterRequested || + state == MSIPProfileContext::ERegisterRequested) + { + profile = profilecontext->Profile(); + profilecontext->SetNextState( *iInit ); + CleanIdleConnectionContexts(); + iUSimWaitForAuthorizedArray.AppendL( profile ); + } + if ( state == MSIPProfileContext::ERegistrationInProgress ) + { + iISIMUpdateProfile = profilecontext->Profile(); + } + if ( state == MSIPProfileContext::ERegistered ) + { + iISIMUpdateProfile = profilecontext->Profile(); + DeregisterL( *iISIMUpdateProfile ); + } + } + } + return found; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::IncomingRequest +// From MSIPObserver +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::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; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::TimedOut +// From MSIPObserver +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::TimedOut(CSIPServerTransaction& /*aTransaction*/) + { + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::ChallengeReceived +// From MSIPHttpDigestChallengeObserver2 +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::ChallengeReceived( + const CSIPClientTransaction& aTransaction) + { + TBool found = EFalse; + for (TInt i=0; i < iConnectionCtxArray.Count() && !found; i++) + { + found = + iConnectionCtxArray[i]->SetCredentials(aTransaction,*iHttpDigest); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::ChallengeReceived +// From MSIPHttpDigestChallengeObserver2 +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::ChallengeReceived(const CSIPRefresh& aRefresh) + { + TBool found = EFalse; + for (TInt i=0; i < iConnectionCtxArray.Count() && !found; i++) + { + found = iConnectionCtxArray[i]->SetCredentials(aRefresh,*iHttpDigest); + } + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::FindProfileContext +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPIMSProfileContext* CSIPIMSProfileAgent::FindProfileContext( + CSIPConcreteProfile& aSIPConcreteProfile) const + { + return FindProfileContext(aSIPConcreteProfile.Id()); + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::FindProfileContext +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPIMSProfileContext* CSIPIMSProfileAgent::FindProfileContext( + TUint32 aProfileId) const + { + for (TInt i=0; i < iConnectionCtxArray.Count(); i++) + { + CSIPIMSProfileContext *context = + iConnectionCtxArray[i]->FindContext(aProfileId); + if (context) + { + return context; + } + } + return 0; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::FindConnectionContext +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPIMSConnectionContext* CSIPIMSProfileAgent::FindConnectionContext( + CSIPConcreteProfile& aProfile) const + { + CSIPIMSConnectionContext* 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; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::FindConnectionContext +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPIMSConnectionContext* CSIPIMSProfileAgent::FindConnectionContext( + TUint32 aIapId ) const + { + CSIPIMSConnectionContext* 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; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::ProvideProfileContextL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPIMSProfileContext& CSIPIMSProfileAgent::ProvideProfileContextL( + CSIPConcreteProfile& aProfile) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::ProvideProfileContextL") + CSIPIMSConnectionContext* connContext = FindConnectionContext(aProfile); + if (!connContext) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::ProvideProfileContextL create connection first") + + connContext = CSIPIMSConnectionContext::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::NewLC( sip, iapId, *connContext ); + } + else + { + connection = CSIPConnection::NewLC( *iSIP, iapId, *connContext ); + } + connContext->SetConnectionL( connection ); + CleanupStack::Pop( connection ); + + // Connection should be set before setting user + connContext->SetConnectionUserL( aProfile ); + + iConnectionCtxArray.AppendL( connContext ); + + CleanupStack::Pop( connContext ); + } + + CSIPIMSProfileContext* profilectx = + CSIPIMSProfileContext::NewLC(*iXMLParser, *iSIP, *connContext, *this, + *iInit, aProfile, iDeltaTimer, *iSIMRecord,*iConfigExtension); + connContext->AddProfileContextL(profilectx); + CleanupStack::Pop(profilectx); + return *profilectx; + } + +// ----------------------------------------------------------------------------- +// CSIPIMSProfileAgent::CleanIdleConnectionContexts +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::CleanIdleConnectionContexts() + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::CleanIdleConnectionContexts") + CSIPIMSConnectionContext* context = 0; + + for (TInt i=iConnectionCtxArray.Count()-1; i>= 0;) + { + iConnectionCtxArray[i]->CleanIdleContexts(); + if (iConnectionCtxArray[i]->IsIdle()) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::CleanIdleConnectionContexts,\ + ConnectionContext removed") + context = iConnectionCtxArray[i]; + iConnectionCtxArray.Remove(i); + delete context; + context = NULL; + } + i--; + } + + iConnectionCtxArray.Compress(); + } + +// ---------------------------------------------------------------------------- +// CSIPIMSProfileAgent::GetTsyModuleNameL +// ---------------------------------------------------------------------------- +// +void CSIPIMSProfileAgent::GetTsyModuleNameL( TDes& aTsyModuleName ) const + { + __ASSERT_ALWAYS( aTsyModuleName.MaxSize() >= KCommsDbSvrMaxFieldLength, + User::Leave( KErrArgument ) ); + + using namespace CommsDat; + + CMDBSession* db = CMDBSession::NewLC(KCDVersion1_1); + + CMDBField* globalSettingField = + new (ELeave) CMDBField(KCDTIdModemPhoneServicesSMS); + CleanupStack::PushL(globalSettingField); + + globalSettingField->SetRecordId(1); + globalSettingField->LoadL(*db); + TUint32 modemId = *globalSettingField; + + CMDBField* tsyField = new (ELeave) CMDBField(KCDTIdTsyName); + CleanupStack::PushL(tsyField); + + tsyField->SetRecordId(modemId); + tsyField->LoadL(*db); + aTsyModuleName = *tsyField; + + CleanupStack::PopAndDestroy(3, db); // db, tsyField & globalSettingField + } + +// ---------------------------------------------------------------------------- +// CSIPIMSProfileAgent::RegisterQueue +// ---------------------------------------------------------------------------- +// +TInt CSIPIMSProfileAgent::RegisterQueue( + CSIPConcreteProfile& aProfile, + TBool aReportError ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::RegisterQueue") + TInt err( KErrNone ); + + if ( AllowedTakeFromQueue( aProfile ) ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::RegisterQueue RegisterFromQueueL") + TRAP( err, iProfileQueueHandling->RegisterFromQueueL( aProfile ) ); + } + + if ( err && aReportError ) + { + PROFILE_DEBUG1("CSIPIMSProfileAgent::RegisterQueue ErrorEvent") + iSIPProfileAgentObserver.SIPProfileErrorEvent( aProfile, err ); + } + + PROFILE_DEBUG3("CSIPIMSProfileAgent::RegisterQueue end, err=", err) + return err; + } +