diff -r 000000000000 -r ff3b6d0fd310 satengine/SatServer/Engine/src/CSatApnHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/satengine/SatServer/Engine/src/CSatApnHandler.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,397 @@ +/* +* 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: Handles APN operations +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include + +#include "MSatUtils.h" +#include "CSatApnHandler.h" +#include "SatLog.h" + + +const TInt KMaxAccessPointName( 50 ); +// Granularity for getting connection methods from CM session +const TUint32 KSatCMGranularity( 5 ); +// The max length of access point name +const TUint32 KSatMaxApnName( 236 ); + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSatApnHandler::CSatApnHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSatApnHandler::CSatApnHandler( MSatUtils& aUtils ) : + iUtils( aUtils ) + { + LOG( SIMPLE, + "SATENGINE: CSatApnHandler::CSatApnHandler calling-exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatApnHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSatApnHandler* CSatApnHandler::NewL( MSatUtils& aUtils ) + { + LOG( SIMPLE, "SATENGINE: CSatApnHandler::NewL calling" ) + + CSatApnHandler* self = new( ELeave )CSatApnHandler( aUtils ); + LOG( SIMPLE, "SATENGINE: CSatApnHandler::NewL exiting" ) + return self; + } + +// ----------------------------------------------------------------------------- +// CSatApnHandler::Destructor +// ----------------------------------------------------------------------------- +// +CSatApnHandler::~CSatApnHandler() + { + LOG( SIMPLE, + "SATENGINE: CSatApnHandler::~CSatApnHandler calling" ) + LOG( SIMPLE, + "SATENGINE: CSatApnHandler::~CSatApnHandler exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatApnHandler::GetApnInfoL +// ----------------------------------------------------------------------------- +// +void CSatApnHandler::GetApnInfoL( + const RSat::TAccessName& aName, + const RSat::TTextString& aUserLogin, + const RSat::TTextString& aUserPwd, + TUint32& aIapId, + TUint32& aNwId, + TBool& aApnCreated, + const RPacketContext::TProtocolType& aPdpType, + const TDesC8& aLocalAddress ) + { + LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL calling" ) + + + // First check the length of the APN + if ( !aName.Length() ) + { + LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL \ + aName.Length() == 0" ) + User::Leave( KErrNotFound ); + } + + // Format APN + HBufC* formatName = FormatAPN( aName ); + + if ( !formatName ) + { + LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL wrong APN name \ + format" ) + // APN was in false format, leave + User::Leave( KErrArgument ); + } + CleanupStack::PushL( formatName ); + + // Reference params + TUint32 iapId( 0 ); + TUint32 networkId( 0 ); + + // Find if the connection method already exists + // Initialize the flags + TBool found = EFalse; + aApnCreated = EFalse; + + // Create CMManager Session + RCmManager cmManager; + cmManager.OpenLC(); + + // Get the Connection Method list from the open CMManager session + RArray array = RArray( KSatCMGranularity ); + CleanupClosePushL( array ); + + cmManager.ConnectionMethodL( array ); + + // Go through the Connection Method list to find if there is matched one + HBufC* apnCM; + + LOG2( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL, \ + required pdp type is %d", aPdpType ) + + for( TInt i = 0; ( i < array.Count() ) && !found; ++i ) + { + RCmConnectionMethod cm = cmManager.ConnectionMethodL( array[i] ); + + CleanupClosePushL( cm ); + // query the APN of the Connection Method + apnCM = cm.GetStringAttributeL( CMManager::EPacketDataAPName ); + CleanupStack::PushL( apnCM ); + // query the pdpType of the Connection Method + TInt pdpType = cm.GetIntAttributeL( CMManager::EPacketDataPDPType ); + + + if ( ( pdpType == aPdpType ) && ( *apnCM == *formatName ) ) + { + // Found the Connection Method, query the IapId and NwId + LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL, \ + Record found" ) + + // Get IAP Id, Network Id + networkId = cm.GetIntAttributeL( CMManager::ECmNetworkId ); + LOG2( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL, \ + networkId %d", networkId ) + + iapId = cm.GetIntAttributeL( CMManager::ECmIapId ); + LOG2( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL, \ + iapId %d", iapId ) + + found = ETrue; + } + CleanupStack::PopAndDestroy( apnCM ); + CleanupStack::PopAndDestroy( &cm ); + } + + CleanupStack::PopAndDestroy( &array ); + + if ( !found ) + { + // No Connection Method found, insert a new one + + LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL, \ + Record Not found, insert a new one" ) + + TRAPD( insertError, InsertRecordL( *formatName, aUserLogin, + aUserPwd, iapId, networkId, aPdpType, aLocalAddress ) ) + + if ( KErrNone == insertError ) + { + // Insert OK + LOG( NORMAL, "SATENGINE: CSatApnHandler::GetApnInfoL, \ + new record inserted" ) + aApnCreated = ETrue; + } + } + + CleanupStack::PopAndDestroy( &cmManager ); + CleanupStack::PopAndDestroy( formatName ); + + // Set return values + aIapId = iapId; + aNwId = networkId; + + LOG( SIMPLE, "SATENGINE: CSatApnHandler::GetApnInfoL exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatApnHandler::DeleteApnL +// ----------------------------------------------------------------------------- +// +void CSatApnHandler::DeleteApnL( TUint32 aApnId ) + { + LOG( SIMPLE, "SATENGINE: CSatApnHandler::DeleteApnL calling" ) + + if ( aApnId ) + { + // Create CMManager Session + RCmManagerExt cmManager; + cmManager.OpenLC(); + + // Get the connection method + RCmConnectionMethodExt cm; + cm = cmManager.ConnectionMethodL( aApnId ); + CleanupClosePushL( cm ); + + cm.DeleteL(); + LOG2( SIMPLE, "SATENGINE: CSatApnHandler::DeleteApnL, \ + delete the connection method %d", aApnId ) + + CleanupStack::PopAndDestroy( &cm ); + CleanupStack::PopAndDestroy( &cmManager ); + } + + LOG( SIMPLE, "SATENGINE: CSatApnHandler::DeleteApnL exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatApnHandler::InsertRecordL +// ----------------------------------------------------------------------------- +// +void CSatApnHandler::InsertRecordL( + const TDesC& aReqApn, + const RSat::TTextString& aUserLogin, + const RSat::TTextString& aUserPwd, + TUint32& aIapId, + TUint32& aNwId, + const RPacketContext::TProtocolType aPdpType, + const TDesC8& aLocalAddress ) + { + LOG( SIMPLE, "SATENGINE: CSatApnHandler::InsertRecordL calling" ) + + LOG2( NORMAL, "SATENGINE: CSatApnHandler::InsertRecordL, apn is %S", + &aReqApn ) + + // Create CMManager Session + RCmManagerExt cmManager; + cmManager.OpenLC(); + + // Create a connection method without destination. So when we can find + // the connection method by going through the connection method list. + RCmConnectionMethodExt cm; + cm = cmManager.CreateConnectionMethodL( KUidPacketDataBearerType ); + CleanupClosePushL( cm ); + + // This is shown in GS in Access Point list + cm.SetStringAttributeL( CMManager::ECmName, iUtils.BipApnName() ); + // GPRS connection name + cm.SetStringAttributeL( CMManager::EPacketDataAPName, aReqApn ); + // IPv4 or IPv6 + cm.SetIntAttributeL( CMManager::EPacketDataPDPType, aPdpType ); + + // Set the local IP address (if any) + if ( aLocalAddress.Length() ) + { + LOG2( SIMPLE, "SATENGINE: CSatApnHandler::InsertRecordL, Local addr \ + length: %i", aLocalAddress.Length() ) + cm.SetString8AttributeL( CMManager::EPacketDataPDPAddress, + aLocalAddress ); + } + + cm.SetBoolAttributeL( CMManager::ECmWapIPSecurity, EFalse ); + cm.SetIntAttributeL( CMManager::ECmWapIPWSPOption, + CMManager::ECmWapWspOptionConnectionOriented ); + cm.SetBoolAttributeL( CMManager::EPacketDataDisablePlainTextAuth, EFalse ); + cm.SetIntAttributeL( CMManager::ECmIFPromptForAuth, EFalse ); + + if ( aUserLogin != KNullDesC ) + { + LOG2( NORMAL, "SATENGINE: CSatApnHandler::InsertRecordL, \ + username is %S", &aUserLogin ) + cm.SetStringAttributeL( CMManager::ECmIFAuthName, aUserLogin ); + + if ( aUserPwd != KNullDesC ) + { + LOG2( NORMAL, "SATENGINE: CSatApnHandler::InsertRecordL, \ + pwd is %S", &aUserPwd ) + cm.SetStringAttributeL( CMManager::ECmIFAuthPass, aUserPwd ); + } + } + + // Update the access point ID for use later. + cm.UpdateL(); + + // Get IAP Id, Network Id + aNwId = cm.GetIntAttributeL( CMManager::ECmNetworkId ); + LOG2( SIMPLE, "SATENGINE: CSatApnHandler::InsertRecordL, \ + Nwid is %d", aNwId ) + + aIapId = cm.GetIntAttributeL( CMManager::ECmIapId ); + LOG2( SIMPLE, "SATENGINE: CSatApnHandler::InsertRecordL, \ + aIpId is %d", aIapId ) + + CleanupStack::PopAndDestroy( &cm ); + CleanupStack::PopAndDestroy( &cmManager ); + + LOG( SIMPLE, "SATENGINE: CSatApnHandler::InsertRecordL exiting" ) + } + +// ----------------------------------------------------------------------------- +// CSatApnHandler::FormatAPN +// ----------------------------------------------------------------------------- +// +HBufC* CSatApnHandler::FormatAPN( const RSat::TAccessName& + aReqApn ) const + { + LOG( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN calling" ) + + // Length of the access point name + const TInt accessNameLength( aReqApn.Length() ); + TInt index( 0 ); + + // Format APN coming from SIM. Remove length infos and add dots + // from the requested APN. The APN format is, for example, + // '4Some9accesspnt2fi' and after the format the formatted APN + // should be 'Some.accesspnt.fi' + HBufC* formatApnName = HBufC::New( aReqApn.MaxLength() ); + + if ( formatApnName ) + { + TPtr formApn( formatApnName->Des() ); + + // Indicates is the APN format correct. Can be detected only in loops. + TBool correctFormat( ETrue ); + + // Loop requested APN. The first byte is always the length + for ( index = 0; index < accessNameLength && correctFormat; index++ ) + { + // Next byte is the length of the next label + const TInt length( aReqApn[index] ); + + // Label length cannot be bigger than the length of the APN + if ( ( index + length ) > accessNameLength ) + { + LOG( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN \ + ( index + length ) > accessNameLength" ) + correctFormat = EFalse; + } + + // Append the label + for ( TInt j = 0; j < length && correctFormat; j++ ) + { + index++; // move to next index + TChar next = aReqApn[index]; + formApn.Append( next ); + } + + // Add dot to APN if not end of APN + if ( accessNameLength > index + 1 ) + { + LOG( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN \ + accessNameLength > index + 1" ) + formApn.Append( '.' ); + } + } + LOG2( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN index: %i", index ) + + // Check did we read all characters + if ( !correctFormat || ( index != accessNameLength ) ) + { + // Format was not correct, return zero + formApn.Zero(); + formApn.SetLength( 0 ); + } + else + { + LOG( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN lower case" ) + // Put characters to lower case + formApn.LowerCase(); + } + + LOG( SIMPLE, "SATENGINE: CSatApnHandler::FormatAPN exiting" ) + } + + return formatApnName; + } + +// End of File