diff -r 30e048a7b597 -r bad0cc58d154 wlansecuritysettings/wepsecuritysettingsui/src/WEPSecuritySettingsImpl.cpp --- a/wlansecuritysettings/wepsecuritysettingsui/src/WEPSecuritySettingsImpl.cpp Thu Aug 19 09:58:27 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,633 +0,0 @@ -/* -* Copyright (c) 2001-2010 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 CWEPSecuritySettingsImpl. -* -*/ - -/* -* %version: tr1cfwln#27 % -*/ - -// INCLUDE FILES - -#include "WEPSecuritySettingsImpl.h" -#include "WEPSecuritySettingsUiPanic.h" - -#include -#include -#include -#include - -#include -#include -#include - -// CONSTANT DECLARATIONS - -// Index of first key -LOCAL_D const TInt KFirstKey = 0; - -// Index of second key -LOCAL_D const TInt KSecondKey = 1; - -// Index of third key -LOCAL_D const TInt KThirdKey = 2; - -// Index of fourth key -LOCAL_D const TInt KFourthKey = 3; - -// Ratio of ascii and hex key sizes -LOCAL_D const TInt KAsciiHexRatio = 2; - - -// ================= MEMBER FUNCTIONS ======================= - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::NewL -// --------------------------------------------------------- -// -CWEPSecuritySettingsImpl* CWEPSecuritySettingsImpl::NewL() - { - CWEPSecuritySettingsImpl* settings = - new ( ELeave ) CWEPSecuritySettingsImpl(); - CleanupStack::PushL( settings ); - settings->ConstructL(); - CleanupStack::Pop( settings ); - return settings; - } - - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::CWEPSecuritySettingsImpl -// --------------------------------------------------------- -// -CWEPSecuritySettingsImpl::CWEPSecuritySettingsImpl() -: iIsWEP256Enabled( ETrue ) - { - iKeyInUse = CWEPSecuritySettings::EKeyNumber1; - iAuthentication = CWEPSecuritySettings::EAuthOpen; - for ( TUint i = 0; i < KMaxNumberofKeys; i++) - { - iKeyLength[i] = CWEPSecuritySettings::E40Bits; - iKeyFormat[i] = CWEPSecuritySettings::EAscii; - iKeyData[i].Zero(); - } - } - - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::ConstructL -// --------------------------------------------------------- -// -void CWEPSecuritySettingsImpl::ConstructL() - { - // WEP256 is deprecated. - iIsWEP256Enabled = EFalse; - } - - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::~CWEPSecuritySettingsImpl -// --------------------------------------------------------- -// -CWEPSecuritySettingsImpl::~CWEPSecuritySettingsImpl() - { - } - - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::LoadL -// --------------------------------------------------------- -// -void CWEPSecuritySettingsImpl::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 index of key in use - TRAPD( err, wLanServiceTable->ReadUintL( TPtrC( WLAN_WEP_INDEX ), - ( TUint32& ) iKeyInUse ) ); - - // Get index of key in use - TRAP( err, wLanServiceTable->ReadUintL( - TPtrC( NU_WLAN_AUTHENTICATION_MODE ), - ( TUint32& ) iAuthentication ) ); - - // Get first WEP key - wLanServiceTable->ReadTextL( TPtrC( NU_WLAN_WEP_KEY1 ), - iKeyData[KFirstKey] ); - SetLenKeyDataFromText( KFirstKey ); - - // Get second WEP key - wLanServiceTable->ReadTextL( TPtrC( NU_WLAN_WEP_KEY2 ), - iKeyData[KSecondKey] ); - SetLenKeyDataFromText( KSecondKey ); - - // Get third WEP key - wLanServiceTable->ReadTextL( TPtrC( NU_WLAN_WEP_KEY3 ), - iKeyData[KThirdKey] ); - SetLenKeyDataFromText( KThirdKey ); - - // Get fourth WEP key - wLanServiceTable->ReadTextL( TPtrC( NU_WLAN_WEP_KEY4 ), - iKeyData[KFourthKey] ); - SetLenKeyDataFromText( KFourthKey ); - - - // Get the format of the keys - TRAP( err, wLanServiceTable->ReadUintL( TPtrC( WLAN_WEP_KEY1_FORMAT ), - ( TUint32& ) iKeyFormat[KFirstKey] ) ); - - TRAP( err, wLanServiceTable->ReadUintL( TPtrC( WLAN_WEP_KEY2_FORMAT ), - ( TUint32& ) iKeyFormat[KSecondKey] ) ); - - TRAP( err, wLanServiceTable->ReadUintL( TPtrC( WLAN_WEP_KEY3_FORMAT ), - ( TUint32& ) iKeyFormat[KThirdKey] ) ); - - TRAP( err, wLanServiceTable->ReadUintL( TPtrC( WLAN_WEP_KEY4_FORMAT ), - ( TUint32& ) iKeyFormat[KFourthKey] ) ); - } - else - { - // silently ignore KErrNotFound. It is caused by incorrect DB, - // we are 'repairing it' this way. - if ( errorCode != KErrNotFound ) - { - User::Leave( errorCode ); - } - } - - CleanupStack::PopAndDestroy( wLanServiceTable ); // wLanServiceTable - } - - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::SaveL -// --------------------------------------------------------- -// -void CWEPSecuritySettingsImpl::SaveL( TUint32 aIapId, - CCommsDatabase& aCommsDb ) const - { - 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 index of key in use - wLanServiceTable->WriteUintL( TPtrC( WLAN_WEP_INDEX ), - ( TUint32& ) iKeyInUse ); - - // Save index of key in use - wLanServiceTable->WriteUintL( TPtrC( NU_WLAN_AUTHENTICATION_MODE ), - ( TUint32& ) iAuthentication ); - - // Save first WEP key - wLanServiceTable->WriteTextL( TPtrC( NU_WLAN_WEP_KEY1 ), - iKeyData[KFirstKey] ); - - // Save second WEP key - wLanServiceTable->WriteTextL( TPtrC( NU_WLAN_WEP_KEY2 ), - iKeyData[KSecondKey] ); - - // Save third WEP key - wLanServiceTable->WriteTextL( TPtrC( NU_WLAN_WEP_KEY3 ), - iKeyData[KThirdKey] ); - - // Save fourth WEP key - wLanServiceTable->WriteTextL( TPtrC( NU_WLAN_WEP_KEY4 ), - iKeyData[KFourthKey] ); - - // Save the format of the keys - wLanServiceTable->WriteUintL( TPtrC( WLAN_WEP_KEY1_FORMAT ), - ( TUint32& ) iKeyFormat[KFirstKey] ); - - wLanServiceTable->WriteUintL( TPtrC( WLAN_WEP_KEY2_FORMAT ), - ( TUint32& ) iKeyFormat[KSecondKey] ); - - wLanServiceTable->WriteUintL( TPtrC( WLAN_WEP_KEY3_FORMAT ), - ( TUint32& ) iKeyFormat[KThirdKey] ); - - wLanServiceTable->WriteUintL( TPtrC( WLAN_WEP_KEY4_FORMAT ), - ( TUint32& ) iKeyFormat[KFourthKey] ); - - wLanServiceTable->PutRecordChanges(); - - CleanupStack::PopAndDestroy( wLanServiceTable ); // wLanServiceTable - } - - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::SetLenKeyDataFromText -// --------------------------------------------------------- -// -void CWEPSecuritySettingsImpl::SetLenKeyDataFromText( const TInt aIndex ) - { - const TUint keyDataLength = iKeyData[aIndex].Length(); - - if ( keyDataLength == KKeyDataLength104Bits ) - { - iKeyLength[aIndex] = CWEPSecuritySettings::E104Bits; - } - else if ( keyDataLength == KKeyDataLength232Bits && iIsWEP256Enabled ) - { - iKeyLength[aIndex] = CWEPSecuritySettings::E232Bits; - } - else // if ( aKeyDataLength == KKeyDataLength40Bits ) or any - { // other case, by default - iKeyLength[aIndex] = CWEPSecuritySettings::E40Bits; - } - } - - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::IsValid -// --------------------------------------------------------- -// -TBool CWEPSecuritySettingsImpl::IsValid() - { - return ( KeyData( KeyInUse() )->Length() == - ExpectedLengthOfKeyData( KeyLength( KeyInUse() ) ) ); - } - - -//---------------------------------------------------------- -// CWEPSecuritySettingsImpl::ExpectedLengthOfKeyData -//---------------------------------------------------------- -// -TInt CWEPSecuritySettingsImpl::ExpectedLengthOfKeyData( - CWEPSecuritySettings::TWEPKeyLength aKeyLength ) - { - TInt retVal; - - switch ( aKeyLength ) - { - case CWEPSecuritySettings::E40Bits: - { - retVal = KKeyDataLength40Bits; - break; - } - - case CWEPSecuritySettings::E104Bits: - { - retVal = KKeyDataLength104Bits; - break; - } - - case CWEPSecuritySettings::E232Bits: - { - retVal = WEP256Enabled() ? KKeyDataLength232Bits : 0; - break; - } - - default: - { - retVal = 0; - break; - } - } - - return retVal; - } - - - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::SetKeyDataL -// --------------------------------------------------------- -// -TInt CWEPSecuritySettingsImpl::SetKeyDataL( const TInt aElement, - const TDesC& aKeyData, - const TBool aHex ) - { - CWEPSecuritySettings::TWEPKeyFormat keyFormat = aHex ? - CWEPSecuritySettings::EHexadecimal : - CWEPSecuritySettings::EAscii; - SetKeyFormat( aElement, keyFormat ); - - TInt dataLength = aKeyData.Length(); - if ( dataLength == KKeyDataLength40Bits || - dataLength == KKeyDataLength40Bits / KAsciiHexRatio ) - { - SetKeyLength( aElement, CWEPSecuritySettings::E40Bits ); - } - else if ( dataLength == KKeyDataLength104Bits || - dataLength == KKeyDataLength104Bits / KAsciiHexRatio ) - { - SetKeyLength( aElement, CWEPSecuritySettings::E104Bits ); - } - else if ( dataLength == KKeyDataLength232Bits || - dataLength == KKeyDataLength232Bits / KAsciiHexRatio ) - { - SetKeyLength( aElement, CWEPSecuritySettings::E232Bits ); - } - else - { - return KErrInvalidLength; - } - - TInt expectedLength = ExpectedLengthOfKeyData( KeyLength( aElement ) ); - - if ( keyFormat == CWEPSecuritySettings::EAscii ) - { - expectedLength /= KAsciiHexRatio; //Ascii key is half the length of Hex - } - - HBufC8* buf8 = HBufC8::NewL( dataLength ); - CleanupStack::PushL( buf8 ); - buf8->Des().Copy( aKeyData ); - - TInt errData = VerifyKeyData( *buf8, expectedLength, - KeyFormat( aElement ) ); - if ( errData == KErrNone ) - { - if ( aHex ) - { - SetKeyData( aElement, buf8->Des() ); - } - else - { - HBufC8* buf8Conv = HBufC8::NewL( dataLength * KAsciiHexRatio ); - // Ascii key is half the length of Hex - ConvertAsciiToHex( buf8->Des(), buf8Conv ); - SetKeyData( aElement, buf8Conv->Des() ); - delete buf8Conv; - } - } - - CleanupStack::PopAndDestroy( buf8 ); // buf8 - - return errData; - } - - -//---------------------------------------------------------- -// CWEPSecuritySettingsImpl::VerifyKeyData -//---------------------------------------------------------- -// -TInt CWEPSecuritySettingsImpl::VerifyKeyData( const TDesC8& aTextToTest, - TInt aLengthOfKeyData, - CWEPSecuritySettings::TWEPKeyFormat aWEPKeyFormat ) - { - TInt err = KErrNone; - TInt lengthOfText = aTextToTest.Length(); - - if ( aTextToTest.Length() != aLengthOfKeyData ) - { - err = KErrInvalidLength; - } - else if ( aWEPKeyFormat == CWEPSecuritySettings::EHexadecimal ) - { - for ( TInt i = 0; i < lengthOfText; i++ ) - { - TChar c ( aTextToTest[i] ); - - if ( !c.IsHexDigit() ) - { - err = KErrInvalidChar; - break; - } - } - } - - return err; - } - - -//---------------------------------------------------------- -// CWEPSecuritySettingsImpl::ConvertAsciiToHex -//---------------------------------------------------------- -// -void CWEPSecuritySettingsImpl::ConvertAsciiToHex( const TDesC8& aSource, - HBufC8*& aDest ) - { - _LIT( hex, "0123456789ABCDEF" ); - TInt size = aSource.Size(); - TPtr8 ptr = aDest->Des(); - for ( TInt ii = 0; ii < size; ii++ ) - { - TText8 ch = aSource[ii]; - ptr.Append( hex()[(ch/16)&0x0f] ); - ptr.Append( hex()[ch&0x0f] ); - } - } - - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::LoadL -// --------------------------------------------------------- -// -void CWEPSecuritySettingsImpl::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 the values - CMDBField* keyInUseField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWepIndex ) ); - ( TUint32& )iKeyInUse = *keyInUseField; - CMDBField* authenticationField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanAuthMode ) ); - ( TUint32& )iAuthentication = *authenticationField; - - CMDBField* wepKey1Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWepKey1 ) ); - iKeyData[ KFirstKey ] = *wepKey1Field; - SetLenKeyDataFromText( KFirstKey ); - - CMDBField* wepKey2Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWepKey2 ) ); - iKeyData[ KSecondKey ] = *wepKey2Field; - SetLenKeyDataFromText( KSecondKey ); - - CMDBField* wepKey3Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWepKey3 ) ); - iKeyData[ KThirdKey ] = *wepKey3Field; - SetLenKeyDataFromText( KThirdKey ); - - CMDBField* wepKey4Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWepKey4 ) ); - iKeyData[ KFourthKey ] = *wepKey4Field; - SetLenKeyDataFromText( KFourthKey ); - - CMDBField* formatKey1Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanFormatKey1 ) ); - ( TUint32& )iKeyFormat[ KFirstKey ] = *formatKey1Field; - CMDBField* formatKey2Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanFormatKey2 ) ); - ( TUint32& )iKeyFormat[ KSecondKey ] = *formatKey2Field; - CMDBField* formatKey3Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanFormatKey3 ) ); - ( TUint32& )iKeyFormat[ KThirdKey ] = *formatKey3Field; - CMDBField* formatKey4Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanFormatKey4 ) ); - ( TUint32& )iKeyFormat[ KFourthKey ] = *formatKey4Field; - } - - CleanupStack::PopAndDestroy( generic ); - - } - - -// --------------------------------------------------------- -// CWEPSecuritySettingsImpl::SaveL -// --------------------------------------------------------- -// -void CWEPSecuritySettingsImpl::SaveL( TUint32 aIapId, - CMDBSession& aSession ) const - { - 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() - - CMDBField* keyInUseField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWepIndex ) ); - keyInUseField->SetL( iKeyInUse ); - - CMDBField* authenticationField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanAuthMode ) ); - authenticationField->SetL( iAuthentication ); - - CMDBField* wepKey1Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWepKey1 ) ); - wepKey1Field->SetL( iKeyData[ KFirstKey ] ); - CMDBField* wepKey2Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWepKey2 ) ); - wepKey2Field->SetL( iKeyData[ KSecondKey ] ); - CMDBField* wepKey3Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWepKey3 ) ); - wepKey3Field->SetL( iKeyData[ KThirdKey ] ); - CMDBField* wepKey4Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWepKey4 ) ); - wepKey4Field->SetL( iKeyData[ KFourthKey ] ); - - CMDBField* formatKey1Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanFormatKey1 ) ); - formatKey1Field->SetL( iKeyFormat[ KFirstKey ] ); - CMDBField* formatKey2Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanFormatKey2 ) ); - formatKey2Field->SetL( iKeyFormat[ KSecondKey ] ); - CMDBField* formatKey3Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanFormatKey3 ) ); - formatKey3Field->SetL( iKeyFormat[ KThirdKey ] ); - CMDBField* formatKey4Field = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanFormatKey4 ) ); - formatKey4Field->SetL( iKeyFormat[ KFourthKey ] ); - - 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 ); - } - - -// End of File