diff -r ed1e38b404e5 -r 6134b5029079 voipplugins/sipconnectionprovider/src/scpservicemanager.cpp --- a/voipplugins/sipconnectionprovider/src/scpservicemanager.cpp Wed Mar 31 21:20:05 2010 +0300 +++ b/voipplugins/sipconnectionprovider/src/scpservicemanager.cpp Wed Apr 14 15:49:55 2010 +0300 @@ -16,6 +16,10 @@ */ #include #include +#include +#include +#include +#include #include "scpservicemanager.h" #include "scpsettinghandler.h" @@ -181,7 +185,9 @@ SCPLOGSTRING2( "CScpServiceManager::EnableServiceL service:%i", aServiceId ); SCPLOGSTRING2( "CScpServiceManager::EnableServiceL type:%i", aSubServiceType ); __ASSERT_DEBUG( aServiceId > 0, User::Panic( KNullDesC, KErrNotFound ) ); - + + CheckRestrictedConnectionsL( aServiceId ); + CScpService* service = GetServiceL( aServiceId, aSubServiceType ); if( !service ) @@ -805,22 +811,25 @@ if( aParameter==ECchUsername ) { - HBufC* buffer = NULL; TBuf16 tempBuf; TBuf8 username; if( sipConnection->GetUsername( username ) == KErrNone ) { - tempBuf.Copy( username ); + // Decode encoded username (spaces to %20). + HBufC8* decodedUsername = EscapeUtils::EscapeDecodeL( username ); + CleanupStack::PushL( decodedUsername ); - // Decode encoded username (spaces to %20). - buffer = EscapeUtils::EscapeDecodeL( tempBuf ); + HBufC* userName16 = + EscapeUtils::ConvertToUnicodeFromUtf8L( decodedUsername->Des() ); - if ( buffer ) + CleanupStack::PopAndDestroy( decodedUsername ); + + if ( userName16 ) { - aValue.Copy( buffer->Des() ); - delete buffer; - buffer = NULL; + aValue.Copy( userName16->Des() ); + delete userName16; + userName16 = NULL; } else { @@ -1007,4 +1016,86 @@ } } +// ----------------------------------------------------------------------------- +// CScpServiceManager::CheckRestrictedConnectionsL +// ----------------------------------------------------------------------------- +// +void CScpServiceManager::CheckRestrictedConnectionsL( TUint aServiceId ) + { + if ( !iSettingHandler->IsVoIPOverWcdmaAllowedL( aServiceId ) ) + { + SCPLOGSTRING( "CScpServiceManager::CheckRestrictedConnectionsL WCDMA not allowed" ); + + TBool sipConnectionCreated( EFalse ); + CScpSipConnection* sipConnection = GetSipConnectionL( + aServiceId, + ECCHVoIPSub, + sipConnectionCreated ); + + if( sipConnectionCreated ) + { + CleanupStack::PushL( sipConnection ); + } + + TUint32 snapId( KErrNone ); + sipConnection->GetSnap( snapId ); + + RArray iaps; + CleanupClosePushL( iaps ); + // get first iap and iap's bearer, there must be atleast + // one iap if not cch does not work as it should + RCmManager cmm; + cmm.OpenL(); + CleanupClosePushL( cmm ); + RCmDestination destination( cmm.DestinationL( snapId ) ); + CleanupClosePushL( destination ); + + for ( TInt i = 0; i < destination.ConnectionMethodCount(); i++ ) + { + RCmConnectionMethod cm = destination.ConnectionMethodL( i ); + CleanupClosePushL( cm ); + + if( KUidWlanBearerType == + cm.GetIntAttributeL( CMManager::ECmBearerType ) ) + { + SCPLOGSTRING( "CScpServiceManager::CheckAvailableConnectionsL WLAN IAP found" ); + iaps.Append( cm.GetIntAttributeL( CMManager::ECmIapId ) ); + } + else + { + SCPLOGSTRING2( "CScpServiceManager::CheckAvailableConnectionsL iaps count = %d", iaps.Count() ); + SCPLOGSTRING( "CScpServiceManager::CheckAvailableConnectionsL 3G IAP found break the loop" ); + i = destination.ConnectionMethodCount(); + } + + CleanupStack::PopAndDestroy( &cm ); + } + + TBool available( EFalse ); + for ( TInt j( 0 ); j < iaps.Count(); j++ ) + { + if ( sipConnection->IsIapConnectionAvailable( iaps[ j ] ) ) + { + SCPLOGSTRING( "CScpServiceManager::CheckAvailableConnectionsL WLAN IAP available" ); + available = ETrue; + break; + } + } + + CleanupStack::PopAndDestroy( &destination ); + CleanupStack::PopAndDestroy( &cmm ); + CleanupStack::PopAndDestroy( &iaps ); + + if( sipConnectionCreated ) + { + CleanupStack::PopAndDestroy( sipConnection ); + } + + if ( !available ) + { + User::Leave( KCCHErrorAccessPointNotDefined ); + } + } + } + // End of file