--- 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 <commsdattypesv1_1.h>
-#include <commsdat.h>
-#include <cmconnectionmethodext.h>
-#include <cmpluginwlandef.h>
-
-// 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<TUint32> 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