--- a/wlansecuritysettings/wpasecuritysettingsui/src/WPASecuritySettingsImpl.cpp Thu Aug 19 09:58:27 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,879 +0,0 @@
-/*
-* 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.
-*
-*/
-
-/*
-* %version: tr1cfwln#29 %
-*/
-
-// INCLUDE FILES
-
-#include "WPASecuritySettingsUiPanic.h"
-
-#include "WPASecuritySettingsUI.hrh"
-
-#include <WPASecuritySettingsUI.h>
-#include <commdb.h>
-#include <EAPPluginConfigurationIf.h>
-#include "WPASecuritySettingsImpl.h"
-
-#include <commsdattypesv1_1.h>
-#include <cmmanagertablefields.h>
-#include <wlancontainer.h>
-
-
-// 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 ),
- iWPAUnencryptedConn( 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 )
- {
- if ( iSecurityMode == ESecurityMode8021x )
- {
- // in 802.1x PSK mode is not supported
- iWPAMode = EFalse;
- }
- else
- {
- // 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
- TRAPD( 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 Unencrypted Connection mode for 802.1x
- if ( iSecurityMode == ESecurityMode8021x )
- {
- // WLAN_WPA_KEY_LENGTH is used also for Unencrypted Connection mode
- TRAPD( err2, wLanServiceTable->ReadUintL( TPtrC( WLAN_WPA_KEY_LENGTH ),
- ( TUint32& ) iWPAUnencryptedConn ) );
- if ( err2 != KErrNone )
- { // do not leave if value is not present in table...
- if ( err2 != KErrUnknown )
- User::Leave( err2 );
- }
- }
-
- // 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<const TUint8*>( 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<const TUint8*>( 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
- if ( iSecurityMode != ESecurityMode8021x )
- {
- 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
- if ( iSecurityMode != ESecurityMode8021x )
- {
- 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 );
-
-
-
- if ( iSecurityMode == ESecurityMode8021x )
- {
- // In 802.1x WpaKeyLength is not used
- // and the field is reused to save UnencryptedConn mode
- wLanServiceTable->WriteUintL( TPtrC( WLAN_WPA_KEY_LENGTH ),
- ( TUint32& ) iWPAUnencryptedConn );
- }
- else
- {
- // 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<CMDBGenericRecord*>
- ( CCDRecordBase::RecordFactoryL( 0 ) );
- CleanupStack::PushL( generic );
- generic->InitializeL( TPtrC( WLAN_SERVICE ), NULL );
- generic->LoadL( aSession );
- TMDBElementId wlanTableId = generic->TableId();
-
- CMDBField<TUint32>* sidField = static_cast<CMDBField<TUint32>*>
- ( generic->GetFieldByIdL( KCDTIdWlanServiceId ) );
-
- // prime with service id
- *sidField = aIapId;
-
- if( generic->FindL( aSession) )
- {
- if ( iSecurityMode == ESecurityMode8021x )
- {
- // in 802.1x PSK mode is not supported
- iWPAMode = EFalse;
- }
- else
- {
- // Get WPA mode
- CMDBField<TUint>* enableWpaPskField = static_cast<CMDBField<TUint>*>
- ( generic->GetFieldByIdL( KCDTIdWlanEnableWpaPsk ) );
- iWPAMode = *enableWpaPskField;
- }
-
- // Get WPA2 Only Mode
- CMDBField<TUint>* secModeField = static_cast<CMDBField<TUint>*>
- ( generic->GetFieldByIdL( KCDTIdWlanSecMode ) );
- TUint32 secMode = *secModeField;
- iWpa2Only = secMode == EWpa2;
-
- // Get 802.1x Unencrypted Connection saved in reused WpaKeyLengthField
- if ( iSecurityMode == ESecurityMode8021x )
- {
- CMDBField<TUint>* WpaKeyLengthField = static_cast<CMDBField<TUint>*>
- ( generic->GetFieldByIdL( KCDTIdWlanWpaKeyLength ) );
- iWPAUnencryptedConn = *WpaKeyLengthField;
- }
-
- // Get EAP plugins
- CMDBField<TDesC>* wlanEapsField = static_cast<CMDBField<TDesC>*>
- ( generic->GetFieldByIdL( KCDTIdWlanEaps ) );
- iWPAEAPPlugin = *wlanEapsField;
-
- if ( !iWPAEAPPlugin.Length() )
- {
- // no data found in the old column, use the new ones
-
- // enabled EAP types
- CMDBField<TDesC8>* wlanEnabledEapsField =
- static_cast<CMDBField<TDesC8>*>
- ( generic->GetFieldByIdL( KCDTIdWlanEnabledEaps ) );
-
- delete iWPAEnabledEAPPlugin; iWPAEnabledEAPPlugin = NULL;
- iWPAEnabledEAPPlugin =
- ( ( const TDesC8& ) *wlanEnabledEapsField ).AllocL();
-
-
- // disabled EAP types
- CMDBField<TDesC8>* wlanDisabledEapsField =
- static_cast<CMDBField<TDesC8>*>
- ( 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
- if ( iSecurityMode != ESecurityMode8021x )
- {
- CMDBField<TDesC8>* wpaPskField = static_cast<CMDBField<TDesC8>*>
- ( 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<CMDBGenericRecord*>
- ( CCDRecordBase::RecordFactoryL( 0 ) );
- CleanupStack::PushL( generic );
- generic->InitializeL( TPtrC( WLAN_SERVICE ), NULL );
- generic->LoadL( aSession );
- TMDBElementId wlanTableId = generic->TableId();
-
- CMDBField<TUint32>* sidField = static_cast<CMDBField<TUint32>*>
- ( 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()
-
- if ( iSecurityMode != ESecurityMode8021x )
- {
- // Set WPA mode
- CMDBField<TUint>* enableWpaPskField = static_cast<CMDBField<TUint>*>
- ( 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<TUint>* secModeField = static_cast<CMDBField<TUint>*>
- ( generic->GetFieldByIdL( KCDTIdWlanSecMode ) );
- secModeField->SetL( secMode );
-
- // Save EAP list
- CMDBField<TDesC>* wlanEapsField = static_cast<CMDBField<TDesC>*>
- ( 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<TDesC8>* wlanEnabledEapsField = static_cast<CMDBField<TDesC8>*>
- ( generic->GetFieldByIdL( KCDTIdWlanEnabledEaps ) );
- wlanEnabledEapsField->SetL( iWPAEnabledEAPPlugin?
- (const TDesC8&)*iWPAEnabledEAPPlugin:
- (const TDesC8&)KNullDesC8 );
-
-
- CMDBField<TDesC8>* wlanDisabledEapsField = static_cast<CMDBField<TDesC8>*>
- ( generic->GetFieldByIdL( KCDTIdWlanDisabledEaps ) );
- wlanDisabledEapsField->SetL( iWPADisabledEAPPlugin?
- (const TDesC8&)*iWPADisabledEAPPlugin:
- (const TDesC8&)KNullDesC8 );
-
- // Save PreShared Key length
- CMDBField<TUint>* keyLengthField = static_cast<CMDBField<TUint>*>
- ( generic->GetFieldByIdL( KCDTIdWlanWpaKeyLength ) );
- if ( iSecurityMode == ESecurityMode8021x )
- {
- // In 802.1x keyLengthField is reused to contain Unencrypted Connection info
- keyLengthField->SetL( iWPAUnencryptedConn );
- }
- else
- {
- keyLengthField->SetL( iWPAPreSharedKey.Length() );
-
- // Save PreShared Key
- CMDBField<TDesC8>* wpaPskField = static_cast<CMDBField<TDesC8>*>
- ( generic->GetFieldByIdL( KCDTIdWlanWpaPreSharedKey ) );
- wpaPskField->SetL( iWPAPreSharedKey );
- }
-
- 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