diff -r 000000000000 -r 5a93021fdf25 alwayson_net_plugin/pdpcontextmanager2/src/caoconnectionmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alwayson_net_plugin/pdpcontextmanager2/src/caoconnectionmanager.cpp Thu Dec 17 08:55:21 2009 +0200 @@ -0,0 +1,464 @@ +/* +* Copyright (c) 2004,2006 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: Implements the CAOConnectionManager class +* +*/ + +// INCLUDE FILES +#include "caoconnectionmanager.h" +#include "logger.h" +#include "caoconnection.h" +#include "caoconnectionmonitor.h" +#include "maoconnectionmanagerobserver.h" + +// METHODS + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CAOConnectionManager* CAOConnectionManager::NewL( + MAOConnectionManagerObserver& aObserver, + MAOSettings& aSettings ) + { + LOG_1( _L("CAOConnectionManager::NewL") ); + + CAOConnectionManager* self = new( ELeave ) + CAOConnectionManager( aObserver, aSettings ); + + CleanupStack::PushL( self ); + self->ConstructL( aSettings ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CAOConnectionManager::~CAOConnectionManager() + { + LOG_1( _L("CAOConnectionManager::~CAOConnectionManager") ); + + for ( TInt i=0; i < iLingerArray.Count(); i++ ) + { + delete iLingerArray[ i ]; + } + + iLingerArray.Reset(); + iLingerArray.Close(); + + delete iConnectionMonitor; + delete iConnection; + iSocketServ.Close(); + } + + +// --------------------------------------------------------------------------- +// CAOConnectionManager::FetchNetworkRegistrationStatus +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::FetchNetworkRegistrationStatus() + { + LOG_1( _L("CAOConnectionManager::FetchNetworkRegistrationStatus") ); + + iConnectionMonitor->FetchNetworkRegistrationStatus(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::ActivatePDPContext +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::ActivatePDPContextL() + { + LOG_1( _L("CAOConnectionManager::ActivatePDPContextL") ); + + iConnection->ActivateConnection(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::IsPDPContextActive +// --------------------------------------------------------------------------- +// +TBool CAOConnectionManager::IsPDPContextActive() const + { + LOG_1( _L("CAOConnectionManager::IsPDPContextActive") ); + + return iConnection->IsConnectedToDefaultIAP(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::CloseConnection +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::CloseConnection() + { + LOG_1( _L("CAOConnectionManager::CloseConnection") ); + + iConnection->CancelConnection(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::DetachConnection +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::DetachConnection() + { + LOG_1( _L("CAOConnectionManager::DetachConnection") ); + + iConnection->CloseConnection(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::NetworkType +// --------------------------------------------------------------------------- +// +MAOConnectionManager::TNetworkType CAOConnectionManager::NetworkType() const + { + LOG_1( _L("CAOConnectionManager::NetworkType") ); + + MAOConnectionManager::TNetworkType nwType = ENotRegistered; + switch ( iConnectionMonitor->NetworkRegistration() ) + { + case CTelephony::ERegisteredOnHomeNetwork: + { + nwType = EHPLMN; + break; + } + case CTelephony::ERegisteredRoaming: + { + nwType = EVPLMN; + break; + } + default: + { + // Other types are considered as not registered. + break; + } + } + LOG_2( _L("CAOConnectionManager::NetworkType: NWType: %d"), + nwType ); + + return nwType; + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::NumberOfConnections +// --------------------------------------------------------------------------- +// +TInt CAOConnectionManager::NumberOfConnections() + { + LOG_1( _L("CAOConnectionManager::NumberOfConnections") ); + + TInt numOfConnections = iConnection->NumberOfConnections(); + LOG_2( _L("> Connection count: %d"), numOfConnections ); + + return numOfConnections; + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::HandleSettingsChangedL +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::HandleSettingsChangedL() + { + LOG_1( _L("CAOConnectionManager::HandleSettingsChangedL") ); + + + // Check if always-on iap should stop linger + for ( TInt i=0; i < iLingerArray.Count(); i++ ) + { + if ( iLingerArray[ i ]->IapId() == iSettings.AccessPointId() ) + { + // Always-on IAP + if ( IsAlwaysOnEnabled() ) + { + iLingerArray[ i ]->StopLinger(); + } + else + { + iLingerArray[ i ]->HandleSettingsChanged(); + } + } + else + { + // common IAP + iLingerArray[ i ]->HandleSettingsChanged(); + } + } + } + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CAOConnectionManager::CAOConnectionManager( + MAOConnectionManagerObserver& aObserver, + MAOSettings& aSettings ): + iObserver( aObserver ), + iSettings( aSettings ) + { + LOG_1( _L("CAOConnectionManager::CAOConnectionManager") ); + } + +// --------------------------------------------------------------------------- +// Symbian 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::ConstructL( MAOSettings& aSettings ) + { + LOG_1( _L("CAOConnectionManager::ConstructL") ); + + User::LeaveIfError( iSocketServ.Connect() ); + + iConnection = CAOConnection::NewL( *this, aSettings, &iSocketServ ); + iConnectionMonitor = CAOConnectionMonitor::NewL( *this, aSettings ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::IsAlwaysOnEnabled() +// --------------------------------------------------------------------------- +// +TBool CAOConnectionManager::IsAlwaysOnEnabled() + { + LOG_1( _L("CAOConnectionManager::IsAlwaysOnEnabled") ); + + TBool alwaysOnEnabled( EFalse ); + + MAOConnectionManager::TNetworkType nwType = NetworkType(); + + if ( nwType == MAOConnectionManager::EHPLMN ) + { + if ( iSettings.AlwaysOnSupportedInHPLMN() ) + { + alwaysOnEnabled = ETrue; + } + } + else if ( nwType == MAOConnectionManager::EVPLMN ) + { + if ( iSettings.AlwaysOnSupportedInVPLMN() ) + { + alwaysOnEnabled = ETrue; + } + } + else + { + alwaysOnEnabled = EFalse; + } + + return alwaysOnEnabled; + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::HandlePDPContextActivatedL +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::HandlePDPContextActivatedL() + { + LOG_1( _L("CAOConnectionManager::HandlePDPContextActivatedL") ); + + iObserver.HandlePDPContextActivatedL(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::HandlePDPContextActivationFailedL +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::HandlePDPContextActivationFailedL( + MAOConnectionManager::TFailureReason aReason ) + { + LOG_1( _L("CAOConnectionManager::HandlePDPContextActivationFailedL") ); + + iObserver.HandlePDPContextActivationFailedL( aReason ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::HandlePDPContextDisconnectedL +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::HandlePDPContextDisconnectedL( + MAOConnectionManager::TFailureReason aReason ) + { + LOG_1( _L("CAOConnectionManager::HandlePDPContextDisconnectedL") ); + + iObserver.HandlePDPContextDisconnectedL( aReason ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::HandlePDPContextTemporarilyBlockedL +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::HandlePDPContextTemporarilyBlockedL() + { + LOG_1( _L("CAOConnectionManager::HandlePDPContextTemporarilyBlockedL") ); + + iObserver.HandlePDPContextTemporarilyBlockedL(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::HandleNWRegistrationStatusChangedL +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::HandleNWRegistrationStatusChangedL( + CTelephony::TRegistrationStatus aNetworkRegistration ) + { + LOG_1( _L("CAOConnectionManager::HandleNWRegistrationStatusChangedL") ); + + MAOConnectionManager::TNetworkType nwType = NetworkType(); + + // Check if always-on iap should start/stop linger + for ( TInt i=0; i < iLingerArray.Count(); i++ ) + { + if ( iLingerArray[ i ]->IapId() == iSettings.AccessPointId() ) + { + if ( IsAlwaysOnEnabled() ) + { + iObserver.HandleNWRegistrationStatusChangedL( aNetworkRegistration ); + iLingerArray[ i ]->StopLinger(); + return; + } + else if ( nwType != MAOConnectionManager::ENotRegistered ) + { + iLingerArray[ i ]->StartLinger(); + iObserver.HandleNWRegistrationStatusChangedL( aNetworkRegistration ); + return; + } + + break; + } + } + + iObserver.HandleNWRegistrationStatusChangedL( aNetworkRegistration ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::HandleExternalConnectionCreatedL +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::HandleExternalConnectionCreatedL() + { + LOG_1( _L("CAOConnectionManager::HandleExternalConnectionCreatedL") ); + + iObserver.HandleExternalConnectionCreatedL(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::HandleConnectionDeletedL +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::HandleConnectionDeletedL( const TUint aConnectionId, + const TBool aForward ) + { + LOG_1( _L("CAOConnectionManager::HandleConnectionDeletedL") ); + + // Check if this is a linger connection + for ( TInt i=0; i < iLingerArray.Count(); i++ ) + { + if ( iLingerArray[ i ]->ConnectionId() == aConnectionId ) + { + delete iLingerArray[ i ]; + iLingerArray.Remove( i ); + break; + } + } + + if ( aForward ) + { + iObserver.HandleConnectionDeletedL( aConnectionId, aForward ); + } + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::HandleInternalConnectionCreatedL +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::HandleInternalConnectionCreatedL( + const TUint aConnectionId, + const TUint aIapId, + const TUint aNetId ) + { + LOG_1( _L("CAOConnectionManager::HandleInternalConnectionCreatedL") ); + + CLingerConnection* ptr = NULL; + TInt err( KErrNone ); + + // Check if there is already a linger object for this connection + for ( TInt i=0; i < iLingerArray.Count(); i++ ) + { + if ( iLingerArray[ i ]->ConnectionId() == aConnectionId ) + { + delete iLingerArray[ i ]; + iLingerArray.Remove( i ); + break; + } + } + + if ( ptr == NULL ) + { + TConnectionInfo connInfo; + + connInfo.iIapId = aIapId; + connInfo.iNetId = aNetId; + + ptr = CLingerConnection::NewL( aConnectionId, + connInfo, + iSettings, + &iSocketServ ); + + iLingerArray.Append( ptr ); + } + + + if ( iSettings.AccessPointId() == aIapId ) + { + // Always-on-iap + if ( !IsAlwaysOnEnabled() ) + { + // Start linger since iap is not in always-on mode + err = ptr->StartLinger(); + + if ( err ) + { + // write to log + LOG_2( _L("ptr->StartLinger: err: %d"), err ); + } + } + } + else + { + // common iap + err = ptr->StartLinger(); + + if ( err ) + { + // write to log + LOG_2( _L("ptr->StartLinger: err: %d"), err ); + } + } + } + +// --------------------------------------------------------------------------- +// CAOConnectionManager::HandleError +// --------------------------------------------------------------------------- +// +void CAOConnectionManager::HandleError( TInt /*aError*/ ) + { + LOG_1( _L("CAOConnectionManager::HandleError") ); + + // Notify that PDP context has disconnected since there is something wrong + // with network + TRAP_IGNORE( iObserver.HandlePDPContextDisconnectedL( + MAOConnectionManager::EDisconnected ) ); + }