diff -r 35488577e233 -r 2fa1fa551b0b satengine/SatServer/Engine/src/CSatApnHandler.cpp --- a/satengine/SatServer/Engine/src/CSatApnHandler.cpp Mon Aug 23 15:50:31 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,461 +0,0 @@ -/* -* Copyright (c) 2002-2010 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 -#include - -#include "MSatUtils.h" -#include "CSatApnHandler.h" -#include "SatLog.h" - -const TUint32 KSatCMGranularity( 5 ); - -// ============================ 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.SetBoolAttributeL( 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; - } - -// ----------------------------------------------------------------------------- -// CSatApnHandler::FindDefaultApL -// ----------------------------------------------------------------------------- -// -TUint32 CSatApnHandler::FindDefaultApL( - const RPacketContext::TProtocolType& aPdpType ) - { - LOG( SIMPLE, "SATENGINE: CSatApnHandler::FindDefaultApL calling" ); - TUint32 defaultIap( 0 ); - TInt pdpType; - TBool isFound( EFalse ); - - // create a network destination - RCmDestination des; - RCmConnectionMethod cm; - - // Create CMManager Session - RCmManager cmManager; - cmManager.OpenL(); - CleanupClosePushL( cmManager ); - - // Get the Connection Method list from the open CMManager session - RArray array( KSatCMGranularity ); - CleanupClosePushL( array ); - - // list all available destinations' id - cmManager.AllDestinationsL( array ); - for( TInt i = 0; ( i < array.Count() ) && !isFound; ++i ) - { - des = cmManager.DestinationL( array[i] ); - CleanupClosePushL( des ); - - if ( CMManager::ESnapPurposeInternet == - des.MetadataL( CMManager::ESnapMetadataPurpose ) ) - { - LOG( SIMPLE, "SATENGINE: CSatApnHandler::FindDefaultApL \ - the fixed destination is identified as 'Internet'" ); - for( TInt j = 0; ( j < des.ConnectionMethodCount() ) && - !isFound; ++j ) - { - cm = des.ConnectionMethodL( j ); - CleanupClosePushL( cm ); - pdpType = cm.GetIntAttributeL( - CMManager::EPacketDataPDPType ); - LOG2( SIMPLE, "SATENGINE: CSatApnHandler::FindDefaultApL \ - current protocol type is %d", pdpType ) - if ( pdpType == aPdpType ) - { - defaultIap = cm.GetIntAttributeL( CMManager::ECmIapId ); - isFound = ETrue; - LOG2( SIMPLE, "SATENGINE: CSatApnHandler::FindDefaultApL \ - default iap had been found %d", defaultIap ) - } - CleanupStack::PopAndDestroy( &cm ); - } - } - CleanupStack::PopAndDestroy( &des ); - } - CleanupStack::PopAndDestroy( &array ); - CleanupStack::PopAndDestroy( &cmManager ); - - if ( !isFound ) - { - LOG( SIMPLE, "SATENGINE: CSatApnHandler: default AP not found" ); - User::Leave( KErrNotFound ); - } - - LOG( SIMPLE, "SATENGINE: CSatApnHandler::FindDefaultApL exit" ) - return defaultIap; - } -// End of File