diff -r 000000000000 -r c8830336c852 wlansecuritysettings/wpasecuritysettingsui/src/WPASecuritySettingsImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlansecuritysettings/wpasecuritysettingsui/src/WPASecuritySettingsImpl.cpp Thu Dec 17 08:47:43 2009 +0200 @@ -0,0 +1,805 @@ +/* +* Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Implementation of class CWPASecuritySettingsImpl. +* +*/ + + +// INCLUDE FILES + +#include "WPASecuritySettingsUiPanic.h" + +#include "WPASecuritySettingsUI.hrh" + +#include +#include +#include +#include "WPASecuritySettingsImpl.h" + +#include +#include +#include + + +// CONSTANTS +LOCAL_D const TUint32 KUidNone = 0; // Invalid id +LOCAL_D const TUint32 E8021X = 4; // 802.1X security mode +LOCAL_D const TUint32 EWpa = 8; // Wpa security mode +LOCAL_D const TUint32 EWpa2 = 16; // Wpa2 only security mode + +LOCAL_D const TUint32 KExpEapTypeLength = 8; // expanded EAP type length + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::NewL +// --------------------------------------------------------- +// +CWPASecuritySettingsImpl* CWPASecuritySettingsImpl::NewL( + TSecurityMode aSecurityMode ) + { + CWPASecuritySettingsImpl* settings = new ( ELeave ) + CWPASecuritySettingsImpl( aSecurityMode ); + CleanupStack::PushL( settings ); + settings->ConstructL(); + CleanupStack::Pop( settings ); + return settings; + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::CWPASecuritySettingsImpl +// --------------------------------------------------------- +// +CWPASecuritySettingsImpl::CWPASecuritySettingsImpl( + TSecurityMode aSecurityMode ) +: iSecurityMode( aSecurityMode ), + iWPAMode( EFalse ), + iWpa2Only( EFalse ) + { + iWPAEAPPlugin.Zero(); + iWPAPreSharedKey.Zero(); + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::ConstructL +// --------------------------------------------------------- +// +void CWPASecuritySettingsImpl::ConstructL() + { + _LIT8( KMatchString, "EAPPConfig" ); + TRAPD( err, iPlugin = CEAPPluginConfigurationIf::NewL( KMatchString ) ); + if ( err != KErrNone && err != KEComErrNoInterfaceIdentified ) + { + User::Leave( err ); + } + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::~CWPASecuritySettingsImpl +// --------------------------------------------------------- +// +CWPASecuritySettingsImpl::~CWPASecuritySettingsImpl() + { + delete iWPAEnabledEAPPlugin; + delete iWPADisabledEAPPlugin; + delete iPlugin; + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::LoadL +// --------------------------------------------------------- +// +void CWPASecuritySettingsImpl::LoadL( TUint32 aIapId, + CCommsDatabase& aCommsDb ) + { + if ( aIapId == KUidNone ) + { + return; + } + + CCommsDbTableView* wLanServiceTable; + + wLanServiceTable = aCommsDb.OpenViewMatchingUintLC( + TPtrC( WLAN_SERVICE ), TPtrC( WLAN_SERVICE_ID ), aIapId ); + + TInt errorCode = wLanServiceTable->GotoFirstRecord(); + if ( errorCode == KErrNone ) + { + // Get WPA Mode + TRAPD( err, wLanServiceTable->ReadUintL( TPtrC( WLAN_ENABLE_WPA_PSK ), + ( TUint32& ) iWPAMode ) ); + if ( err != KErrNone ) + { // do not leave if value is not present in table... + if ( err != KErrUnknown ) + User::Leave( err ); + } + + TUint32 secMode = 0; + // Get WPA2 Only Mode + TRAP( err, wLanServiceTable->ReadUintL( TPtrC( WLAN_SECURITY_MODE ), + secMode ) ); + if ( err != KErrNone ) + { // do not leave if value is not present in table... + if ( err != KErrUnknown ) + User::Leave( err ); + } + + iWpa2Only = secMode == EWpa2; + + // Get EAP list + iWPAEAPPlugin.Copy( *wLanServiceTable->ReadLongTextLC( + TPtrC( WLAN_EAPS ) ) ); + CleanupStack::PopAndDestroy(); + + if ( !iWPAEAPPlugin.Length() ) + { + // no data found in the old column, use the new ones + + // enabled EAP types + HBufC *data = wLanServiceTable->ReadLongTextLC( + TPtrC( WLAN_ENABLED_EAPS ) ); + + TPtrC8 reint( reinterpret_cast( data->Ptr() ), + data->Size() ); + + delete iWPAEnabledEAPPlugin; iWPAEnabledEAPPlugin = NULL; + iWPAEnabledEAPPlugin = reint.AllocL(); + + CleanupStack::PopAndDestroy( data ); + + + // 2. disabled EAP types + data = wLanServiceTable->ReadLongTextLC( + TPtrC( WLAN_DISABLED_EAPS ) ); + + reint.Set( reinterpret_cast( data->Ptr() ), + data->Size() ); + + delete iWPADisabledEAPPlugin; iWPADisabledEAPPlugin = NULL; + iWPADisabledEAPPlugin = reint.AllocL(); + + CleanupStack::PopAndDestroy( data ); + } + else + { + // generate appropriate entries in the new enabled and disabled list, + // overwriting those values + + // count the + and - signs to determine the size of enabled and + // disabled descriptors + TLex lex( iWPAEAPPlugin ); + + TInt numPlus = 0; + TInt numMinus = 0; + TChar ch; + while ( !lex.Eos() ) + { + ch = lex.Get(); + if ( ch == '+' ) ++numPlus; + else if ( ch == '-' ) ++numMinus; + } + + // each entry consumes 8 bytes in binary format + delete iWPAEnabledEAPPlugin; iWPAEnabledEAPPlugin = NULL; + iWPAEnabledEAPPlugin = HBufC8::NewL( 8 * numPlus ); + + delete iWPADisabledEAPPlugin; iWPADisabledEAPPlugin = NULL; + iWPADisabledEAPPlugin = HBufC8::NewL( 8 * numMinus ); + + lex.Assign( iWPAEAPPlugin ); + + while ( !lex.Eos() ) + { + // beginning of implementation UID + TInt16 implUid = 0; + + if ( lex.Val( implUid ) != KErrNone || !implUid ) + { + // if the old string is corrupted, null out both lists + iWPAEnabledEAPPlugin->Des().Zero(); + iWPADisabledEAPPlugin->Des().Zero(); + break; + } + + // append it to the appropriate list ('+' enabled, '-' disabled) + _LIT8( KPadding, "\xFE\0\0\0\0\0\0" ); + _LIT8( KMsChapV2Padding, "\xFE\xFF\xFF\xFF\0\0\0"); + const TInt KPlainMsChapV2ImplUid = 99; + + if ( implUid > 0 ) + { + iWPAEnabledEAPPlugin->Des().Append( + Abs( implUid ) == KPlainMsChapV2ImplUid? + KMsChapV2Padding: KPadding ); + iWPAEnabledEAPPlugin->Des().Append( Abs( implUid ) ); + } + else if (implUid < 0 ) + { + iWPADisabledEAPPlugin->Des().Append( + Abs( implUid ) == KPlainMsChapV2ImplUid? + KMsChapV2Padding: KPadding ); + iWPADisabledEAPPlugin->Des().Append( Abs( implUid ) ); + } + + // swallow the delimiter (',') + lex.Get(); + } + + // finally, wipe old column data + iWPAEAPPlugin.Zero(); + } + + // Get PreShared Key + wLanServiceTable->ReadTextL( TPtrC( WLAN_WPA_PRE_SHARED_KEY ), + iWPAPreSharedKey ); + + if ( !IsValidPsk( iWPAPreSharedKey ) ) + { + // invalid key format + iWPAPreSharedKey.Zero(); + } + } + + CleanupStack::PopAndDestroy( wLanServiceTable ); // wLanServiceTable + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::SaveL +// --------------------------------------------------------- +// +void CWPASecuritySettingsImpl::SaveL( TUint32 aIapId, + CCommsDatabase& aCommsDb, + TTypeOfSaving aTypeOfSaving, + TUint32 aOldIapId ) + { + CCommsDbTableView* wLanServiceTable; + + // Caller MUST initiate a transaction, WE WILL NOT. + + wLanServiceTable = aCommsDb.OpenViewMatchingUintLC( + TPtrC( WLAN_SERVICE ), TPtrC( WLAN_SERVICE_ID ), aIapId ); + TInt errorCode = wLanServiceTable->GotoFirstRecord(); + + if ( errorCode == KErrNone ) + { + wLanServiceTable->UpdateRecord(); + } + else + { + TUint32 dummyUid( KUidNone ); + User::LeaveIfError( wLanServiceTable->InsertRecord( dummyUid ) ); + + // Save link to LAN service + wLanServiceTable->WriteUintL( TPtrC( WLAN_SERVICE_ID ), aIapId ); + } + + // Save WPA Mode + wLanServiceTable->WriteUintL( TPtrC( WLAN_ENABLE_WPA_PSK ), + ( TUint32& ) iWPAMode ); + + TUint32 secMode; + + if ( iSecurityMode == ESecurityMode8021x ) + { + secMode = E8021X; + } + else if ( iWpa2Only ) + { + secMode = EWpa2; + } + else + { + secMode = EWpa; + } + + // Save security mode + wLanServiceTable->WriteUintL( TPtrC( WLAN_SECURITY_MODE ), secMode ); + + // With expanded EAP types allowed we no longer need the old column + iWPAEAPPlugin.Zero(); + + // Save EAP list + wLanServiceTable->WriteLongTextL( TPtrC( WLAN_EAPS ), iWPAEAPPlugin ); + + + // Save the expanded EAPs + wLanServiceTable->WriteTextL( TPtrC( WLAN_ENABLED_EAPS ), + iWPAEnabledEAPPlugin? + (const TDesC8&)*iWPAEnabledEAPPlugin: + (const TDesC8&)KNullDesC8 ); + + wLanServiceTable->WriteTextL( TPtrC( WLAN_DISABLED_EAPS ), + iWPADisabledEAPPlugin? + (const TDesC8&)*iWPADisabledEAPPlugin: + (const TDesC8&)KNullDesC8 ); + // Save PreShared Key + wLanServiceTable->WriteTextL( TPtrC( WLAN_WPA_PRE_SHARED_KEY ), + iWPAPreSharedKey ); + + // Save PreShared Key Length + wLanServiceTable->WriteUintL( TPtrC( WLAN_WPA_KEY_LENGTH ), + iWPAPreSharedKey.Length() ); + + wLanServiceTable->PutRecordChanges(); + + if ( iPlugin ) + { + if ( aTypeOfSaving == ESavingBrandNewAP ) + { + iPlugin->ChangeIapIDL( aOldIapId, aIapId ); + } + else if ( aTypeOfSaving == ESavingNewAPAsACopy ) + { + iPlugin->CopySettingsL( aOldIapId, aIapId ); + } + } + + CleanupStack::PopAndDestroy( wLanServiceTable ); // wLanServiceTable + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::DeleteL +// --------------------------------------------------------- +// +void CWPASecuritySettingsImpl::DeleteL( TUint32 aIapId ) + { + if ( iPlugin ) + { + iPlugin->DeleteSettingsL( aIapId ); + } + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::IsValid +// --------------------------------------------------------- +// +TBool CWPASecuritySettingsImpl::IsValid() + { + TBool retval = ETrue; + if ( iWPAMode || !iPlugin ) + { + retval = IsValidPsk( iWPAPreSharedKey ); + } + + return retval; + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::IsValidPsk +// --------------------------------------------------------- +// +TBool CWPASecuritySettingsImpl::IsValidPsk( const TDesC8& aPsk ) + { + TBool ret( EFalse ); + + TInt len = aPsk.Length(); + + ret = ( len >= EMinLengthOfPreSharedKeyAscii && + len <= EMaxLengthOfPreSharedKeyAscii ); + + if ( !ret && len == ELengthOfPreSharedKeyHex ) + { + // perhaps it is hex + ret = ETrue; + + for ( TInt i = 0; i < len; ++i ) + { + TChar ch( aPsk[i] ); + if ( !ch.IsHexDigit() ) + { + // got a bad character + ret = EFalse; + break; + } + } + } + + return ret; + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::SetWPAPreSharedKey +// --------------------------------------------------------- +// +TInt CWPASecuritySettingsImpl::SetWPAPreSharedKey( + const TDesC& aPreSharedKey ) + { + TInt ret( KErrNone ); + + HBufC8* buf8 = HBufC8::New( aPreSharedKey.Length() ); + + if ( buf8 ) + { + TPtr8 pskPtr( buf8->Des() ); + pskPtr.Copy( aPreSharedKey ); + + if ( IsValidPsk( pskPtr ) ) + { + SetWPAPreSharedKey( pskPtr ); + SetWPAMode( ETrue ); + } + else + { + ret = KErrArgument; + } + + delete buf8; + } + else + { + ret = KErrNoMemory; + } + + return ret; + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::SetWPAEnabledEAPPlugin +// --------------------------------------------------------- +// +TInt CWPASecuritySettingsImpl::SetWPAEnabledEAPPlugin( + const TDesC8& aEnabledPluginList ) + { + delete iWPAEnabledEAPPlugin; iWPAEnabledEAPPlugin = NULL; + + if ( aEnabledPluginList.Length() % KExpEapTypeLength ) + { + // valid expanded EAP types occupy 8 bytes each + return KErrArgument; + } + + if ( aEnabledPluginList.Length() ) + { + iWPAEnabledEAPPlugin = aEnabledPluginList.Alloc(); + if ( !iWPAEnabledEAPPlugin ) + { + return KErrNoMemory; + } + } + + return KErrNone; + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::SetWPADisabledEAPPlugin +// --------------------------------------------------------- +// +TInt CWPASecuritySettingsImpl::SetWPADisabledEAPPlugin( + const TDesC8& aDisabledPluginList ) + { + delete iWPADisabledEAPPlugin; iWPADisabledEAPPlugin = NULL; + + if ( aDisabledPluginList.Length() % KExpEapTypeLength ) + { + // valid expanded EAP types occupy 8 bytes each + return KErrArgument; + } + + if ( aDisabledPluginList.Length() ) + { + iWPADisabledEAPPlugin = aDisabledPluginList.Alloc(); + if ( !iWPADisabledEAPPlugin ) + { + return KErrNoMemory; + } + } + + return KErrNone; + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::LoadL +// --------------------------------------------------------- +// +void CWPASecuritySettingsImpl::LoadL( TUint32 aIapId, + CMDBSession& aSession ) + { + if ( aIapId == KUidNone ) + { + return; + } + + // Load WLAN service table + // first get WLAN table id + CMDBGenericRecord* generic = static_cast + ( CCDRecordBase::RecordFactoryL( 0 ) ); + CleanupStack::PushL( generic ); + generic->InitializeL( TPtrC( WLAN_SERVICE ), NULL ); + generic->LoadL( aSession ); + TMDBElementId wlanTableId = generic->TableId(); + + CMDBField* sidField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanServiceId ) ); + + // prime with service id + *sidField = aIapId; + + if( generic->FindL( aSession) ) + { + // Get WPA mode + CMDBField* enableWpaPskField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanEnableWpaPsk ) ); + iWPAMode = *enableWpaPskField; + + // Get WPA2 Only Mode + CMDBField* secModeField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanSecMode ) ); + TUint32 secMode = *secModeField; + iWpa2Only = secMode == EWpa2; + + // Get EAP plugins + CMDBField* wlanEapsField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanEaps ) ); + iWPAEAPPlugin = *wlanEapsField; + + if ( !iWPAEAPPlugin.Length() ) + { + // no data found in the old column, use the new ones + + // enabled EAP types + CMDBField* wlanEnabledEapsField = + static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanEnabledEaps ) ); + + delete iWPAEnabledEAPPlugin; iWPAEnabledEAPPlugin = NULL; + iWPAEnabledEAPPlugin = + ( ( const TDesC8& ) *wlanEnabledEapsField ).AllocL(); + + + // disabled EAP types + CMDBField* wlanDisabledEapsField = + static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanDisabledEaps ) ); + + delete iWPADisabledEAPPlugin; iWPADisabledEAPPlugin = NULL; + iWPADisabledEAPPlugin = + ( ( const TDesC8& ) *wlanDisabledEapsField ).AllocL(); + + } + else + { + // generate appropriate entries in the new enabled and disabled list, + // overwriting those values + + // count the + and - signs to determine the size of enabled and + // disabled descriptors + TLex lex( iWPAEAPPlugin ); + + TInt numPlus = 0; + TInt numMinus = 0; + TChar ch; + while ( !lex.Eos() ) + { + ch = lex.Get(); + if ( ch == '+' ) ++numPlus; + else if ( ch == '-' ) ++numMinus; + } + + // each entry consumes 8 bytes in binary format + delete iWPAEnabledEAPPlugin; iWPAEnabledEAPPlugin = NULL; + iWPAEnabledEAPPlugin = HBufC8::NewL( 8 * numPlus ); + + delete iWPADisabledEAPPlugin; iWPADisabledEAPPlugin = NULL; + iWPADisabledEAPPlugin = HBufC8::NewL( 8 * numMinus ); + + lex.Assign( iWPAEAPPlugin ); + + while ( !lex.Eos() ) + { + // beginning of implementation UID + TInt16 implUid = 0; + + if ( lex.Val( implUid ) != KErrNone || !implUid ) + { + // if the old string is corrupted, null out both lists + iWPAEnabledEAPPlugin->Des().Zero(); + iWPADisabledEAPPlugin->Des().Zero(); + break; + } + + // append it to the appropriate list ('+' enabled, '-' disabled) + _LIT8( KPadding, "\xFE\0\0\0\0\0\0" ); + _LIT8( KMsChapV2Padding, "\xFE\xFF\xFF\xFF\0\0\0"); + const TInt KPlainMsChapV2ImplUid = 99; + + if ( implUid > 0 ) + { + iWPAEnabledEAPPlugin->Des().Append( + Abs( implUid ) == KPlainMsChapV2ImplUid? + KMsChapV2Padding: KPadding ); + iWPAEnabledEAPPlugin->Des().Append( Abs( implUid ) ); + } + else if (implUid < 0 ) + { + iWPADisabledEAPPlugin->Des().Append( + Abs( implUid ) == KPlainMsChapV2ImplUid? + KMsChapV2Padding: KPadding ); + iWPADisabledEAPPlugin->Des().Append( Abs( implUid ) ); + } + + // swallow the delimiter (',') + lex.Get(); + } + + // finally, wipe old column data + iWPAEAPPlugin.Zero(); + } + + // GetWPA preshared key + CMDBField* wpaPskField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanWpaPreSharedKey ) ); + iWPAPreSharedKey = *wpaPskField; + + if ( !IsValidPsk( iWPAPreSharedKey ) ) + { + // invalid key format + iWPAPreSharedKey.Zero(); + } + } + + CleanupStack::PopAndDestroy( generic ); + } + + +// --------------------------------------------------------- +// CWPASecuritySettingsImpl::SaveL +// --------------------------------------------------------- +// +void CWPASecuritySettingsImpl::SaveL( TUint32 aIapId, + CMDBSession& aSession, + TTypeOfSaving aTypeOfSaving, + TUint32 aOldIapId ) + { + const TInt KRetryWait = 100000; // Wait time between retries in TTimeIntervalMicroSeconds32 + const TInt KRetryCount = 50; // Max retry count + + // Load WLAN service table + // first get WLAN table id + CMDBGenericRecord* generic = static_cast + ( CCDRecordBase::RecordFactoryL( 0 ) ); + CleanupStack::PushL( generic ); + generic->InitializeL( TPtrC( WLAN_SERVICE ), NULL ); + generic->LoadL( aSession ); + TMDBElementId wlanTableId = generic->TableId(); + + CMDBField* sidField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanServiceId ) ); + + // prime with service id + *sidField = aIapId; + + TBool found = generic->FindL( aSession); + + // If loading failed, WLAN service record will be + // created and StoreL()-d, otherwise, ModifyL() + + // Set WPA mode + CMDBField* enableWpaPskField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanEnableWpaPsk ) ); + enableWpaPskField->SetL( iWPAMode ); + + // Set security mode + TUint32 secMode; + if ( iSecurityMode == ESecurityMode8021x ) + { + secMode = E8021X; + } + else if ( iWpa2Only ) + { + secMode = EWpa2; + } + else + { + secMode = EWpa; + } + CMDBField* secModeField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanSecMode ) ); + secModeField->SetL( secMode ); + + // Save EAP list + CMDBField* wlanEapsField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanEaps ) ); + + // when using the expanded EAP types, wipe out data in the old column + iWPAEAPPlugin.Zero(); + + wlanEapsField->SetL( iWPAEAPPlugin ); + + // Save the expanded EAPs + CMDBField* wlanEnabledEapsField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanEnabledEaps ) ); + wlanEnabledEapsField->SetL( iWPAEnabledEAPPlugin? + (const TDesC8&)*iWPAEnabledEAPPlugin: + (const TDesC8&)KNullDesC8 ); + + + CMDBField* wlanDisabledEapsField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanDisabledEaps ) ); + wlanDisabledEapsField->SetL( iWPADisabledEAPPlugin? + (const TDesC8&)*iWPADisabledEAPPlugin: + (const TDesC8&)KNullDesC8 ); + + // Save PreShared Key + CMDBField* wpaPskField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanWpaPreSharedKey ) ); + wpaPskField->SetL( iWPAPreSharedKey ); + + // Save PreShared Key length + CMDBField* keyLengthField = static_cast*> + ( generic->GetFieldByIdL( KCDTIdWlanWpaKeyLength ) ); + keyLengthField->SetL( iWPAPreSharedKey.Length() ); + + TInt error( KErrNone ); + + // Saving changes + for ( TInt i( 0 ); i < KRetryCount; i++ ) + { + + // If table existed modify it + if( found ) + { + TRAP( error, generic->ModifyL( aSession ) ); + } + + // Otherwise store a new record + else + { + generic->SetRecordId( KCDNewRecordRequest ); + TRAP( error, generic->StoreL( aSession ) ); + } + + // If operation failed with KErrLocked, we'll retry. + if ( KErrLocked == error ) + { + User::After( KRetryWait ); + } + + // Otherwise break the retry loop. + else + { + break; + } + } + + // If the save operation failed, leave now. + User::LeaveIfError( error ); + + CleanupStack::PopAndDestroy( generic ); + + if ( iPlugin ) + { + if ( aTypeOfSaving == ESavingBrandNewAP ) + { + iPlugin->ChangeIapIDL( aOldIapId, aIapId ); + } + else if ( aTypeOfSaving == ESavingNewAPAsACopy ) + { + iPlugin->CopySettingsL( aOldIapId, aIapId ); + } + } + } + +// End of File