diff -r ff3b37722600 -r 10810c91db26 wlanutilities/wlansniffer/engine/client/src/wsfsession.cpp --- a/wlanutilities/wlansniffer/engine/client/src/wsfsession.cpp Tue Jan 26 13:04:04 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,723 +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 RWsfSession -* -*/ - - - -// CLASS HEADER -#include "wsfsession.h" - -// INTERNAL INCLUDES -#include "wsfwlaninfoarray.h" -#include "wsfeventhandler.h" -#include "wsfactivewaiter.h" -#include "wsfservercommon.h" -#include "wsflogger.h" - - - -// LOCAL DEFINITIONS -/** -* Number of message slots at the server -*/ -static const TInt KIPCSlots = 6; - - - -// --------------------------------------------------------------------------- -// RWsfSession::RWsfSession -// --------------------------------------------------------------------------- -EXPORT_C RWsfSession::RWsfSession(): - RSessionBase(), - iEventHandler( 0 ), - iConnectingResult( KErrNone ) - { - } - - -// --------------------------------------------------------------------------- -// RWsfSession::StartServer -// --------------------------------------------------------------------------- -TInt RWsfSession::StartServer() - { - LOG_ENTERFN( "RWsfSession::StartServerL" ); - - TInt res( KErrNone ); - // create server - if one of this name does not already exist - TFindServer findServer( KWlanSnifferServerName ); - TFullName name; - - if ( findServer.Next( name ) != KErrNone ) // we don't exist already - { - RProcess server; - // Create the server process - res = server.Create( KWlanSnifferServerExe, KNullDesC ); - - if ( res != KErrNone ) // thread created ok - now start it going - { - return res; - } - - // Rendezvous is used to detect server start - TRequestStatus status; - server.Rendezvous( status ); - - if ( status != KRequestPending ) - { - LOG_WRITEF( "StartServer Rendezvous ERROR: %d", status.Int() ); - server.Kill( 0 ); // abort startup - } - else - { - server.Resume(); // logon OK - start the server - } - - LOG_WRITE( "StartServer wait for start" ); - User::WaitForRequest( status ); // wait for start or death - - // We can't use the 'exit reason' if the server paniced as this - // is the panic 'reason' and may be '0' which cannot be distinguished - // from KErrNone - res = ( server.ExitType() == EExitPanic ) ? KErrGeneral : status.Int(); - - // we're no longer interested in the other process - server.Close(); - } - - return res; - } - - -// --------------------------------------------------------------------------- -// RWsfSession::Connect -// --------------------------------------------------------------------------- -// -EXPORT_C TInt RWsfSession::Connect() - { - LOG_ENTERFN( "RWsfSession::Connect" ); - TInt err = StartServer(); - - if ( err == KErrNone ) - { - LOG_WRITE( "server started" ); - - err = CreateSession( KWlanSnifferServerName, Version(), KIPCSlots ); - - LOG_WRITEF( "CreateSession() returned %d", err ); - - if ( err == KErrNone ) - { - TRAP( err, iConnWaiter = new (ELeave) CActiveSchedulerWait() ); - } - } - else - { - LOG_WRITEF( "server starting failed with error %d", err ); - } - - return err; - } - - -// --------------------------------------------------------------------------- -// RWsfSession::Version -// --------------------------------------------------------------------------- -// -TVersion RWsfSession::Version() const - { - return TVersion( KWlanSnifferServerMajor, - KWlanSnifferServerMinor, - KWlanSnifferServerBuild ); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::CancelNotifyEvent -// --------------------------------------------------------------------------- -// -EXPORT_C void RWsfSession::CancelNotifyEvent() - { - LOG_ENTERFN( "RWsfSession::CancelNotifyEvent" ); - if ( iEventHandler ) - { - iEventHandler->Cancel(); - } - } - - -// --------------------------------------------------------------------------- -// RWsfSession::ConnectedAccountNameL -// --------------------------------------------------------------------------- -// -EXPORT_C HBufC* RWsfSession::ConnectedAccountNameL() - { - LOG_ENTERFN("RWsfSession::ConnectedAccountNameL"); - TPckgBuf package; - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - SendReceive( ESnifferCmdConnectionName, TIpcArgs( &package ), - waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdConnectionName, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - CleanupStack::PopAndDestroy( waiter ); - - if ( package().iConnected ) - { - return package().iConnectedAccountName.AllocL(); - } - return KNullDesC().AllocL(); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::GetConnectedWlanDetailsL -// --------------------------------------------------------------------------- -// -EXPORT_C TBool RWsfSession::GetConnectedWlanDetailsL( TWsfWlanInfo& aWlanInfo ) - { - LOG_ENTERFN("RWsfSession::GetConnectedWlanDetailsL"); - TPckgBuf ret( EFalse ); - TPckg package( aWlanInfo ); - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdConnectedDetails, TIpcArgs( &ret, &package ), - waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdConnectedDetails, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - CleanupStack::PopAndDestroy( waiter ); - - return ret(); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::NotifyEventL -// --------------------------------------------------------------------------- -// -EXPORT_C void RWsfSession::NotifyEventL( MWsfStateChangeObserver& aObserver ) - { - LOG_ENTERFN("RWsfSession::NotifyEventL"); - if ( !iEventHandler ) - { - iEventHandler = CWsfEventHandler::NewL( *this, aObserver ); - } - iEventHandler->ResetObserver( aObserver ); - if ( !iEventHandler->IsActive() ) - { - iEventHandler->Start(); - SendReceive( ESnifferCmdNotifyEvents, - TIpcArgs( &iEventHandler->EventContainer() ), - iEventHandler->iStatus ); - } - } - - -// --------------------------------------------------------------------------- -// RWsfSession::EnableScanL -// --------------------------------------------------------------------------- -// -EXPORT_C TBool RWsfSession::EnableScanL() - { - LOG_ENTERFN("RWsfSession::EnableScanL"); - - TInt err = Send( ESnifferCmdActivateScan ); - LOG_WRITEF( "message[%d] call returned %d", ESnifferCmdActivateScan, err ); - - User::LeaveIfError( err ); - - return !err; - } - - -// --------------------------------------------------------------------------- -// RWsfSession::DisableScanL -// --------------------------------------------------------------------------- -// -EXPORT_C TBool RWsfSession::DisableScanL() - { - LOG_ENTERFN("RWsfSession::DisableScanL"); - - TInt err = Send( ESnifferCmdDisableScan ); - LOG_WRITEF( "message[%d] call returned %d", ESnifferCmdDisableScan, err ); - - User::LeaveIfError( err ); - - return !err; - } - - -// --------------------------------------------------------------------------- -// RWsfSession::IsScanEnabledL -// --------------------------------------------------------------------------- -// -EXPORT_C TBool RWsfSession::IsScanEnabledL() - { - LOG_ENTERFN("RWsfSession::IsScanEnabledL"); - TBool res = 0; - TPckgBuf pckg; - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdIsScanEnabled, TIpcArgs( &pckg ), - waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdIsScanEnabled, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - CleanupStack::PopAndDestroy( waiter ); - - res = pckg(); - return res; - } - - -// --------------------------------------------------------------------------- -// RWsfSession::UpdateWlanListL -// --------------------------------------------------------------------------- -// -EXPORT_C void RWsfSession::UpdateWlanListL( CWsfWlanInfoArray* aInfoArray ) - { - LOG_ENTERFN("RWsfSession::UpdateWlanListL"); - // first request the buffer size for wlan data... - TPckgBuf pckg; - TUint infoArrayElementCount = aInfoArray->Count(); - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdWlanDataSize, TIpcArgs( &pckg ), waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdWlanDataSize, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - - // alloc the required size buffer... - TInt requiredSize = pckg(); - LOG_WRITEF( "WLAN data buffer size = %d", requiredSize ); - - if ( !requiredSize ) - { - // no data ... - CleanupStack::PopAndDestroy( waiter ); - return; - } - - HBufC8* buffer = HBufC8::NewLC( requiredSize ); - TPtr8 ptr = buffer->Des(); - - SendReceive( ESnifferCmdGetWlanInfo, TIpcArgs( &pckg, &ptr ), - waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdGetWlanInfo, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - - - LOG_WRITEF( "actual bytes occupied = %d", pckg() ); - - if ( requiredSize != pckg() ) - { - // the buffer is not long enough... we must try again... - User::Leave( KErrOverflow ); - } - - // Check that aInfoArray has not been modified - // while we waited server response - if ( aInfoArray->Count() != infoArrayElementCount ) - { - LOG_WRITEF( "aInfoArray data has changed %d != %d ", - aInfoArray->Count(), infoArrayElementCount ); - aInfoArray->Reset(); - } - - aInfoArray->AppendFromStreamBufferL( ptr ); - CleanupStack::PopAndDestroy( buffer ); - CleanupStack::PopAndDestroy( waiter ); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::MonitorAccessPointL -// --------------------------------------------------------------------------- -// -EXPORT_C void RWsfSession::MonitorAccessPointL( TUint32 aMonitoredIap ) - { - LOG_ENTERFN("RWsfSession::MonitorAccessPointL"); - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdMonitorAp, TIpcArgs( aMonitoredIap ), - waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdMonitorAp, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - - CleanupStack::PopAndDestroy( waiter ); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::RequestScanL -// --------------------------------------------------------------------------- -// -EXPORT_C TBool RWsfSession::RequestScanL() - { - LOG_ENTERFN("RWsfSession::RequestScanL"); - TPckgBuf pckg; - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdRequestScan, TIpcArgs( &pckg ), waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdRequestScan, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - CleanupStack::PopAndDestroy( waiter ); - return pckg(); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::ConnectWlanBearerL -// --------------------------------------------------------------------------- -// -EXPORT_C TInt RWsfSession::ConnectWlanBearerL( TUint32 aIapId, - TWsfIapPersistence aPersistence ) - { - LOG_ENTERFN( "RWsfSession::ConnectWlanBearerL" ); - LOG_WRITEF( "IAP id = %d", aIapId ); - - // mark the beginning of the connection process - iEventHandler->SetConnecting( ETrue ); - - TInt res( KErrNone ); - TPckgBuf pckg; - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdConnect, TIpcArgs( &pckg, aIapId, aPersistence ), - waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdConnect, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - CleanupStack::PopAndDestroy( waiter ); - - res = pckg(); - - if ( res != KErrNone ) - { - // on any error the flag should be cleared - iEventHandler->SetConnecting( EFalse ); - } - else - { - // otherwise we must wait until the connected signal arrives - iConnWaiter->Start(); - } - - if ( iConnectingResult ) - { - // the caller must know if the connecting process was cancelled - res = iConnectingResult; - iConnectingResult = KErrNone; - } - - return res; - } - - -// --------------------------------------------------------------------------- -// RWsfSession::ConnectWlanBearerWithoutConnWaiterL -// --------------------------------------------------------------------------- -// -EXPORT_C TInt RWsfSession::ConnectWlanBearerWithoutConnWaiterL( TUint32 aIapId, - TWsfIapPersistence aPersistence ) - { - LOG_ENTERFN( "RWsfSession::ConnectWlanBearerWithoutConnWaiterL" ); - LOG_WRITEF( "IAP id = %d", aIapId ); - - // mark the beginning of the connection process - iEventHandler->SetConnecting( ETrue ); - - TInt res( KErrNone ); - TPckgBuf pckg; - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdConnect, TIpcArgs( &pckg, aIapId, aPersistence ), - waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdConnect, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - CleanupStack::PopAndDestroy( waiter ); - - res = pckg(); - - if ( res != KErrNone ) - { - // on any error the flag should be cleared - iEventHandler->SetConnecting( EFalse ); - } - - return res; - } - - -// --------------------------------------------------------------------------- -// RWsfSession::StopConnectingWait -// --------------------------------------------------------------------------- -// -void RWsfSession::StopConnectingWait() - { - LOG_ENTERFN( "RWsfSession::StopConnectingWait" ); - if ( iConnWaiter->IsStarted() ) - { - iConnWaiter->AsyncStop(); - } - } - - -// --------------------------------------------------------------------------- -// RWsfSession::DisconnectWlanBearerL -// --------------------------------------------------------------------------- -// -EXPORT_C TBool RWsfSession::DisconnectWlanBearerL() - { - LOG_ENTERFN("RWsfSession::DisconnectWlanBearerL"); - TBool res = 0; - TPckgBuf pckg; - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdDisconnect, TIpcArgs( &pckg ), waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdDisconnect, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - - CleanupStack::PopAndDestroy( waiter ); - - res = pckg(); - return res; - } - - -// --------------------------------------------------------------------------- -// RWsfSession::Close -// --------------------------------------------------------------------------- -// -EXPORT_C void RWsfSession::Close() - { - LOG_ENTERFN("RWsfSession::Close"); - delete iEventHandler; iEventHandler = NULL; - delete iConnWaiter; iConnWaiter = NULL; - - RSessionBase::Close(); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::DoCancelNotifyEvent -// --------------------------------------------------------------------------- -// -void RWsfSession::DoCancelNotifyEvent() - { - LOG_ENTERFN("RWsfSession::DoCancelNotifyEvent"); - // used only by CWsfEventHandler - TInt err = Send( ESnifferCmdCancelNotifyEvents ); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdCancelNotifyEvents, err ); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::CancelAll -// --------------------------------------------------------------------------- -// -void RWsfSession::CancelAll() - { - LOG_ENTERFN("RWsfSession::CancelAll"); - TInt err = Send( ESnifferCmdCancelAll ); - - LOG_WRITEF( "message[%d] call returned %d", ESnifferCmdCancelAll, err ); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::IsConnectedL -// --------------------------------------------------------------------------- -// -EXPORT_C TBool RWsfSession::IsConnectedL() - { - LOG_ENTERFN("RWsfSession::IsConnectedL"); - TPckgBuf pckg; - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdIsConnected, TIpcArgs( &pckg ), waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdIsConnected, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - CleanupStack::PopAndDestroy( waiter ); - - return pckg(); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::RecoverFromServerTermination -// --------------------------------------------------------------------------- -// -TBool RWsfSession::RecoverFromServerTermination( - MWsfStateChangeObserver& aObserver ) - { - RSessionBase::Close(); - - TBool ret( EFalse ); - - ret = ( Connect() == KErrNone ); - if ( ret ) - { - TRAPD( err, NotifyEventL( aObserver ) ); - ret = ( err == KErrNone ); - } - - return ret; - } - - -// --------------------------------------------------------------------------- -// RWsfSession::AbortConnectingL -// --------------------------------------------------------------------------- -// -EXPORT_C void RWsfSession::AbortConnectingL() - { - LOG_ENTERFN("RWsfSession::AbortConnectingL"); - - if ( iEventHandler->Connecting() ) - { - iConnectingResult = KErrCancel; - iEventHandler->BlockNextConnectedEvent(); - - TInt err = Send( ESnifferCmdAbortConnecting ); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdAbortConnecting, err ); - - User::LeaveIfError( err ); - StopConnectingWait(); - } - - } - - -// --------------------------------------------------------------------------- -// RWsfSession::AbortScanningL -// --------------------------------------------------------------------------- -// -EXPORT_C void RWsfSession::AbortScanningL() - { - LOG_ENTERFN("RWsfSession::AbortScanningL"); - - TInt err = Send( ESnifferCmdAbortScanning ); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdAbortScanning, err ); - - User::LeaveIfError( err ); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::SetIapPersistenceL -// --------------------------------------------------------------------------- -// -EXPORT_C TBool RWsfSession::SetIapPersistenceL( - TWsfIapPersistence aPersistence ) - { - LOG_ENTERFN("RWsfSession::SetIapPersistenceL"); - TPckgBuf ret( EFalse ); - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdSetIapPersistence, TIpcArgs( &ret, aPersistence ), - waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdSetIapPersistence, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - CleanupStack::PopAndDestroy( waiter ); - - return ret(); - } - - -// --------------------------------------------------------------------------- -// RWsfSession::ControlDisconnectTimerL -// --------------------------------------------------------------------------- -// -EXPORT_C TBool RWsfSession::ControlDisconnectTimerL( TUint aAdcCommand ) - { - LOG_ENTERFN("RWsfSession::ControlDisconnectTimerL"); - - TPckgBuf ret( EFalse ); - - CWsfActiveWaiter *waiter = CWsfActiveWaiter::NewL(); - CleanupStack::PushL( waiter ); - - SendReceive( ESnifferCmdControlDisconnectTimer, - TIpcArgs( &ret, aAdcCommand ), - waiter->iStatus ); - - waiter->WaitForRequest(); - LOG_WRITEF( "message[%d] call returned %d", - ESnifferCmdControlDisconnectTimer, - waiter->iStatus.Int() ); - User::LeaveIfError( waiter->iStatus.Int() ); - CleanupStack::PopAndDestroy( waiter ); - - return ret(); - } - -