bluetoothengine/btnotif/btnotifsrv/src/btnotifoutgoingpairinghandler.cpp
author hgs
Mon, 12 Jul 2010 18:51:05 +0300
changeset 42 b72428996822
parent 31 a0ea99b6fa53
child 47 9e2a905b887f
permissions -rw-r--r--
201025
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: Pairing handler for local device initiated pairing
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 "btnotifoutgoingpairinghandler.h"
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    19
#include <btengconstants.h>
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    20
#include <btservices/btdevextension.h>
42
hgs
parents: 31
diff changeset
    21
#include "btnotifsecuritymanager.h"
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
/**  Length of the default PIN. */
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    25
const TInt KDefaultHeadsetPinLength = 4;
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
     * no pairing operation ongoing
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    31
     */
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    32
    ENoBonding = 0,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    33
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    34
    /**
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    35
     * pair with dedicated bonding method
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    36
     */
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    37
    EDedicatedBonding = 200,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    38
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    39
    /**
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    40
     * pair with general bonding by establishing L2CAP connection.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    41
     */
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    42
    EGeneralBonding,  
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    43
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    44
    /**
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    45
     * delaying next pairing request for a while
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    46
     */
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    47
    EGeneralBondingRetryTimer,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    48
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    49
    /**
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    50
     * The last pairing retry
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    51
     */
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    52
    EGeneralBondingRetry,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    53
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    54
    /**
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    55
     * disconnecting physical link after pairing operation.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    56
     * 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    57
     * todo: not used yet.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    58
     */
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    59
    EDisconnectLinkAfterBonding,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    60
    };
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    61
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    62
/**  SDP PSM (used for pairing) */
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    63
const TInt KSDPPSM = 0x0001;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    64
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    65
// Delay time to void Repeated Attempts on pairing
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    66
const TInt KGeneralBondingRetryDelayMicroSeconds = 5000000; // 5.0s
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    67
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    68
// ======== MEMBER FUNCTIONS ========
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    69
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    70
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    71
// C++ default constructor
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    72
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    73
//
42
hgs
parents: 31
diff changeset
    74
CBTNotifOutgoingPairingHandler::CBTNotifOutgoingPairingHandler( CBTNotifSecurityManager& aParent, const TBTDevAddr& aAddr)
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    75
    :  CBTNotifBasePairingHandler( aParent, aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    76
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    77
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    78
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    79
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    80
// Symbian 2nd-phase constructor
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    81
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    82
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    83
void CBTNotifOutgoingPairingHandler::ConstructL()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    84
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    85
    BaseConstructL();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    86
    User::LeaveIfError( iTimer.CreateLocal() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    87
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    88
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    89
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    90
// NewL
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    91
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    92
//
42
hgs
parents: 31
diff changeset
    93
CBTNotifBasePairingHandler* CBTNotifOutgoingPairingHandler::NewL( CBTNotifSecurityManager& aParent, 
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    94
        const TBTDevAddr& aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    95
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    96
    CBTNotifOutgoingPairingHandler* self = new( ELeave ) CBTNotifOutgoingPairingHandler( aParent, aAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    97
    CleanupStack::PushL( self );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    98
    self->ConstructL();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    99
    CleanupStack::Pop( self );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   100
    return self;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   101
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   102
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   103
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   104
// Destructor
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   105
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   106
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   107
CBTNotifOutgoingPairingHandler::~CBTNotifOutgoingPairingHandler()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   108
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   109
    if ( iActive ) 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   110
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   111
        iActive->Cancel();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   112
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   113
    iBondingSession.Close();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   114
    iSocket.Close();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   115
    iTimer.Close();
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
// Simply deny the request as this is handing outgoing pairing
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   120
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   121
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   122
TInt CBTNotifOutgoingPairingHandler::ObserveIncomingPair( const TBTDevAddr& /*aAddr*/ )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   123
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   124
    return KErrServerBusy;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   125
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   126
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   127
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   128
// Accept the request only this device is not busy with another pairing request.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   129
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   130
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   131
void CBTNotifOutgoingPairingHandler::HandleOutgoingPairL( const TBTDevAddr& aAddr, TUint aCod )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   132
    {
42
hgs
parents: 31
diff changeset
   133
    BOstrace1(TRACE_DEBUG,DUMMY_DEVLIST," cod 0x%08x", aCod );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   134
    if ( iActive->IsActive() || aAddr != iAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   135
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   136
        // we don't allow another pairing request.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   137
        User::Leave( KErrServerBusy );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   138
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   139
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   140
    iAddr = aAddr;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   141
    iCod = TBTDeviceClass( aCod );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   142
    UnSetPairResult();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   143
    iParent.UnpairDevice( iAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   144
    if ( CBtDevExtension::IsHeadset( iCod ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   145
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   146
        // If the devie is a headset, set to 0000 pin auto pairing
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   147
        iPairMode = EBTOutgoingHeadsetAutoPairing;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   148
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   149
    else
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   150
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   151
        iPairMode = EBTOutgoingNoneHeadsetPairing;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   152
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   153
    DoPairingL();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   154
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   155
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   156
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   157
// Cancels an outstanding pair request by self-destruct
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   158
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   159
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   160
void CBTNotifOutgoingPairingHandler::CancelOutgoingPair()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   161
    {
42
hgs
parents: 31
diff changeset
   162
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   163
    iParent.RenewPairingHandler( NULL );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   164
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   165
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   166
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   167
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   168
// when phone initiated a pairing request towards a headset,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   169
// Pin code 0000 is first tried.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   170
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   171
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   172
void CBTNotifOutgoingPairingHandler::GetPinCode( 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   173
        TBTPinCode& aPin, const TBTDevAddr& aAddr, TInt aMinPinLength )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   174
    {
42
hgs
parents: 31
diff changeset
   175
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   176
    aPin().iLength = 0;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   177
    if ( aMinPinLength <= KDefaultHeadsetPinLength 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   178
            && aAddr == iAddr
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   179
            && iPairMode == EBTOutgoingHeadsetAutoPairing)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   180
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   181
        // if the pairing requires a stronger security level (indicated
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   182
        // by aMinPinLength), 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   183
        // 0000 will not be supplied as it does not mmet the security
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   184
        // requirements
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   185
        const TUint8 KZeroPinValue = '0';
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   186
        for (TInt i = 0; i < KDefaultHeadsetPinLength; ++i)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   187
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   188
            aPin().iPIN[i] = KZeroPinValue;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   189
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   190
        aPin().iLength = KDefaultHeadsetPinLength;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   191
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   192
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   193
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   194
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   195
// Abort pairing handling, request the owner to destroy this.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   196
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   197
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   198
void CBTNotifOutgoingPairingHandler::StopPairHandling( const TBTDevAddr& aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   199
    {
42
hgs
parents: 31
diff changeset
   200
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   201
    if ( aAddr == iAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   202
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   203
        iParent.OutgoingPairCompleted( KErrCancel );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   204
        iParent.RenewPairingHandler( NULL );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   205
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   206
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   207
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   208
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   209
// Pairing result will be received when pairing operation completes.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   210
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   211
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   212
void CBTNotifOutgoingPairingHandler::DoHandlePairServerResult( TInt aResult )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   213
    {
42
hgs
parents: 31
diff changeset
   214
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   215
	if (aResult == (KHCIErrorBase-EPairingNotAllowed))
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   216
		{
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   217
		// if EPairingNotAllowed is recieved then any further pairing attempts will fail
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   218
		// so don't attampt to pair
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   219
        iPairMode = EBTOutgoingPairNone;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   220
		}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   221
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   222
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   223
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   224
// Cancels possible outstanding pairing and notify user pair success.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   225
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   226
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   227
void CBTNotifOutgoingPairingHandler::DoHandleRegistryNewPairedEvent( 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   228
        const TBTNamelessDevice& aDev )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   229
    {
42
hgs
parents: 31
diff changeset
   230
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   231
    TInt err( KErrNone );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   232
    // If pairing was performed using Just Works mode, we set a 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   233
    // UICookie to indicate that the device is successfully 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   234
    // bonded so that this device will be listed in paired device view of
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   235
    // bluetooth application:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   236
    if ( aDev.LinkKeyType() == ELinkKeyUnauthenticatedNonUpgradable )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   237
        {
42
hgs
parents: 31
diff changeset
   238
        BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST,"[BTNOTIF] Outgoing Pairing, Just Works pairing");
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   239
        err = iParent.AddUiCookieJustWorksPaired( aDev );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   240
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   241
    iActive->Cancel();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   242
    SetPairResult( err ? err : KErrNone );
42
hgs
parents: 31
diff changeset
   243
    if(err == KErrNone){
hgs
parents: 31
diff changeset
   244
    TRAP_IGNORE(ShowPairingResultNoteL(err));
hgs
parents: 31
diff changeset
   245
    }
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   246
    iParent.OutgoingPairCompleted( err );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   247
    iParent.RenewPairingHandler( NULL );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   248
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   249
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   250
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   251
// From class MBTNotifPairingAOObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   252
// Based on the result code, decides the next operation, either try pairing 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   253
// with another mode, or complete pair request.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   254
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   255
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   256
void CBTNotifOutgoingPairingHandler::RequestCompletedL( 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   257
        CBtSimpleActive* aActive, TInt aStatus )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   258
    {
42
hgs
parents: 31
diff changeset
   259
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
hgs
parents: 31
diff changeset
   260
    BOstraceExt3(TRACE_DEBUG,DUMMY_DEVLIST,"reqid %d, status: %d, pair mode %d ", aActive->RequestId(), aStatus, iPairMode);
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   261
    if( aActive->RequestId() == EDedicatedBonding && 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   262
				( aStatus == KErrRemoteDeviceIndicatedNoBonding || 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   263
					( aStatus && iPairMode != EBTOutgoingNoneHeadsetPairing && iPairMode != EBTOutgoingPairNone ) )   )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   264
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   265
        // try general pairing if the remote doesn't have dedicated bonding, or
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   266
        // pairing fails with a headset.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   267
        DoPairingL();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   268
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   269
    else if ( aStatus && iPairMode == EBTOutgoingHeadsetAutoPairing )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   270
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   271
        iPairMode = EBTOutgoingHeadsetManualPairing;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   272
        // auto pairing with headset failed, try to pair again with manual pin:
42
hgs
parents: 31
diff changeset
   273
        BOstrace0(TRACE_DEBUG,DUMMY_DEVLIST," auto pairing failed, switch to manual pairing");     
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   274
        DoPairingL();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   275
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   276
    else if ( aStatus && aActive->RequestId() == EGeneralBonding && 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   277
              iPairMode == EBTOutgoingHeadsetManualPairing )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   278
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   279
        // pairing headset with manual pin failed, wait for a while and try again:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   280
        iActive->SetRequestId( EGeneralBondingRetryTimer );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   281
        iTimer.After( iActive->iStatus, KGeneralBondingRetryDelayMicroSeconds );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   282
        iActive->GoActive();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   283
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   284
    else if( aActive->RequestId() == EGeneralBondingRetryTimer )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   285
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   286
        // try to pair headset again with manual pin again:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   287
        DoPairingL();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   288
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   289
    else if ( aStatus )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   290
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   291
        // we only starts showing note if pairing failed.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   292
        // For a successful pair, we must wait until registry has been updated.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   293
        if ( !IsPairResultSet() )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   294
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   295
            SetPairResult( aStatus );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   296
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   297
        if ( aStatus )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   298
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   299
            iParent.OutgoingPairCompleted( aStatus );
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
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   304
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   305
// From class MBTEngActiveObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   306
// cancels an outstanding request according to the given id.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   307
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   308
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   309
void CBTNotifOutgoingPairingHandler::CancelRequest( TInt aRequestId )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   310
    {
42
hgs
parents: 31
diff changeset
   311
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   312
    switch ( aRequestId )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   313
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   314
        case EDedicatedBonding:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   315
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   316
            iBondingSession.Close();
42
hgs
parents: 31
diff changeset
   317
            break;
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   318
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   319
        case EGeneralBonding:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   320
        case EGeneralBondingRetry:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   321
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   322
            iSocket.CancelConnect();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   323
            iSocket.Close();
42
hgs
parents: 31
diff changeset
   324
            break;
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   325
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   326
        case EGeneralBondingRetryTimer:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   327
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   328
            iTimer.Cancel();
42
hgs
parents: 31
diff changeset
   329
            break;
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   330
            }     
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   331
        }
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
// From class MBTEngActiveObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   336
// Handles a leave in RequestCompleted by self-destructing.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   337
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   338
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   339
void CBTNotifOutgoingPairingHandler::HandleError( 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   340
        CBtSimpleActive* aActive, TInt aError )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   341
    {
42
hgs
parents: 31
diff changeset
   342
    BOstrace1(TRACE_DEBUG,DUMMY_DEVLIST,"error: %d", aError );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   343
    // Our RunL can actually not leave, so we should never reach here.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   344
    (void) aActive;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   345
    iParent.OutgoingPairCompleted( aError );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   346
    iParent.RenewPairingHandler( NULL );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   347
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   348
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   349
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   350
// decide the next state and issue pair request
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   351
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   352
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   353
void CBTNotifOutgoingPairingHandler::DoPairingL()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   354
    {
42
hgs
parents: 31
diff changeset
   355
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   356
    TPairingStageId currentMode = ( TPairingStageId ) iActive->RequestId();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   357
    ASSERT( !iActive->IsActive() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   358
    TPairingStageId nextMode( EGeneralBonding );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   359
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   360
    // if running BTv2.0 stack, dedicated bonding method 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   361
    // is not available.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   362
    if ( currentMode == ENoBonding && iParent.PairingServer() != NULL )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   363
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   364
        nextMode = EDedicatedBonding;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   365
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   366
    else if(currentMode == EGeneralBondingRetryTimer)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   367
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   368
        nextMode = EGeneralBondingRetry;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   369
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   370
    
42
hgs
parents: 31
diff changeset
   371
    BOstraceExt2(TRACE_DEBUG,DUMMY_DEVLIST,"[BTENG] CBTEngOtgPair::DoPairingL: bonding mode: pre %d, next %d", currentMode, nextMode);
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   372
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   373
    iActive->SetRequestId( nextMode );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   374
    if ( nextMode == EDedicatedBonding )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   375
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   376
        iBondingSession.Start( *iParent.PairingServer(), iAddr, iActive->RequestStatus() );          
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   377
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   378
    else
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   379
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   380
        TBTServiceSecurity sec;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   381
        sec.SetAuthentication( ETrue );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   382
        iSockAddr.SetBTAddr( iAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   383
        iSockAddr.SetPort(KSDPPSM);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   384
        iSockAddr.SetSecurity( sec );    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   385
        iSocket.Close();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   386
        User::LeaveIfError( iSocket.Open( iParent.SocketServ(), KL2CAPDesC ) );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   387
        iSocket.Connect( iSockAddr, iActive->RequestStatus() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   388
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   389
    iActive->GoActive();
42
hgs
parents: 31
diff changeset
   390
    BOstraceFunctionExit0( DUMMY_DEVLIST );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   391
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   392