mmsharing/mmshavailability/src/musavaconnectionavailability.cpp
changeset 0 f0cf47e981f9
child 22 73a1feb507fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/mmshavailability/src/musavaconnectionavailability.cpp	Thu Dec 17 08:44:37 2009 +0200
@@ -0,0 +1,590 @@
+/*
+* Copyright (c) 2005-2007 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:   Provide interface for the client requestin availability class.
+*
+*/
+
+
+
+#include "musavaconnectionavailability.h"
+#include "musavaavailabilityobserver.h"
+#include "musavasettingsimp.h"
+#include "musavaobserver.h"
+#include "musavaavailability.h"
+#include "musavasharedobject.h"
+#include "musavaconnectionmonitor.h"
+#include "musavanetworkregistrationstatus.h"
+#include "musavanetworkmodestatus.h"
+#include "musavasip.h"
+#include "mussettings.h"
+#include "mussettingskeys.h"
+#include "muslogger.h"
+
+#include <e32base.h>
+#include <rconnmon.h>
+#include <e32cmn.h>
+#include <etelmm.h>
+#include <nifvar.h>
+
+
+// --------------------------------------------------------------------------
+// Symbian two-phase constructor
+// --------------------------------------------------------------------------
+//
+CMusAvaConnectionAvailability* CMusAvaConnectionAvailability::NewL(
+    MMusAvaAvailabilityObserver& aObserver,
+    CMusAvaSettingsImp& aSettings  )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::NewL()" )
+    CMusAvaConnectionAvailability* self =
+        CMusAvaConnectionAvailability::NewLC(
+            aObserver, aSettings );
+    CleanupStack::Pop( self );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::NewL()" )
+    return self;
+    }
+
+
+// -------------------------------------------------------------------------
+//  Two-phased constructor.
+// -------------------------------------------------------------------------
+//
+CMusAvaConnectionAvailability* CMusAvaConnectionAvailability::NewLC(
+    MMusAvaAvailabilityObserver& aObserver, 
+    CMusAvaSettingsImp& aSettings  )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::NewLC()" )
+    CMusAvaConnectionAvailability* self =
+        new( ELeave ) CMusAvaConnectionAvailability(
+            aObserver, aSettings );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::NewLC()" )
+    return self;
+    }
+
+
+// -------------------------------------------------------------------------
+//  Destructor.
+// -------------------------------------------------------------------------
+//
+CMusAvaConnectionAvailability::~CMusAvaConnectionAvailability()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::\
+        ~CMusAvaConnectionAvailability()" )
+    if( iSharedObj )
+        {
+        iSharedObj->DeleteSingleton();
+        }
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::\
+        ~CMusAvaConnectionAvailability()" )
+    }
+
+
+// -------------------------------------------------------------------------
+//  Constructor.
+// -------------------------------------------------------------------------
+//
+CMusAvaConnectionAvailability::CMusAvaConnectionAvailability(
+    MMusAvaAvailabilityObserver& aObserver, 
+    CMusAvaSettingsImp& aSettings  )
+    :CMusAvaAvailability( aObserver ),
+    iSettings( aSettings )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CMusAvaConnectionAvailability::ConstructL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::ConstructL()" )
+    iSharedObj = CMusAvaSharedObject::GetSingletonL();
+    iNetworkRegistrationStatus =  &iSharedObj->MusAvaTelephonyStatus();
+    iNetworkModeStatus = &iSharedObj->NetworkModeStatus();
+    iConnectionMonitor = &iSharedObj->ConnectionMonitor();
+    iNetworkRegistrationStatus->AddAdapterL( *this );
+	iNetworkModeStatus->AddAdapterL( *this );
+	iConnectionMonitor->AddAdapterL( *this );
+	iConnectionMonitor->NotifyEventL();
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::ConstructL()" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// From CMusAvaAvailability.
+// Executes for the availability.
+// ---------------------------------------------------------------------------
+//
+void CMusAvaConnectionAvailability::DoExecuteL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::DoExecuteL()" )
+	MMusAvaObserver::TAvailabilityStatus status; 
+    MUS_LOG( "mus: [MUSAVA]  Check network mode" )
+    RMobilePhone::TMobilePhoneNetworkMode networkmode = 
+                                        iNetworkModeStatus->PhoneNetworkMode();
+    if ( networkmode == RMobilePhone::ENetworkModeWcdma||
+         networkmode == RMobilePhone::ENetworkModeTdcdma ||
+         networkmode == RMobilePhone::ENetworkModeCdma95 ||
+         networkmode == RMobilePhone::ENetworkModeCdma2000 )
+        {
+        status = NetworkRegistrationAndSettingsL();
+    	if ( status == MMusAvaObserver::EMusAvaStatusAvailable )
+	        {
+	        MUS_LOG( "mus: [MUSAVA]  Network available" )
+	        SetState( status );
+	        }
+        else
+            {
+            MUS_LOG1( "mus: [MUSAVA] Activation error: %d", status )
+            SetState( status );
+            }        
+        }
+    else if( networkmode == RMobilePhone::ENetworkModeGsm)
+    	{
+    	TInt edgeDtmSupport = KErrNone;
+        TRAPD( err, edgeDtmSupport = 
+                       MultimediaSharingSettings::EdgeDtmSupportSettingL() );
+        if( err != KErrNone )
+            {
+            MUS_LOG1( "mus: [MUSAVA]  Reading activation setting error:%d", err )
+            SetState( MMusAvaObserver::EMusActivationError );
+            }
+        else if( edgeDtmSupport == MusSettingsKeys::EDtmModeAllowed )
+            { 
+            MUS_LOG( "mus: [MUSAVA]  Edge Network Mode allowed in settings " )     
+            if( iConnectionMonitor->ConnectionCount() > 0)       
+                {
+                MUS_LOG( "mus: [MUSAVA]  Atlease one packect connection exists " )     
+                SetState( NetworkRegistrationAndSettingsL() );  
+                }
+            else
+                {
+                MUS_LOG( "mus: [MUSAVA]  No Packet connection exists now." )     
+                SetState( MMusAvaObserver::EMusAvaEdgeDtmStatusUnknown );                    
+                }            
+            }
+        else
+            {
+            MUS_LOG( "mus: [MUSAVA]  Edge Network Mode Not allowed in settings " )     
+            SetState( MMusAvaObserver::EMusAvaNetworkType );    
+            }
+    	}
+    else
+        {
+        MUS_LOG( "mus: [MUSAVA] Network not available" )
+        SetState( MMusAvaObserver::EMusAvaNetworkType );
+        }
+    
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::DoExecuteL()" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+TBool CMusAvaConnectionAvailability::OperatorVariant()
+    {
+    MusSettingsKeys::TOperatorVariant variantValue = MusSettingsKeys::EStandard;
+    TRAPD( error, variantValue = 
+                  MultimediaSharingSettings::OperatorVariantSettingL() );
+    
+    return ( variantValue == MusSettingsKeys::EOperatorSpecific && 
+             error == KErrNone );
+     
+    }
+
+// ---------------------------------------------------------------------------
+// From CMusAvaAvailability.
+// Stops execution.
+// ---------------------------------------------------------------------------
+//
+void CMusAvaConnectionAvailability::Stop()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::Stop()" )
+    
+    iNetworkRegistrationStatus->RemoveAdapter( *this );
+    iNetworkModeStatus->RemoveAdapter( *this );
+    iConnectionMonitor->RemoveAdapter( *this );
+    
+    SetState( MMusAvaObserver::EMusAvaStatusNotExecuted );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::Stop()" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// From CMusAvaAvailability.
+// Returns name of *this* availability module.
+// ---------------------------------------------------------------------------
+//
+MMusAvaObserver::TAvailabilityName CMusAvaConnectionAvailability::Name()
+    {
+    return MMusAvaObserver::EMusAvaBearerStatus;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMusAvaConnectionAvailability::PhoneNetworkModeStatus
+// 
+// ---------------------------------------------------------------------------
+//
+void CMusAvaConnectionAvailability::PhoneNetworkModeStatus(
+                            RMobilePhone::TMobilePhoneNetworkMode aStatus )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::\
+    PhoneNetworkModeStatus()" )
+    MUS_LOG1( "mus: [MUSAVA] Mobile Phone Network Status = ", aStatus )
+
+    switch ( aStatus )
+        {
+        case RMobilePhone::ENetworkModeWcdma :
+        case RMobilePhone::ENetworkModeTdcdma :
+        case RMobilePhone::ENetworkModeCdma95:
+        case RMobilePhone::ENetworkModeCdma2000:
+            {
+            MMusAvaObserver::TAvailabilityStatus status = 
+                                        MMusAvaObserver::EMusActivationError;
+            TRAP_IGNORE( status = NetworkRegistrationAndSettingsL() );
+            SetState( status );
+            break;
+            }
+        case RMobilePhone::ENetworkModeGsm : // For EDGE /DTM support
+            {
+            TInt edgeDtmSupport = 0;
+            TRAPD( err, edgeDtmSupport = 
+                       MultimediaSharingSettings::EdgeDtmSupportSettingL() );
+            if( err != KErrNone )
+                {
+                MUS_LOG1( "mus: [MUSAVA]  Reading activation setting error:%d", err )
+                SetState( MMusAvaObserver::EMusActivationError );
+                }
+            else if( edgeDtmSupport == MusSettingsKeys::EDtmModeAllowed )
+                { 
+                MUS_LOG( "mus: [MUSAVA]  Edge Network supported " )            
+                SetState( MMusAvaObserver::EMusAvaEdgeDtmStatusUnknown );                               
+                }
+            else
+                {
+                SetState( MMusAvaObserver::EMusAvaNetworkType );    
+                }
+            break;
+            }
+         default :
+            {
+            SetState( MMusAvaObserver::EMusAvaNetworkType );
+            }
+        }
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::\
+    PhoneNetworkModeStatus()" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMusAvaConnectionAvailability::NetworkRegistrationStatus
+// 
+// ---------------------------------------------------------------------------
+//
+void CMusAvaConnectionAvailability::NetworkRegistrationStatus(
+                    RMobilePhone::TMobilePhoneRegistrationStatus aRegStatus )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::\
+NetworkRegistrationStatus()" )
+    MUS_LOG1( "Mobile Phone Network Status = ", aRegStatus )
+    
+    if( OperatorVariant() &&
+        aRegStatus != RMobilePhone::ERegisteredOnHomeNetwork )
+        {
+        MUS_LOG( "mus: [MUSAVA]  Roaming not allowed" )
+        SetState( MMusAvaObserver::EMusAvaRoamingError );
+        }
+
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::\
+NetworkRegistrationStatus()" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMusAvaConnectionAvailability::EventL
+//
+// ---------------------------------------------------------------------------
+//
+void CMusAvaConnectionAvailability::EventL(
+                                        const CConnMonEventBase& aConnMonEvent)
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::EventL()" )
+    TInt connectionId = 0;
+    TInt event = aConnMonEvent.EventType();
+    TUint connId = aConnMonEvent.ConnectionId();
+    CMusAvaConnectionMonitor& connectionMonitor = 
+                                            iSharedObj->ConnectionMonitor();
+    TUint musConnID = connectionMonitor.CreatedConnectionID();
+    MUS_LOG1( "mus: [MUSAVA] Current connection ID %d = ", musConnID )
+    MUS_LOG1( "mus: [MUSAVA] Event connection ID %d = ", connId )
+
+    switch ( event )
+        {
+        case EConnMonCreateConnection:
+            {
+            MUS_LOG( "mus: [MUSAVA] Event type = EConnMonCreateConnection" )
+            if( musConnID == 0 )
+                {
+                MUS_LOG( "mus: [MUSAVA] Store Connection ID" )
+                TRAPD( err, connectionId = 
+                                        iConnectionMonitor->ConnectionIDL() );
+                if ( err == KErrNotFound )
+                    {
+                    SetState( MMusAvaObserver::EMusAvaConnectionErr );
+                    }
+               	else
+                    {
+                    iConnectionMonitor->SetConnectionID( connectionId );
+                    }
+                }
+            break;
+            }
+        case EConnMonDeleteConnection:
+            {
+            MUS_LOG( "mus: [MUSAVA] Event type = EConnMonDeleteConnection" )
+            if( connId == musConnID )
+                {
+                SetState( MMusAvaObserver::EMusAvaConnectionErr );
+                }
+                break;
+                }
+         case EConnMonConnectionStatusChange:
+            {
+            MUS_LOG( "mus: [MUSAVA] Event type = \
+EConnMonConnectionStatusChange" )
+            const CConnMonConnectionStatusChange* connectionStatusChange
+                 = (const CConnMonConnectionStatusChange*)(&aConnMonEvent);
+            TInt connStatus = connectionStatusChange->ConnectionStatus();
+            MUS_LOG1( "mus: [MUSAVA] ConnectionStatus =  %d", connStatus )
+            if ( connId == musConnID )
+                {
+                if( connStatus == KConnectionFailure ||
+                    connStatus == KConnectionClosed ||
+                    connStatus == KDataTransferTemporarilyBlocked ||
+                    connStatus == KLinkLayerClosed ||
+                    connStatus == KPsdSuspended ||
+                    connStatus == KPsdFinishedDeactivation )
+                    {
+                    SetState( MMusAvaObserver::EMusAvaConnectionErr );
+                    }
+                if( connStatus == KConnectionOpen ||
+                    connStatus == KLinkLayerOpen )
+                    {
+                    SetState( NetworkRegistrationAndSettingsL() );
+                    }
+                }
+            break;
+            }
+        case EConnMonNetworkStatusChange:
+            {
+            MUS_LOG( "mus: [MUSAVA] Event type = EConnMonNetworkStatusChange" )
+            const CConnMonNetworkStatusChange* networkStatusChange
+                 = (const CConnMonNetworkStatusChange*)(&aConnMonEvent);
+			TInt networkStatus = networkStatusChange->NetworkStatus();
+            MUS_LOG1( "mus: [MUSAVA] NetworkStatus =  %d", networkStatus )
+            if( connId == EBearerIdWCDMA || connId == EBearerIdWcdmaCSD )
+            	{
+            	if( EConnMonStatusAttached == networkStatus ||
+            	    EConnMonStatusActive == networkStatus )
+                    {
+                    SetState( NetworkRegistrationAndSettingsL() );
+                    }
+             	else
+                    {
+                    SetState( MMusAvaObserver::EMusAvaConnectionErr );
+                    }
+            	}
+            break;
+            }
+        case EConnMonNetworkRegistrationChange:
+            {
+            MUS_LOG( "mus: [MUSAVA] Event type = \
+EConnMonNetworkRegistrationChange" )
+            const CConnMonNetworkRegistrationChange* registrationChange
+                 = (const CConnMonNetworkRegistrationChange*)(&aConnMonEvent);
+            TInt registrationStatus = registrationChange->RegistrationStatus();
+            MUS_LOG1( "mus: [MUSAVA] RegistrationStatus =  %d", 
+                    registrationStatus )
+            if( connId == EBearerIdWCDMA || connId == EBearerIdWcdmaCSD )
+                {
+                if ( ENetworkRegistrationRoaming == registrationStatus )
+                {
+                SetState( MMusAvaObserver::EMusAvaRoamingError );
+                }
+            else
+                {
+                SetState( NetworkRegistrationAndSettingsL() );
+                }
+            }
+            break;
+            }
+        case EConnMonBearerChange:
+            {
+            MUS_LOG( "mus: [MUSAVA] Event type = EConnMonBearerChange" )
+            MUS_LOG1( "mus: [MUSAVA] Bearer =  %d",connId )
+            if( connId == EBearerIdGPRS ||
+                connId == EBearerIdWCDMA || 
+                connId == EBearerIdWcdmaCSD )
+                {
+                SetState( NetworkRegistrationAndSettingsL() );
+                }
+            else
+                {
+                SetState( MMusAvaObserver::EMusAvaNetworkType );
+                }
+            break;
+            }
+
+        case EConnMonPacketDataAvailable:
+            {
+            MUS_LOG( "mus: [MUSAVA] EConnMonPacketDataAvailable" )
+            /* This is for EDGE /DTM support , This is the only place we can be 
+               sure that packet data available along with CS call. Here we have to
+               check again for activation settings and based on that availability 
+               state has to be set
+            */
+            MMusAvaObserver::TAvailabilityStatus status
+                                                = NetworkRegistrationAndSettingsL();
+            SetState( status );            
+            break;
+            }
+
+        case EConnMonPacketDataUnavailable:
+            {
+            SetState( MMusAvaObserver::EMusAvaNetworkType );
+            MUS_LOG( "mus: [MUSAVA] EConnMonPacketDataUnavailable" )
+            break;
+            }
+
+        case EConnMonBearerInfoChange:
+            {
+            MUS_LOG( "mus: [MUSAVA] EConnMonBearerInfoChange" )           
+            break;
+            }
+        default :
+            {
+            MUS_LOG( "mus: [MUSAVA] Event type is not implemented" )
+            MUS_LOG1( "mus: [MUSAVA] Event type %d = ", event )
+            break;
+            }
+        }
+
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::EventL()" )
+    }
+
+// -------------------------------------------------------------------------
+// CMusAvaConnectionAvailability::MusAvaManualActivation
+//
+// -------------------------------------------------------------------------
+//    
+MMusAvaObserver::TAvailabilityStatus CMusAvaConnectionAvailability::
+    ManualActivationL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::\
+ManualActivationL()" )
+
+    if( OperatorVariant() )
+    	{
+    	MUS_LOG( "mus: [MUSAVA] Operator Specific No Manual query" )
+    	MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::\
+NetworkRegistrationAndSettingsL()" )
+    	return MMusAvaObserver::EMusActivationError;	
+    	}
+    else
+        {
+        if ( iSettings.ManualActivation() == 
+            MMusAvaSettings::EActivationAllowed )
+            {
+            MUS_LOG( "mus: [MUSAVA] Manual activation allowed" )
+            MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::\
+ManualActivationL()" )
+            return MMusAvaObserver::EMusAvaStatusAvailable;	
+            }
+        else if ( iSettings.ManualActivation() == 
+            MMusAvaSettings::EActivationNotExecuted )
+            {
+            MUS_LOG( "mus: [MUSAVA] Manual activation is not executed" )
+            MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::\
+ManualActivationL()" )
+            return MMusAvaObserver::EMusAvaManualActivation;	
+            }
+        else
+            {
+            MUS_LOG( "mus: [MUSAVA] Activation error" )
+            MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::\
+ManualActivationL()" )
+            return MMusAvaObserver::EMusActivationError;	
+            }
+        }
+    }
+
+// -------------------------------------------------------------------------
+// CMusAvaConnectionAvailability::NetworkRegistrationAndSettingsL
+//
+// -------------------------------------------------------------------------
+//
+MMusAvaObserver::TAvailabilityStatus CMusAvaConnectionAvailability::
+    NetworkRegistrationAndSettingsL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionAvailability::\
+NetworkRegistrationAndSettingsL()" )
+    MUS_LOG( "mus: [MUSAVA]  Check registration network status" )
+    MUS_LOG( "mus: [MUSAVA]  Check roaming" )
+
+    RMobilePhone::TMobilePhoneRegistrationStatus regStatus;
+    iNetworkRegistrationStatus->NetworkRegistration( regStatus );
+
+    MUS_LOG1( "mus: [MUSAVA]     NetworkRegistration returned %d", regStatus )
+
+    MMusAvaObserver::TAvailabilityStatus status;
+    MusSettingsKeys::TActivation activation = MusSettingsKeys::EAlwaysActive;
+  
+    activation = MultimediaSharingSettings::ActivationSettingL();
+    TBool operatorVariant = OperatorVariant();
+    
+    MUS_LOG1( "mus: [MUSAVA]     ActivationSetting returned %d", 
+        activation )
+    
+    //VS off
+    if ( activation != MusSettingsKeys::EAlwaysActive )
+        {
+        status = MMusAvaObserver::EMusActivationError;
+        }
+    //VS on
+    else
+        {
+        //roaming
+        if( regStatus == RMobilePhone::ERegisteredRoaming )
+            {
+            status = ManualActivationL();        
+            }
+        //other states including also not registered states, thus
+        //failing of PDP context activation will be detected elsewhere
+        else
+            {
+            status = MMusAvaObserver::EMusAvaStatusAvailable;   
+            }
+        }
+    
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionAvailability::\
+NetworkRegistrationAndSettingsL()" )
+    return status;
+    }
+
+