diff -r b852595f5cbe -r 63be7eb3fc78 wlanutilities/wlansniffer/engine/server/src/wsfengine.cpp --- a/wlanutilities/wlansniffer/engine/server/src/wsfengine.cpp Thu Aug 19 10:59:40 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,749 +0,0 @@ -/* -* Copyright (c) 2007-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: Implementation of CWsfEngine -* -*/ - - - -// EXTERNAL INCLUDES -#include -#include -#include -#include - -// CLASS HEADER -#include "wsfengine.h" - - -// INTERNAL INCLUDES -#include "wsfwlanscanner.h" -#include "wsfwlansettingsaccessor.h" -#include "wsfwlanbearerconnectionmonitor.h" -#include "wsfengineobserver.h" -#include "wsfservercloseradapter.h" -#include "wsfactivewaiter.h" - -#include "wsflogger.h" - - - -// LOCAL DEFINITIONS -using namespace CommsDat; - - -/** -* Maximum number of retries when trying to delete a temporary IAP but -* the connection is locking it -*/ -static const TInt KMaxIapDeletionRetries = 10; - - -/** -* Time to wait betweed two IAP deletion retries, in microseconds -*/ -static const TUint KDelayBetweenDeletionRetries = 500 * 1000; - - - - - -// CONSTRUCTION AND DESTRUCTION - -// ---------------------------------------------------------------------------- -// CWsfEngine::NewL -// ---------------------------------------------------------------------------- -// -CWsfEngine* CWsfEngine::NewL( MWsfServerCloserAdapter& aServerCloser ) - { - CWsfEngine* self = CWsfEngine::NewLC( aServerCloser ); - CleanupStack::Pop( self ); - return self; - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::NewLC -// ---------------------------------------------------------------------------- -// -CWsfEngine* CWsfEngine::NewLC( MWsfServerCloserAdapter& aServerCloser ) - { - CWsfEngine* self = new ( ELeave ) CWsfEngine( aServerCloser ); - CleanupStack::PushL( self ); - self->ConstructL(); - return self; - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::~CWsfEngine -// ---------------------------------------------------------------------------- -// -CWsfEngine::~CWsfEngine() - { - LOG_ENTERFN( "CWsfEngine::~CWsfEngine" ); - - delete iWlanBearerMonitor; - delete iScanner; - delete iDbSession; - iObservers.Reset(); - - if ( iMonitoredIap && - ( iIapPersistence == EIapExpireOnDisconnect || - iIapPersistence == EIapNestedExpireOnDisconnect || - iIapPersistence == EIapExpireOnBrowserExit || - iIapPersistence == EIapExpireOnShutdown ) ) - { - TRAP_IGNORE( DeleteIapL( iMonitoredIap ) ); - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::CWsfEngine -// ---------------------------------------------------------------------------- -// -CWsfEngine::CWsfEngine( MWsfServerCloserAdapter& aServerCloser ): - iServerCloser( aServerCloser ), - iEnableScanning( 0 ), - iIapPersistence( EIapDeleted ) - { - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::ConstructL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::ConstructL() - { - LOG_CREATE; - LOG_ENTERFN( "CWsfEngine::ConstructL" ); - iDbSession = CMDBSession::NewL( CMDBSession::LatestVersion() ); - iScanner = CWsfWlanScanner::NewL( *iDbSession ); - - iScanner->SetObserver( *this ); - - iWlanBearerMonitor = CWsfWlanBearerConnectionMonitor::NewL( iServerCloser ); - iScanner->SetConnectionDetailProvider( *iWlanBearerMonitor ); - - iWlanBearerMonitor->StartMonitoringL( this ); - - if ( iWlanBearerMonitor->GetWlanBearerNameL() != KNullDesC() ) - { - HBufC* name = ConnectedWlanSsidL(); - CleanupStack::PushL( name ); - iScanner->ConnectionEstablishedL( *name ); - CleanupStack::PopAndDestroy( name ); - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::AttachL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::AttachL( MWsfEngineObserver* aObserver ) - { - LOG_ENTERFN( "CWsfEngine::AttachL" ); - - iObservers.AppendL( aObserver ); - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::Detach -// ---------------------------------------------------------------------------- -// -void CWsfEngine::Detach( MWsfEngineObserver* aObserver ) - { - LOG_ENTERFN( "CWsfEngine::Detach" ); - TInt index = iObservers.Find( aObserver ); - if ( index != KErrNotFound ) - { - iObservers.Remove( index ); - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::GetScanResults -// ---------------------------------------------------------------------------- -// -HBufC8* CWsfEngine::GetScanResults() - { - LOG_ENTERFN( "CWsfEngine::GetScanResults" ); - return iScanner->ScanResults(); - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::EnableScanningL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::EnableScanningL() - { - LOG_ENTERFN( "CWsfEngine::EnableScanningL" ); - - iEnableScanning++; - LOG_WRITEF( "++iEnableScanning = %d", iEnableScanning ); - - if ( iEnableScanning == 1 ) - { - LOG_WRITE( "CWsfEngine::EnableScanningL - start scanner" ); - if ( !iScanner->IsActive() ) - { - iScanner->StartScanningL(); - } - LOG_WRITE( "CWsfEngine::EnableScanningL start scanner done" ); - for ( TInt i( 0 ); i< iObservers.Count(); ++i ) - { - (iObservers[i])->ScanEnabledL(); - } - } - else - { - // the scanning is already active - stop and reactivate to complete the - // new monitor in sensible time - if ( iScanner->IsActive() ) - { - iScanner->StopScanning(); - } - iScanner->StartScanningL(); - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::IsScanning -// ---------------------------------------------------------------------------- -// -TBool CWsfEngine::IsScanning() - { - return iEnableScanning; - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::RefreshScanResults -// ---------------------------------------------------------------------------- -// -TBool CWsfEngine::RefreshScanResults() - { - LOG_ENTERFN( "CWsfEngine::RefreshScanResults" ); - return iScanner->RestartScanning(); - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::MonitorAccessPointL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::MonitorAccessPointL( TUint32 aIapId ) - { - LOG_ENTERFN( "CWsfEngine::MonitorAccessPointL" ); - - iMonitoredIap = aIapId; - - if ( iIapPersistence == EIapExpireOnShutdown ) - { - // web browsing with a temporary IAP - LOG_WRITE( "EIapExpireOnShutdown => EIapExpireOnBrowserExit" ); - SetIapPersistenceL( EIapExpireOnBrowserExit ); - iServerCloser.WaitForBrowserExit( ETrue ); - - // semaphore to keep the order of calls - iSuppressIapDeletion = ETrue; - } - else if ( iIapPersistence == EIapExpireOnDisconnect ) - { - LOG_WRITE( "EIapExpireOnDisconnect => EIapNestedExpireOnDisconnect" ); - SetIapPersistenceL( EIapNestedExpireOnDisconnect ); - } - - - LOG_WRITEF( "iMonitoredIap = %d", iMonitoredIap ); - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::DisableScanningL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::DisableScanningL() - { - LOG_ENTERFN( "CWsfEngine::DisableScanningL" ); - - iEnableScanning--; - LOG_WRITEF( "--iEnableScanning = %d", iEnableScanning ); - - if ( !iEnableScanning ) - { - LOG_WRITE( "CWsfEngine::DisableScanning stop scanner" ); - - iScanner->StopScanning(); - LOG_WRITE( "CWsfEngine::DisableScanning stopped scanner" ); - - for ( TInt i( 0 ); i < iObservers.Count(); ++i ) - { - (iObservers[i])->ScanDisabledL(); - } - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::ConnectedWlanSsidL -// ---------------------------------------------------------------------------- -// -HBufC* CWsfEngine::ConnectedWlanSsidL() - { - LOG_ENTERFN( "CWsfEngine::ConnectedWlanIapNameL" ); - return iWlanBearerMonitor->GetWlanBearerNameL().AllocL(); - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::ConnectedWlanConnectionDetailsL -// ---------------------------------------------------------------------------- -// -TBool CWsfEngine::ConnectedWlanConnectionDetailsL( TWsfWlanInfo& aWlanInfo ) - { - LOG_ENTERFN( "CWsfEngine::ConnectedWlanConnectionDetailsL" ); - return iWlanBearerMonitor->ConnectedWlanConnectionDetailsL( &aWlanInfo ); - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::WlanScanCompleteL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::WlanScanCompleteL() - { - LOG_ENTERFN( "CWsfEngine::WlanScanCompleteL" ); - - for ( TInt i( 0 ); i < iObservers.Count(); ++i ) - { - (iObservers[i])->WlanListChangedL(); - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::WlanScanStarted -// ---------------------------------------------------------------------------- -// -void CWsfEngine::WlanScanStarted() - { - LOG_ENTERFN( "CWsfEngine::WlanScanStarted" ); - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::NotifyError -// ---------------------------------------------------------------------------- -// -void CWsfEngine::NotifyError( TInt aError ) - { - LOG_ENTERFN( "CWsfEngine::NotifyError" ); - - for ( TInt i( 0 ); i < iObservers.Count(); ++i ) - { - TRAP_IGNORE( (iObservers)[i]->NotifyErrorL( aError ) ); - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::ConnectionEstablishedL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::ConnectionEstablishedL( const TDesC& aConnectionName ) - { - LOG_ENTERFN( "CWsfEngine::ConnectionEstablishedL" ); - // set the scanner to check connected accounts - iScanner->ConnectionEstablishedL( aConnectionName ); - - iScanner->RestartScanning(); - - // notify the observers - for ( TInt i( 0 ); i < iObservers.Count(); ++i ) - { - (iObservers)[i]->ConnectedL(); - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::ConnectionLostL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::ConnectionLostL() - { - LOG_ENTERFN( "CWsfEngine::ConnectionLostL" ); - - // check temporarity here as well since it is not guaranteed that - // the connection was owned and ConnectedIapReleasedL was called - if ( iSuppressIapDeletion ) - { - // web browsing with a temporary IAP - LOG_WRITE( "IAP deletion suppressed" ); - iSuppressIapDeletion = EFalse; - } - else if ( iMonitoredIap ) - { - if ( iIapPersistence == EIapExpireOnDisconnect || - iIapPersistence == EIapExpireOnBrowserExit ) - { - DeleteIapL( iMonitoredIap ); - iIapPersistence = EIapDeleted; - iMonitoredIap = 0; - } - else if ( iIapPersistence == EIapNestedExpireOnDisconnect ) - { - iIapPersistence = EIapExpireOnBrowserExit; - } - } - - iScanner->ConnectionLostL(); - iScanner->RestartScanning(); - - // notify the observers - for ( TInt i( 0 ); i < iObservers.Count(); ++i ) - { - (iObservers)[i]->DisconnectedL(); - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::ConnectingFailedL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::ConnectingFailedL( TInt aError ) - { - LOG_ENTERFN( "CWsfEngine::ConnectingFailedL" ); - - for ( TInt i( 0 ); i < iObservers.Count(); ++i ) - { - (iObservers)[i]->ConnectingFailedL( aError ); - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::ConnectedIapReleasedL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::ConnectedIapReleasedL() - { - LOG_ENTERFN( "CWsfEngine::ConnectedIapReleasedL" ); - - // deleting temporary IAP if necessary - if ( !iSuppressIapDeletion && iMonitoredIap ) - { - if ( iIapPersistence == EIapExpireOnDisconnect || - iIapPersistence == EIapExpireOnBrowserExit ) - { - DeleteIapL( iMonitoredIap ); - iIapPersistence = EIapDeleted; - iMonitoredIap = 0; - } - else if ( iIapPersistence == EIapNestedExpireOnDisconnect ) - { - iIapPersistence = EIapExpireOnBrowserExit; - iSuppressIapDeletion = ETrue; - } - } - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::DeleteIapL -// ---------------------------------------------------------------------------- -// -void CWsfEngine::DeleteIapL( TUint32 aIapId ) - { - LOG_ENTERFN( "CWsfEngine::DeleteIapL" ); - - LOG_WRITEF( "deleting temporary IAP id = %d", aIapId ); - RCmManagerExt cmMgr; - cmMgr.OpenLC(); - - RArray cmIds; - CleanupClosePushL( cmIds ); - cmMgr.ConnectionMethodL( cmIds, ETrue, ETrue, EFalse ); - TBool foundFromUncategorized = EFalse; - - for ( TInt k = 0; k < cmIds.Count(); k++ ) - { - RCmConnectionMethodExt cm; - TRAPD( error, cm = cmMgr.ConnectionMethodL( cmIds[k] ) ); - if ( KErrNone == error ) - { - CleanupClosePushL( cm ); - - TUint iapId = cm.GetIntAttributeL( CMManager::ECmIapId ); - if ( iapId == aIapId ) - { - LOG_WRITE( "IAP is uncategorized" ); - foundFromUncategorized = ETrue; - } - CleanupStack::PopAndDestroy( &cm ); - } - } - - CleanupStack::PopAndDestroy( &cmIds ); - - if ( !foundFromUncategorized ) - { - LOG_WRITE( "Not deleting IAP since it is in SNAP" ); - CleanupStack::PopAndDestroy( &cmMgr ); - return; - } - - RCmConnectionMethodExt ictCm = cmMgr.ConnectionMethodL( aIapId ); - CleanupClosePushL( ictCm ); - - CWsfActiveWaiter* waiter = CWsfActiveWaiter::NewLC(); - - RTimer timer; - timer.CreateLocal(); - - // trying to delete the temporary IAP - // sometimes the RConnection is still locking the IAP when - // we want to delete it, so we might have to try a couple of times - TInt counter( KMaxIapDeletionRetries ); - TInt err( KErrNone ); - - while ( counter ) - { - LOG_WRITEF( "trying to delete (#%d)", - KMaxIapDeletionRetries - counter ); - - TRAP( err, ictCm.DeleteL() ); - - if ( !err || err == KErrNotFound ) - { - // if success or the IAP was not found (strange but happens), break - break; - } - - --counter; - if ( err && counter ) - { - LOG_WRITEF( "deletion failed with error = %d", err ); - LOG_WRITE( "RConnection is still locking the IAP, waiting..." ); - - timer.After( waiter->iStatus, TTimeIntervalMicroSeconds32( - KDelayBetweenDeletionRetries ) ); - waiter->WaitForRequest(); - } - } - - - timer.Close(); - CleanupStack::PopAndDestroy( waiter ); - - if ( !err ) - { - LOG_WRITE( "IAP deleted." ); - } - else - { - LOG_WRITE( "IAP couldn't be deleted!" ); - } - - CleanupStack::PopAndDestroy( &ictCm ); - CleanupStack::PopAndDestroy( &cmMgr ); - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::ConnectWlanL -// ---------------------------------------------------------------------------- -// -TInt CWsfEngine::ConnectWlanL( TUint32 aIapId, - TBool aConnectOnly, - TWsfIapPersistence aPersistence ) - { - LOG_ENTERFN( "CWsfEngine::ConnectWlanL" ); - LOG_WRITEF( "iapId = %d, persistence = %d", aIapId, aPersistence ); - - // if we have already been monitoring an IAP (different from the - // new one), clean that one up properly - if ( iMonitoredIap && iIapPersistence == EIapExpireOnBrowserExit ) - { - // user switched back from browser to sniffer and issued connect - if ( iMonitoredIap != aIapId ) - { - // selected network is different, so we must clean up the old one - DeleteIapL( iMonitoredIap ); - iIapPersistence = EIapDeleted; - iMonitoredIap = 0; - } - else if ( iMonitoredIap == aIapId ) - { - // selected networks are the same - aPersistence = EIapNestedExpireOnDisconnect; - } - iSuppressIapDeletion = EFalse; - } - - TInt ret = iWlanBearerMonitor->ConnectBearer( aIapId, - aConnectOnly, - aPersistence != EIapPersistent ); - - if ( !ret ) - { - // successfully initiated connection - LOG_WRITE( "connection init succeded" ); - iMonitoredIap = aIapId; - SetIapPersistenceL( aPersistence ); - } - - return ret; - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::DisconnectWlan -// ---------------------------------------------------------------------------- -// -TBool CWsfEngine::DisconnectWlan() - { - LOG_ENTERFN( "CWsfEngine::DisconnectWlan" ); - return iWlanBearerMonitor->DisconnectBearer(); - } - - -// ---------------------------------------------------------------------------- -// CWsfEngine::IsConnected -// ---------------------------------------------------------------------------- -// -TBool CWsfEngine::IsConnected() - { - return iWlanBearerMonitor->IsConnected(); - } - - -// --------------------------------------------------------------------------- -// CWsfEngine::AbortConnectingL -// --------------------------------------------------------------------------- -// -void CWsfEngine::AbortConnectingL() - { - LOG_ENTERFN("CWsfEngine::AbortConnectingL"); - - TInt result = iWlanBearerMonitor->AbortConnecting(); - - LOG_WRITEF( "abort connection result = %d", result ); - - if ( result == KErrNone && iMonitoredIap ) - { - if ( iIapPersistence == EIapExpireOnDisconnect ) - { - LOG_WRITE( "EIapNestedExpireOnDisconnect => EIapDeleted" ); - DeleteIapL( iMonitoredIap ); - iIapPersistence = EIapDeleted; - iMonitoredIap = 0; - } - else if ( iIapPersistence == EIapNestedExpireOnDisconnect ) - { - LOG_WRITE( "EIapNestedExpireOnDisconnect => " - L"EIapExpireOnBrowserExit" ); - iIapPersistence = EIapExpireOnBrowserExit; - } - } - else if ( result != KErrNone ) - { - LOG_WRITE( "abort connection did not stopped connection" ); - // Try to disconnect via normal disconnect if engine is - // connected and and there is connection id - DisconnectWlan(); - } - } - - -// --------------------------------------------------------------------------- -// CWsfEngine::AbortScanning -// --------------------------------------------------------------------------- -// -void CWsfEngine::AbortScanning() - { - LOG_ENTERFN("CWsfEngine::AbortScanning"); - - iScanner->AbortScanning(); - } - - -// --------------------------------------------------------------------------- -// CWsfEngine::SetIapPersistenceL -// --------------------------------------------------------------------------- -// -TBool CWsfEngine::SetIapPersistenceL( TWsfIapPersistence aPersistence ) - { - LOG_ENTERFN("CWsfEngine::SetIapPersistenceL"); - if ( aPersistence == EIapForcedExpiry ) - { - if ( iMonitoredIap && - ( iIapPersistence == EIapExpireOnBrowserExit || - iIapPersistence == EIapExpireOnShutdown ) ) - { - LOG_WRITE( "forced IAP expiry" ); - DeleteIapL( iMonitoredIap ); - iIapPersistence = EIapDeleted; - iMonitoredIap = 0; - } - else if ( iIapPersistence == EIapNestedExpireOnDisconnect ) - { - LOG_WRITE( "reverting to EIapExpireOnDisconnect" ); - iIapPersistence = EIapExpireOnDisconnect; - } - - iServerCloser.WaitForBrowserExit( EFalse ); - } - else - { - LOG_WRITEF( "persistence = %d", aPersistence ); - iIapPersistence = aPersistence; - } - - return ( iMonitoredIap ); - } - - -// --------------------------------------------------------------------------- -// CWsfEngine::ControlDisconnectTimer -// --------------------------------------------------------------------------- -// -TBool CWsfEngine::ControlDisconnectTimer( TUint aAdcCommand ) - { - LOG_ENTERFN("CWsfEngine::ControlDisconnectTimer"); - - return iWlanBearerMonitor->ControlDisconnectTimer( aAdcCommand ); - } - -// --------------------------------------------------------------------------- -// CWsfEngine::ResetSuppressIapDeletion -// --------------------------------------------------------------------------- -// -void CWsfEngine::ResetSuppressIapDeletion() - { - LOG_ENTERFN( "CWsfEngine::ResetSuppresIapDeletion" ); - - iSuppressIapDeletion = EFalse; - } - -// End of file