bluetoothengine/btnotif/btnotifsrv/src/btnotifincomingpairinghandler.cpp
author hgs
Tue, 19 Oct 2010 15:09:34 +0300
changeset 70 f5508c13dfe0
parent 57 5ebadcda06cb
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
     1
/*
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
     3
* All rights reserved.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
     8
*
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
     9
* Initial Contributors:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    11
*
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    12
* Contributors:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    13
*
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    14
* Description: 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    15
*
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    16
*/
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    17
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    18
#include "btnotifincomingpairinghandler.h"
42
hgs
parents: 31
diff changeset
    19
#include "btnotifsecuritymanager.h"
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    20
#include "btnotifoutgoingpairinghandler.h"
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    21
#include <btengconstants.h>
42
hgs
parents: 31
diff changeset
    22
#include "bluetoothtrace.h"
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    23
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    24
const TInt KBTNotifWaitingForPairingOkDelay = 500000; // 0.5s
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
    25
const TInt KBTNotif10SecondTimer = 10000000;
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    26
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    27
enum TPairingStageId
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    28
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    29
    /**
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    30
     * is monitoring physical link status
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    31
     */
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    32
    EPhysicalLinkNotify = 100,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    33
    EWaitingForPairingOk,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    34
    };
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    35
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    36
// ======== MEMBER FUNCTIONS ========
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    37
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    38
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    39
// C++ default constructor
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    40
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    41
//
42
hgs
parents: 31
diff changeset
    42
CBTNotifIncomingPairingHandler::CBTNotifIncomingPairingHandler( CBTNotifSecurityManager& aParent, 
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    43
    const TBTDevAddr& aAddr) : CBTNotifBasePairingHandler( aParent, aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    44
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    45
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    46
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    47
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    48
// 2nd phase constructor
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    49
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    50
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    51
void CBTNotifIncomingPairingHandler::ConstructL()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    52
    {
42
hgs
parents: 31
diff changeset
    53
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    54
    BaseConstructL();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    55
    iActivePairingOk = CBtSimpleActive::NewL(*this, EWaitingForPairingOk );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    56
    User::LeaveIfError( iPairingOkTimer.CreateLocal() );
42
hgs
parents: 31
diff changeset
    57
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    58
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    59
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    60
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    61
// NewL
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    62
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    63
//
42
hgs
parents: 31
diff changeset
    64
CBTNotifBasePairingHandler* CBTNotifIncomingPairingHandler::NewL( CBTNotifSecurityManager& aParent, 
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    65
    const TBTDevAddr& aAddr)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    66
    {
42
hgs
parents: 31
diff changeset
    67
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    68
    CBTNotifIncomingPairingHandler* self = new (ELeave) CBTNotifIncomingPairingHandler(aParent, aAddr);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    69
    CleanupStack::PushL( self );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    70
    self->ConstructL();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    71
    CleanupStack::Pop( self );
42
hgs
parents: 31
diff changeset
    72
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    73
    return self;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    74
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    75
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    76
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    77
// Destructor
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    78
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    79
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    80
CBTNotifIncomingPairingHandler::~CBTNotifIncomingPairingHandler()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    81
    {
42
hgs
parents: 31
diff changeset
    82
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    83
    // Cancel all outstanding requests
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    84
    CancelPlaNotification();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    85
    iPla.Close();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    86
    delete iActivePairingOk;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    87
    iPairingOkTimer.Close();
42
hgs
parents: 31
diff changeset
    88
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    89
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    90
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    91
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    92
// Accept this message only if the specified device is the same as this is
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    93
// dealing with.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    94
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    95
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    96
TInt CBTNotifIncomingPairingHandler::ObserveIncomingPair( const TBTDevAddr& aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    97
    {
42
hgs
parents: 31
diff changeset
    98
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    99
    TInt err( KErrServerBusy );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   100
    if ( iAddr == aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   101
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   102
        err = KErrNone;
42
hgs
parents: 31
diff changeset
   103
        // This function is called by a notifier, which means the UI has been involved
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   104
        // Therefore we can display it in the paired devices list
42
hgs
parents: 31
diff changeset
   105
        iUserAwarePairing = ETrue; 
hgs
parents: 31
diff changeset
   106
         if ( !iActive->IsActive() && !OpenPhysicalLinkAdaptor() )
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   107
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   108
            // If we are observing physical link, or showing user a note,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   109
            // we won't interrupt it.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   110
            UnSetPairResult();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   111
            MonitorPhysicalLink();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   112
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   113
        }
42
hgs
parents: 31
diff changeset
   114
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   115
    return err;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   116
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   117
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   118
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   119
// Assign the responsibility of outgoing pair handling to CBTEngOtgPair
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   120
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   121
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   122
void CBTNotifIncomingPairingHandler::HandleOutgoingPairL( const TBTDevAddr& aAddr, TUint aCod )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   123
    {
42
hgs
parents: 31
diff changeset
   124
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   125
    // Outgoing pairing always takes highest priority:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   126
    CBTNotifBasePairingHandler* pairinghandler = CBTNotifOutgoingPairingHandler::NewL( iParent, aAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   127
    pairinghandler->HandleOutgoingPairL( aAddr, aCod );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   128
    iParent.RenewPairingHandler( pairinghandler );
42
hgs
parents: 31
diff changeset
   129
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   130
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   131
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   132
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   133
// Accept this message only if the specified device is the same as this is
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   134
// dealing with.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   135
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   136
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   137
void CBTNotifIncomingPairingHandler::StopPairHandling( const TBTDevAddr& aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   138
    {
42
hgs
parents: 31
diff changeset
   139
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   140
    if ( aAddr == iAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   141
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   142
        iParent.RenewPairingHandler( NULL );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   143
        }
42
hgs
parents: 31
diff changeset
   144
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   145
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   146
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   147
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   148
// Notify user if pairing failed.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   149
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   150
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   151
void CBTNotifIncomingPairingHandler::DoHandlePairServerResult( TInt aResult )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   152
    {
42
hgs
parents: 31
diff changeset
   153
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   154
    CancelPlaNotification();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   155
    // For a successful pairing, we need wait for registry table change.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   156
    if( aResult != KErrNone && aResult != KHCIErrorBase )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   157
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   158
        // Pair failure situation.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   159
        SetPairResult( aResult );
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   160
        TRAPD(err , ShowPairingResultNoteL(KErrGeneral));
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   161
        if(!err && iNotification)
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   162
            {
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   163
            iNotification->SetCloseTimer(KBTNotif10SecondTimer);
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   164
            }
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   165
        }
42
hgs
parents: 31
diff changeset
   166
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   167
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   168
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   169
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   170
// Kill this if the linkkey type indicates OBEX authentication.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   171
// Otherwise notify user the pair result.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   172
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   173
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   174
void CBTNotifIncomingPairingHandler::DoHandleRegistryNewPairedEvent( const TBTNamelessDevice& aDev )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   175
    {
42
hgs
parents: 31
diff changeset
   176
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   177
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   178
    // First of all cancel the iPairingOkTimer timer, if active
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   179
    if (iActivePairingOk->IsActive())
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   180
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   181
        iActivePairingOk->Cancel();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   182
        UnSetPairResult();  // we might have set it before (if the link went down) so we want to reset it.   
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   183
        }
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   184
    // If the user checked the trusted checkbox then we trust the device
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   185
    if(iTrustDevice)
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   186
        {
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   187
        iParent.TrustDevice(iAddr);
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   188
        }
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   189
    if (aDev.LinkKeyType() == ELinkKeyUnauthenticatedNonUpgradable && !iUserAwarePairing)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   190
		{
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   191
		// If an application uses btengconnman API to connect a service of 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   192
		// this device and JW pairing occurred as part of security enforcement,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   193
		// it shall be a user aware pairing, and we shall add this device in paired
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   194
		// view. In this way, user is able to disconnect the device from our UI.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   195
		// Otherwise the link key has been created by a device without IO requesting 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   196
		// a service connection with phone. We won't take any action (e.g. remove 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   197
		// link key) in this case. As the result, this device can't be seen in our UI, 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   198
		// however other applications are still freely to use its services.
70
hgs
parents: 57
diff changeset
   199
        BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,_L("[BTNotif]: JW pairing with no IO device"));
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   200
		TBTEngConnectionStatus status = iParent.ConnectStatus( aDev.Address() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   201
		if ( status == EBTEngConnecting || status == EBTEngConnected )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   202
			{
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   203
			// the return error is ingore as we can not have other proper 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   204
			// exception handling option:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   205
			(void) iParent.AddUiCookieJustWorksPaired( aDev );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   206
			}
42
hgs
parents: 31
diff changeset
   207
		TRAP_IGNORE(ShowPairingResultNoteL(KErrNone));
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   208
		iParent.RenewPairingHandler( NULL );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   209
		}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   210
    else if (aDev.LinkKeyType() == ELinkKeyUnauthenticatedUpgradable && !iUserAwarePairing)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   211
		{
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   212
		// The linkkey has been created  by an incoming OBEX service request
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   213
		// which resulted a pairing event received from pair server.
70
hgs
parents: 57
diff changeset
   214
        BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,_L("[BTNotif]: JW pairing with IO device"));
42
hgs
parents: 31
diff changeset
   215
		iParent.RenewPairingHandler( NULL );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   216
		}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   217
    else
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   218
		{
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   219
		if (aDev.LinkKeyType() == ELinkKeyUnauthenticatedNonUpgradable || aDev.LinkKeyType() == ELinkKeyUnauthenticatedUpgradable)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   220
			{
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   221
			// The user was involved in the pairing, so display in the paired devices list
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   222
			(void) iParent.AddUiCookieJustWorksPaired(aDev);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   223
			}
70
hgs
parents: 57
diff changeset
   224
		BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,_L("[BTNotif]: Non-JW pairing"));
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   225
		// Other pairing model than Just Works:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   226
		CancelPlaNotification();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   227
		SetPairResult( KErrNone );
42
hgs
parents: 31
diff changeset
   228
		TRAP_IGNORE(ShowPairingResultNoteL(KErrNone));
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   229
		iParent.RenewPairingHandler( NULL );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   230
		}
42
hgs
parents: 31
diff changeset
   231
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   232
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   233
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   234
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   235
// From class MBTNotifPairingAOObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   236
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   237
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   238
void CBTNotifIncomingPairingHandler::RequestCompletedL( CBtSimpleActive* aActive, TInt aStatus )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   239
    {
42
hgs
parents: 31
diff changeset
   240
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
hgs
parents: 31
diff changeset
   241
    // Check which request completed.
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   242
    switch( aActive->RequestId() )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   243
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   244
        case EPhysicalLinkNotify:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   245
            {
42
hgs
parents: 31
diff changeset
   246
            // Check if the link has disconnected.
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   247
            HandlePhysicalLinkResultL( aStatus );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   248
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   249
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   250
        case EWaitingForPairingOk:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   251
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   252
            // pairing failed, inform user:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   253
            if (iPairResult == KErrNone)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   254
                {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   255
                // iPairResult must have been set as an error. if it's not it means somewhere else
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   256
                // it has been reset. But we need to have it set to an error as we are notifying 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   257
                // the "unable to pair" message.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   258
                SetPairResult(KErrGeneral);
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   259
                TRAPD(err , ShowPairingResultNoteL(KErrGeneral));
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   260
                if(!err && iNotification)
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   261
                    {
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   262
                    iNotification->SetCloseTimer(KBTNotif10SecondTimer);
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   263
                    }
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   264
                }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   265
            iParent.RenewPairingHandler( NULL );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   266
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   267
            } 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   268
        default:
42
hgs
parents: 31
diff changeset
   269
            // Should not be possible, but no need for handling.
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   270
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   271
        }
42
hgs
parents: 31
diff changeset
   272
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   273
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   274
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   275
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   276
// ---------------------------------------------------------------------------
42
hgs
parents: 31
diff changeset
   277
// From class MBTNotifPairingAOObserver.
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   278
// cancels an outstanding request according to the given id.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   279
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   280
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   281
void CBTNotifIncomingPairingHandler::CancelRequest( TInt aRequestId )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   282
    {
42
hgs
parents: 31
diff changeset
   283
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   284
    switch ( aRequestId ) 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   285
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   286
        case EPhysicalLinkNotify:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   287
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   288
            iPla.CancelNextBasebandChangeEventNotifier();
42
hgs
parents: 31
diff changeset
   289
            break;
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   290
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   291
        case EWaitingForPairingOk:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   292
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   293
            iPairingOkTimer.Cancel();
42
hgs
parents: 31
diff changeset
   294
            break;
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   295
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   296
        }
42
hgs
parents: 31
diff changeset
   297
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   298
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   299
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   300
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   301
// From class MBTNotifPairingAOObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   302
// Handles a leave in RequestCompleted by simply self-destructing.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   303
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   304
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   305
void CBTNotifIncomingPairingHandler::HandleError( CBtSimpleActive* aActive, TInt aError )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   306
    {
42
hgs
parents: 31
diff changeset
   307
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   308
    (void) aActive;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   309
    (void) aError;
42
hgs
parents: 31
diff changeset
   310
    // Our error handling is to just stop observing. 
hgs
parents: 31
diff changeset
   311
    // Nothing critical to be preserved here, the user 
hgs
parents: 31
diff changeset
   312
    // just won't get any notification of pairing result.
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   313
    iParent.RenewPairingHandler( NULL );
42
hgs
parents: 31
diff changeset
   314
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   315
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   316
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   317
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   318
// Subscribe to physical link notifications. 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   319
// physical link must exist when calling this function.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   320
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   321
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   322
void CBTNotifIncomingPairingHandler::MonitorPhysicalLink()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   323
    {
42
hgs
parents: 31
diff changeset
   324
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   325
    iActive->SetRequestId( EPhysicalLinkNotify );
42
hgs
parents: 31
diff changeset
   326
    // Subscribe to disconnect and error events.
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   327
    iPla.NotifyNextBasebandChangeEvent( iBbEvent, 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   328
                            iActive->RequestStatus(), 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   329
                            ENotifyPhysicalLinkDown | ENotifyPhysicalLinkError );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   330
    iActive->GoActive();
42
hgs
parents: 31
diff changeset
   331
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   332
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   333
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   334
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   335
// Opens the adaptor if physical link exists.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   336
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   337
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   338
TInt CBTNotifIncomingPairingHandler::OpenPhysicalLinkAdaptor()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   339
    {
42
hgs
parents: 31
diff changeset
   340
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   341
    TInt err ( KErrNone );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   342
    if( !iPla.IsOpen() )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   343
        {
42
hgs
parents: 31
diff changeset
   344
        // Try to open the adapter in case it failed earlier.
hgs
parents: 31
diff changeset
   345
        // This can happen for outgoing dedicated bonding with 
hgs
parents: 31
diff changeset
   346
        // non-SSP device, as the PIN dialog can be kept open even 
hgs
parents: 31
diff changeset
   347
        // though the link has dropped because of a time-out.
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   348
        err = iPla.Open( iParent.SocketServ(), iAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   349
        }
70
hgs
parents: 57
diff changeset
   350
    BOstrace1(TRACE_DEBUG,DUMMY_DEVLIST,_L("[BTNotif]:HasPhysicalLink ? %d"), iPla.IsOpen() );
42
hgs
parents: 31
diff changeset
   351
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   352
    return err;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   353
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   354
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   355
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   356
// Cancel outstanding physical link notification
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   357
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   358
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   359
void CBTNotifIncomingPairingHandler::CancelPlaNotification()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   360
    {
42
hgs
parents: 31
diff changeset
   361
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   362
    if( iActive && iActive->RequestId() == EPhysicalLinkNotify )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   363
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   364
        // cancel Baseband monitor
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   365
        iActive->Cancel();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   366
        }
42
hgs
parents: 31
diff changeset
   367
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   368
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   369
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   370
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   371
// Handle a physical link event. Notify pair failed if physical link is down.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   372
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   373
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   374
void CBTNotifIncomingPairingHandler::HandlePhysicalLinkResultL( TInt aResult )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   375
    {
42
hgs
parents: 31
diff changeset
   376
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
hgs
parents: 31
diff changeset
   377
    // Check if the connection is still alive.
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   378
    TBool physicalLinkDown = 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   379
        ( iBbEvent().EventType() == ENotifyPhysicalLinkDown | ENotifyPhysicalLinkError );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   380
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   381
    if( aResult || physicalLinkDown )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   382
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   383
        // link went down. It might be because of pairing failed or the remote device disconnected the
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   384
        // physical link after a successful pairing.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   385
        // we wait for 0.5 secs before notifying the "unable to pair" message as, if the pair is 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   386
        // successful, we manage it to show the right confirmation message.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   387
        SetPairResult( (aResult == 0) ? KErrGeneral : aResult );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   388
        iPairingOkTimer.After(iActivePairingOk->iStatus, KBTNotifWaitingForPairingOkDelay);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   389
        iActivePairingOk->GoActive();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   390
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   391
    else
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   392
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   393
        // Uninteresting event, re-subscribe.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   394
        MonitorPhysicalLink();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   395
        }
42
hgs
parents: 31
diff changeset
   396
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   397
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   398
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   399
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   400