diff -r b852595f5cbe -r 63be7eb3fc78 wlanutilities/wlansniffer/engine/server/src/wsfwlanbearerconnectionmonitor.cpp --- a/wlanutilities/wlansniffer/engine/server/src/wsfwlanbearerconnectionmonitor.cpp Thu Aug 19 10:59:40 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1137 +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 CWsfWlanBearerConnectionMonitor -* -*/ - - - -// EXTERNAL INCLUDES -#include -#include -#include -#include -#include -#include -#include -#include -#include - - - -// CLASS HEADER -#include "wsfwlanbearerconnectionmonitor.h" - -// INTERNAL INCLUDES -#include "wsfwlanmonitorobserver.h" -#include "wsflogger.h" -#include "wsfactivewaiter.h" -#include "wsfservercloseradapter.h" -#include "wsfcommon.h" -#include "wsfict.h" - - -// LOCAL DEFINITIONS -using namespace CMManager; - - -#ifdef _DEBUG - _LIT( KWlanConnMonPanic, "wsfwlanconnmon" ); - #define __ASSERTD(x) __ASSERT_DEBUG( (x), \ - User::Panic( KWlanConnMonPanic, __LINE__ ) ); -#else - #define __ASSERTD(x) -#endif - - -// LOCAL CONSTANTS -/** -* Connection id referring to a non-existing connection -*/ -static const TInt KNoConnection = -1; - -/** -* Max allowed connection inactivity time in seconds -*/ -static const TUint KMaxConnectionInactivityTime = 60; - - -/** -* Client polling interval in microseconds -*/ -static const TUint KClientPollInterval = 5 * 1000 * 1000; - - -/** -* Number of trivial clients of a connection (Sniffer, AI/CP plugin etc) -*/ -static const TUint KTrivialClientCount = 2; - -/** -* List of UIDs of the trivial clients -*/ -static const TUid KTrivialClientUids[KTrivialClientCount] = - { - { 0x10281CAB }, // Sniffer server (wsfserver.exe) - { 0x101fD9C5 } // DHCP server (dhcpserv.exe) - }; - -/** -* Browser UID -*/ -const TUid KCRUidBrowser = {0x10008D39}; - - - -// CONSTRUCTION AND DESTRUCTION - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::NewL -// --------------------------------------------------------------------------- -// -CWsfWlanBearerConnectionMonitor* CWsfWlanBearerConnectionMonitor::NewL( - MWsfServerCloserAdapter& aServerCloser ) - { - CWsfWlanBearerConnectionMonitor* thisPtr = NewLC( aServerCloser ); - CleanupStack::Pop( thisPtr ); - return thisPtr; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::NewLC -// --------------------------------------------------------------------------- -// -CWsfWlanBearerConnectionMonitor* CWsfWlanBearerConnectionMonitor::NewLC( - MWsfServerCloserAdapter& aServerCloser ) - { - CWsfWlanBearerConnectionMonitor* thisPtr = - new (ELeave) CWsfWlanBearerConnectionMonitor( aServerCloser ); - CleanupStack::PushL( thisPtr ); - thisPtr->ConstructL(); - return thisPtr; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::~CWsfWlanBearerConnectionMonitor -// --------------------------------------------------------------------------- -// -CWsfWlanBearerConnectionMonitor::~CWsfWlanBearerConnectionMonitor() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::" - L"~CWsfWlanBearerConnectionMonitor" ); - iMonitor.CancelNotifications(); - iMonitor.Close(); - - Cancel(); - - if ( iConnectionOwned ) - { - // in case Cancel() hasn't done the job - TRAP_IGNORE( ShutdownOwnedConnectionL() ); - } - else if ( iMonitoredAp ) - { - - } - - delete iClientPoll; - - delete iIct; - - iCmMgr.Close(); - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::CWsfWlanBearerConnectionMonitor -// --------------------------------------------------------------------------- -// -CWsfWlanBearerConnectionMonitor::CWsfWlanBearerConnectionMonitor( - MWsfServerCloserAdapter& aServerCloser ): - CActive( CActive::EPriorityStandard ), - iConnectionId( KNoConnection ), - iMonitoring( EFalse ), - iConnectingState( ECsIdle ), - iServerCloser( aServerCloser ) - { - CActiveScheduler::Add( this ); - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::ConstructL -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::ConstructL() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::ConstructL" ); - iCmMgr.OpenL(); - iMonitor.ConnectL(); - iClientPoll = CPeriodic::NewL( CActive::EPriorityLow ); - iIct = CWsfIct::NewL(); - FindWlanBearerConnectedL(); - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::GetWlanBearerNameL -// --------------------------------------------------------------------------- -// -const TDesC& CWsfWlanBearerConnectionMonitor::GetWlanBearerNameL() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::GetWlanBearerNameL" ); - if ( iConnectionId == KNoConnection ) - { - LOG_WRITE( "[no connection]" ); - return KNullDesC(); - } - - LOG_WRITEF( "connection name: %S", &iWlanNetworkName ); - return iWlanNetworkName; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::FindWlanBearerConnectedL -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::FindWlanBearerConnectedL() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::FindWlanBearerConnectedL" ); - CWsfActiveWaiter* waiter = CWsfActiveWaiter::NewLC(); - TUint connectionNumber( 0 ); - - iMonitor.GetConnectionCount( connectionNumber, waiter->iStatus ); - waiter->WaitForRequest(); - - if ( !waiter->iStatus.Int() ) - { - TBool connectionIDFound = EFalse; - for ( TUint i = 1; i <= connectionNumber; ++i ) - { - TUint connectionId( 0 ); - TUint subConnectionCount( 0 ); - - User::LeaveIfError( iMonitor.GetConnectionInfo( i, connectionId, - subConnectionCount ) ); - if ( CheckConnectionDetailsL( connectionId ) ) - { - LOG_WRITEF( "found connection %d", connectionId ); - connectionIDFound = ETrue; - iConnectionId = connectionId; - break; - } - } - if ( !connectionIDFound ) - { - LOG_WRITE( "Reset connection ID" ); - iConnectionId = KNoConnection; - } - } - else - { - LOG_WRITEF( "GetConnectionCount failed error = %d", - waiter->iStatus.Int() ); - } - - CleanupStack::PopAndDestroy( waiter ); - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::EventL -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::EventL( - const CConnMonEventBase& aConnMonEvent ) - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::EventL" ); - - TConnMonEvent event = TConnMonEvent( aConnMonEvent.EventType() ); - TInt connectionId = aConnMonEvent.ConnectionId(); - - LOG_WRITEF( "event = %d", (TInt)event ); - - switch ( event ) - { - case EConnMonCreateConnection: - { - LOG_WRITEF( "EConnMonCreateConnection id = %d", - connectionId ); - break; - } - - case EConnMonConnectionStatusChange: - { - LOG_WRITEF( "EConnMonConnectionStatusChange id = %d", - connectionId ); - - const CConnMonConnectionStatusChange* statusChangeEvent = - static_cast( - &aConnMonEvent ); - - LOG_WRITEF( "EConnMonConnectionStatusChange status = %d", - statusChangeEvent->ConnectionStatus() ); - - if ( statusChangeEvent->ConnectionStatus() == KConnectionOpen && - !iConnectionOwned ) - { - LOG_WRITE( "connection status: open" ); - TBool wlanEvent( EFalse ); - - wlanEvent = CheckConnectionDetailsL( connectionId ); - if ( wlanEvent ) - { - LOG_WRITEF( "[%S] connected, id = %d", - &iWlanNetworkName, connectionId ); - - // notify observer ... - iConnectionId = connectionId; - iObserver->ConnectionEstablishedL( iWlanNetworkName ); - } - } - break; - } - - case EConnMonDeleteConnection: - { - LOG_WRITEF( "EConnMonDeleteConnection id = %d", connectionId ); - - if ( connectionId == iConnectionId ) - { - if ( iConnectionOwned ) - { - LOG_WRITE( "connection was owned, manual closing" ); - ShutdownOwnedConnectionL(); - } - else - { - LOG_WRITE( "connection was not owned" ); - iWlanNetworkName.Zero(); - iConnectionId = KNoConnection; - - // notify observer - iObserver->ConnectionLostL(); - } - } - break; - } - - default: - { - } - } - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::CheckConnectionDetailsL -// --------------------------------------------------------------------------- -// -TBool CWsfWlanBearerConnectionMonitor::CheckConnectionDetailsL( - TUint aConnectionId ) - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::CheckConnectionDetailsL" ); - LOG_WRITEF( "aConnectionId: %d", aConnectionId ); - TConnMonBearerType bearerType( EBearerUnknown ); - - TBool foundWlanBearer( EFalse ); - - // Add only connections with valid id - if ( aConnectionId > 0 ) - { - CWsfActiveWaiter* waiter = CWsfActiveWaiter::NewLC(); - iMonitor.GetIntAttribute( aConnectionId, 0, KBearer, - (TInt&)bearerType, - waiter->iStatus ); - waiter->WaitForRequest(); - LOG_WRITEF( "found bearer: %d", bearerType ); - - if ( waiter->iStatus.Int() == KErrNone ) - { - LOG_WRITE( "status: KErrNone" ); - if ( bearerType == EBearerWLAN ) - { - - iMonitor.GetStringAttribute( aConnectionId, 0, KNetworkName, - iWlanNetworkName, waiter->iStatus ); - waiter->WaitForRequest(); - if ( waiter->iStatus.Int() == KErrNone ) - { - LOG_WRITEF( "WLAN network name: %S", &iWlanNetworkName ); - foundWlanBearer = ETrue; - } - - } - } - else - { - LOG_WRITEF( "status: %d", waiter->iStatus.Int() ); - } - CleanupStack::PopAndDestroy( waiter ); - } - - return foundWlanBearer; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::StartMonitoringL -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::StartMonitoringL( - MWsfWlanMonitorObserver* aObserver ) - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::StartMonitoringL" ); - __ASSERTD( aObserver ); - - iObserver = aObserver; - if ( !iMonitoring ) - { - iMonitoring = ETrue; - iMonitor.NotifyEventL( *this ); - } - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::StopMonitoring -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::StopMonitoring() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::StopMonitoring" ); - - if ( iMonitoring ) - { - iMonitoredAp = 0; - iMonitoring = EFalse; - iMonitor.CancelNotifications(); - } - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::ConnectBearer -// --------------------------------------------------------------------------- -// -TInt CWsfWlanBearerConnectionMonitor::ConnectBearer( TUint32 aIapId, - TBool aConnectOnly, - TBool aTestAccessPoint ) - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::ConnectBearer" ); - - if ( iConnectionId != KNoConnection || iConnectingState != ECsIdle ) - { - // there is already a connection - LOG_WRITE( "there is already a WLAN connection" ); - return KErrWlanConnAlreadyActive; - } - - // self-completion - if ( iConnectingState == ECsIdle ) - { - LOG_WRITE( "initiating connection process" ); - iConnIap = aIapId; - iConnectingState = ECsNotConnected; - iConnectionOwned = ETrue; - iServerCloser.WaitForOwnedConnection( ETrue ); - - TRAPD( err, iIct->InitializeIctL( aTestAccessPoint, aIapId, - aConnectOnly ) ); - if ( err ) - { - LOG_WRITEF( "Ict initialization failed error = %d", err ); - } - - SetActive(); - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrNone ); - } - - return KErrNone; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::DisconnectBearer -// --------------------------------------------------------------------------- -// -TBool CWsfWlanBearerConnectionMonitor::DisconnectBearer() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::DisconnectBearer" ); - - if ( iConnectionId != KNoConnection ) - { - LOG_WRITEF( "closing connection id = %d", iConnectionId ); - iMonitor.SetBoolAttribute( iConnectionId, 0, KConnectionStop, ETrue ); - } - - return ( iConnectionId != KNoConnection ); - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::AbortConnecting -// --------------------------------------------------------------------------- -// -TInt CWsfWlanBearerConnectionMonitor::AbortConnecting() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::AbortConnecting" ); - TInt result = KErrGeneral; - - if ( iConnectingState != ECsIdle ) - { - LOG_WRITE( "connection in progress, aborting"); - iAborting = ETrue; - - if ( IsActive() && iConnectingState == ECsSocketOpened ) - { - LOG_WRITE( "forcing connection to stop" ); - result = iConnection.Stop(); - } - } - return result; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::MonitorAccessPoint -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::MonitorAccessPoint( TUint32 aIapId ) - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::MonitorAccessPoint" ); - iMonitoredAp = aIapId; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::ConnectedWlanConnectionDetailsL -// --------------------------------------------------------------------------- -// -TBool CWsfWlanBearerConnectionMonitor::ConnectedWlanConnectionDetailsL( - TWsfWlanInfo* aWlanInfo ) - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::" - L"ConnectedWlanConnectionDetailsL" ); - - LOG_WRITEF( "Monitor iConnectingState =%d and iConnectionId = %d", - iConnectingState, iConnectionId ); - - if ( iConnectingState == ECsIdle && iConnectionId == KNoConnection ) - { - // Make sure that we have connection id - FindWlanBearerConnectedL(); - } - - if ( iConnectionId == KNoConnection ) - { - return EFalse; - } - - // get the data's from the monitor add them to aWlanInfo.. - aWlanInfo->iConnectionState = EConnected; - aWlanInfo->iVisibility = 1; - aWlanInfo->iCoverage = 1; - aWlanInfo->iNetworkName = KNullDesC8; - - CWsfActiveWaiter* waiter = CWsfActiveWaiter::NewLC(); - - // security mode - TInt securityAttribute( EWlanConnectionSecurityOpen ); - iMonitor.GetIntAttribute( iConnectionId, 0, KSecurityMode, - securityAttribute, waiter->iStatus ); - waiter->WaitForRequest(); - - if ( waiter->iStatus.Int() != KErrNone ) - { - aWlanInfo->iConnectionState = ENotConnected; - CleanupStack::PopAndDestroy( waiter ); - return EFalse; - } - - switch ( securityAttribute ) - { - case EConnMonSecurityWep: - { - aWlanInfo->iSecurityMode = EWlanSecModeWep; - break; - } - - case EConnMonSecurity802d1x: - { - aWlanInfo->iSecurityMode = EWlanSecMode802_1x; - break; - } - - case EConnMonSecurityWpa: // fall-through - case EConnMonSecurityWpaPsk: - { - aWlanInfo->iSecurityMode = EWlanSecModeWpa; - break; - } - - case EConnMonSecurityOpen: // fall-through - default: - { - aWlanInfo->iSecurityMode = EWlanSecModeOpen; - } - } - LOG_WRITEF( "conn.secmode = %d", aWlanInfo->iSecurityMode ); - - aWlanInfo->SetUsesPreSharedKey( - EConnMonSecurityWpaPsk == securityAttribute ); - - LOG_WRITEF( "conn.usespresharedkey = %d", aWlanInfo->UsesPreSharedKey() ); - - // network mode - TInt networkModeAttribute( 0 ); - - iMonitor.GetIntAttribute( iConnectionId, 0, KNetworkMode, - networkModeAttribute, waiter->iStatus ); - waiter->WaitForRequest(); - - if ( waiter->iStatus.Int() != KErrNone ) - { - aWlanInfo->iConnectionState = ENotConnected; - CleanupStack::PopAndDestroy( waiter ); - return EFalse; - } - - if ( networkModeAttribute == EConnMonAdHoc ) - { - aWlanInfo->iNetMode = EAdhoc; - } - else - { - aWlanInfo->iNetMode = EInfra; - } - - LOG_WRITEF( "conn.netmode = %d", aWlanInfo->iNetMode ); - - // iap id - TUint iapIdAttribute( 0 ); - iMonitor.GetUintAttribute( iConnectionId, 0, KIAPId, - iapIdAttribute, waiter->iStatus ); - waiter->WaitForRequest(); - - if ( waiter->iStatus.Int() != KErrNone ) - { - aWlanInfo->iConnectionState = ENotConnected; - CleanupStack::PopAndDestroy( waiter ); - return EFalse; - } - - aWlanInfo->iIapId = iapIdAttribute; - - LOG_WRITEF( "conn.iap = %d", aWlanInfo->iIapId ); - - // signal strength - TInt signStrengthAttribute( 0 ); - iMonitor.GetIntAttribute( iConnectionId, 0, KSignalStrength, - signStrengthAttribute, waiter->iStatus ); - waiter->WaitForRequest(); - - if ( waiter->iStatus.Int() != KErrNone ) - { - aWlanInfo->iConnectionState = ENotConnected; - CleanupStack::PopAndDestroy( waiter ); - return EFalse; - } - - aWlanInfo->iStrengthLevel = signStrengthAttribute; - LOG_WRITEF( "conn.signalstrength = %d", aWlanInfo->iStrengthLevel ); - - if ( aWlanInfo->iIapId ) - { - LOG_WRITE( "IAP id != 0" ); - - RCmConnectionMethodExt cm = iCmMgr.ConnectionMethodL( aWlanInfo->iIapId ); - CleanupClosePushL( cm ); - HBufC* buf = NULL; - - if ( iCmMgr.EasyWlanIdL() != aWlanInfo->iIapId ) - { - LOG_WRITE( "not EasyWLAN" ); - buf = cm.GetStringAttributeL( ECmName ); - } - else - { - LOG_WRITE("Sniffer:EasyWLAN IAP "); - aWlanInfo->iIapId = 0; - buf = cm.GetStringAttributeL( EWlanUsedSSID ); - } - - if ( buf ) - { - TInt error = CnvUtfConverter::ConvertFromUnicodeToUtf8( - aWlanInfo->iSsid, - *buf ); - if ( error ) - { - LOG_WRITE( "ConvertFromUnicodeToUtf8 failed"); - aWlanInfo->iSsid.Copy( *buf ); - } - delete buf; - } - CleanupStack::PopAndDestroy( &cm ); //cm - } - else - { - LOG_WRITE( "IAP id = 0" ); - } - -#ifdef _DEBUG - // Iap & Ssid logging - HBufC* nameUnicode = aWlanInfo->GetIapNameAsUnicodeLC(); - LOG_WRITEF( "aWlanInfo->iNetworkName: [%S]", nameUnicode ); - CleanupStack::PopAndDestroy( nameUnicode ); - - HBufC* ssidUnicode = aWlanInfo->GetSsidAsUnicodeLC(); - LOG_WRITEF( "aWlanInfo->tmpSsid: [%S]", ssidUnicode ); - CleanupStack::PopAndDestroy( ssidUnicode ); -#endif - - CleanupStack::PopAndDestroy( waiter ); - - return ETrue; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::IsConnected -// --------------------------------------------------------------------------- -// -TBool CWsfWlanBearerConnectionMonitor::IsConnected() - { - return ( iConnectionId != KNoConnection ); - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::CheckClientCount -// --------------------------------------------------------------------------- -// -TInt CWsfWlanBearerConnectionMonitor::CheckClientCount( TAny* aPtr ) - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::CheckClientCount" ); - CWsfWlanBearerConnectionMonitor* self = - static_cast( aPtr ); - TInt err( KErrNone ); - - if ( !self->iClientCountMutex ) - { - // in some rare cases this function is reentered because of the - // active scheduler waits, so we need a mutex - self->iClientCountMutex = ETrue; - - TRAP( err, self->CheckClientCountL() ); - - self->iClientCountMutex = EFalse; - } - - return err; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::CheckClientCountL -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::CheckClientCountL() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::CheckClientCountL" ); - - RWsSession wsSession; - if ( KErrNone == wsSession.Connect() ) - { - LOG_WRITE( "Find browser task" ); - TApaTaskList taskList( wsSession ); - TApaTask task = taskList.FindApp( KCRUidBrowser ); - if ( task.Exists() ) - { - LOG_WRITE( "Browser is running - auto disconnect to false" ); - iAutoDisconnect = EFalse; - iInactivityStart.UniversalTime(); - } - else - { - LOG_WRITE( "Browser is not running - auto disconnect to true" ); - iAutoDisconnect = ETrue; - } - wsSession.Close(); - } - else - { - LOG_WRITE( "Session connect failed" ); - } - - if ( iAutoDisconnect ) - { - CWsfActiveWaiter* waiter = CWsfActiveWaiter::NewL(); - - TConnMonClientEnumBuf clientInfo; - - iMonitor.GetPckgAttribute( iConnectionId, 0, - KClientInfo, - clientInfo, - waiter->iStatus ); - waiter->WaitForRequest(); - delete waiter; - - // get the client count - iClientCount = clientInfo().iCount; - - // decrease count by each trivial client (Sniffer server, DHCP etc) - for ( TInt i( 0 ); i < clientInfo().iCount; ++i ) - { - for ( TInt j( 0 ); j < KTrivialClientCount; ++j ) - { - if ( clientInfo().iUid[i] == KTrivialClientUids[j] ) - { - --iClientCount; - LOG_WRITEF( "trivial client [0x%08X] discarded", - clientInfo().iUid[i].iUid ); - break; - } - } - } - - LOG_WRITEF( "iClientCount = %d (trivial clients:%d)", - iClientCount, - clientInfo().iCount - iClientCount ); - - if ( iClientCount ) - { - LOG_WRITE( "reset the inactivity start time to current time" ); - // there are more clients than the default ones -> - // connection is considered active -> - // reset the inactivity start time to current time - iInactivityStart.UniversalTime(); - } - else - { - // there are only trivial clients of the connection - // this means inactivity, so check the time elapsed - LOG_WRITEF( "Connection monitor state = %d", iConnectingState ); - TTime now; - now.UniversalTime(); - - if ( iInactivityStart + TTimeIntervalSeconds( - KMaxConnectionInactivityTime ) <= now ) - { - // inactivity time limit elapsed, connection should be stopped - LOG_WRITE( "inactivity threshold reached, disconnecting..." ); - DisconnectBearer(); - } - - } - - } - - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::ControlDisconnectTimer -// --------------------------------------------------------------------------- -// -TBool CWsfWlanBearerConnectionMonitor::ControlDisconnectTimer( - TUint aAdcCommand ) - { - LOG_ENTERFN("CWsfWlanBearerConnectionMonitor::ControlDisconnectTimer"); - - if ( iConnectionOwned ) - { - if ( aAdcCommand & EAdcTimerReset ) - { - // reset inactivity time - LOG_WRITE( "timer reset" ); - iInactivityStart.UniversalTime(); - } - - if ( aAdcCommand & EAdcStartTimer ) - { - if ( !iAutoDisconnect ) - { - LOG_WRITE( "timer started" ); - iAutoDisconnect = ETrue; - } - else - { - LOG_WRITE( "timer had already been started!" ); - } - } - else - { - iAutoDisconnect = EFalse; - LOG_WRITE( "timer stopped" ); - } - - } - else - { - LOG_WRITE( "connection is not owned!" ); - } - - return iAutoDisconnect; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::ReleaseShutdownMutex -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::ReleaseShutdownMutex( TAny* aPtr ) - { - CWsfWlanBearerConnectionMonitor* self = - static_cast( aPtr ); - self->iShutdownMutex = EFalse; - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::ShutdownOwnedConnectionL -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::ShutdownOwnedConnectionL() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::ShutdownOwnedConnectionL" ); - - // Make sure that the internal status is reset. - iConnectionId = KNoConnection; - - if ( iShutdownMutex ) - { - return; - } - - // make sure we don't lock ourselves forever - CleanupStack::PushL( TCleanupItem( ReleaseShutdownMutex, this ) ); - iShutdownMutex = ETrue; - - - // roll-back the changes - switch ( iConnectingState ) - { - case ECsConnected: - { - // cancelling the periodic callback - iClientPoll->Cancel(); - } - - case ECsConnectionCreated: // fall-through - { - - } - - case ECsSocketOpened: // fall-through - { - // closing the connection handle - LOG_WRITE( "closing the connection handle" ); - iConnection.Close(); - iSocketServ.Close(); - } - - case ECsNotConnected: // fall-through - { - // nothing to put here - } - - } - - - // reset the state machine - iConnectingState = ECsIdle; - iConnectionOwned = EFalse; - - // tell the engine we have released the IAP - iObserver->ConnectedIapReleasedL(); - - - iServerCloser.WaitForOwnedConnection( EFalse ); - - if ( !iAborting ) - { - // notify observers only if connection creation - // was not aborted - iObserver->ConnectionLostL(); - } - - iAborting = EFalse; - - CleanupStack::PopAndDestroy( 1 ); // ReleaseShutdownMutex() - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::RunL -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::RunL() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::RunL" ); - - if ( iAborting ) - { - // if connection creation was aborted, do the cleanup - ShutdownOwnedConnectionL(); - return; - } - - switch ( iConnectingState ) - { - case ECsNotConnected: - { - LOG_WRITE( "" ); - - TInt err( KErrNone ); - err = iSocketServ.Connect(); - - if ( !err ) - { - err = iConnection.Open( iSocketServ ); - } - - if ( err ) - { - // there was an error while connecting - LOG_WRITEF( "connection.Open error = %d", err ); - ShutdownOwnedConnectionL(); - - iObserver->ConnectingFailedL( err ); - break; - } - - TCommDbConnPref connPref; - connPref.SetIapId( iConnIap ); - connPref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); - - iConnectingState = ECsSocketOpened; - SetActive(); - iConnection.Start( connPref, iStatus ); - break; - } - - case ECsSocketOpened: - { - LOG_WRITE( "" ); - if ( iStatus.Int() != KErrNone ) - { - // there was an error while connecting - LOG_WRITE( "connection.Start error" ); - ShutdownOwnedConnectionL(); - - iObserver->ConnectingFailedL( iStatus.Int() ); - - break; - } - - LOG_WRITE( "connection.Start OK" ); - - // get the connection id - TRAPD( error, FindWlanBearerConnectedL(); ); - if ( error || iConnectionId == KNoConnection ) - { - // At this point we really need the connection id if it exists - // without connection id server is in very unbalanced state - LOG_WRITEF( "FindWlanBearerConnectedL error=%d", error ); - ShutdownOwnedConnectionL(); - - iObserver->ConnectingFailedL( ( error )? error : KErrGeneral ); - - break; - } - - iConnectingState = ECsConnectionCreated; - SetActive(); - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrNone ); - break; - } - - case ECsConnectionCreated: - { - LOG_WRITE( "" ); - - // start monitoring the iap - MonitorAccessPoint( iConnIap ); - - // reset inactivity time - iInactivityStart.UniversalTime(); - iAutoDisconnect = EFalse; - - iClientPoll->Start( - TTimeIntervalMicroSeconds32( KClientPollInterval ), - TTimeIntervalMicroSeconds32( KClientPollInterval ), - TCallBack( CheckClientCount, this ) ); - - LOG_WRITE( "connection client polling started" ); - - // notify observers of the connection name - iObserver->ConnectionEstablishedL( iWlanNetworkName ); - - TRAPD( err, iIct->TestConnectedAccessPointL( iConnIap ) ); - if ( err ) - { - LOG_WRITEF( "Ict start failed error = %d", err ); - } - - iConnectingState = ECsConnected; - break; - } - - default: - { - } - } - - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::DoCancel -// --------------------------------------------------------------------------- -// -void CWsfWlanBearerConnectionMonitor::DoCancel() - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::DoCancel" ); - - // we were in the middle of a connection creation process - iAborting = ETrue; - TRAP_IGNORE( ShutdownOwnedConnectionL() ); - } - - -// --------------------------------------------------------------------------- -// CWsfWlanBearerConnectionMonitor::RunError -// --------------------------------------------------------------------------- -// -#ifdef _DEBUG -TInt CWsfWlanBearerConnectionMonitor::RunError( TInt aError ) - { - LOG_ENTERFN( "CWsfWlanBearerConnectionMonitor::RunError" ); - LOG_WRITEF( "error = %d", aError ); -#else -TInt CWsfWlanBearerConnectionMonitor::RunError( TInt /*aError*/ ) - { -#endif - return KErrNone; - } - -