sipplugins/sippsipadapter/src/CWPSIPAdapter.cpp
changeset 0 307788aac0a8
child 1 dd3853b8dc3f
--- /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 <e32base.h>
+#include <CWPAdapter.h>
+#include <cwpcharacteristic.h>
+#include <cwpparameter.h>
+#include <wpsipadapter.rsg>
+#include <utf.h>           // Unicode conversion
+#include <wpadapterutil.h>
+#include <sipmanagedprofileregistry.h>
+#include <sipmanagedprofile.h>
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+
+#include <cmmanagerext.h>
+#include <cmdestinationext.h>
+#include <cmconnectionmethoddef.h>
+
+#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<TUint32> 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<CSIPManagedProfile>* profiles;
+
+    CSIPProfileRegistryObserver* cSIPProfileRegistryObserver = 
+        CSIPProfileRegistryObserver::NewLC(); // CS:1
+    CSIPManagedProfileRegistry*  cSIPManagedProfileRegistry = 
+        CSIPManagedProfileRegistry::NewLC( *cSIPProfileRegistryObserver );
+        // CS:2
+    RArray<TSIPProfileTypeInfo> profileTypes;
+    CleanupClosePushL( profileTypes ); // CS:3
+
+     // Get the supported profile types.
+    cSIPManagedProfileRegistry->SupportedProfileTypesL( profileTypes );
+
+    // Create the profile pointer array.
+    profiles = new ( ELeave ) CArrayPtrFlat<CSIPManagedProfile>( 5 );    
+    TCleanupItem cleanupItem( CWPSIPItem::CleanupArrayItem, profiles );
+    CleanupStack::PushL( cleanupItem ); // CS:4
+
+    TInt i( 0 );
+    RPointerArray<CSIPProfile> 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<CSIPManagedProfile*>( 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<HBufC8>& 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<CSIPManagedProfile*>( 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<TUint32> 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<TUint32> 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<CSIPManagedProfile*>( 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