alwayson_net_plugin/pdpcontextmanager2/src/caoconnectionmanager.cpp
changeset 0 5a93021fdf25
child 41 bbb64eb3bdee
--- /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 ) );
+    }