diff -r 000000000000 -r 307788aac0a8 sipplugins/sippsipadapter/src/CWPSIPAdapter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sipplugins/sippsipadapter/src/CWPSIPAdapter.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,851 @@ +/* +* Copyright (c) 2004-2007 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: Handles SIP settings in provisioning. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include // Unicode conversion +#include +#include +#include +#include + +#include +#include +#include + +#include "CSIPProfileRegistryObserver.h" +#include "CWPSIPAdapter.h" // own header +#include "CWPSIPItem.h" +#include "wpsipadapterdebug.h" + +// CONSTANTS +_LIT( KSIPAdapterName, "WPSIPAdapter" ); +_LIT( KSIPAppID, "w9010" ); +_LIT8( KSIPAppID8, "w9010" ); +_LIT8( KDestinationNwAppId, "w904C" ); // Destination Network settings APPID + +// SIP profile parameters, see w9010.txt +_LIT( KParmPTYPE, "PTYPE"); +_LIT( KParmPUID, "PUID"); +_LIT( KParmSIGNALCMPR, "SIGNALCMPR" ); +_LIT( KParmSECNEG, "SECNEG" ); +_LIT( KParmLR, "LR" ); +_LIT( KParmLOCK, "LOCK" ); +_LIT( KParmAUTOREG, "AUTOREG" ); +_LIT( KParmSIGQOS, "SIGQOS" ); + +// For other purposes. +const TUint32 KNotSet = 0xffffffff; + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::CWPSIPAdapter +// +// --------------------------------------------------------------------------- +// +CWPSIPAdapter::CWPSIPAdapter() : CWPAdapter() + { + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::ConstructL +// +// --------------------------------------------------------------------------- +// +void CWPSIPAdapter::ConstructL() + { + DBG_PRINT( "CWPSIPAdapter::ConstructL - begin" ); + TFileName fileName; + Dll::FileName( fileName ); + iDefaultName = WPAdapterUtil::ReadHBufCL( fileName, KSIPAdapterName, + R_QTN_SM_DEFAULT_NAME_SIP ); + iTitle = WPAdapterUtil::ReadHBufCL( fileName, KSIPAdapterName, + R_QTN_SM_HEAD_SIP ); + iProviderIdDefault = WPAdapterUtil::ReadHBufCL( fileName, KSIPAdapterName, + R_QTN_SM_PROVIDER ); + iSIPIdForDefault = KNotSet; + DBG_PRINT( "CWPSIPAdapter::ConstructL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::NewL +// +// --------------------------------------------------------------------------- +// +CWPSIPAdapter* CWPSIPAdapter::NewL() + { + CWPSIPAdapter* self = new( ELeave ) CWPSIPAdapter; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::~CWPSIPAdapter +// +// --------------------------------------------------------------------------- +// +CWPSIPAdapter::~CWPSIPAdapter() + { + DBG_PRINT( "CWPSIPAdapter::~CWPSIPAdapter - begin" ); + delete iTitle; + delete iProviderIdDefault; + delete iDefaultName; + delete iCurrentSIPItem; + iDatas.ResetAndDestroy(); + iDatas.Close(); + iSIPIdArray.Reset(); + iSIPIdArray.Close(); + DBG_PRINT( "CWPSIPAdapter::~CWPSIPAdapter - end" ); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::ContextExtension +// +// --------------------------------------------------------------------------- +// +TInt CWPSIPAdapter::ContextExtension( MWPContextExtension*& aExtension ) + { + aExtension = this; + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::SaveDataL +// +// --------------------------------------------------------------------------- +// +const TDesC8& CWPSIPAdapter::SaveDataL( TInt aIndex ) const + { + return iDatas[aIndex]->SaveData(); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::DeleteL +// +// --------------------------------------------------------------------------- +// +void CWPSIPAdapter::DeleteL( const TDesC8& aSaveData ) + { + TUint tId; + TLex8 lex( aSaveData ); + TInt err( KErrNone ); + err = lex.Val( tId ); + if ( KErrNone == err ) + { + CSIPProfileRegistryObserver* cSIPProfileRegistryObserver = + CSIPProfileRegistryObserver::NewLC(); + CSIPManagedProfileRegistry* cSIPManagedProfileRegistry = + CSIPManagedProfileRegistry::NewLC( *cSIPProfileRegistryObserver ); + CSIPProfile* cProfile = NULL; + cProfile = cSIPManagedProfileRegistry->ProfileL( tId ); + CleanupStack::PushL( cProfile ); + cSIPManagedProfileRegistry->DestroyL( *cProfile ); + CleanupStack::PopAndDestroy( cProfile ); + cProfile = NULL; + CleanupStack::PopAndDestroy( cSIPManagedProfileRegistry ); + CleanupStack::PopAndDestroy( cSIPProfileRegistryObserver ); + }// if + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::Uid +// +// --------------------------------------------------------------------------- +// +TUint32 CWPSIPAdapter::Uid() const + { + return iDtor_ID_Key.iUid; + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::DetailsL +// +// --------------------------------------------------------------------------- +// +TInt CWPSIPAdapter::DetailsL( TInt /*aItem*/, MWPPairVisitor& /*aVisitor */ ) + { + return KErrNotSupported; + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::SummaryCount +// +// --------------------------------------------------------------------------- +// +TInt CWPSIPAdapter::ItemCount() const + { + return iDatas.Count(); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::SummaryTitle +// +// --------------------------------------------------------------------------- +// +const TDesC16& CWPSIPAdapter::SummaryTitle( TInt /*aIndex*/ ) const + { + return *iTitle; + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::SummaryText +// +// --------------------------------------------------------------------------- +// +const TDesC16& CWPSIPAdapter::SummaryText( TInt aIndex ) const + { + // If there is no value for NAME parameter the default value is set here. + if ( iDatas[aIndex]->GetName().Length() == 0 ) + { + TRAP_IGNORE( iDatas[aIndex]->SetNameL( iDefaultName->Des() ) ); + } + return iDatas[aIndex]->GetName(); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::SaveL +// +// --------------------------------------------------------------------------- +// +void CWPSIPAdapter::SaveL( TInt aIndex ) + { + DBG_PRINT( "CWPSIPAdapter::SaveL - begin" ); + // Getting the SIP item (SIP profile data) at given index. + CWPSIPItem* sipItem = iDatas[aIndex]; + + if ( sipItem->GetNapDef() ) + { + // Get WAP ID. + TPckgBuf uid; + uid.Copy( sipItem->GetNapDef()->Data( 0 ) ); + + TUint32 wapId( uid() ); + // Get corresponding IAP ID. + TUint32 iapId = IapIdFromWapIdL( wapId ); + sipItem->SetIAPId( iapId ); + } + + // If the PROVIDER-ID was not received the default value is set. + if ( sipItem->GetProviderId().Length() == 0 ) + { + HBufC8* tmpProviderId8 = HBufC8::NewLC( + iProviderIdDefault->Length() ); // CS:1 + TPtr8 ptrProviderId( tmpProviderId8->Des() ); + ptrProviderId.Copy( iProviderIdDefault->Des() ); + sipItem->SetProviderIdL( tmpProviderId8->Des() ); + CleanupStack::PopAndDestroy( tmpProviderId8 ); // CS:0 + } + + sipItem->StoreL(); + + // Set WLAN availability state. Setting WLAN availability is done in + // SavingFinalizedL(). + if ( sipItem->GetAutomaticRegistrationEnabled() ) + { + iSIPIdArray.AppendL( sipItem->GetProfileId() ); + } + DBG_PRINT( "CWPSIPAdapter::SaveL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::CanSetAsDefault +// +// --------------------------------------------------------------------------- +// +TBool CWPSIPAdapter::CanSetAsDefault( TInt /* aIndex */ ) const + { + TBool canSetAsDefault( 0 ); + TRAP_IGNORE( canSetAsDefault = CheckSettingAsDefaultL() ); + return canSetAsDefault; + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::CheckSettingAsDefaultL +// +// --------------------------------------------------------------------------- +// +TBool CWPSIPAdapter::CheckSettingAsDefaultL() const + { + // Array of pointers to all loaded SIP profiles. + CArrayPtrFlat* profiles; + + CSIPProfileRegistryObserver* cSIPProfileRegistryObserver = + CSIPProfileRegistryObserver::NewLC(); // CS:1 + CSIPManagedProfileRegistry* cSIPManagedProfileRegistry = + CSIPManagedProfileRegistry::NewLC( *cSIPProfileRegistryObserver ); + // CS:2 + RArray profileTypes; + CleanupClosePushL( profileTypes ); // CS:3 + + // Get the supported profile types. + cSIPManagedProfileRegistry->SupportedProfileTypesL( profileTypes ); + + // Create the profile pointer array. + profiles = new ( ELeave ) CArrayPtrFlat( 5 ); + TCleanupItem cleanupItem( CWPSIPItem::CleanupArrayItem, profiles ); + CleanupStack::PushL( cleanupItem ); // CS:4 + + TInt i( 0 ); + RPointerArray profilePointerArray; + CleanupResetAndDestroyPushL( profilePointerArray ); // CS:5 + + // Get all profiles based on profile types + for ( i = 0; i < profileTypes.Count(); i++ ) + { + cSIPManagedProfileRegistry->ProfilesL( profileTypes[i], + profilePointerArray ); + TInt j( 0 ); + for ( j = 0; j < profilePointerArray.Count(); j++ ) + { + CSIPManagedProfile* profile = + static_cast( profilePointerArray[j] ); + profiles->AppendL( profile ); + } + profilePointerArray.Reset(); + } + TInt profileCount = profiles->Count(); + + // &profilePointerArray, profiles, &profileTypes, + // cSIPManagedProfileRegistry, cSIPProfileRegistryObserver + CleanupStack::PopAndDestroy( 5, cSIPProfileRegistryObserver ); // CS:0 + + if ( profileCount > 1 ) + { + // Adapter supports setting profile as default when there are at least + // one profile stored before. + return ETrue; + } + else + { + // First profile always gets default, no need to ask question in UI. + return EFalse; + } + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::SetAsDefaultL +// +// --------------------------------------------------------------------------- +// +void CWPSIPAdapter::SetAsDefaultL( TInt /* aIndex */ ) + { + // Set messages first profile as default + iDatas[0]->SetAsDefaultL(); + iDatas[0]->StoreL(); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::VisitL +// +// --------------------------------------------------------------------------- +// +void CWPSIPAdapter::VisitL( CWPCharacteristic& aCharacteristic ) + { + switch( aCharacteristic.Type() ) + { + case KWPApplication: + iCurrentCharacteristic = KWPApplication; + iCurrentSIPItem = CWPSIPItem::NewL(); + aCharacteristic.AcceptL( *this ); + + if ( iAppID == KSIPAppID ) + { + User::LeaveIfError( iDatas.Append( iCurrentSIPItem ) ); + } + else + { + delete iCurrentSIPItem; + } + iCurrentSIPItem = NULL; + break; + + case KWPResource: + iCurrentCharacteristic = KWPResource; + if ( iCurrentSIPItem ) + { + aCharacteristic.AcceptL( *this ); + } + break; + + case KWPNapDef: + iCurrentCharacteristic = KWPNapDef; + if ( iCurrentSIPItem ) + { + aCharacteristic.AcceptL( *this ); + } + break; + + case KWPAppAddr: + iCurrentCharacteristic = KWPAppAddr; + if ( iCurrentSIPItem ) + { + aCharacteristic.AcceptL( *this ); + } + break; + + case KWPPort: + iCurrentCharacteristic = KWPPort; + if ( iCurrentSIPItem ) + { + aCharacteristic.AcceptL( *this ); + } + break; + + case KWPAppAuth: + iCurrentCharacteristic = KWPAppAuth; + if ( iCurrentSIPItem ) + { + aCharacteristic.AcceptL( *this ); + } + break; + + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::VisitL +// +// --------------------------------------------------------------------------- +// +void CWPSIPAdapter::VisitL( CWPParameter& aParameter ) + { + DBG_PRINT("CWPSIPAdapter::VisitL( parameter ) - begin"); + + if ( !iCurrentSIPItem ) + { + User::Leave( KErrGeneral ); + } + // tmpValue is created for holding value converted from Unicode to UTF8. + HBufC8* tmpValue; + tmpValue = HBufC8::NewL( aParameter.Value().Length() ); + CleanupStack::PushL( tmpValue ); // CS:1 + TPtr8 ptrTmpValue( tmpValue->Des() ); + ptrTmpValue.Copy( aParameter.Value() ); + + switch ( aParameter.ID() ) + { + case EWPParameterAppID: + { + iAppID.Set( aParameter.Value() ); + break; + } + // Here case 0 are handled the SIP parameters that are extensions to + // OMA Client Provisioning parameter set. + case 0: + { + if ( aParameter.Name() == KParmPTYPE ) + { + iCurrentSIPItem->SetProfileTypeL( tmpValue->Des() ); + } + else if ( aParameter.Name() == KParmPUID && + iCurrentSIPItem->GetAOR().Length() == 0 ) + { + iCurrentSIPItem->SetAORL( tmpValue->Des() ); + } + else if ( aParameter.Name() == KParmSIGNALCMPR && + iCurrentSIPItem->GetSignalCompressionEnabled() == EFalse ) + { + iCurrentSIPItem->SetSignalCompressionEnabled( ETrue ); + } + else if ( aParameter.Name() == KParmSECNEG && + iCurrentSIPItem->GetSecurityNegotiationEnabled() == EFalse ) + { + iCurrentSIPItem->SetSecurityNegotiationEnabled( ETrue ); + } + // Extensions to OMA parameters in APPDDR characteristics + else if ( aParameter.Name() == KParmLR && iCurrentSIPItem-> + GetLooseRoutingForOutboundConnectionEnabled() == EFalse ) + { + iCurrentSIPItem->SetLooseRoutingForOutboundConnectionEnabled( + ETrue ); + } + else if ( aParameter.Name() == KParmLOCK ) + { + iCurrentSIPItem->SetProfileLockEnabled( ETrue ); + } + else if ( aParameter.Name() == KParmAUTOREG && iCurrentSIPItem-> + GetAutomaticRegistrationEnabled() == EFalse ) + { + iCurrentSIPItem->SetAutomaticRegistrationEnabled( ETrue ); + } + else if ( aParameter.Name() == KParmSIGQOS ) + { + TUint32 parmVal; + TLex8 lex( tmpValue->Des() ); + TInt err( KErrNone ); + err = lex.Val( parmVal, EDecimal ); + if ( KErrNone == err ) + { + iCurrentSIPItem->SetSigQos( parmVal ); + } + } + break; + } + case EWPParameterAppRef: + { + if ( iCurrentSIPItem->GetAppRef().Length() == 0 ) + { + iCurrentSIPItem->SetAppRefL( tmpValue->Des() ); + }// if + break; + } + case EWPParameterURI: + { + if ( iCurrentCharacteristic == KWPResource && + iCurrentSIPItem->GetRegistrarAddr().Length() == 0 ) + { + iCurrentSIPItem->SetRegistrarAddrL( tmpValue->Des() ); + }// if + break; + } + + case EWPParameterToNapID: + { + if ( iCurrentCharacteristic == KWPApplication && + iCurrentSIPItem->GetNapDefName().Length() == 0 ) + { + iCurrentSIPItem->SetNapDefNameL( tmpValue->Des() ); + }// if + break; + } + case EWPParameterName: + { + if ( iCurrentSIPItem->GetName().Length() == 0 ) + { + iCurrentSIPItem->SetNameL( aParameter.Value() ); + } + break; + } + + case EWPParameterProviderID: + { + if ( iCurrentSIPItem->GetProviderId().Length() == 0 ) + { + iCurrentSIPItem->SetProviderIdL( tmpValue->Des() ); + } + break; + } + + case EWPParameterAProtocol: + { + if ( iCurrentSIPItem->GetProtocolForOutboundConnection().Length() + == 0 ) + { + iCurrentSIPItem->SetProtocolForOutboundConnectionL( + tmpValue->Des() ); + } + break; + } + + case EWPParameterAddr: + { + if ( iCurrentCharacteristic == KWPAppAddr && + iCurrentSIPItem->GetOutboundAddr().Length() == 0 ) + { + iCurrentSIPItem->SetOutboundAddrL( tmpValue->Des() ); + } + break; + } + + case EWPParameterPortNbr: + { + if ( iCurrentCharacteristic == KWPPort && iCurrentSIPItem-> + GetPortNumberForOutboundConnection().Length() == 0 ) + { + iCurrentSIPItem->SetPortNumberForOutboundConnectionL( + tmpValue->Des() ); + } + break; + } + + case EWPParameterAAuthType: + { + if ( iCurrentCharacteristic == KWPAppAuth && iCurrentSIPItem-> + GetAuthenticationTypeForOutbound().Length() == 0 ) + { + iCurrentSIPItem->SetAuthenticationTypeForOutboundL( + tmpValue->Des() ); + } + else if ( iCurrentCharacteristic == KWPResource && + iCurrentSIPItem->GetAuthenticationTypeForRegistrar().Length() + == 0 ) + { + iCurrentSIPItem->SetAuthenticationTypeForRegistrarL( + tmpValue->Des() ); + } + break; + } + + case EWPParameterAAuthName: + { + if ( iCurrentCharacteristic == KWPAppAuth && + iCurrentSIPItem->GetUsernameForOutbound().Length() == 0 ) + { + iCurrentSIPItem->SetUsernameForOutboundL( tmpValue->Des() ); + } + else if ( iCurrentCharacteristic == KWPResource && + iCurrentSIPItem->GetUsernameForRegistrar().Length() == 0 ) + { + iCurrentSIPItem->SetUsernameForRegistrarL( tmpValue->Des() ); + } + break; + } + + case EWPParameterAAuthSecret: + { + if ( iCurrentCharacteristic == KWPAppAuth && + iCurrentSIPItem->GetPasswordForOutbound().Length() == 0 ) + { + iCurrentSIPItem->SetPasswordForOutboundL(tmpValue->Des()); + } + else if ( iCurrentCharacteristic == KWPResource && + iCurrentSIPItem->GetPasswordForRegistrar().Length() == 0 ) + { + iCurrentSIPItem->SetPasswordForRegistrarL( tmpValue->Des() ); + } + break; + } + + case EWPParameterAAuthData: + { + if ( iCurrentCharacteristic == KWPAppAuth && + iCurrentSIPItem->GetRealmForOutbound().Length() == 0 ) + { + iCurrentSIPItem->SetRealmForOutboundL(tmpValue->Des()); + } + else if ( iCurrentCharacteristic == KWPResource && + iCurrentSIPItem->GetRealmForRegistrar().Length() == 0 ) + { + iCurrentSIPItem->SetRealmForRegistrarL( tmpValue->Des() ); + } + break; + } + + case EWPParameterToAppRef: + { + if ( !iCurrentSIPItem->ToAppRef().Length() ) + { + iCurrentSIPItem->SetToAppRefL( tmpValue->Des() ); + } + break; + } + + case EWPParameterNetwork: + { + if ( !iCurrentSIPItem->Network().Length() ) + { + iCurrentSIPItem->SetNetworkL( aParameter.Value() ); + } + break; + } + + default: + break; + } + CleanupStack::PopAndDestroy( tmpValue ); // CS:0 + DBG_PRINT("CWPSIPAdapter::VisitL( parameter ) - end"); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::VisitLinkL +// +// --------------------------------------------------------------------------- +// +void CWPSIPAdapter::VisitLinkL( CWPCharacteristic& aLink ) + { + DBG_PRINT("CWPSIPAdapter::VisitLinkL - begin"); + switch( aLink.Type() ) + { + case KWPNapDef: + { + if ( !iCurrentSIPItem->GetNapDef() ) + { + iCurrentSIPItem->SetNapDef( &aLink ); + } + break; + } + default: + break; + } + DBG_PRINT("CWPSIPAdapter::VisitLinkL - end"); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::GetSavingInfoL +// +// --------------------------------------------------------------------------- +// +void CWPSIPAdapter::GetSavingInfoL( TInt aIndex, + RPointerArray& aSavingInfo ) + { + // APPID into place [0]. + aSavingInfo.AppendL( KSIPAppID8().AllocL() ); + // APPREF into place [1]. + aSavingInfo.AppendL( iDatas[aIndex]->GetAppRef().AllocL() ); + // SIP Profile id into place [2]. + aSavingInfo.AppendL( iDatas[aIndex]->SaveData().AllocL() ); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::SavingFinalizedL() +// +// --------------------------------------------------------------------------- +// +void CWPSIPAdapter::SavingFinalizedL() + { + DBG_PRINT( "CWPSIPAdapter::SavingFinalizedL - begin" ); + CSIPProfileRegistryObserver* cSIPProfileRegistryObserver = + CSIPProfileRegistryObserver::NewLC(); + CSIPManagedProfileRegistry* cSIPManagedProfileRegistry = + CSIPManagedProfileRegistry::NewLC( *cSIPProfileRegistryObserver ); + + // Go through SIP profiles and set autoregistration if needed. + // Autoregistrable profile IDs are in iSIPIdArray. + for ( TInt sipIdCounter = 0; sipIdCounter < iSIPIdArray.Count(); + sipIdCounter++ ) + { + CSIPProfile* cProfile = NULL; + cProfile = cSIPManagedProfileRegistry->ProfileL( + iSIPIdArray[sipIdCounter] ); + CSIPManagedProfile* cSIPManagedProfile = + static_cast( cProfile ); + cSIPManagedProfile->SetParameter( KSIPAutoRegistration, ETrue ); + cSIPManagedProfileRegistry->SaveL( *cSIPManagedProfile ); + } + iSIPIdArray.Reset(); + CleanupStack::PopAndDestroy( cSIPManagedProfileRegistry ); + CleanupStack::PopAndDestroy( cSIPProfileRegistryObserver ); + DBG_PRINT( "CWPSIPAdapter::SavingFinalizedL - end" ); + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::IapIdFromWapIdL +// Returns IAP ID from WAP ID. +// --------------------------------------------------------------------------- +// +TUint32 CWPSIPAdapter::IapIdFromWapIdL( TUint32 aWapId ) + { + DBG_PRINT( "CWPSIPAdapter::IapIdFromWapIdL - begin" ); + RCmManagerExt cmManager; + cmManager.OpenLC(); // CS:1 + RArray iapIds; + + TUint32 iapId( 0 ); + + // First get all free IAP ID's. + cmManager.ConnectionMethodL( iapIds ); + CleanupClosePushL( iapIds ); // CS:2 + + // Then get IAP ID's from all destinations. + RArray destIds; + cmManager.AllDestinationsL( destIds ); + CleanupClosePushL( destIds ); // CS:3 + + TInt destCount = destIds.Count(); + + for ( TInt destIndex = 0; destIndex < destCount; destIndex++ ) + { + RCmDestinationExt dest = cmManager.DestinationL( + destIds[destIndex] ); + + CleanupClosePushL( dest ); // CS:4 + TInt cmCount = dest.ConnectionMethodCount(); + for ( TInt cmIndex = 0; cmIndex < cmCount; cmIndex++ ) + { + TUint32 apId = dest.ConnectionMethodL( + cmIndex ).GetIntAttributeL( CMManager::ECmIapId ); + iapIds.AppendL( apId ); + } + CleanupStack::PopAndDestroy( &dest ); // CS:3 + } + // Finally, go through all connection methods and find correct IAP ID. + const TInt cmCount = iapIds.Count(); + for ( TInt counter = 0; counter < cmCount; counter++ ) + { + TUint32 id = cmManager.GetConnectionMethodInfoIntL( + iapIds[counter], CMManager::ECmWapId ); + + if ( id == aWapId ) + { + iapId = iapIds[counter]; + // No need to go through rest of IAPs. + break; + } + } + + // PopAndDestroy destIds, iapIds, cmManager. + CleanupStack::PopAndDestroy( 3, &cmManager ); // CS:0 + + DBG_PRINT( "CWPSIPAdapter::IapIdFromWapIdL - end" ); + return iapId; + } + +// --------------------------------------------------------------------------- +// CWPSIPAdapter::SettingsSavedL +// +// --------------------------------------------------------------------------- +// +void CWPSIPAdapter::SettingsSavedL( const TDesC8& aAppIdOfSavingItem, + const TDesC8& aAppRef, const TDesC8& aStorageIdValue ) + { + DBG_PRINT( "CWPSIPAdapter::SettingsSavedL - begin" ); + if ( 0 == aAppIdOfSavingItem.Compare( KDestinationNwAppId() ) ) + { + TInt snapId; + TLex8 lex( aStorageIdValue ); + User::LeaveIfError( lex.Val( snapId ) ); + for ( TInt counter = 0; counter < iDatas.Count(); counter++ ) + { + if ( 0 == iDatas[counter]->ToAppRef().Compare( aAppRef ) ) + { + // If SIP settings are already saved, i.e. profile ID exists, + // set SNAP ID to existing profile. + if ( iDatas[counter]->GetProfileId() ) + { + CSIPProfileRegistryObserver* observer = + CSIPProfileRegistryObserver::NewLC(); // CS:1 + CSIPManagedProfileRegistry* registry = + CSIPManagedProfileRegistry::NewLC( *observer );// CS:2 + CSIPProfile* profile = NULL; + profile = registry->ProfileL( + iDatas[counter]->GetProfileId() ); + CSIPManagedProfile* managedProfile = + static_cast( profile ); + managedProfile->SetParameter( + KSIPSnapId, (TUint32)snapId ); + registry->SaveL( *managedProfile ); + CleanupStack::PopAndDestroy( 2, observer ); // CS:0 + } + else + { + iDatas[counter]->SetSnapId( snapId ); + } + } + } + } + DBG_PRINT( "CWPSIPAdapter::SettingsSavedL - end" ); + } + +// End of File