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