/*
* Copyright (c) 2002-2008 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: Class stores data for one accesspoint
*
*/
// INCLUDE FILES
#include "CWPAPNapdef.h"
#include <CWPCharacteristic.h>
#include <CWPParameter.h>
#include <WPAPAdapterResource.rsg>
#include <featmgr.h>
#include <WPAdapterUtil.h>
#include "CWPAPAccesspointItem.h"
#include "WPAPAdapter.pan"
#include <WlanCdbCols.h>
#include <EapType.h>
#include <EapSettings.h>
#include "ProvisioningDebug.h"
#include <cmconnectionmethodext.h>
#include <cmpluginpacketdatadef.h>
#include <cmpluginwlandef.h>
#include <cmmanagerext.h>
#include <cmconnectionmethodext.h>
#include <commdb.h>
#include <WlanCdbCols.h>
#include <EapExpandedType.h>
#include <centralrepository.h>
#include <pdpcontextmanagerinternalcrkeys.h>
#include <EapGeneralSettings.h>
#include <EapTypeDefinitions.h>
const TUint KIapColumn = 0x00000100;
const TUint KLingerColumn = 0x00000200;
const TUint KColumnMask = 0xFFFFFF00;
const TUint KRowMask = 0x000000FF;
// Delay for comms db begintransaction retry (microseconds)
const TInt KBeginTransRetryDelay = 1000000;
// Maximum number of retries
const TInt KBeginTransRetryCount = 7;
// ============================ MEMBER FUNCTIONS ===============================
// -----------------------------------------------------------------------------
// CWPAPNapdef::NewLC
// -----------------------------------------------------------------------------
//
CWPAPNapdef* CWPAPNapdef::NewLC( TBool aFollowingLink,
const TDesC& aDefaultName,
CWPCharacteristic& aLogicalCharacteristic,
CWPCharacteristic& aLink )
{
CWPAPNapdef* self = new(ELeave) CWPAPNapdef( aFollowingLink,
aDefaultName,
aLogicalCharacteristic );
CleanupStack::PushL( self );
self->ConstructL();
aLink.AcceptL( *self );
return self;
}
// -----------------------------------------------------------------------------
// Destructor
// -----------------------------------------------------------------------------
CWPAPNapdef::~CWPAPNapdef()
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::~CWPAPNapdef" ) );
iEapTypeArray.ResetAndDestroy();
iEapTypeArray.Close();
iSecSSID.ResetAndDestroy();
iSecSSID.Close();
iNameServers.Close();
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::ValidateL
// -----------------------------------------------------------------------------
//
TBool CWPAPNapdef::ValidateL()
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ValidateL" ) );
TBool result( ETrue );
if ( iBearer == KUidWlanBearerType )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ValidateL wlan" ) );
if ( iWlanSupported )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ValidateL wlan supported" ) );
return result;
}
else
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ValidateL wlan NOT supported" ) );
return EFalse;
}
}
// Received unsupported bearer
if( iBearerUnsupported )
{
return EFalse;
}
// Didn't receive a bearer value.
if ( iBearer == 0 )
{
// Access point address type can also tell the bearer
if( iAccesspointNameType )
{
TPtrC addrType( iAccesspointNameType->Value() );
if( addrType == KAddrTypeAPN )
{
iBearer =KUidPacketDataBearerType;
}
}
// If still couldn't determine the bearer, default to GPRS
if( iBearer == 0 )
{
iBearer = KUidPacketDataBearerType;
}
}
// "NAP-ADDRESS" (Access point name) must be defined
if( iAccesspointName )
{
if( iAccesspointName->Value() == KNullDesC )
{
return EFalse;
}
}
else
{
return EFalse;
}
/*
Combinations of authentication type, username and password and corressponding
value of prompt for password field. AuthType in this table means that provisioning document
contained authtype parameter and it was supported by the implementation.
Provisioning document names are used in table.
x means that value of the specified parameter is received and it was valid.
AuthType received & supported
| AuthName
| | AuthSecret
| | | "Prompt for Password"
no
x no
x no
x x yes
x no
x x yes
x x no
x x x no
*/
// Set the "prompt password"-value. See the table above. Value is set to true
// only if we have supported authentication type and either username or password
// is empty.
if ( IsReceived( EWPParameterAuthentication_id ) &&
( ( !iPassword && iUserName ) ||( iPassword && !iUserName ) ) )
{
iPromptPassword = ETrue;
}
// IFNETWORKS is a list of possible protocols that a GPRS access points can be
// used for.
if( iBearer == KUidPacketDataBearerType && IsReceived( EWPParameterIfNetworks_id ) )
{
TLex lex( iIfNetworks->Value() );
lex.Mark();
do
{
TChar ch( lex.Get() );
if( ( !iPdpType && !ch.IsAlphaDigit() ) || ( !iPdpType && lex.Eos() ) )
{
if(!lex.Eos())
{
lex.UnGet();
}
TPtrC value( lex.MarkedToken() );
if( !lex.Eos() )
{
lex.Inc();
}
if( value == KIPv6
&& FeatureManager::FeatureSupported( KFeatureIdIPv6 ) )
{
//iPdpType = EIPv6;
// CMManager
iPdpType = RPacketContext::EPdpTypeIPv6;
result = ETrue;
}
else if( value == KIPv6
&& !FeatureManager::FeatureSupported( KFeatureIdIPv6 ) )
{
result = EFalse;
}
else if( value == KIPv4 )
{
//iPdpType = EIPv4;
// CMManager
iPdpType = RPacketContext::EPdpTypeIPv4;
result = ETrue;
}
}
} while( !lex.Eos() );
}
return result;
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::AddItemsL
// -----------------------------------------------------------------------------
//
TInt CWPAPNapdef::AddItemsL( RPointerArray<CWPAPAccesspointItem>& aItems,
CWPAPItemBase* aLogicalProxy,
CWPAPItemBase* aPhysicalProxy )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddItemsL" ) );
TInt count( 0 );
if( ( iFollowingLink || IsReceived( EWPParameterInternet_id )
|| IsReceived( EWPParameterWlan_id ) )
&& ValidateL() )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddItemsL append" ) );
CWPAPAccesspointItem* item = CWPAPAccesspointItem::NewLC(
iDefaultName,
aLogicalProxy,
aPhysicalProxy,
this,
iCharacteristic );
User::LeaveIfError( aItems.Append( item ) );
//Internet Parameter is received
if (IsReceived(EWPParameterInternet_id) && !iFollowingLink)
{
SetInternetIndicator(aItems.Count() - 1);
}
count++;
CleanupStack::Pop( item );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddItemsL append done" ) );
}
return count;
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::SetInternetIndicator
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::SetInternetIndicator(TInt aValue)
{
iInternetIndicator = aValue;
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::GetInternetIndicator
// -----------------------------------------------------------------------------
//
TInt CWPAPNapdef::GetInternetIndicator()
{
return iInternetIndicator;
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::AddDataL
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::AddDataL( /*CApAccessPointItem& aAPItem*/ RCmConnectionMethodExt& aCmItem )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddDataL" ) );
TInt err( KErrNone );
if ( iBearer == KUidWlanBearerType )
{
if ( iWlanSupported )
{
// CMManager
AddWlanDataL( aCmItem);
}
else
{
// WLAN is disabled (or does not exist) in the device.
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddDataL WLAN disabled." ) );
User::Leave( KErrNotSupported );
}
}
else
{
if ( iConnectionName )
{
// CMManager
aCmItem.SetStringAttributeL( CMManager::ECmName, (iConnectionName->Value().Left( KNameMaxLength )));
}
else // Use default name
{
// CMManager
aCmItem.SetStringAttributeL( CMManager::ECmName, iDefaultName );
}
if ( iAccesspointName )
{
if ( iBearer == KUidPacketDataBearerType )
{
// CMManager
TRAP ( err, aCmItem.SetStringAttributeL( CMManager::EPacketDataAPName, iAccesspointName->Value() ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddDataL value: %S, err: %d"),
&iAccesspointName->Value(), err));
}
else
{
// CMManager
TRAP ( err, aCmItem.SetStringAttributeL( CMManager::EDialDefaultTelNum, iAccesspointName->Value() ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::EApIspDefaultTelNumber value: %S, err: %d"),
&iAccesspointName->Value(), err ) );
}
}
TRAP ( err, aCmItem.UpdateL() );
if ( iUserName )
{
// CMManager
TRAP ( err, aCmItem.SetStringAttributeL( CMManager::EDialLoginName, iUserName->Value() ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddDataL EDialLoginName value: %S, err: %d"),
&iUserName->Value(), err));
TRAP ( err, aCmItem.SetStringAttributeL( CMManager::EDialIFAuthName, iUserName->Value() ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddDataL EDialIFAuthName value: %S, err: %d"),
&iUserName->Value(), err));
TRAP ( err, aCmItem.SetStringAttributeL( CMManager::ECmIFAuthName, iUserName->Value() ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddDataL ECmIFAuthName value: %S, err: %d"),
&iUserName->Value(), err));
}
// CMManager
TRAP ( err, aCmItem.SetBoolAttributeL( CMManager::ECmIFPromptForAuth, iPromptPassword));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddDataL ECmIFPromptForAuth value: %d, err: %d"),
iPromptPassword, err ));
if ( iPassword )
{
// CMManager
TRAP ( err, aCmItem.SetStringAttributeL( CMManager::EDialLoginPassword, iPassword->Value() ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddDataL EDialLoginPassword value: %d, err: %d"),
&iPassword->Value(), err ) );
TRAP ( err, aCmItem.SetStringAttributeL( CMManager::ECmIFAuthPass, iPassword->Value() ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddDataL ECmIFAuthPass value: %d, err: %d"),
&iPassword->Value(), err ) );
}
// CMManager
TRAP ( err, aCmItem.SetBoolAttributeL( CMManager::ECmDisablePlainTextAuth, iSecureAuthentication ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddDataL EApEApIspDisablePlainTextAuth value: %d, err: %d"),
iSecureAuthentication, err ) );
// IPv6 APs always have dynamic phone address
//CMManager
if ( iPhoneIPAddress && iPdpType != RPacketContext::EPdpTypeIPv6 )
{
// CMManager IS CORRECT?
//err = aAPItem.WriteTextL( EApIspIPAddr, iPhoneIPAddress->Value() );
TRAP ( err, aCmItem.SetStringAttributeL( CMManager::ECmIPAddress, iPhoneIPAddress->Value() ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddDataL EApIspIPAddr value: %S, err: %d"),
&iPhoneIPAddress->Value(), err ) );
}
TRAP ( err, aCmItem.UpdateL() );
for( TInt i( 0 ); i < iNameServers.Count(); i++ )
{
WriteDNSAddressL( aCmItem, iNameServers[i]->Value() );
}
TRAP ( err, aCmItem.UpdateL() );
if( FeatureManager::FeatureSupported( KFeatureIdIPv6 )
&& iPdpType )
{
// CMManager
TRAP ( err, aCmItem.SetIntAttributeL( CMManager::EPacketDataPDPType, iPdpType ));
}
if ( err ) err = 0; // prevent compiler warning
}
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddDataL" ) );
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::AddWlanDataL
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::AddWlanDataL( RCmConnectionMethodExt& aCmItem )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddWlanDataL" ) );
if ( !iWlanSupported )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddWlanDataL WLAN NOT supported." ) );
User::Leave( KErrNotSupported);
}
TInt err = KErrNone;
if ( iConnectionName )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddWlanDataL iConnectionName" ) );
//Connection name
// CMManager
aCmItem.SetStringAttributeL( CMManager::ECmName, iConnectionName->Value().Left( KNameMaxLength ) );
// CMManager
// Network name
aCmItem.SetStringAttributeL( CMManager::EWlanSSID, iConnectionName->Value());
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddWlanDataL iConnectionName err (%d) (%S)"), err, &iConnectionName->Value()));
}
else // Use default name
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddWlanDataL iConnectionName default" ) );
aCmItem.SetStringAttributeL( CMManager::EWlanSSID, iDefaultName);
}
//EApWlanNetworkMode Gives network mode, TUint32
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddWlanDataL EApWlanNetworkMode" ) );
// CMManager
TRAP ( err, aCmItem.SetIntAttributeL( CMManager::EWlanConnectionMode, iNetMode ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddWlanDataL EApWlanNetworkMode err (%d)"), err));
//EApWlanSecurityMode The security mode, TUint32
if ( iSecMode == 0 )
{
// This is needed if Provisioning message does not contain SECMODE parameter
// AP does not work if secmode is not set
iSecMode = CMManager::EWlanSecModeOpen;
}
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::AddWlanDataL EApWlanSecurityMode" ) );
// CMManager, securitymode causes error -1, this will be set manually in SaveWlanData
//TRAP ( err, aCmItem.SetIntAttributeL( CMManager::EWlanSecurityMode, iSecMode ));
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::AddWlanDataL EApWlanSecurityMode err (%d)"), err));
if (err)
{
err = KErrNone;
}
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::WriteDNSAddressL
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::WriteDNSAddressL( /*CApAccessPointItem& aAPItem*/ RCmConnectionMethodExt& aCmItem,
const TDesC& aValue )
{
// GPRS access points supports IPv6 only if explicitly stated.
// CMManager
TBool apSupportsIPv6( iPdpType == RPacketContext::EPdpTypeIPv6 | iBearer != KUidPacketDataBearerType );
// If IPv6 is supported, write the DNS address as IPv6 if
// bearer supports IPv6 and the address format is IPv6
if( FeatureManager::FeatureSupported( KFeatureIdIPv6 )
&& apSupportsIPv6
&& WPAdapterUtil::CheckIPv6( aValue ) )
{
// Two name servers per network type
if( iNumIPv6NameServers < KTwoNameServersPerNetworkType )
{
// CMManager
TRAPD (err, aCmItem.SetStringAttributeL( CMManager::TConnectionMethodCommonAttributes(
( CMManager::ECmIP6NameServer1 ) + iNumIPv6NameServers ), aValue ) );
User::LeaveIfError( err );
iNumIPv6NameServers++;
}
}
else if( CheckIPv4values( aValue) )
{
// Two name servers per network type
if( iNumIPv4NameServers < KTwoNameServersPerNetworkType )
{
// CMManager
TRAPD ( err, aCmItem.SetStringAttributeL( CMManager::TConnectionMethodCommonAttributes(
( CMManager::ECmIPNameServer1 ) + iNumIPv4NameServers ), aValue ) );
User::LeaveIfError( err );
aCmItem.SetBoolAttributeL( CMManager::ECmIPDNSAddrFromServer, EFalse);
iNumIPv4NameServers++;
}
}
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::CheckAddressPart
// -----------------------------------------------------------------------------
//
TBool CWPAPNapdef:: CheckAddressPart( TLex& aLex )
{
TBool result( aLex.Peek().IsDigit() );
aLex.Inc();
if( aLex.Peek().IsDigit() )
{
aLex.Inc();
if( aLex.Peek().IsDigit() )
{
aLex.Inc();
}
}
return result;
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::CheckIPv4values
// -----------------------------------------------------------------------------
//
TBool CWPAPNapdef::CheckIPv4values( const TDesC& aValue )
{
TLex aLex( aValue );
return CheckAddressPart( aLex )
&& aLex.Get() == '.'
&& CheckAddressPart( aLex )
&& aLex.Get() == '.'
&& CheckAddressPart( aLex )
&& aLex.Get() == '.'
&& CheckAddressPart( aLex )
&& aLex.Get() == '\0';
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::Name
// -----------------------------------------------------------------------------
//
const TDesC& CWPAPNapdef::Name()
{
if ( iConnectionName )
{
return iConnectionName->Value();
}
else
{
return KNullDesC;
}
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::VisitL
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::VisitL( CWPCharacteristic& aCharacteristic )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::VisitL(CWPCharacteristic)" ) );
TInt type = aCharacteristic.Type();
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::VisitL(CWPCharacteristic) type (%d)"), type));
switch ( type )
{
case KWPNapAuthInfo:
case KWPValidity:
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::VisitL(CWPCharacteristic) normal" ) );
aCharacteristic.AcceptL( *this );
break;
}
case KWPWLAN:
case KWPWepKey:
{
if( iWlanSupported )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::VisitL(CWPCharacteristic) accept WLAN characteristic" ) );
aCharacteristic.AcceptL( *this );
}
}
default:
{
if ( ( ( ( aCharacteristic.Name().Compare( KWLAN ) ) == 0 ) ||
( ( aCharacteristic.Name().Compare( SECSSID ) ) == 0 ) ||
( ( aCharacteristic.Name().Compare( KEAP ) ) == 0 ) ||
( ( aCharacteristic.Name().Compare( KCERT ) ) == 0 ) ||
( ( aCharacteristic.Name().Compare( KWEP ) ) == 0 ) ) && iWlanSupported )
{
if(aCharacteristic.Name().Compare( KEAP ) == 0)
{
CEapTypeElement* newEap = new (ELeave) CEapTypeElement;
newEap->iEAPSettings = new (ELeave) EAPSettings;
newEap->iCertificate = new (ELeave) EapCertificateEntry;
iEapTypeArray.AppendL(newEap);
}
else if(aCharacteristic.Name().Compare( SECSSID ) == 0)
{
SECssID* newsecSSID = new (ELeave) SECssID;
newsecSSID->iSSSID = NULL;
newsecSSID->iSUSSID = NULL;
iSecSSID.AppendL(newsecSSID);
}
aCharacteristic.AcceptL( *this );
}
}
}
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::VisitL(CWPCharacteristic) done" ) );
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::VisitL
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::VisitL( CWPParameter& aParameter )
{
TInt id = aParameter.ID();
TPtrC value( aParameter.Value() );
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::VisitL(CWPParameter) id: %d value: %S"), id, &value));
switch ( id )
{
case EWPParameterName:
{
if ( !iConnectionName )
{
iConnectionName = &aParameter;
}
break;
}
case EWPParameterBearer:
{
if ( iBearer != 0 || iBearerUnsupported )
{
break; // Already received a bearer information
}
if ( value == KGSMGPRS )
{
iBearer = KUidPacketDataBearerType;
}
else if ( value == KWLAN && iWlanSupported )
{
iBearer = KUidWlanBearerType;
MarkReceived( EWPParameterWlan_id );
}
else
{
// Unsupported bearer type
iBearerUnsupported = ETrue;
}
break;
}
case EWPParameterNapAddress:
{
if ( !iAccesspointName )
{
iAccesspointName = &aParameter;
}
break;
}
case EWPParameterLinger:
{
iLinger = &aParameter;
UdateligerValueL( iLinger );
break;
}
case EWPParameterNapAddrType:
{
if ( !iAccesspointNameType )
{
iAccesspointNameType = &aParameter;
}
break;
}
case EWPParameterAuthName:
{
if ( !iUserName )
{
iUserName = &aParameter;
}
break;
}
case EWPParameterAuthSecret:
{
if ( !iPassword )
{
iPassword = &aParameter;
}
break;
}
case EWPParameterAuthType:
{
// If already received don't accept
if (IsReceived(EWPParameterAuthentication_id))
{
break;
}
if ( value == KCHAP || value == KMD5 )
{
iSecureAuthentication = ETrue;
MarkReceived( EWPParameterAuthentication_id );
}
else if ( value == KPAP )
{
iSecureAuthentication = EFalse;
MarkReceived( EWPParameterAuthentication_id );
}
else
{
// Not supported...
}
break;
}
case EWPParameterLocalAddr: // iPhoneIPAddress
{
if ( !iPhoneIPAddress )
{
iPhoneIPAddress = &aParameter;
}
break;
}
case EWPParameterDNSAddr:
{
// All name servers must be stored, as some of them might
// be IPv6 and some IPv4
User::LeaveIfError( iNameServers.Append( &aParameter ) );
break;
}
case EWPParameterIfNetworks:
{
if( !iIfNetworks )
{
iIfNetworks = &aParameter;
MarkReceived( EWPParameterIfNetworks_id );
}
break;
}
case EWPParameterInternet:
{
MarkReceived( EWPParameterInternet_id );
break;
}
//JMan for WLan
case EWPParameterNapID:
{
if ( !iNapID )
{
iNapID = &aParameter;
}
break;
}
// Here case 0 are handled the WLAN parameters that are extensions
// to OMA Client Provisioning parameter set.
case 0:
{
if( iWlanSupported )
{
HandleWLanParametersL( aParameter );
}
break;
}
//JMan for WLan ends
default:
{
}
}
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::HandleWLanParametersL
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::HandleWLanParametersL( CWPParameter& aParameter )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL" ) );
if( !iWlanSupported )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL WLAN not supported." ) );
User::Leave( KErrNotSupported );
}
SECssID* scssid = NULL;
if( iSecSSID.Count() )
{
scssid = iSecSSID[iSecSSID.Count()-1];
}
TPtrC value( aParameter.Value() );
if( ( aParameter.Name().Compare( PRISSID ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL iPriSSID" ) );
if ( !iPriSSID )
{
iPriSSID = &aParameter;
}
}
else if( ( aParameter.Name().Compare( PRIUSSID ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL iPriUSSID" ) );
if ( !iPriUSSID )
{
iPriUSSID = &aParameter;
}
}// else if
else if( ( aParameter.Name().Compare( PRIHSSID ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL iPriHSSID" ) );
if ( !iPriHSSID )
{
iPriHSSID = &aParameter;
}
}// else if
else if( ( aParameter.Name().Compare( SSSID ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL iPriHSSID" ) );
if(scssid!=NULL)
{
scssid->iSSSID = &aParameter;
}
}// else if
else if( ( aParameter.Name().Compare( SUSSID ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL iPriHSSID" ) );
if(scssid!=NULL)
{
scssid->iSUSSID = &aParameter;
}
}// else if
else if( ( aParameter.Name().Compare( NETMODE ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL netmode" ) );
if ( value == KADHOC )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL netmode adhoc" ) );
iNetMode = CMManager::EAdhoc;
}
else // default is INFRA
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL netmode infra" ) );
iNetMode =CMManager::EInfra;
}
}
else if( ( aParameter.Name().Compare( SECMODE ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL secmode" ) );
if ( value == KWEPSEC )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL secmode KWEPSEC" ) );
iSecMode = CMManager::EWlanSecModeWep;
}
else if( value == K8021XSEC )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL secmode K8021XSEC" ) );
iSecMode = CMManager::EWlanSecMode802_1x;
}
else if( value == KWPASEC )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL secmode KWPASEC" ) );
iSecMode = CMManager::EWlanSecModeWpa;
}
else if( value == KWPA2SEC )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL secmode KWPA2SEC" ) );
iSecMode = CMManager::EWlanSecModeWpa2;
}
else if( value == KWPAPRESSEC )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL secmode KWPAPRESSEC" ) );
iSecMode = CMManager::EWlanSecModeWpa;
}
else if( value == KWPA2PRESSEC )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL secmode KWPA2PRESSEC" ) );
iSecMode = CMManager::EWlanSecModeWpa2;
}
else
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL secmode open" ) );
iSecMode = CMManager::EWlanSecModeOpen;
}
}
else if( ( aParameter.Name().Compare( WPAPRESKEYASC ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL WPAPRESKEYASC" ) );
if ( !iWpaPresKeyAsc )
{
iWpaPresKeyAsc = &aParameter;
}
}// else if
// indicates the default wepkey index
else if( ( aParameter.Name().Compare( DEFAULTWEPIND ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL wepind" ) );
TLex lex( value );
lex.Val( iDefaultWepKeyIndex );
if ( iDefaultWepKeyIndex >= 4 )
{
iDefaultWepKeyIndex = 0;
}
}// else if
else if( ( aParameter.Name().Compare( WEPAUTHMODE ) ) == 0 )
{
if ( value == KWEPAUTHMODEOPEN )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL wepauthmode OPEN" ) );
iAuthentication = EAuthOpen;
}
else if ( value == KWEPAUTHMODESHARED )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL wepauthmode SHARED" ) );
iAuthentication = EAuthShared;
}
}// else if
else if( ( aParameter.Name().Compare( WEPKEYLENGTH ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL WEPKEYLENGTH" ) );
if ( !iWepKeyLength )
{
iWepKeyLength = &aParameter;
}
}// else if
else if( ( aParameter.Name().Compare( WEPKEYINDEX ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL WEPKEYINDEX" ) );
TLex lex( value );
lex.Val( iWepInd );
}// else if
else if( ( aParameter.Name().Compare( WEPKEYDATA ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL WEPKEYDATA" ) );
if ( iWepInd < 4 )
{
const TUint8 K40Bits = 5;
const TUint8 K104Bits = 13;
const TUint8 K232Bits = 29;
TBuf8<KMaxLengthOfKeyData> buf8;
StrCopy( buf8, aParameter.Value() );
if(buf8.Length() == K232Bits ||
buf8.Length() == K104Bits ||
buf8.Length() == K40Bits )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL ASCI Wep Key" ) );
HBufC8* buf8Conv = HBufC8::NewLC( KMaxLengthOfKeyData );
ConvertAsciiToHex( buf8, buf8Conv );
iKeyData[iWepInd] = *buf8Conv;
iKeyFormat[iWepInd] = CWPAPNapdef::EAscii;
CleanupStack::PopAndDestroy( buf8Conv );
}
else if( buf8.Length()==K232Bits*2 ||
buf8.Length()== K104Bits*2 ||
buf8.Length() == K40Bits*2)
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL HEX Wep Key" ) );
iKeyData[iWepInd] = buf8;
iKeyFormat[iWepInd] = CWPAPNapdef::EHexadecimal;
}
}
}// else if
// Handle EAP parameter
HandleEAPParametersCCL( aParameter );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleWLanParametersL done" ) );
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::HandleEAPParametersL
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::HandleEAPParametersCCL( CWPParameter& aParameter )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL" ) );
CEapTypeElement* eap = NULL;
if ( iEapTypeArray.Count() )
{
eap = iEapTypeArray[iEapTypeArray.Count()-1];
}
if(!eap)
{
return;
}
TPtrC value( aParameter.Value() );
if( ( aParameter.Name().Compare( EAPTYPE ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPTYPE" ) );
ConvertEAPStringToIds( value, eap->iEapTypeString, eap->iEAPSettings->iEAPExpandedType );
}
else if( ( aParameter.Name().Compare( EAPUSERNAME ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPUSERNAME" ) );
if ( eap->iEAPSettings->iUsername.Length() == 0 )
{
eap->iEAPSettings->iUsername = value;
eap->iEAPSettings->iUsernamePresent = ETrue;
eap->iEAPSettings->iUseAutomaticUsernamePresent = ETrue;
eap->iEAPSettings->iUseAutomaticUsername = EFalse;
}
}// else if
else if( ( aParameter.Name().Compare( EAPPASSWORD ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPPASSWORD" ) );
if ( eap->iEAPSettings->iPassword.Length() == 0 )
{
eap->iEAPSettings->iPassword = value;
eap->iEAPSettings->iPasswordPresent = ETrue;
eap->iEAPSettings-> iShowPassWordPromptPresent = ETrue;
eap->iEAPSettings-> iShowPassWordPrompt = EFalse;
}
}// else if
else if( ( aParameter.Name().Compare( EAPREALM ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPREALM" ) );
if ( eap->iEAPSettings->iRealm.Length() == 0 )
{
eap->iEAPSettings->iRealm = value;
eap->iEAPSettings->iRealmPresent = ETrue;
eap->iEAPSettings->iUseAutomaticRealmPresent = ETrue;
eap->iEAPSettings->iUseAutomaticRealm = EFalse;
}
}// else if
else if( ( aParameter.Name().Compare( EAPUSEPSEUD ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPUSEPSEUD" ) );
TInt pseudonyms;
TLex lex( value );
lex.Val( pseudonyms );
eap->iEAPSettings->iUsePseudonymsPresent = ETrue;
if ( pseudonyms == 1 )
{
eap->iEAPSettings->iUsePseudonyms = ETrue;
}
else
{
eap->iEAPSettings->iUsePseudonyms = EFalse;
}
}// else if
else if( ( aParameter.Name().Compare( EAPMAXAUTHS ) ) == 0 )
{
// not supported
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPMAXAUTHS" ) );
}// else if
else if( ( aParameter.Name().Compare( EAPENCAPS ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPENCAPS" ) );
TEapExpandedType dummy;
ConvertEAPStringToIds( value, eap->iEncapsulatingExpandedEapId, dummy );
}// else if
else if( ( aParameter.Name().Compare( EAPVERSERREALM ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPVERSERREALM" ) );
TInt serverRealm;
TLex lex( value );
lex.Val( serverRealm );
eap->iEAPSettings->iVerifyServerRealmPresent = ETrue;
if ( serverRealm == 1 )
{
eap->iEAPSettings->iVerifyServerRealm = ETrue;
}
else
{
eap->iEAPSettings->iVerifyServerRealm = EFalse;
}
}// else if
else if( ( aParameter.Name().Compare( EAPCLIENTHAUTH ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPCLIENTHAUTH" ) );
TInt clientAuthentication;
TLex lex( value );
lex.Val( clientAuthentication );
eap->iEAPSettings->iRequireClientAuthenticationPresent = ETrue;
if ( clientAuthentication == 1 )
{
eap->iEAPSettings->iRequireClientAuthentication = ETrue;
}
else
{
eap->iEAPSettings->iRequireClientAuthentication = EFalse;
}
}// else if
else if( ( aParameter.Name().Compare( EAPSESVALTIME ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPSESVALTIME" ) );
TInt sessionValidityTime;
TLex lex( value );
lex.Val( sessionValidityTime );
eap->iEAPSettings->iSessionValidityTime = sessionValidityTime;
eap->iEAPSettings->iSessionValidityTimePresent = ETrue;
}// else if
else if( ( aParameter.Name().Compare( EAPCIPSUIT ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPCIPSUIT" ) );
TInt cipherSuites;
TLex lex( value );
lex.Val( cipherSuites );
eap->iEAPSettings->iCipherSuites.Append( cipherSuites );
eap->iEAPSettings->iCipherSuitesPresent = ETrue;
}// else if
else if( ( aParameter.Name().Compare( EAPPEAPV0 ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPPEAPV0" ) );
TInt peap;
TLex lex( value );
lex.Val( peap );
eap->iEAPSettings->iPEAPVersionsPresent = ETrue;
if ( peap == 1 )
{
eap->iEAPSettings->iPEAPv0Allowed = ETrue;
}
else
{
eap->iEAPSettings->iPEAPv0Allowed = EFalse;
}
}// else if
else if( ( aParameter.Name().Compare( EAPPEAPV1 ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPPEAPV1" ) );
TInt peap;
TLex lex( value );
lex.Val( peap );
eap->iEAPSettings->iPEAPVersionsPresent = ETrue;
if ( peap == 1 )
{
eap->iEAPSettings->iPEAPv1Allowed = ETrue;
}
else
{
eap->iEAPSettings->iPEAPv1Allowed = EFalse;
}
}// else if
else if( ( aParameter.Name().Compare( EAPPEAPV2 ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPPEAPV2" ) );
TInt peap;
TLex lex( value );
lex.Val( peap );
eap->iEAPSettings->iPEAPVersionsPresent = ETrue;
if ( peap == 1 )
{
eap->iEAPSettings->iPEAPv2Allowed = ETrue;
}
else
{
eap->iEAPSettings->iPEAPv2Allowed = EFalse;
}
}// else if
else if( ( aParameter.Name().Compare( EAPISSNAME ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPISSNAME" ) );
eap->iCertificate->SetSubjectName(value);
eap->iCertificate->SetSubjectNamePresent();
}// else if
else if( ( aParameter.Name().Compare( EAPSUBNAME ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPSUBNAME" ) );
eap->iCertificate->SetIssuerName(value);
eap->iCertificate->SetIssuerNamePresent();
}// else if
else if( ( aParameter.Name().Compare( EAPCERTTYPE ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPCERTTYPE" ) );
if ( value == EAPCERTCA )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EEapSim" ) );
eap->iCertificate->SetCertType(EapCertificateEntry::ECA);
eap->iEAPSettings-> iUseAutomaticCACertificatePresent = ETrue;
eap->iEAPSettings-> iUseAutomaticCACertificate = EFalse;
}
else
{
eap->iCertificate->SetCertType(EapCertificateEntry::EUser);
}
// Certificates must be present since this field was added
eap->iEAPSettings->iCertificatesPresent = ETrue;
eap->iCertificate->SetIsEnabledPresent();
eap->iCertificate->SetIsEnabled(ETrue) ;
}// else if
else if( ( aParameter.Name().Compare( EAPSERNUM ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPSERNUM" ) );
eap->iCertificate->SetSerialNumber(value);
eap->iCertificate->SetSerialNumberPresent();
}// else if
else if( ( aParameter.Name().Compare( EAPSUBKEYID ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPSUBKEYID" ) );
_LIT(KHexIdLC, "0x");
_LIT(KHexIdUC, "0X");
TBuf<2> HexIdBuf;
TInt keyLen = aParameter.Value().Length();
// setting the given key to the key buffer
TBuf<KMaxSubKeyLenght> origKey;
origKey.SetLength(keyLen);
origKey = aParameter.Value();
TBuf<KMaxSubKeyLenght> key;
TLex tmpByte;
TInt err(KErrNone);
TUint16 byte;
// Remove possible spaces from the beginning
origKey.TrimLeft();
// if the key is over two chars long, then we have to check
// whether there is 0x or 0X in the beginning
if (origKey.Length() >= 2)
{
// Copy the two left most characters in to the buffer
HexIdBuf.Copy(origKey.Left(2));
// If the first characters are 0x or 0X, then they should be ignored
if (HexIdBuf.Compare(KHexIdLC) == 0
|| HexIdBuf.Compare(KHexIdUC) == 0)
{
// delete two characters
origKey.Delete(0, 2);
}
}
// looping the subject key through, removing whitespaces
for (TInt i = 0; i < keyLen; i++)
{
// removing white spaces from the left side of the key
origKey.TrimLeft();
// check that there are characters left
if (origKey.Length() >= 2)
{
// pick the two left most bytes from the key
tmpByte = origKey.Left(2);
// convert byte into binary format
err = tmpByte.Val(byte, EHex);
// delete two characters from the left side of the character array in the buffer
origKey.Delete(0, 2);
// check whether conversion to decimal went ok
if (err != KErrNone)
{
// if there are problems, then leave the loop
break;
}
// store the appended byte into the key variable
key.Append(byte);
}
else if (origKey.Length() == 1)
{
// pick the left most bytes from the key
tmpByte = origKey.Left(1);
// convert byte into binary format
err = tmpByte.Val(byte, EHex);
// delete two characters from the left side of the character array in the buffer
origKey.Delete(0, 1);
// check whether conversion to decimal went ok
if (err != KErrNone)
{
// if there are problems, then leave the loop
break;
}
// store the appended byte into the key variable
key.Append(byte);
}
else
{
break;
}
}
TBuf8<KMaxSubKeyLenght> keyIdentifier;
keyIdentifier.Copy(key);
// store key value only if no errors occurred
if (err == KErrNone)
{
eap->iCertificate->SetSubjectKeyId(keyIdentifier);
eap->iCertificate->SetSubjectKeyIdPresent();
eap->iEAPSettings->iCertificatesPresent = ETrue;
}
}
else if( ( aParameter.Name().Compare( EAPTHUMBPRINT ) ) == 0 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::HandleEAPParametersL EAPTHUMBPRINT" ) );
eap->iCertificate->SetThumbprintPresent();
eap->iCertificate->SetThumbprint(value);
}// else if
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::CWPAPNapdef
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CWPAPNapdef::CWPAPNapdef( TBool aFollowingLink,
const TDesC& aDefaultName,
CWPCharacteristic& aLogicalCharacteristic )
: CWPAPItemBase( aDefaultName ),
iCharacteristic( aLogicalCharacteristic ),
iFollowingLink( aFollowingLink )
{
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::ConstructL()
{
iLingerValue = NULL;
iLingerFlag = ETrue;
iInternetIndicator = -1;
//checks if Wlan feature is supported
FeatureManager::InitializeLibL();
iWlanSupported = FeatureManager::FeatureSupported( KFeatureIdProtocolWlan );
FeatureManager::UnInitializeLib();
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::SaveWlanDataL
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::SaveWlanDataL( TUint32 aIapId, CCommsDatabase& aCommsDb )
{
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL APid: (%d)"), aIapId) );
if ( iBearer == KUidWlanBearerType )
{
CCommsDbTableView* wLanServiceTable;
// CMManager
// Search the Iap Service Id using the received IapId
RCmConnectionMethodExt cm = iCm->ConnectionMethodL( aIapId );
TUint32 serviceId = cm.GetIntAttributeL( CMManager::ECmIapServiceId );
// The BeginTransaction might fail if someone else has locked CommsDat
TInt dberr = aCommsDb.BeginTransaction();
if( dberr == KErrLocked )
{
// Try BeginTransaction again to get lock
TInt retry = KBeginTransRetryCount;
while ( retry > 0 && dberr == KErrLocked )
{
User::After(KBeginTransRetryDelay);
dberr = aCommsDb.BeginTransaction();
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL: Database locked. BeginTransaction retry." ) );
retry--;
}
if(dberr != KErrNone)
{
// Could not get lock to CommsDat at all
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL: BeginTransaction failed completely." ) );
User::Leave( dberr );
}
}
TInt indexToSec = 0;
wLanServiceTable = aCommsDb.OpenViewMatchingUintLC(
TPtrC( WLAN_SERVICE ), TPtrC( WLAN_SERVICE_ID ), serviceId );
TInt errorCode = wLanServiceTable->GotoFirstRecord();
if ( errorCode == KErrNone )
{
indexToSec = serviceId;
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL updaterecord" ) );
wLanServiceTable->UpdateRecord();
}
else
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL insertrecord" ) );
TUint32 dummyUid( 0 );
User::LeaveIfError( wLanServiceTable->InsertRecord( dummyUid ) );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteUintL WLAN_SERVICE_ID" ) );
// Save link to LAN service
wLanServiceTable->WriteUintL( TPtrC( WLAN_SERVICE_ID ), aIapId );
indexToSec = aIapId;
}
// Setting the security mode manually, because CMManager does not do that
wLanServiceTable->WriteUintL( TPtrC( WLAN_SECURITY_MODE ), iSecMode );
if( iSecSSID.Count() )
{
CCommsDbTableView* wLanSecserviceTable;
wLanSecserviceTable = aCommsDb.OpenTableLC( TPtrC( WLAN_SECONDARY_SSID ) );
//CleanupStack::Pop(wLanSecserviceTable); // wLanSecserviceTable
TBuf<4> blank;
blank.Append(KNullDesC);
TBool sssid = EFalse;
TBool sussid = EFalse;
for(TInt i = 0; i < iSecSSID.Count(); i++ )
{
TUint32 id ;
TInt retval = wLanSecserviceTable->InsertRecord(id);
wLanSecserviceTable->WriteUintL(TPtrC(WLAN_SEC_SSID_SERVICE_ID), indexToSec );
wLanSecserviceTable->WriteUintL(TPtrC(WLAN_SEC_SSID_ID), id );
if( iSecSSID[i]->iSSSID != NULL)
sssid = ETrue;
if(iSecSSID[i]->iSUSSID != NULL)
sussid = ETrue;
if((sssid && iSecSSID[i]->iSSSID->Value() != blank) || (sussid && iSecSSID[i]->iSUSSID->Value() != blank ))
{
if( sssid )
wLanSecserviceTable->WriteTextL(TPtrC(WLAN_SEC_SSID_SCANNED_SSID), iSecSSID[i]->iSSSID->Value());
if(sussid)
wLanSecserviceTable->WriteTextL(TPtrC(WLAN_SEC_SSID_USED_SSID), iSecSSID[i]->iSUSSID->Value());
}
wLanSecserviceTable->PutRecordChanges();
sssid = EFalse;
sussid = EFalse;
}
CleanupStack::PopAndDestroy( wLanSecserviceTable );
}
iSecSSID.ResetAndDestroy();
iSecSSID.Close();
if ( iPriSSID )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL NU_WLAN_SSID" ) );
// Save NU_WLAN_SSID
wLanServiceTable->WriteTextL( TPtrC(NU_WLAN_SSID), iPriSSID->Value() );
}
if ( iPriUSSID )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL WLAN_USED_SSID" ) );
// Save WLAN_USED_SSID
wLanServiceTable->WriteTextL( TPtrC(WLAN_USED_SSID), iPriUSSID->Value() );
}
if ( iPriHSSID )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL WLAN_SCAN_SSID" ) );
// Save WLAN_SCAN_SSID
wLanServiceTable->WriteBoolL( TPtrC(WLAN_SCAN_SSID), ETrue );
}
else
{
wLanServiceTable->WriteBoolL( TPtrC(WLAN_SCAN_SSID), EFalse );
}
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteUintL WLAN_WEP_INDEX" ) );
// Save index of key in use
wLanServiceTable->WriteUintL( TPtrC( WLAN_WEP_INDEX ),
(TUint32&) iDefaultWepKeyIndex );
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteUintL WLAN_WEP_INDEX: (%d)"), iDefaultWepKeyIndex) );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteUintL NU_WLAN_AUTHENTICATION_MODE" ) );
// Open / Shared (0/1)
// Save index of key in use
wLanServiceTable->WriteUintL( TPtrC( NU_WLAN_AUTHENTICATION_MODE ),
( TUint32& ) iAuthentication );
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteUintL NU_WLAN_AUTHENTICATION_MODE: (%d)"), iAuthentication) );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL NU_WLAN_WEP_KEY1" ) );
// Save first WEP key
wLanServiceTable->WriteTextL( TPtrC( NU_WLAN_WEP_KEY1 ), iKeyData[0] );
wLanServiceTable->WriteUintL( TPtrC( WLAN_WEP_KEY1_FORMAT ),
( TUint32& ) iKeyFormat[0] );
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL (%S)"), &iKeyData[0] ) );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL NU_WLAN_WEP_KEY2" ) );
// Save second WEP key
wLanServiceTable->WriteTextL( TPtrC( NU_WLAN_WEP_KEY2 ), iKeyData[1] );
wLanServiceTable->WriteUintL( TPtrC( WLAN_WEP_KEY2_FORMAT ),
( TUint32& ) iKeyFormat[1] );
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL (%S)"), &iKeyData[1] ) );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL NU_WLAN_WEP_KEY3" ) );
// Save third WEP key
wLanServiceTable->WriteTextL( TPtrC( NU_WLAN_WEP_KEY3 ), iKeyData[2] );
wLanServiceTable->WriteUintL( TPtrC( WLAN_WEP_KEY3_FORMAT ),
( TUint32& ) iKeyFormat[2] );
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL (%S)"), &iKeyData[2] ) );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL NU_WLAN_WEP_KEY4" ) );
// Save fourth WEP key
wLanServiceTable->WriteTextL( TPtrC( NU_WLAN_WEP_KEY4 ), iKeyData[3] );
wLanServiceTable->WriteUintL( TPtrC( WLAN_WEP_KEY4_FORMAT ),
( TUint32& ) iKeyFormat[3] );
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL (%S)"), &iKeyData[3] ) );
if ( iWpaPresKeyAsc )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL convert WPAKEY to ascii" ) );
// convert unicode to 8-bit ascii
TBuf8<KMaxWpaPskLength> wpaKey;
StrCopy( wpaKey, iWpaPresKeyAsc->Value() );
// Enable WPA Pre Shared key mode
wLanServiceTable->WriteBoolL( TPtrC( WLAN_ENABLE_WPA_PSK ), ETrue );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteUintL WLAN_WPA_PRE_SHARED_KEY" ) );
// Save PreShared Key
wLanServiceTable->WriteTextL( TPtrC( WLAN_WPA_PRE_SHARED_KEY ),
wpaKey );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteUintL WLAN_WPA_KEY_LENGTH" ) );
// Save PreShared Key Length
wLanServiceTable->WriteUintL( TPtrC( WLAN_WPA_KEY_LENGTH ),
wpaKey.Length() );
}
TBuf<KMaxLengthOfEapList> eapList;
eapList.Copy(KEapAll);
for (TInt i=0;i<iEapTypeArray.Count();i++)
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL save EAP settings" ) );
CEapTypeElement* eap = iEapTypeArray[i];
if ( eap->iEAPSettings->iCertificatesPresent )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL Certificate was present." ) );
eap->iEAPSettings->iCertificates.Append( eap->iCertificate );
}
// Save EAP list
if ( eap->iEapTypeString.Length() > 0
&& eap->iEncapsulatingExpandedEapId.Length() == 0) // AND method is not encapsulated
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL WriteTextL WLAN_EAPS" ) );
TBuf8<3> buf;
_LIT8(KFormat, "%d");
// pick the last byte from the array
buf.Format(KFormat, eap->iEapTypeString[KExpandedEapIdLength - 1]);
// search for the correct offset for the eap type from the KEapAll literal
TInt index = KEapAll().Find(buf);
const TUint8 offset = 2; //length = f "-0" string
// Add '+' to the correct offset, so that the eap is repsesented activated in the list
if(index >= offset)
{
eapList[index-offset] = KEapPlus;
}
}
// Set iEncapsulatingEapTypes
for ( TInt j = 0; j < iEapTypeArray.Count(); j++ )
{
// Check if any method has this method as the encapsulating method
if ( eap->iEapTypeString == iEapTypeArray[j]->iEncapsulatingExpandedEapId )
{
// Append this method to iEncapsulatedEAPType
eap->iEAPSettings->iEnabledEncapsulatedEAPExpandedTypes.Append( iEapTypeArray[j]->iEAPSettings->iEAPExpandedType );
eap->iEAPSettings->iEnabledEncapsulatedEAPExpandedTypesPresent = ETrue;
}
}
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL save EAP settings CEapType::NewL" ) );
CEapType* eapType = NULL;
TRAPD( error, ( eapType = CEapType::NewL( ELan, serviceId, eap->iEAPSettings->iEAPExpandedType ) ) );
if ( ( error == KErrNone ) && eapType )
{
CleanupStack::PushL( eapType );
// Check if this type is tunneled
if ( eap->iEncapsulatingExpandedEapId.Length() > 0 )
{
// It is tunneled.
eapType->SetTunnelingType( eap->iEncapsulatingExpandedEapId);
}
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL save EAP settings SetConfigurationL" ) );
TRAP_IGNORE( eapType->SetConfigurationL( *eap->iEAPSettings ) );
CleanupStack::PopAndDestroy( eapType );
}
else
{
FTRACE(RDebug::Print(_L("[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL CEapType::NewL err: %d"), error ) );
}
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL save EAP settings done" ) );
}
// Expanded EAP types in use. Write the eap list to the new columns.
// 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( eapList );
TInt numPlus = 0;
TInt numMinus = 0;
TChar ch;
while ( !lex.Eos() )
{
ch = lex.Get();
if ( ch == '+' ) ++numPlus;
else if ( ch == '-' ) ++numMinus;
}
// load general EAP settings If
CEapGeneralSettings* genSettings;
genSettings = CEapGeneralSettings::NewL(ELan, serviceId);
CleanupStack::PushL( genSettings );
// get lists of enabled/disabled EAPs for the IAP
RArray<TEapExpandedType> enabledEapMethods;
RArray<TEapExpandedType> disabledEapMethods;
enabledEapMethods.Reset();
disabledEapMethods.Reset();
lex.Assign( eapList );
while ( !lex.Eos() )
{
// beginning of implementation UID
TInt16 implUid = 0;
if ( lex.Val( implUid ) != KErrNone || !implUid )
{
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 )
{
TBuf8<KExpandedEapIdLength> tempbuf;
if(Abs( implUid ) == KPlainMsChapV2ImplUid)
{
tempbuf.Append(KMsChapV2Padding);
}
else
{
tempbuf.Append(KPadding);
}
tempbuf.Append(Abs( implUid ));
TEapExpandedType expandedTypebuf(tempbuf);
enabledEapMethods.Append(expandedTypebuf);
}
// swallow the delimiter (',')
lex.Get();
}
genSettings->SetEapMethods(enabledEapMethods, disabledEapMethods);
CleanupStack::PopAndDestroy( genSettings );
iEapTypeArray.ResetAndDestroy();
wLanServiceTable->PutRecordChanges();
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL PutRecordChanges" ) );
CleanupStack::PopAndDestroy( wLanServiceTable );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL done" ) );
aCommsDb.CommitTransaction();
}
else
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::SaveWlanDataL ignored not a WLAN AP" ) );
}
}
//------------------------------------------------------------------------------
// CWPAPNapdef::ConvertAsciiToHex
//------------------------------------------------------------------------------
//
void CWPAPNapdef::ConvertAsciiToHex( const TDesC8& aSource, HBufC8*& aDest )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertAsciiToHex" ) );
_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] );
}
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertAsciiToHex Done" ) );
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::StrCopy
// String copy with lenght check.
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::StrCopy( TDes8& aTarget, const TDesC& aSource )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::StrCopy" ) );
TInt len = aTarget.MaxLength();
if( len < aSource.Length() )
{
aTarget.Copy( aSource.Left( len ) );
return;
}
aTarget.Copy( aSource );
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::StrCopy Done" ) );
}
CEapTypeElement::~CEapTypeElement()
{
delete iEAPSettings;
delete iCertificate;
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::UpdateLingerL
//
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::UpdateLingerL(const TUint32 aIapId)
{
if ( iLinger && ( !iLingerFlag ) )
{
AddLingerL( aIapId , iLingerValue );
}
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::UdateligerValueL
//
// -----------------------------------------------------------------------------
//
void CWPAPNapdef::UdateligerValueL(CWPParameter* aLinger)
{
TInt err(KErrNone);
const TDesC& value = aLinger->Value();
if( !Notalpha(value))
{
TLex lex( value );
TUint Linger = 0;
TInt lingerint;
err = lex.Val( Linger, EDecimal );
if( err == KErrNone )
{
lingerint = Linger;
if( lingerint >= 0 )
{
iLingerValue = lingerint;
iLingerFlag = EFalse;
}
}
}
}
// -----------------------------------------------------------------------------
// CWPAPNapdef::UdateligerValueL
//
// -----------------------------------------------------------------------------
//
TBool CWPAPNapdef::Notalpha(const TDesC& aValue)
{
TBool NotAlpha = EFalse;
TChar character;
for(TInt i = 0 ; i < aValue.Length(); i++)
{
character = aValue[i];
NotAlpha = character.IsAlpha();
if(NotAlpha)
break;
}
return NotAlpha;
}
// ---------------------------------------------------------------------------
// Adds iapID and linger interval to CentralRepository
// ---------------------------------------------------------------------------
//
void CWPAPNapdef::AddLingerL( const TInt aIapId, const TInt aLingerInterval )
{
TInt err( KErrNone );
// Open repository
CRepository* repository = CRepository::NewLC( KCRUidPDPContextManager );
// Find if an entry for "iapId" already exists in CentRep
RArray< TUint32 > foundKeys;
foundKeys.Reset();
err = repository->FindEqL( KIapColumn, // partial key
KColumnMask, // key mask
aIapId, // value
foundKeys ); // found keys
if ( err == KErrNone || err == KErrNotFound )
{
if ( foundKeys.Count() == 0 )
{
// Add a new entry
TInt arrayCount( 0 );
// Get number of iapId&linger entries in Centrep
err = repository->Get( KPdpContextManagerLingerArrayCount,
arrayCount );
if ( err == KErrNone )
{
arrayCount++;
err = repository->Create( ( KIapColumn | arrayCount ), aIapId );
if ( err == KErrNone )
{
err = repository->Create( ( KLingerColumn | arrayCount ),
aLingerInterval );
}
if ( err == KErrNone )
{
// Update number of iapId&linger entries in Centrep
err = repository->Set( KPdpContextManagerLingerArrayCount,
arrayCount );
}
}
}
else
{
// Update existing entry on current row
TInt32 row = foundKeys[ 0 ] & KRowMask;
err = repository->Set( ( KLingerColumn | row ), aLingerInterval );
}
}
foundKeys.Close();
CleanupStack::PopAndDestroy( repository );
User::LeaveIfError( err );
}
void CWPAPNapdef::ConvertEAPStringToIds( const TDesC& aEAPString, TDes8& aExpandedId, TEapExpandedType& aID)
{
if ( aEAPString == KEAPSIM )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertEAPStringToIds EEapSim" ) );
aExpandedId.Copy( KEapSimTypeId, KExpandedEapIdLength );
aID = *EapExpandedTypeSim.GetType();
}
else if( aEAPString == KEAPAKA )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertEAPStringToIds EEapAka" ) );
aExpandedId.Copy( KEapAkaTypeId, KExpandedEapIdLength );
aID = *EapExpandedTypeAka.GetType();
}
else if( aEAPString == KEAPTLS )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertEAPStringToIds EEapTls" ) );
aExpandedId.Copy( KEapTlsTypeId, KExpandedEapIdLength );
aID = *EapExpandedTypeTls.GetType();
}
else if( aEAPString == KEAPPEAP )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertEAPStringToIds EEapPeap" ) );
aExpandedId.Copy( KEapPeapTypeId, KExpandedEapIdLength );
aID = *EapExpandedTypePeap.GetType();
}
else if( aEAPString == KEAPTTLS )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertEAPStringToIds EEapTtls" ) );
aExpandedId.Copy( KEapTtlsTypeId, KExpandedEapIdLength );
aID = *EapExpandedTypeTtls.GetType();
}
else if( aEAPString == KEAPLEAP )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertEAPStringToIds EEapLeap" ) );
aExpandedId.Copy( KEapLeapTypeId, KExpandedEapIdLength );
aID = *EapExpandedTypeLeap.GetType();
}
else if( aEAPString == KEAPMSCHAPV2 )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertEAPStringToIds EEapMschapv2" ) );
aExpandedId.Copy( KEapMschapv2TypeId, KExpandedEapIdLength );
aID = *EapExpandedTypeMsChapv2.GetType();
}
else if( aEAPString == KEAPGTC )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertEAPStringToIds EEapGtc" ) );
aExpandedId.Copy( KEapGtcTypeId, KExpandedEapIdLength );
aID = *EapExpandedTypeGtc.GetType();
}
else if( aEAPString == KEAPFAST )
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertEAPStringToIds EEapFast" ) );
aExpandedId.Copy( KEapFastTypeId, KExpandedEapIdLength );
aID = *EapExpandedTypeFast.GetType();
}
else
{
FLOG( _L( "[AccesspointAdapter] CWPAPNapdef::ConvertEAPStringToIds EEapNone" ) );
aExpandedId.Copy( KEapNoneId, KExpandedEapIdLength );
aID = *EapExpandedTypeNone.GetType();
}
}
// ---------------------------------------------------------------------------
// Returns the NAP-ID
// ---------------------------------------------------------------------------
//
const TDesC& CWPAPNapdef::NapId()
{
return iNapID->Value();
}
// ---------------------------------------------------------------------------
// Returns the bearer value
// ---------------------------------------------------------------------------
//
TUint CWPAPNapdef::Bearer()
{
return iBearer;
}
// ---------------------------------------------------------------------------
// Returns the bearer value
// ---------------------------------------------------------------------------
//
void CWPAPNapdef::SetCMManager( RCmManagerExt* aCm )
{
iCm = aCm;
}
// End of File