diff -r 000000000000 -r 5a93021fdf25 bearermanagement/mpm/src/mpmconnmonevents.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bearermanagement/mpm/src/mpmconnmonevents.cpp Thu Dec 17 08:55:21 2009 +0200 @@ -0,0 +1,748 @@ +/* +* Copyright (c) 2005-2009 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: Get events from Connection Monitor +* +*/ + +/** +@file mpmconnmonevents.cpp +Get events from Connection Monitor. +*/ + +// INCLUDE FILES +#include "mpmconnmonevents.h" +#include "mpmconnmonreqs.h" +#include "mpmserver.h" +#include "mpmserversession.h" +#include "mpmlogger.h" +#include "mpmwlanavailability.h" + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::NewL +// ----------------------------------------------------------------------------- +// +CMPMConnMonEvents* CMPMConnMonEvents::NewL( CMPMServer& aServer, + CMPMServerSession& aSession ) + { + CMPMConnMonEvents* self = new ( ELeave ) CMPMConnMonEvents( aServer ); + CleanupStack::PushL( self ); + self->ConstructL( aSession ); + CleanupStack::Pop( self ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::CMPMConnMonEvents +// ----------------------------------------------------------------------------- +// +CMPMConnMonEvents::CMPMConnMonEvents( CMPMServer& aServer ) + : iMyServer( aServer ), + iDiscardAvailabilityNotification( EFalse ) + { + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::~CMPMConnMonEvents +// ----------------------------------------------------------------------------- +// +CMPMConnMonEvents::~CMPMConnMonEvents() + { + iConnMon.CancelNotifications(); + iConnMon.Close(); + iReqPtrs.ResetAndDestroy(); + iConnInfoArray.Close(); + delete iWlanAvailability; + iWlanAvailability = NULL; + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::ConstructL +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::ConstructL( CMPMServerSession& aSession ) + { + MPMLOGSTRING( "CMPMConnMonEvents::ConstructL" ) + // Connect to Connection Monitor + // + TInt rv = iConnMon.ConnectL(); + if ( rv != KErrNone ) + { + MPMLOGSTRING2( + "CMPMConnMonEvents::ConstructL error connecting to ConnMon %d", + rv ) + User::Leave( rv ); + } + + // Request for available IAPs + // + CMPMConnMonReqs* req = CMPMConnMonReqs::NewL( + *const_cast( this ), + iConnMon, + aSession.ConnectionId(), aSession ); + CleanupStack::PushL( req ); + iReqPtrs.AppendL( req ); + req->AvailableIapsSync(); + + UpdateIAPRefreshTime(); + + // Activate event notifications + // + iConnMon.NotifyEventL( *this ); + CleanupStack::Pop( req ); + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::RemoveReqPtr +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::RemoveReqPtr( const CMPMConnMonReqs* aReq ) + { + TInt index( KErrNotFound ); + + index = iReqPtrs.Find( aReq ); + if ( index != KErrNotFound ) + { + iReqPtrs.Remove( index ); + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::AppendConnInfo +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::AppendConnInfo( const TUint& aConnId ) + { + TInt index( KErrNotFound ); + TConnInfo info; + + info.iConnId = aConnId; + index = iConnInfoArray.Find( info ); + + if ( index == KErrNotFound ) + { + iConnInfoArray.Append( info ); + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::RemoveConnInfo +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::RemoveConnInfo( const TUint& aConnId ) + { + TInt index( KErrNotFound ); + TConnInfo info; + + info.iConnId = aConnId; + index = iConnInfoArray.Find( info ); + + if ( ( index != KErrNotFound ) && ( index < iConnInfoArray.Count() ) ) + { + iConnInfoArray.Remove( index ); + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::SetConnInfo +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::SetConnInfo( const TUint& aConnId, + const TUint& aIapId, + const TUint& aPresumedIapId, + const TUint& aNetId, + const TDesC& aAPN ) + { + TInt index( KErrNotFound ); + TConnInfo info; + + info.iConnId = aConnId; + index = iConnInfoArray.Find( info ); + + if ( ( index != KErrNotFound ) && ( index < iConnInfoArray.Count() ) ) + { + MPMLOGSTRING3( + "CMPMConnMonEvents::SetConnInfo - aConnId = 0x%x, APN = %S", + aConnId, &aAPN ) + iConnInfoArray[index].iIapId = TUint32( aIapId ); + iConnInfoArray[index].iNetId = TUint32( aNetId ); + iConnInfoArray[index].iAPN.Copy( aAPN ); + iConnInfoArray[index].iSSID.FillZ(); + iConnInfoArray[index].iSSID.Zero(); + iConnInfoArray[index].iPresumedIapId = TUint32( aPresumedIapId ); + iConnInfoArray[index].iConnType = EConnectionGPRS; + } + else + { + MPMLOGSTRING2( + "CMPMConnMonEvents::SetConnInfo - aConnId = 0x%x not found", + aConnId ) + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::SetConnInfo +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::SetConnInfo( const TUint& aConnId, + const TUint& aIapId, + const TUint& aPresumedIapId, + const TUint& aNetId, + const TWlanSsid& aSSID ) + { + TInt index( KErrNotFound ); + TConnInfo info; + + info.iConnId = aConnId; + index = iConnInfoArray.Find( info ); + + if ( ( index != KErrNotFound ) && ( index < iConnInfoArray.Count() ) ) + { + MPMLOGSSID( + "CMPMConnMonEvents::SetConnInfo - aConnId = 0x%x, SSID = %S", + aConnId, &aSSID ) + + iConnInfoArray[index].iIapId = TUint32( aIapId ); + iConnInfoArray[index].iNetId = TUint32( aNetId ); + iConnInfoArray[index].iAPN.FillZ(); + iConnInfoArray[index].iAPN.Zero(); + iConnInfoArray[index].iSSID.Copy( aSSID ); + iConnInfoArray[index].iPresumedIapId = TUint32( aPresumedIapId ); + iConnInfoArray[index].iConnType = EConnectionWLAN; + } + else + { + MPMLOGSTRING2( + "CMPMConnMonEvents::SetConnInfo - aConnId = 0x%x not found", + aConnId ) + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::SetConnInfoIapSsid +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::SetConnInfoIapSsid( const TUint& aIapId, + const TWlanSsid& aSSID ) + { + + for ( TInt i( 0 ); ( i < iConnInfoArray.Count() ); i++ ) + { + if ( iConnInfoArray[i].iIapId == aIapId ) + { + iConnInfoArray[i].iSSID.Copy( aSSID ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::ResetConnInfo +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::ResetConnInfo( const TUint& aConnId ) + { + TInt index( KErrNotFound ); + TConnInfo info; + + info.iConnId = aConnId; + index = iConnInfoArray.Find( info ); + + if ( ( index != KErrNotFound ) && ( index < iConnInfoArray.Count() ) ) + { + MPMLOGSTRING2( + "CMPMConnMonEvents::ResetConnInfo - aConnId = 0x%x reset", + aConnId ) + iConnInfoArray[index].iIapId = 0; + iConnInfoArray[index].iNetId = 0; + iConnInfoArray[index].iPresumedIapId = 0; + iConnInfoArray[index].iAPN.FillZ(); + iConnInfoArray[index].iAPN.Zero(); + iConnInfoArray[index].iSSID.FillZ(); + iConnInfoArray[index].iSSID.Zero(); + iConnInfoArray[index].iConnType = EConnectionGeneric; + } + else + { + MPMLOGSTRING2( + "CMPMConnMonEvents::ResetConnInfo - aConnId = 0x%x not found", + aConnId ) + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::ResetIapConnInfo +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::ResetIapConnInfo( const TUint32 aIapId ) + { + + // Reset all connections using aIapId + // + for ( TInt index( 0 ); ( index < iConnInfoArray.Count() ); index++ ) + { + if ( iConnInfoArray[index].iIapId == aIapId ) + { + MPMLOGSTRING2( + "CMPMConnMonEvents::ResetIapConnInfo - ConnId = 0x%x reset", + iConnInfoArray[index].iConnId ) + iConnInfoArray[index].iIapId = 0; + iConnInfoArray[index].iNetId = 0; + iConnInfoArray[index].iPresumedIapId = 0; + iConnInfoArray[index].iAPN.FillZ(); + iConnInfoArray[index].iAPN.Zero(); + iConnInfoArray[index].iSSID.FillZ(); + iConnInfoArray[index].iSSID.Zero(); + iConnInfoArray[index].iConnType = EConnectionGeneric; + } + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::GetAvailableIAPs +// ----------------------------------------------------------------------------- +// +const TConnMonIapInfo& CMPMConnMonEvents::GetAvailableIAPs() + { + return iAvailableIAPs; + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::SetAvailableIAPs +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::SetAvailableIAPs( + const TConnMonIapInfo& aAvailableIAPs ) + { + iAvailableIAPs = aAvailableIAPs; + + UpdateIAPRefreshTime(); + + MPMLOGSTRING2( "CMPMConnMonEvents::SetAvailableIAPs - IAPs count: %d", + iAvailableIAPs.Count() ) + +#ifdef _DEBUG + for ( TUint i = 0; i < iAvailableIAPs.Count(); i++ ) + { + MPMLOGSTRING2( "CMPMConnMonEvents::SetAvailableIAPs - IAP: %d", + iAvailableIAPs.iIap[i].iIapId) + } +#endif // _DEBUG + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::FindAPN +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::FindAPN( const TDesC& aDes, + TUint32& aIapId, + TUint32& aNetId ) + { + TBool apnFound( EFalse ); + + for ( TInt i( 0 ); ( (i < iConnInfoArray.Count()) && !apnFound ); i++ ) + { + if ( ( aDes.Compare( iConnInfoArray[i].iAPN ) == KErrNone ) && + ( iConnInfoArray[i].iConnType == EConnectionGPRS ) ) + { + aIapId = iConnInfoArray[i].iIapId; + aNetId = iConnInfoArray[i].iNetId; + MPMLOGSTRING2( "CMPMConnMonEvents::FindAPN found Iap Id: %i", + aIapId) + MPMLOGSTRING2( "CMPMConnMonEvents::FindAPN found Net Id: %i", + aNetId) + apnFound = ETrue; + } + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::FindSSID +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::FindSSID( const TWlanSsid& aSSID, + TUint32& aIapId, + TUint32& aNetId ) + { + TBool ssidFound( EFalse ); + + for ( TInt i( 0 ); ( (i < iConnInfoArray.Count()) && !ssidFound ); i++ ) + { + if ( ( aSSID.Compare( iConnInfoArray[i].iSSID ) == KErrNone ) && + ( iConnInfoArray[i].iConnType == EConnectionWLAN ) ) + { + aIapId = iConnInfoArray[i].iIapId; + aNetId = iConnInfoArray[i].iNetId; + MPMLOGSTRING2( "CMPMConnMonEvents::FindSSID found Iap Id: %i", + aIapId) + MPMLOGSTRING2( "CMPMConnMonEvents::FindSSID found Net Id: %i", + aNetId) + ssidFound = ETrue; + } + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::ActiveWlanConnection +// ----------------------------------------------------------------------------- +// +TBool CMPMConnMonEvents::ActiveWlanConnection( TWlanSsid& aSSID, + TUint32& aIapId ) + { + TWlanSsid emptySSID; + TBool activeWlanFound( EFalse ); + + emptySSID.FillZ(); + emptySSID.Zero(); + + for ( TInt i( 0 ); ( (i < iConnInfoArray.Count()) && !activeWlanFound ); + i++ ) + { + if ( emptySSID.Compare( iConnInfoArray[i].iSSID ) != KErrNone ) + { + // Cross check that a started connection with the wlan IAP + // is found from ActiveBMConnections + // + TUint32 connIap = iMyServer.GetBMIap( iConnInfoArray[i].iConnId ); + TConnectionState connState; + iMyServer.GetConnectionState( iConnInfoArray[i].iConnId, connState ); + if( connIap == iConnInfoArray[i].iIapId && + connState == EStarted ) + { + aSSID.Copy( iConnInfoArray[i].iSSID ); + aIapId = iConnInfoArray[i].iIapId; + activeWlanFound = ETrue; + + MPMLOGSSID( "CMPMConnMonEvents::ActiveWlanConnection found\ + ConnId = 0x%x, SSID = %S", iConnInfoArray[i].iConnId, &aSSID ) + + MPMLOGSTRING2( + "CMPMConnMonEvents::ActiveWlanConnection found Iap Id: %i", + iConnInfoArray[i].iIapId ) + } + else + { + MPMLOGSSID( "CMPMConnMonEvents::ActiveWlanConnection found\ + but connection not in started state ConnId = 0x%x, SSID = %S", + iConnInfoArray[i].iConnId, &aSSID ) + } + } + } + return activeWlanFound; + } + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::IapAvailabilityChange +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::IapAvailabilityChange() + { + if ( ( iAvailableIAPs.Count() > 0 ) && + !DiscardAvailabilityNotification() ) + { + // Remove temporary blacklistings as fresh availability + // info is available. + // + iMyServer.HandleServerUnblackListIap( ETemporary ); + + // Send preferred IAP notifications, but DO NOT LEAVE + // or Connection Monitor CConnMonEventHandler::RunL() + // will also leave, which will make mpmserver.exe CRASH. + // + TRAP_IGNORE( iMyServer.NotifyBMPrefIapL( iAvailableIAPs ) ) + } + else + { + MPMLOGSTRING2( "CMPMConnMonEvents::EventL - IAPs count: %d", + iAvailableIAPs.Count() ) + MPMLOGSTRING2( + "CMPMConnMonEvents::EventL - DiscardAvailabilityNotification = %d", + DiscardAvailabilityNotification() ) + } + } + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::EventL +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::EventL( const CConnMonEventBase& aConnMonEvent ) + { + MPMLOGSTRING2( "CMPMConnMonEvents::EventL %d", aConnMonEvent.EventType()) + + switch ( aConnMonEvent.EventType() ) + { + case EConnMonCreateConnection: + { + MPMLOGSTRING( " EConnMonCreateConnection" ) + iMyServer.IncrementConnections(); + break; + } + case EConnMonDeleteConnection: + { + MPMLOGSTRING( " EConnMonDeleteConnection" ) + iMyServer.DecrementConnections(); + break; + } + case EConnMonIapAvailabilityChange: + { +#ifdef __DEBUG + if ( iFilterEvents == ETrue ) + { + MPMLOGSTRING( " EConnMonIapAvailabilityChange FILTERED OUT" ) + return; + } +#endif //__DEBUG + // IAP Availability has changed + // + MPMLOGSTRING( " EConnMonIapAvailabilityChange" ) + + const CConnMonIapAvailabilityChange* eventIap; + + // Following line is correct, even though + // PC-Lint claims that here is a problem: + // + // Suspicious pointer-to-pointer conversion (area too small) + // + eventIap = static_cast( + &aConnMonEvent ); + + iAvailableIAPs = eventIap->IapAvailability(); + UpdateIAPRefreshTime(); + IapAvailabilityChange(); + + TRAPD( err, iMyServer.UpdateSessionConnectionDlgL() ) + if( err != KErrNone ) + { + MPMLOGSTRING2( "CMPMConnMonEvents::EventL UpdateSessionConnectionDlgL \ +error code %d", err ) + } + break; + } + default: + { + MPMLOGSTRING( "CMPMConnMonEvents::RunL: default" ) + break; + } + } + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::ScanWLANNetworksL +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::ScanWLANNetworksL( CMPMServerSession* aSession, + const TConnectionId& aId, + TWlanScanCallback aCallback, + TInt aForceRefreshIntervalSeconds ) + { + MPMLOGSTRING( "CMPMConnMonEvents::ScanWLANNetworksL" ) + // Sanity check null pointer + ASSERT( aSession != NULL + || aCallback == EWlanScanCallbackNone + || aCallback == EWlanScanCallbackGenerateEvent ); + // Request for available WLAN Networks + // + CMPMConnMonReqs* req = CMPMConnMonReqs::NewL( + *const_cast( this ), + iConnMon, + aId, + *aSession ); + CleanupStack::PushL( req ); + iReqPtrs.AppendL( req ); + req->RefreshAvailableIAPs( aCallback, aForceRefreshIntervalSeconds ); + CleanupStack::Pop( req ); + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::CancelScanL +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::CancelScanL( CMPMServerSession& aSession ) + { + MPMLOGSTRING( "CMPMConnMonEvents::CancelScanL" ) + + // Disable discarding availability notifications from Connection Monitor. + // + DisableDiscarding(); + + CMPMConnMonReqs* req = CMPMConnMonReqs::NewL( + *const_cast( this ), + iConnMon, + aSession.ConnectionId(), + aSession ); + // Delete ongoing req, if found + TInt index = iReqPtrs.Find(req, CMPMConnMonReqs::CompareConnIds); + if (index != KErrNotFound) + { + // Instead of delete iReqPtrs[index] + // We just mark it as obsolete. + iReqPtrs[index]->MyCancel(); + // And we can remove the index as the request will handle the deletion. + iReqPtrs.Remove(index); + } + // Finally delete the temporary object. + delete req; + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::PresumedIapId +// ----------------------------------------------------------------------------- +// +TUint32 CMPMConnMonEvents::PresumedIapId( const TUint& aConnId, + const TUint& aIapId ) + { + + for ( TInt i( 0 ); ( i < iConnInfoArray.Count() ); i++ ) + { + if ( iConnInfoArray[i].iConnId == aConnId && + iConnInfoArray[i].iIapId == aIapId ) + { + if ( iConnInfoArray[i].iPresumedIapId == 0 ) + { + // Iap Id zero is not a valid Iap Id + // + return aIapId; + } + else + { + MPMLOGSTRING2( + "CMPMConnMonEvents::PresumedIapId found Iap: %i", + iConnInfoArray[i].iPresumedIapId ) + + return iConnInfoArray[i].iPresumedIapId; + } + } + } + + // PresumedIapId returns aIapId in case no presumed IAP info is found. + // + return aIapId; + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::UpdateIAPRefreshTime +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::UpdateIAPRefreshTime() + { + iLastIAPRefreshTime.UniversalTime(); + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::GetIAPRefreshTime +// ----------------------------------------------------------------------------- +// +TTime& CMPMConnMonEvents::GetIAPRefreshTime() + { + return iLastIAPRefreshTime; + } + + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::SetConnectionCounter +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::SetConnectionCounter( const TUint aValue ) + { + iMyServer.SetConnectionCounter( aValue ); + } + + +// ----------------------------------------------------------------------------- +// TConnInfo::TConnInfo +// ----------------------------------------------------------------------------- +// +TConnInfo::TConnInfo() + : iConnId( 0 ), + iIapId( 0 ), + iPresumedIapId( 0 ), + iNetId( 0 ), + iAPN(), + iSSID(), + iConnType( EConnectionGeneric ) + { + } + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::CheckWlanAvailabilityL +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::CheckWlanAvailabilityL( MWlanAvailability* aObserver ) + { + MPMLOGSTRING( "CMPMConnMonEvents::CheckWlanAvailabilityL" ) + // Sanity check null pointer + ASSERT( aObserver != NULL ); + + // Request for WLAN bearer availability info + // + if ( !iWlanAvailability ) + { + iWlanAvailability = CWlanAvailability::NewL( this, iConnMon ); + } + + iWlanAvailability->Start( aObserver ); + } + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::CancelCheckWlanWlanAvailability +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::CancelCheckWlanWlanAvailability( MWlanAvailability* aObserver ) + { + MPMLOGSTRING( "CMPMConnMonEvents::CancelCheckWlanWlanAvailability" ) + // Sanity check null pointer + ASSERT( aObserver != NULL ); + + // Cancel WLAN bearer availability check for this observer + // + if ( iWlanAvailability ) + { + iWlanAvailability->CancelObserver( aObserver ); + } + } + +// ----------------------------------------------------------------------------- +// CMPMConnMonEvents::SetWlanAvailabilityPtrNull +// ----------------------------------------------------------------------------- +// +void CMPMConnMonEvents::SetWlanAvailabilityPtrNull() + { + iWlanAvailability = NULL; + } + +// End of File +