--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wlanutilities/wlansniffer/engine/server/src/wsfsession.cpp Wed Sep 01 12:20:32 2010 +0100
@@ -0,0 +1,720 @@
+/*
+* 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 CWsfSession
+*
+*/
+
+
+// CLASS HEADER
+#include "wsfsession.h"
+#include "wsfserver.h"
+#include "wsfengine.h"
+#include "wsfservercommon.h"
+#include "wsfwlaninfo.h"
+#include "wsflogger.h"
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::CWsfSession
+// ----------------------------------------------------------------------------
+//
+CWsfSession::CWsfSession( CWsfServer& aServer ):
+ iServer( aServer ),
+ iRequestNotify( EFalse ),
+ iEnabledScanning( EFalse )
+ {
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::NewL
+// ----------------------------------------------------------------------------
+//
+CWsfSession* CWsfSession::NewL( CWsfServer& aServer )
+ {
+ CWsfSession* thisPtr = new (ELeave) CWsfSession( aServer );
+ CleanupStack::PushL( thisPtr );
+ thisPtr->ConstructL();
+ CleanupStack::Pop( thisPtr );
+ return thisPtr;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::~CWsfSession
+// ----------------------------------------------------------------------------
+//
+CWsfSession::~CWsfSession()
+ {
+ LOG_ENTERFN( "CWsfSession::~CWsfSession" );
+ CancelPendingTasks();
+ iServer.Engine()->Detach( this );
+ iServer.ClientRelease();
+ iEventQueue.Close();
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::ConstructL()
+ {
+ iServer.ClientAttach();
+ iServer.Engine()->AttachL( this );
+ iEnabledScanning = iServer.Engine()->IsScanning();
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::ServiceL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::ServiceL( const RMessage2& aMessage )
+ {
+ TRAPD( err, DispatchMessageL( aMessage ) );
+ if ( err != KErrNone )
+ {
+ LOG_WRITEF( "CWsfSession::ServiceL DispatchMessageL leave error = %d",
+ err );
+ aMessage.Complete( err );
+ }
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::DispatchMessageL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::DispatchMessageL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::DispatchMessageL" );
+ LOG_WRITEF( "CWsfSession::DispatchMessageL message = %d",
+ aMessage.Function() );
+
+ switch ( aMessage.Function() )
+ {
+ case ESnifferCmdWlanDataSize:
+ {
+ ReplyWlanDataSizeL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdNotifyEvents:
+ {
+ RequestNotifyL( aMessage );
+ break;
+ }
+
+ case ESnifferCmdCancelNotifyEvents:
+ {
+ CancelNotifyEvents();
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdGetWlanInfo:
+ {
+ WriteWlanDataL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdConnect:
+ {
+ ConnectWlanL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdDisconnect:
+ {
+ DisconnectWlanL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdActivateScan:
+ {
+ ActivateScanL();
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdDisableScan:
+ {
+ DisableScanL();
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdConnectionName:
+ {
+ GetConnectedAccountNameL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdCancelAll:
+ {
+ CancelPendingTasks();
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdRequestScan:
+ {
+ RequestScanL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdMonitorAp:
+ {
+ MonitorApL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdIsScanEnabled:
+ {
+ ReplyIsScanningL(aMessage);
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdIsConnected:
+ {
+ IsConnectedL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdConnectedDetails:
+ {
+ GetConnectedDetailsL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdAbortScanning:
+ {
+ AbortScanning();
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdAbortConnecting:
+ {
+ AbortConnectingL();
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdSetIapPersistence:
+ {
+ SetIapPersistenceL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+ case ESnifferCmdControlDisconnectTimer:
+ {
+ ControlDisconnectTimerL( aMessage );
+ aMessage.Complete( KErrNone );
+ break;
+ }
+
+
+ // requests we don't understand at all are a different thing,
+ // so panic the client here, this function also completes the message
+ default:
+ {
+ _LIT( KWsfServerPanic, "WlanSnifferServer" );
+ aMessage.Panic( KWsfServerPanic, 1 );
+ }
+
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfSession::RequestNotify
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::RequestNotifyL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::RequestNotifyL" );
+ if ( !iRequestNotify )
+ {
+ LOG_WRITE( "CWsfSession::RequestNotifyL first subscription" );
+ // first subscription
+ iRequestNotify = ETrue;
+ iEventQueue.Reset();
+ }
+
+ // initial value / processing finished
+ iProcessingEvent = EFalse;
+
+ // store the message to be completed
+ iNotifyChangesMessage = aMessage;
+
+ // deal with the queue
+ if ( iEventQueue.Count() )
+ {
+ LOG_WRITE( "CWsfSession::RequestNotifyL queue not empty" );
+ NotifyClientL();
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfSession::CancelNotifyEvents
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::CancelNotifyEvents()
+ {
+ LOG_ENTERFN( "CWsfSession::CancelNotifyEvents" );
+
+ // interrupt ongoing event handling
+ iProcessingEvent = EFalse;
+ if ( !iNotifyChangesMessage.IsNull() )
+ {
+ iNotifyChangesMessage.Complete( KErrCancel );
+ }
+
+ // unsubscribe
+ iRequestNotify = EFalse;
+
+ // drop all waiting events
+ iEventQueue.Reset();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfSession::CancelPendingTasks
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::CancelPendingTasks()
+ {
+ LOG_ENTERFN( "CWsfSession::CancelPendingTasks" );
+ if ( iEnabledScanning )
+ {
+ TRAP_IGNORE( iServer.Engine()->DisableScanningL() );
+ }
+
+ CancelNotifyEvents();
+ }
+
+
+
+// from MWsfEngineObserver
+
+// ---------------------------------------------------------------------------
+// CWsfSession::WlanListChangedL
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::WlanListChangedL()
+ {
+ LOG_ENTERFN( "CWsfSession::WlanListChangedL" );
+ TWsfNotifyEventContainer event = { EEngineWlanDataChanged, KErrNone };
+ iEventQueue.AppendL( event );
+
+ NotifyClientL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfSession::NotifyErrorL
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::NotifyErrorL( TInt aError )
+ {
+ LOG_ENTERFN( "CWsfSession::NotifyErrorL" );
+ TWsfNotifyEventContainer event = { EEngineError, aError };
+ iEventQueue.AppendL( event );
+
+ NotifyClientL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfSession::ScanEnabledL
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::ScanEnabledL()
+ {
+ LOG_ENTERFN( "CWsfSession::ScanEnabledL" );
+ iEnabledScanning = ETrue;
+ TWsfNotifyEventContainer event = { EEngineScanEnabled, KErrNone };
+ iEventQueue.AppendL( event );
+
+ NotifyClientL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfSession::ScanDisabledL
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::ScanDisabledL()
+ {
+ LOG_ENTERFN( "CWsfSession::ScanDisabledL" );
+ iEnabledScanning = EFalse;
+ TWsfNotifyEventContainer event = { EEngineScanDisabled, KErrNone };
+ iEventQueue.AppendL( event );
+
+ NotifyClientL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfSession::ConnectedL
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::ConnectedL()
+ {
+ LOG_ENTERFN( "CWsfSession::ConnectedL" );
+ TWsfNotifyEventContainer event = { EEngineConnected, KErrNone };
+ iEventQueue.AppendL( event );
+
+ NotifyClientL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfSession::DisconnectedL
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::DisconnectedL()
+ {
+ LOG_ENTERFN( "CWsfSession::DisconnectedL" );
+ TWsfNotifyEventContainer event = { EEngineDisconnected, KErrNone };
+ iEventQueue.AppendL( event );
+
+ NotifyClientL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfSession::ConnectingFailedL
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::ConnectingFailedL( TInt aError )
+ {
+ LOG_ENTERFN( "CWsfSession::ConnectingFailedL" );
+ TWsfNotifyEventContainer event = { EEngineConnectingFailed, aError };
+ iEventQueue.AppendL( event );
+
+ NotifyClientL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfSession::NotifyClientL
+// ---------------------------------------------------------------------------
+//
+void CWsfSession::NotifyClientL()
+ {
+ LOG_ENTERFN( "CWsfSession::NotifyClientL" );
+
+ if ( iRequestNotify && !iProcessingEvent )
+ {
+ LOG_WRITE( "CWsfSession::NotifyClientL notify" );
+ TPckgBuf<TWsfNotifyEventContainer> container( iEventQueue[0] );
+
+ iNotifyChangesMessage.WriteL( 0, container );
+
+ // remove the item that we have just handed over
+ iEventQueue.Remove( 0 );
+
+ iProcessingEvent = ETrue;
+ iNotifyChangesMessage.Complete( KErrNone );
+ }
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::GetConnectedAccountNameL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::GetConnectedAccountNameL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::GetConnectedAccountNameL" );
+ HBufC* iapName = iServer.Engine()->ConnectedWlanSsidL();
+ CleanupStack::PushL( iapName );
+ TPckgBuf<TWsfQueryConnectedAccount> package;
+
+ TInt maxLen = package().iConnectedAccountName.MaxLength();
+
+ if ( iapName->Length() )
+ {
+ if ( iapName->Length() > maxLen )
+ {
+ package().iConnectedAccountName.Copy( iapName->Ptr(), maxLen );
+ }
+ else
+ {
+ package().iConnectedAccountName.Copy( *iapName );
+ }
+ package().iConnected = ETrue;
+ }
+ else
+ {
+ package().iConnected = EFalse;
+ }
+ aMessage.WriteL( 0, package );
+ CleanupStack::PopAndDestroy( iapName );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::GetConnectedDetailsL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::GetConnectedDetailsL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::GetConnectedDetailsL" );
+ TPckgBuf<TWsfWlanInfo> package;
+ TPckgBuf<TBool> ret( ETrue );
+
+ if ( !iServer.Engine()->ConnectedWlanConnectionDetailsL( package() ) )
+ {
+ LOG_WRITE( "engine returned false, so wlaninfo is marked as invalid" );
+ ret() = EFalse;
+ }
+
+ aMessage.WriteL( 0, ret );
+ aMessage.WriteL( 1, package );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::ReplyWlanDataSizeL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::ReplyWlanDataSizeL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::ReplyWlanDataSizeL" );
+ const TInt KInvalidLength = 0;
+ TPckgBuf<TUint> p( KInvalidLength );
+
+ HBufC8* results = iServer.Engine()->GetScanResults();
+ if ( results )
+ {
+ p() = results->Length();
+ }
+
+ aMessage.WriteL( 0, p );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::WriteWlanDataL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::WriteWlanDataL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::WriteWlanDataL" );
+ TPckgBuf<TUint> sizeData;
+
+ // don't take the ownership
+ HBufC8* scanData = iServer.Engine()->GetScanResults();
+
+ if ( scanData )
+ {
+ LOG_WRITEF( "scanData->Length() = %d aMessage.GetDesMaxLength(1) = %d",
+ scanData->Length(), aMessage.GetDesMaxLength( 1 ) );
+ if ( scanData->Length() > aMessage.GetDesMaxLength( 1 ) )
+ {
+ // the data has changed
+ // return error to client to alloc more buffer
+ sizeData() = scanData->Length();
+ aMessage.WriteL( 0, sizeData );
+ }
+ else
+ {
+ // else we have enough buffer... copy the data
+ sizeData() = scanData->Length();
+ aMessage.WriteL( 0, sizeData );
+ aMessage.WriteL( 1, *scanData, 0 );
+ }
+ }
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::ActivateScanL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::ActivateScanL()
+ {
+ LOG_ENTERFN( "CWsfSession::ActivateScanL" );
+ iServer.Engine()->EnableScanningL();
+ iEnabledScanning = ETrue;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::DisableScanL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::DisableScanL()
+ {
+ LOG_ENTERFN( "CWsfSession::DisableScanL" );
+ if ( iEnabledScanning )
+ {
+ iServer.Engine()->DisableScanningL();
+ iEnabledScanning = EFalse;
+ }
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::ConnectWlanL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::ConnectWlanL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::ConnectWlanL" );
+ TUint32 iapId( aMessage.Int1() );
+ TBool connectOnly( aMessage.Int2() );
+ TWsfIapPersistence persistence( TWsfIapPersistence( aMessage.Int3() ) );
+ TPckgBuf<TInt> p( iServer.Engine()->ConnectWlanL( iapId, connectOnly, persistence ) );
+ aMessage.WriteL( 0, p );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::DisconnectWlanL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::DisconnectWlanL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::DisconnectWlanL" );
+ TPckgBuf<TInt> p( iServer.Engine()->DisconnectWlan() );
+ aMessage.WriteL( 0, p );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::RequestScanL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::RequestScanL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::RequestScanL" );
+ TPckgBuf<TBool> requestMade( EFalse );
+ // check if the client has enabled scanning - if not do not request scans
+ if ( !iEnabledScanning )
+ {
+ LOG_WRITE( "CWsfSession::RequestScanL error, not scanning" );
+ aMessage.WriteL( 0, requestMade );
+ return;
+ }
+
+ requestMade = iServer.Engine()->RefreshScanResults();
+ aMessage.WriteL( 0, requestMade );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::MonitorApL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::MonitorApL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::MonitorApL" );
+ TUint32 accessPoint( (TUint32) aMessage.Int0() );
+ iServer.Engine()->MonitorAccessPointL( accessPoint );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::ReplyIsScanningL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::ReplyIsScanningL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::ReplyIsScanningL" );
+ TPckgBuf<TBool> p( iServer.Engine()->IsScanning() );
+ aMessage.WriteL( 0, p );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::IsConnectedL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::IsConnectedL( const RMessage2& aMessage )
+ {
+ TBool b = iServer.Engine()->IsConnected();
+ TPckgBuf<TBool> p( b );
+ aMessage.WriteL( 0, p );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::AbortScanning
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::AbortScanning()
+ {
+ LOG_ENTERFN( "CWsfSession::AbortScanningL" );
+ iServer.Engine()->AbortScanning();
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::AbortConnectingL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::AbortConnectingL()
+ {
+ LOG_ENTERFN( "CWsfSession::AbortConnectingL" );
+ iServer.Engine()->AbortConnectingL();
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::SetIapPersistenceL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::SetIapPersistenceL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::SetIapPersistenceL" );
+
+ TWsfIapPersistence persistence( TWsfIapPersistence( aMessage.Int1() ) );
+ TPckgBuf<TBool> ret( iServer.Engine()->SetIapPersistenceL( persistence ) );
+
+ aMessage.WriteL( 0, ret );
+ }
+
+
+// ----------------------------------------------------------------------------
+// CWsfSession::ControlDisconnectTimerL
+// ----------------------------------------------------------------------------
+//
+void CWsfSession::ControlDisconnectTimerL( const RMessage2& aMessage )
+ {
+ LOG_ENTERFN( "CWsfSession::ControlDisconnectTimerL" );
+
+ TPckgBuf<TBool> ret( iServer.Engine()->ControlDisconnectTimer(
+ TUint( aMessage.Int1() ) ) );
+
+ aMessage.WriteL( 0, ret );
+ }
+
+