diff -r 63be7eb3fc78 -r f28ada11abbf wlanutilities/wlansniffer/model/src/wsfmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlanutilities/wlansniffer/model/src/wsfmodel.cpp Wed Sep 01 12:20:32 2010 +0100 @@ -0,0 +1,787 @@ +/* +* 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 CWsfModel +* +*/ + + +// EXTERNAL INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// CLASS HEADER +#include "wsfmodel.h" + +// INTERNAL INCLUDES +#include "wsfwlaninfoarray.h" +#include "wsfwlaniapwizard.h" +#include "wsfapplauncher.h" +#include "wsfmodelobserver.h" +#include "wsfstatechangeobserver.h" +#include "wsfscreensaverwatcher.h" +#include "wsflogger.h" + +using namespace CMManager; + + +/** +* UID of helper application +* used when model is instantiated in the active idle +*/ +static const TUid KHelperApUid = { 0x10281CEB }; + +/** +* Estimated overhead for access point creation +*/ +const TInt KEstimatedOverhead = 8192; + + +// ---------------------------------------------------------------------------- +// CWsfModel::NewL +// ---------------------------------------------------------------------------- +// +EXPORT_C CWsfModel* CWsfModel::NewL( MWsfStateChangeObserver& aObserver, + const TBool aScreenSaverAware ) + { + CWsfModel* self = CWsfModel::NewLC( aObserver, aScreenSaverAware ); + CleanupStack::Pop( self ); + return self; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::NewLC +// ---------------------------------------------------------------------------- +// +EXPORT_C CWsfModel* CWsfModel::NewLC( MWsfStateChangeObserver& aObserver, + const TBool aScreenSaverAware ) + { + CWsfModel* self = new( ELeave ) CWsfModel; + CleanupStack::PushL( self ); + self->ConstructL( aObserver, aScreenSaverAware ); + return self; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::~CWsfModel +// ---------------------------------------------------------------------------- +// +EXPORT_C CWsfModel::~CWsfModel() + { + LOG_ENTERFN( "CWsfModel::~CWsfModel" ); + iSession.CancelNotifyEvent(); + iSession.Close(); + delete iScreenSaverWatcher; + delete iArray; + delete iObservedWlan; + delete iBrowserLauncher; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::CWsfModel +// ---------------------------------------------------------------------------- +// +CWsfModel::CWsfModel(): + iEikEnv( CEikonEnv::Static() ), + iRefreshing( EFalse ) + { + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::ConstructL +// ---------------------------------------------------------------------------- +// +void CWsfModel::ConstructL( MWsfStateChangeObserver& aObserver, + const TBool aScreenSaverAware ) + { + iArray = CWsfWlanInfoArray::NewL(); + iBrowserLauncher = CWsfAppLauncher::NewL(); + User::LeaveIfError( iSession.Connect() ); + iSession.NotifyEventL( aObserver ); + if ( aScreenSaverAware ) + { + iScreenSaverWatcher = CWsfScreenSaverWatcher::NewL( *this ); + } + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::SetEngineObserver +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::SetEngineObserver( MWsfModelObserver* aObserver ) + { + LOG_ENTERFN( "CWsfModel::SetEngineObserver" ); + iObserver = aObserver; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::GetWlanListL +// ---------------------------------------------------------------------------- +// +EXPORT_C CWsfWlanInfoArray* CWsfModel::GetWlanListL() + { + LOG_ENTERFN( "CWsfModel::GetWlanListL" ); + iArray->Reset(); + iSession.UpdateWlanListL( iArray ); + return iArray; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::GetWlanListSize +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::GetWlanListSize( TPckgBuf& aPckg, + TRequestStatus& aStatus ) + { + LOG_ENTERFN( "CWsfModel::GetWlanListSize" ); + iSession.GetWlanListSize( aPckg, aStatus ); + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::GetWlanList +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::GetWlanList( TPckgBuf& aPckg, TPtr8& aPtr, + TRequestStatus& aStatus ) + { + LOG_ENTERFN( "CWsfModel::GetWlanList" ); + iSession.GetWlanList( aPckg, aPtr, aStatus ); + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::SetActiveViewL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::SetActiveViewL( TInt aViewId ) + { + TUid id; + id.iUid = aViewId; + iActiveView = id; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::ActiveViewL +// ---------------------------------------------------------------------------- +// +EXPORT_C TUid CWsfModel::ActiveViewL() + { + return iActiveView; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::SetObservedWlanL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::SetObservedWlanL( const TDesC8& aSsid ) + { + HBufC8* ssid = aSsid.AllocL(); + delete iObservedWlan; + iObservedWlan = ssid; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::ObservedWlan +// ---------------------------------------------------------------------------- +// +EXPORT_C const TDesC8& CWsfModel::ObservedWlan() + { + return *iObservedWlan; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::ConnectL +// ---------------------------------------------------------------------------- +// +EXPORT_C int CWsfModel::ConnectL( TUint32 aIapId, TBool aConnectOnly, + TWsfIapPersistence aPersistence ) + { + LOG_ENTERFN( "CWsfModel::ConnectL" ); + + if ( iObserver ) + { + iObserver->ConnectingL( aIapId ); + } + + TInt err = iSession.ConnectWlanBearerL( aIapId, aConnectOnly, aPersistence ); + if ( err == KErrNone ) + { + iConnectedIapId = aIapId; + } + else + { + if ( iObserver ) + { + iObserver->BrowserLaunchFailed( err ); + } + } + + if ( iObserver ) + { + iObserver->ConnectingFinishedL( err ); + } + + iRefreshing = iSession.RequestScanL(); + + return err; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::ConnectL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::ConnectL( TPckgBuf& aPckg, TUint32 aIapId, + TBool aConnectOnly, + TWsfIapPersistence aPersistence, + TRequestStatus& aStatus ) + { + LOG_ENTERFN( "CWsfModel::ConnectL" ); + + if ( iObserver ) + { + iObserver->ConnectingL( aIapId ); + } + + iSession.ConnectWlanBearer( aPckg, aIapId, aConnectOnly, aPersistence, aStatus ); + } + +// ---------------------------------------------------------------------------- +// CWsfModel::SetConnectResultL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::SetConnectResultL( TInt aResult, TUint /*aIapId*/ ) + { + LOG_ENTERFN( "CWsfModel::SetConnectResultL" ); + + iSession.SetConnectWlanBearerResult( aResult ); + + if ( iObserver && aResult != KErrNone ) + { + iObserver->ConnectingFinishedL( aResult ); + } + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::DisconnectL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::DisconnectL() + { + LOG_ENTERFN( "CWsfModel::DisconnectL" ); + TBool disconnected = iSession.DisconnectWlanBearerL(); + LOG_WRITEF( "disconnected = %d", disconnected ); + iConnectedIapId = 0; + if ( !disconnected ) + { + iRefreshing = iSession.RequestScanL(); + } + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::Disconnect +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::Disconnect( TPckgBuf& aPckg, TRequestStatus& aStatus ) + { + LOG_ENTERFN( "CWsfModel::Disconnect" ); + iSession.DisconnectWlanBearer( aPckg, aStatus ); + iConnectedIapId = 0; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::Refreshing +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfModel::Refreshing() + { + return iRefreshing; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::SetRefreshState +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::SetRefreshState( TBool aRefreshing ) + { + iRefreshing = aRefreshing; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::EnableScanL +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfModel::EnableScanL() + { + LOG_ENTERFN( "CWsfModel::EnableScanL" ); + TBool enableScan( iSession.EnableScanL() ); + if ( iScreenSaverWatcher ) + { + iScreenSaverWatcher->Cancel(); + iScreenSaverWatcher->StartStatusScanning(); + } + return enableScan; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::DisableScanL +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfModel::DisableScanL() + { + LOG_ENTERFN( "CWsfModel::DisableScanL" ); + TBool disableScan( iSession.DisableScanL() ); + if ( iScreenSaverWatcher ) + { + iScreenSaverWatcher->Cancel(); + } + return disableScan; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::IsScanEnabledL +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfModel::IsScanEnabledL() + { + return iSession.IsScanEnabledL(); + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::LaunchBrowserL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::LaunchBrowserL( TUint32 aIapId ) + { + LOG_ENTERFN( "CWsfModel::LaunchBrowserL" ); + + if ( !iBrowserLauncher->Launching() || + iBrowserLauncher->BrowserIap() != aIapId ) + { + LOG_WRITE( "launching browser..." ); + iConnectedIapId = aIapId; + iBrowserLauncher->LaunchBrowserL( *this, aIapId ); + } + else if ( iBrowserLauncher->BrowserIap() == aIapId ) + { + LOG_WRITE( "bringing browser to foreground..." ); + ContinueBrowsingL(); + } + + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::ContinueBrowsingL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::ContinueBrowsingL() + { + LOG_ENTERFN( "CWsfModel::ContinueBrowsingL(void)" ); + iBrowserLauncher->ContinueBrowsingL(); + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::ContinueBrowsingL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::ContinueBrowsingL( TUint32 aIapId ) + { + LOG_ENTERFN( "CWsfModel::ContinueBrowsingL(TUint32)" ); + iBrowserLauncher->ContinueBrowsingL( *this, aIapId ); + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::CreateAccessPointL +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfModel::CreateAccessPointL( TWsfWlanInfo& aWlan, + TBool aExplicitDefine ) + { + LOG_ENTERFN( "CWsfModel::CreateAccessPointL" ); + if ( aExplicitDefine ) + { + LOG_WRITE( "called from 'Define access point'" ); + } + + CheckSpaceBelowCriticalLevelL(); + CheckUnknownWapiL( aWlan ); + + CWsfWlanIapWizard* iapWizard = CWsfWlanIapWizard::NewLC(); + + // the wlaninfo must be persistent to avoid nullpointer crashes due to + // background refreshing + TBool ret( ETrue ); + + // query necessary data + if ( !iapWizard->LaunchWizardL( aWlan, aExplicitDefine ) ) + { + LOG_WRITE( "iapWizard.LaunchWizardL failed" ); + ret = EFalse; + } + + // then create accesspoint + if ( ret ) + { + if ( iapWizard->CreateAccessPointL() ) + { + // copy back the IAP id + LOG_WRITEF( "IAP id = %d", aWlan.iIapId ); + } + else + { + LOG_WRITE( "iapWizard.CreateAccessPointL failed" ); + ret = EFalse; + } + } + + CleanupStack::PopAndDestroy( iapWizard ); + + return ret; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::RefreshScanL +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfModel::RefreshScanL() + { + LOG_ENTERFN( "CWsfModel::RefreshScanL" ); + iRefreshing = iSession.RequestScanL(); + LOG_WRITEF( "iRefreshing = %d", iRefreshing ); + return iRefreshing; + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::RefreshScan +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::RefreshScan( TPckgBuf& aPckg, + TRequestStatus& aStatus ) + { + LOG_ENTERFN( "CWsfModel::RefreshScan" ); + iSession.RequestScan( aPckg, aStatus ); + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::CloseHelperApplication +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfModel::CloseHelperApplication() + { + LOG_ENTERFN( "CWsfModel::CloseHelperApplication" ); + TBool endTaskCalled = EFalse; + // check if the app is already running ... and kill it. + TUid id( TUid::Uid( KHelperApUid.iUid ) ); + TApaTaskList taskList( iEikEnv->WsSession() ); + TApaTask task = taskList.FindApp( id ); + + if ( task.Exists() ) + { + LOG_WRITE( "ending task" ); + task.EndTask(); + endTaskCalled = ETrue; + } + return endTaskCalled; + } + + + +// ---------------------------------------------------------------------------- +// CWsfModel::LaunchHelperApplicationL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::LaunchHelperApplicationL( TWsfWlanInfo &aWlanInfo ) + { + LOG_ENTERFN( "CWsfModel::LaunchHelperApplicationL" ); + TPckgC param( aWlanInfo ); + + TBuf8 temp; + temp.Copy( param ); + + TFileName fileName; + fileName.Copy( temp ); + + RApaLsSession appArcSession; + + User::LeaveIfError( appArcSession.Connect() ); // connect to AppArc server + CleanupClosePushL( appArcSession ); + + // check if the app is already running ... and kill it. + TUid id( TUid::Uid( KHelperApUid.iUid ) ); + TApaTaskList taskList( iEikEnv->WsSession() ); + TApaTask task = taskList.FindApp( id ); + + if ( task.Exists() ) + { + task.EndTask(); + } + + TThreadId threadId; + User::LeaveIfError( appArcSession.StartDocument( fileName, TUid::Uid( + KHelperApUid.iUid ), threadId ) ); + + CleanupStack::PopAndDestroy( &appArcSession ); + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::CancelNotifyEvents +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::CancelNotifyEvents() + { + LOG_ENTERFN( "CWsfModel::CancelNotifyEvents" ); + iSession.CancelNotifyEvent(); + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::RequestNotifyEventsL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::RequestNotifyEventsL( + MWsfStateChangeObserver& aObserver ) + { + LOG_ENTERFN( "CWsfModel::RequestNotifyEventsL" ); + iSession.NotifyEventL( aObserver ); + } + + +// ------------------------- From MWsfBrowserLaunchObserver ------------------- + +// ---------------------------------------------------------------------------- +// CWsfModel::BrowserLaunchFailed +// ---------------------------------------------------------------------------- +// +void CWsfModel::BrowserLaunchFailed( TInt aError ) + { + LOG_ENTERFN( "CWsfModel::BrowserLaunchFailed" ); + LOG_WRITEF( "error = %d", aError ); + + if ( iObserver ) + { + iObserver->BrowserLaunchFailed( aError ); + } + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::BrowserLaunchCompleteL +// ---------------------------------------------------------------------------- +// +void CWsfModel::BrowserLaunchCompleteL() + { + LOG_ENTERFN( "CWsfModel::BrowserLaunchCompleteL" ); + + iSession.MonitorAccessPointL( iConnectedIapId ); + + if ( iObserver ) + { + iObserver->BrowserLaunchCompleteL(); + } + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::BrowserExitL +// ---------------------------------------------------------------------------- +// +void CWsfModel::BrowserExitL() + { + LOG_ENTERFN( "CWsfModel::BrowserExitL" ); + + // browser has been terminated, do the cleanup if necessary + iSession.SetIapPersistenceL( EIapForcedExpiry ); + + if ( iObserver ) + { + iObserver->BrowserExitL(); + } + } + +// ------------------------- From MWsfScreenSaverStateObserver ---------------- + +// ---------------------------------------------------------------------------- +// CWsfModel::ScreenSaverStatusChangedL +// ---------------------------------------------------------------------------- +// +void CWsfModel::ScreenSaverStatusChangedL( const TBool aScreenSaverActive ) + { + LOG_ENTERFN( "CWsfModel::ScreenSaverStatusChangedL" ); + LOG_WRITEF( "status = %d", aScreenSaverActive ); + if ( aScreenSaverActive ) + { + iSession.DisableScanL(); + } + else + { + iSession.EnableScanL(); + } + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::IsConnectedL +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfModel::IsConnectedL() + { + return iSession.IsConnectedL(); + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::GetConnectedWlanDetailsL +// ---------------------------------------------------------------------------- +// +EXPORT_C TBool CWsfModel::GetConnectedWlanDetailsL( TWsfWlanInfo& aWlanInfo ) + { + return iSession.GetConnectedWlanDetailsL( aWlanInfo ); + } + +// ---------------------------------------------------------------------------- +// CWsfModel::GetConnectedWlanDetails +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::GetConnectedWlanDetails( TPckgBuf& aPckg, + TWsfWlanInfo& aWlanInfo, + TRequestStatus& aStatus ) + { + iSession.GetConnectedWlanDetails( aPckg, aWlanInfo, aStatus ); + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::AbortConnectingL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::AbortConnectingL() + { + LOG_ENTERFN( "CWsfModel::AbortConnectingL" ); + if ( iConnecting ) + { + iSession.AbortConnectingL(); + } + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::AbortScanningL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::AbortScanningL() + { + LOG_ENTERFN( "CWsfModel::AbortScanningL" ); + if ( iRefreshing ) + { + iSession.AbortScanningL(); + } + } + + +// ---------------------------------------------------------------------------- +// CWsfModel::CheckSpaceBelowCriticalLevelL +// ---------------------------------------------------------------------------- +// +void CWsfModel::CheckSpaceBelowCriticalLevelL() const + { + // OOD handling. If disk space is low user is notified. + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + // Checks the FFS space "after" addition + TBool belowCL = SysUtil::FFSSpaceBelowCriticalLevelL + ( &fs, KEstimatedOverhead ); + + CleanupStack::PopAndDestroy(); // fs + + if( belowCL ) + { + User::Leave( KErrDiskFull ); + } + } + +// ---------------------------------------------------------------------------- +// CWsfModel::CheckUnknownWapiL +// ---------------------------------------------------------------------------- +// +void CWsfModel::CheckUnknownWapiL( TWsfWlanInfo& aWlan ) const + { + if( !aWlan.Known() && aWlan.SecurityMode() == EWlanSecModeWAPI ) + { + User::Leave( KErrWlanProtectedSetupSetupLocked ); + } + } + +// ---------------------------------------------------------------------------- +// CWsfModel::CheckIsIapIdValidL +// ---------------------------------------------------------------------------- +// +EXPORT_C void CWsfModel::CheckIsIapIdValidL( TUint aIapId ) const + { + LOG_ENTERFN( "CWsfModel::CheckIsIapIdValidL" ); + LOG_WRITEF( "Checking iapId= %d", aIapId ); + if( aIapId ) + { + RCmManagerExt cmManager; + cmManager.OpenL(); + CleanupClosePushL( cmManager ); + + RCmConnectionMethodExt cm = cmManager.ConnectionMethodL( aIapId ); + cm.Close(); + CleanupStack::PopAndDestroy( &cmManager ); + } + else + { + User::Leave( KErrArgument ); + } + } + +// End of file