sipplugins/sippwlanplugin/Src/CWLanBearerMonitor.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 23 Jun 2010 18:36:31 +0300
changeset 34 3c8db403127f
parent 0 307788aac0a8
permissions -rw-r--r--
Revision: 201023 Kit: 2010125

/*
* Copyright (c) 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:  Implementation.
*
*/

#include "CWLanBearerMonitor.h"
#include "sipbearerowner.h"
#include "CWLanConnUsagePermissionMonitor.h"
#include "sipwlanlog.h"
#include <wlanerrorcodes.h>

const TInt KCompletionTime = 1;

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::NewL
// -----------------------------------------------------------------------------
//
CWLanBearerMonitor* CWLanBearerMonitor::NewL( TAny* aParams )
	{
	CWLanBearerMonitor* self = new( ELeave ) CWLanBearerMonitor( aParams );
	CleanupClosePushL( *self );
	self->ConstructL();
	CleanupStack::Pop(); // self
	return self;
	}

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::~CWLanBearerMonitor
// -----------------------------------------------------------------------------
//
CWLanBearerMonitor::~CWLanBearerMonitor()
	{
	if( iAsyncCompletionTimer )
	    {
    	iAsyncCompletionTimer->Remove( iTimerEntry );
	    }
    delete iAsyncCompletionTimer;
    
	delete iUsagePermissionMonitor;
	
	// Cancel notifications and close connection monitor session
	iConnMon.CancelNotifications();
	iConnMon.Close();
	}

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::RefreshL
// -----------------------------------------------------------------------------
//	
void CWLanBearerMonitor::RefreshL( TInt aError )
    {  

    SIPWLAN_LOG("CWLanBearerMonitor::RefreshL, calling SetCurrentAvailabilityL()")
    SetCurrentAvailabilityL();
	if(!aError)
	{
    SIPWLAN_LOG("CWLanBearerMonitor::RefreshL, calling IssueActivityNotification()")
    IssueActivityNotification();
	}
	
    }
// -----------------------------------------------------------------------------
// CWLanBearerMonitor::ContinueMonitoring
// -----------------------------------------------------------------------------
//        
TBool CWLanBearerMonitor::ContinueMonitoring( TInt aError )
    {
    SIPWLAN_INTLOG("CWLanBearerMonitor::ContinueMonitoring", aError)
    return !IapSettingsInvalid( aError );
    }

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::EventL
// -----------------------------------------------------------------------------
//
void CWLanBearerMonitor::EventL( const CConnMonEventBase& aConnMonEvent )
    {
    SIPWLAN_LOG("CWLanBearerMonitor::EventL")
    
	// We're interested only on iap availability notifications
	if( ( aConnMonEvent.EventType() == EConnMonIapAvailabilityChange ) &&
		( aConnMonEvent.ConnectionId() == EBearerIdAll ) )
	    {	    
	    // Typecast event to appropriate event type
		const CConnMonIapAvailabilityChange& event =
			static_cast< const CConnMonIapAvailabilityChange& >( aConnMonEvent );
			
		// Check availability and report to our owner
		MSIPNetworkObserver::TNetworkState newState = 
		    IsAvailable( event.IapAvailability(), iIapId ) ? 
            	    MSIPNetworkObserver::ENetworkActive : 
            	    MSIPNetworkObserver::ENetworkInactive;

        SIPWLAN_INTLOG("CWLanBearerMonitor::EventL: new state", newState)

        // Report only if state of monitored iap changed
	    if ( iState != newState )
	        {
	        iState = newState;
	        iParent.BearerStateChanged( this, KErrNone );
	        }
	    }
	}

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::UsagePermissionChanged
// -----------------------------------------------------------------------------
//	
void CWLanBearerMonitor::UsagePermissionChanged( 
    TBool aPermissionToUse, 
    TInt aError )
    {
    iUsagePermission = aPermissionToUse;
    
    if ( !aError )
        {
        // Don't wait for availability changed event if not necessary since
        // it may take several minutes (even if IAP is already available).
        TRAP( aError, SetCurrentAvailabilityL() );
        }

    IssueActivityNotification( aError );
    }
    
// -----------------------------------------------------------------------------
// CWLanBearerMonitor::CompletionCallback
// -----------------------------------------------------------------------------
//
TInt CWLanBearerMonitor::CompletionCallback( TAny* aAny )
	{
	CWLanBearerMonitor* self = 
	    reinterpret_cast< CWLanBearerMonitor* >( aAny );

    if ( self )
        {
        self->InformActivity();
        }
    
	return KErrNone;
	}

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::CWLanBearerMonitor
// -----------------------------------------------------------------------------
//
CWLanBearerMonitor::CWLanBearerMonitor( TAny* aParams )	: 
    CSIPBearerMonitor( aParams ),
	iCallBack( CompletionCallback, this ),
	iTimerEntry( iCallBack ),
	iLastError( KErrNone )
	{
	}

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::ConstructL
// -----------------------------------------------------------------------------
//
void CWLanBearerMonitor::ConstructL()
	{
	// These are really very peculiar functions. They can
	// both leave AND return an error code..
	User::LeaveIfError( iConnMon.ConnectL() );
	User::LeaveIfError( iConnMon.NotifyEventL( *this ) );
	
	iUsagePermissionMonitor = CWLanConnUsagePermissionMonitor::NewL( *this );
	
	iAsyncCompletionTimer = CDeltaTimer::NewL( CActive::EPriorityStandard );
    
    SetCurrentAvailabilityL();
    
    iUsagePermission = iUsagePermissionMonitor->CurrentUsagePermissionL();
            	    
    IssueActivityNotification();
	}

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::SetCurrentAvailabilityL
// -----------------------------------------------------------------------------
//
void CWLanBearerMonitor::SetCurrentAvailabilityL()
    {                         
    // Get current availability of this monitor owner's wlan access point
    // and set current network state according it
    //
    TConnMonIapInfoBuf iapInfo;
	TRequestStatus status;
	iConnMon.GetPckgAttribute( EBearerIdWLAN, 0, KIapAvailability,
							   iapInfo, status );
	User::WaitForRequest( status );
	User::LeaveIfError( status.Int() );
	
	iState = IsAvailable( iapInfo(), iIapId ) ? 
            	    MSIPNetworkObserver::ENetworkActive : 
            	    MSIPNetworkObserver::ENetworkInactive;
    SIPWLAN_INTLOG("CWLanBearerMonitor::SetCurrentAvailabilityL", iState)        	    
    }
    
// -----------------------------------------------------------------------------
// CWLanBearerMonitor::IsAvailable
// -----------------------------------------------------------------------------
//
TBool CWLanBearerMonitor::IsAvailable( 
    const TConnMonIapInfo& aIapInfo, 
    TInt aIapId )
    {
    // Check if aIapId is in the list of available access points
    TInt count = aIapInfo.iCount;
    for ( TInt i = 0; i < count; i++ )
        {
        if ( aIapInfo.iIap[ i ].iIapId == aIapId )
            {
            return ETrue;
            }
        }
    return EFalse;
    }

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::IssueActivityNotification
// -----------------------------------------------------------------------------
//    
void CWLanBearerMonitor::IssueActivityNotification( TInt aError )
    {
    // Notify activity asynchronously
    iAsyncCompletionTimer->Remove( iTimerEntry );
    iAsyncCompletionTimer->Queue( KCompletionTime, iTimerEntry );
    iLastError = aError;
    }

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::InformActivity
// -----------------------------------------------------------------------------
//    
void CWLanBearerMonitor::InformActivity()
    {
    if ( iLastError ||
       ( iState == MSIPNetworkObserver::ENetworkActive && iUsagePermission ) )
        {
        iParent.BearerStateChanged( this, iLastError );
        }
    }

// -----------------------------------------------------------------------------
// CWLanBearerMonitor::IapSettingsInvalid
// -----------------------------------------------------------------------------
//
TBool CWLanBearerMonitor::IapSettingsInvalid( TInt aError ) const
    {
    if ( aError == KErrNotFound || 
         aError == KErrBadName ||
         aError == KErrNotSupported ||
         aError == KErrWlanOpenAuthFailed ||
         aError == KErrWlanSharedKeyAuthRequired ||
         aError == KErrWlanSharedKeyAuthFailed ||
         aError == KErrWlanWpaAuthRequired ||
         aError == KErrWlanIllegalEncryptionKeys ||
         aError == KErrWlanPskModeRequired ||
         aError == KErrWlanEapModeRequired ||
         aError == KErrWlanSimNotInstalled ||
         aError == KErrWlanNotSubscribed ||
         aError == KErrWlanAccessBarred ||
         aError == KErrWlanPasswordExpired ||
         aError == KErrWlanNoDialinPermissions ||
         aError == KErrWlanAccountDisabled ||
         aError == KErrWlanRestrictedLogonHours ||
         aError == KErrWlanServerCertificateExpired ||
         aError == KErrWlanCerficateVerifyFailed ||
         aError == KErrWlanNoUserCertificate ||
         aError == KErrWlanNoCipherSuite ||
         aError == KErrWlanUserRejected ||
         aError == KErrWlanUserCertificateExpired)
        {
	SIPWLAN_INTLOG("CWLanBearerMonitor::IapSettingsInvalid, Fatal", aError)
        return ETrue;
        }
		
	else if(
		aError == KErrWlanWpaAuthFailed ||
		aError == KErrWlan802dot1xAuthFailed ||
		aError == KErrWlanIllegalWpaPskKey ||
		aError == KErrWlanEapSimFailed ||
		aError == KErrWlanEapTlsFailed ||
        aError == KErrWlanEapPeapFailed ||
		aError == KErrWlanEapMsChapv2 ||
        aError == KErrWlanEapAkaFailed ||
        aError == KErrWlanEapTtlsFailed ||
		aError == KErrWlanLeapFailed ||
		aError == KErrWlanEapGtcFailed )
		{
	SIPWLAN_INTLOG("CWLanBearerMonitor::IapSettingsInvalid, Less Fatal", aError)
		return EFalse;
		}
		 
		 
    return EFalse;
    }

// End of File