bluetoothengine/btnotif/btnotifsrv/src/btnotifincomingpairinghandler.cpp
branchRCL_3
changeset 56 9386f31cc85b
parent 55 613943a21004
child 61 269724087bed
--- a/bluetoothengine/btnotif/btnotifsrv/src/btnotifincomingpairinghandler.cpp	Tue Aug 31 15:25:10 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,384 +0,0 @@
-/*
-* Copyright (c) 2010 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: 
-*
-*/
-
-#include "btnotifincomingpairinghandler.h"
-#include "btnotifsecuritymanager.h"
-#include "btnotifoutgoingpairinghandler.h"
-#include <btengconstants.h>
-#include "bluetoothtrace.h"
-
-const TInt KBTNotifWaitingForPairingOkDelay = 500000; // 0.5s
-
-enum TPairingStageId
-    {
-    /**
-     * is monitoring physical link status
-     */
-    EPhysicalLinkNotify = 100,
-    EWaitingForPairingOk,
-    };
-
-// ======== MEMBER FUNCTIONS ========
-
-// ---------------------------------------------------------------------------
-// C++ default constructor
-// ---------------------------------------------------------------------------
-//
-CBTNotifIncomingPairingHandler::CBTNotifIncomingPairingHandler( CBTNotifSecurityManager& aParent, 
-    const TBTDevAddr& aAddr) : CBTNotifBasePairingHandler( aParent, aAddr )
-    {
-    }
-
-// ---------------------------------------------------------------------------
-// 2nd phase constructor
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::ConstructL()
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    BaseConstructL();
-    iActivePairingOk = CBtSimpleActive::NewL(*this, EWaitingForPairingOk );
-    User::LeaveIfError( iPairingOkTimer.CreateLocal() );
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-// ---------------------------------------------------------------------------
-// NewL
-// ---------------------------------------------------------------------------
-//
-CBTNotifBasePairingHandler* CBTNotifIncomingPairingHandler::NewL( CBTNotifSecurityManager& aParent, 
-    const TBTDevAddr& aAddr)
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    CBTNotifIncomingPairingHandler* self = new (ELeave) CBTNotifIncomingPairingHandler(aParent, aAddr);
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// Destructor
-// ---------------------------------------------------------------------------
-//
-CBTNotifIncomingPairingHandler::~CBTNotifIncomingPairingHandler()
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    // Cancel all outstanding requests
-    CancelPlaNotification();
-    iPla.Close();
-    delete iActivePairingOk;
-    iPairingOkTimer.Close();
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-// ---------------------------------------------------------------------------
-// Accept this message only if the specified device is the same as this is
-// dealing with.
-// ---------------------------------------------------------------------------
-//
-TInt CBTNotifIncomingPairingHandler::ObserveIncomingPair( const TBTDevAddr& aAddr )
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    TInt err( KErrServerBusy );
-    if ( iAddr == aAddr )
-        {
-        err = KErrNone;
-        // This function is called by a notifier, which means the UI has been involved
-        // Therefore we can display it in the paired devices list
-        iUserAwarePairing = ETrue; 
-         if ( !iActive->IsActive() && !OpenPhysicalLinkAdaptor() )
-            {
-            // If we are observing physical link, or showing user a note,
-            // we won't interrupt it.
-            UnSetPairResult();
-            MonitorPhysicalLink();
-            }
-        }
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    return err;
-    }
-
-// ---------------------------------------------------------------------------
-// Assign the responsibility of outgoing pair handling to CBTEngOtgPair
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::HandleOutgoingPairL( const TBTDevAddr& aAddr, TUint aCod )
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    // Outgoing pairing always takes highest priority:
-    CBTNotifBasePairingHandler* pairinghandler = CBTNotifOutgoingPairingHandler::NewL( iParent, aAddr );
-    pairinghandler->HandleOutgoingPairL( aAddr, aCod );
-    iParent.RenewPairingHandler( pairinghandler );
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-// ---------------------------------------------------------------------------
-// Accept this message only if the specified device is the same as this is
-// dealing with.
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::StopPairHandling( const TBTDevAddr& aAddr )
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    if ( aAddr == iAddr )
-        {
-        iParent.RenewPairingHandler( NULL );
-        }
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-// ---------------------------------------------------------------------------
-// Notify user if pairing failed.
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::DoHandlePairServerResult( TInt aResult )
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    CancelPlaNotification();
-    // For a successful pairing, we need wait for registry table change.
-    if( aResult != KErrNone && aResult != KHCIErrorBase )
-        {
-        // Pair failure situation.
-        SetPairResult( aResult );
-        }
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-// ---------------------------------------------------------------------------
-// Kill this if the linkkey type indicates OBEX authentication.
-// Otherwise notify user the pair result.
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::DoHandleRegistryNewPairedEvent( const TBTNamelessDevice& aDev )
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    
-    // First of all cancel the iPairingOkTimer timer, if active
-    if (iActivePairingOk->IsActive())
-        {
-        iActivePairingOk->Cancel();
-        UnSetPairResult();  // we might have set it before (if the link went down) so we want to reset it.   
-        }
-    if (aDev.LinkKeyType() == ELinkKeyUnauthenticatedNonUpgradable && !iUserAwarePairing)
-		{
-		// If an application uses btengconnman API to connect a service of 
-		// this device and JW pairing occurred as part of security enforcement,
-		// it shall be a user aware pairing, and we shall add this device in paired
-		// view. In this way, user is able to disconnect the device from our UI.
-		// Otherwise the link key has been created by a device without IO requesting 
-		// a service connection with phone. We won't take any action (e.g. remove 
-		// link key) in this case. As the result, this device can't be seen in our UI, 
-		// however other applications are still freely to use its services.
-        BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,"[BTNotif]: JW pairing with no IO device");
-		TBTEngConnectionStatus status = iParent.ConnectStatus( aDev.Address() );
-		if ( status == EBTEngConnecting || status == EBTEngConnected )
-			{
-			// the return error is ingore as we can not have other proper 
-			// exception handling option:
-			(void) iParent.AddUiCookieJustWorksPaired( aDev );
-			}
-		TRAP_IGNORE(ShowPairingResultNoteL(KErrNone));
-		iParent.RenewPairingHandler( NULL );
-		}
-    else if (aDev.LinkKeyType() == ELinkKeyUnauthenticatedUpgradable && !iUserAwarePairing)
-		{
-		// The linkkey has been created  by an incoming OBEX service request
-		// which resulted a pairing event received from pair server.
-        BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,"[BTNotif]: JW pairing with IO device");
-		iParent.RenewPairingHandler( NULL );
-		}
-    else
-		{
-		if (aDev.LinkKeyType() == ELinkKeyUnauthenticatedNonUpgradable || aDev.LinkKeyType() == ELinkKeyUnauthenticatedUpgradable)
-			{
-			// The user was involved in the pairing, so display in the paired devices list
-			(void) iParent.AddUiCookieJustWorksPaired(aDev);
-			}
-		BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,"[BTNotif]: Non-JW pairing");
-		// Other pairing model than Just Works:
-		CancelPlaNotification();
-		SetPairResult( KErrNone );
-		TRAP_IGNORE(ShowPairingResultNoteL(KErrNone));
-		iParent.RenewPairingHandler( NULL );
-		}
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-// ---------------------------------------------------------------------------
-// From class MBTNotifPairingAOObserver.
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::RequestCompletedL( CBtSimpleActive* aActive, TInt aStatus )
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    // Check which request completed.
-    switch( aActive->RequestId() )
-        {
-        case EPhysicalLinkNotify:
-            {
-            // Check if the link has disconnected.
-            HandlePhysicalLinkResultL( aStatus );
-            break;
-            }
-        case EWaitingForPairingOk:
-            {
-            // pairing failed, inform user:
-            if (iPairResult == KErrNone)
-                {
-                // iPairResult must have been set as an error. if it's not it means somewhere else
-                // it has been reset. But we need to have it set to an error as we are notifying 
-                // the "unable to pair" message.
-                SetPairResult(KErrGeneral);
-                }
-            iParent.RenewPairingHandler( NULL );
-            break;
-            } 
-        default:
-            // Should not be possible, but no need for handling.
-            break;
-        }
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-
-// ---------------------------------------------------------------------------
-// From class MBTNotifPairingAOObserver.
-// cancels an outstanding request according to the given id.
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::CancelRequest( TInt aRequestId )
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    switch ( aRequestId ) 
-        {
-        case EPhysicalLinkNotify:
-            {
-            iPla.CancelNextBasebandChangeEventNotifier();
-            break;
-            }
-        case EWaitingForPairingOk:
-            {
-            iPairingOkTimer.Cancel();
-            break;
-            }
-        }
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-// ---------------------------------------------------------------------------
-// From class MBTNotifPairingAOObserver.
-// Handles a leave in RequestCompleted by simply self-destructing.
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::HandleError( CBtSimpleActive* aActive, TInt aError )
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    (void) aActive;
-    (void) aError;
-    // Our error handling is to just stop observing. 
-    // Nothing critical to be preserved here, the user 
-    // just won't get any notification of pairing result.
-    iParent.RenewPairingHandler( NULL );
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-// ---------------------------------------------------------------------------
-// Subscribe to physical link notifications. 
-// physical link must exist when calling this function.
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::MonitorPhysicalLink()
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    iActive->SetRequestId( EPhysicalLinkNotify );
-    // Subscribe to disconnect and error events.
-    iPla.NotifyNextBasebandChangeEvent( iBbEvent, 
-                            iActive->RequestStatus(), 
-                            ENotifyPhysicalLinkDown | ENotifyPhysicalLinkError );
-    iActive->GoActive();
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-// ---------------------------------------------------------------------------
-// Opens the adaptor if physical link exists.
-// ---------------------------------------------------------------------------
-//
-TInt CBTNotifIncomingPairingHandler::OpenPhysicalLinkAdaptor()
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    TInt err ( KErrNone );
-    if( !iPla.IsOpen() )
-        {
-        // Try to open the adapter in case it failed earlier.
-        // This can happen for outgoing dedicated bonding with 
-        // non-SSP device, as the PIN dialog can be kept open even 
-        // though the link has dropped because of a time-out.
-        err = iPla.Open( iParent.SocketServ(), iAddr );
-        }
-    BOstrace1(TRACE_DEBUG,DUMMY_DEVLIST,"[BTNotif]:HasPhysicalLink ? %d", iPla.IsOpen() );
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    return err;
-    }
-
-// ---------------------------------------------------------------------------
-// Cancel outstanding physical link notification
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::CancelPlaNotification()
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    if( iActive && iActive->RequestId() == EPhysicalLinkNotify )
-        {
-        // cancel Baseband monitor
-        iActive->Cancel();
-        }
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-// ---------------------------------------------------------------------------
-// Handle a physical link event. Notify pair failed if physical link is down.
-// ---------------------------------------------------------------------------
-//
-void CBTNotifIncomingPairingHandler::HandlePhysicalLinkResultL( TInt aResult )
-    {
-    BOstraceFunctionEntry0( DUMMY_DEVLIST );
-    // Check if the connection is still alive.
-    TBool physicalLinkDown = 
-        ( iBbEvent().EventType() == ENotifyPhysicalLinkDown | ENotifyPhysicalLinkError );
-
-    if( aResult || physicalLinkDown )
-        {
-        // link went down. It might be because of pairing failed or the remote device disconnected the
-        // physical link after a successful pairing.
-        // we wait for 0.5 secs before notifying the "unable to pair" message as, if the pair is 
-        // successful, we manage it to show the right confirmation message.
-        SetPairResult( (aResult == 0) ? KErrGeneral : aResult );
-        iPairingOkTimer.After(iActivePairingOk->iStatus, KBTNotifWaitingForPairingOkDelay);
-        iActivePairingOk->GoActive();
-        }
-    else
-        {
-        // Uninteresting event, re-subscribe.
-        MonitorPhysicalLink();
-        }
-    BOstraceFunctionExit0( DUMMY_DEVLIST );
-    }
-
-
-