bluetoothengine/btnotif/btnotifsrv/src/btnotifpairingmanager.cpp
author hgs
Mon, 17 May 2010 11:06:23 +0300
changeset 31 a0ea99b6fa53
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 "btnotifpairingmanager.h"
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    19
#include "btnotifoutgoingpairinghandler.h"
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    20
#include "btnotifincomingpairinghandler.h"
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    21
#include "btnotifpairnotifier.h"
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    22
#include "btnotifclientserver.h"
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    23
#include <e32property.h>
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    24
#include "btnotifconnectiontracker.h"
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    25
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    26
/**  Identification for active object */
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    27
enum TPairManActiveRequestId
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    28
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    29
    ESimplePairingResult,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    30
    EAuthenticationResult,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    31
    ERegistryGetLocalAddress,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    32
    };
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    33
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    34
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    35
// Tells if two TBTNamelessDevice instances are for the same remote device
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    36
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    37
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    38
TBool CompareDeviceByAddress( const TBTNamelessDevice& aDevA, const TBTNamelessDevice& aDevB )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    39
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    40
    return aDevA.Address() == aDevB.Address();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    41
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    42
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    43
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    44
// Tells if these two instances are for the same remote device
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    45
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    46
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    47
TBool MatchDeviceAddress(const TBTDevAddr* aAddr, const TBTNamelessDevice& aDev)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    48
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    49
    return *aAddr == aDev.Address();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    50
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    51
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    52
// ======== MEMBER FUNCTIONS ========
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    53
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    54
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    55
// C++ default constructor
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    56
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    57
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    58
CBTNotifPairingManager::CBTNotifPairingManager(
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    59
        CBTNotifConnectionTracker& aParent,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    60
        CBtDevRepository& aDevRepository)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    61
    : iParent( aParent ), iDevRepository( aDevRepository )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    62
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    63
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    64
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    65
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    66
// Symbian 2nd-phase constructor
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    67
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    68
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    69
void CBTNotifPairingManager::ConstructL()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    70
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    71
    // Connect to pairing server for authentication & simple pairing 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    72
    // results directly from the BT stack.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    73
    // Pairing server doesn't exist if we run BT 2.0 stack:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    74
    iPairingServ = new (ELeave) RBluetoothPairingServer;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    75
    TInt err = iPairingServ->Connect();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    76
    if ( err)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    77
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    78
        delete iPairingServ;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    79
        iPairingServ = NULL;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    80
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    81
    else
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    82
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    83
        User::LeaveIfError( iPairingResult.Open( *iPairingServ ) );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    84
        User::LeaveIfError( iAuthenResult.Open( *iPairingServ ) );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    85
        iSSPResultActive = CBtSimpleActive::NewL( *this, ESimplePairingResult );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    86
        iAuthenResultActive = CBtSimpleActive::NewL( *this, EAuthenticationResult );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    87
        SubscribeSspPairingResult();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    88
        SubscribeAuthenticateResult();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    89
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    90
    User::LeaveIfError( iRegistry.Open( iParent.RegistryServerSession() ) );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    91
    // RProperty for accessing the local device address
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    92
    User::LeaveIfError( iPropertyLocalAddr.Attach(
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    93
            KPropertyUidBluetoothCategory, KPropertyKeyBluetoothGetLocalDeviceAddress) );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    94
    // Initialise paired devices list
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    95
    iLocalAddrActive = CBtSimpleActive::NewL( *this, ERegistryGetLocalAddress );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    96
    SubscribeLocalAddress();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    97
    iPairNotifier = CBTNotifPairNotifier::NewL( *this );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    98
    iDevRepository.AddObserverL( this );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    99
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   100
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   101
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   102
// NewL
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   103
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   104
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   105
CBTNotifPairingManager* CBTNotifPairingManager::NewL(
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   106
        CBTNotifConnectionTracker& aParent,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   107
        CBtDevRepository& aDevRepository )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   108
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   109
    CBTNotifPairingManager* self = NULL;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   110
    self = new  CBTNotifPairingManager( aParent, aDevRepository );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   111
    CleanupStack::PushL( self );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   112
    self->ConstructL();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   113
    CleanupStack::Pop( self );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   114
    return self;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   115
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   116
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   117
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   118
// Destructor
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   119
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   120
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   121
CBTNotifPairingManager::~CBTNotifPairingManager()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   122
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   123
    delete iSSPResultActive;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   124
    delete iAuthenResultActive;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   125
    delete iPairNotifier;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   126
    delete iPairingHandler;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   127
    iPairedDevices.Close();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   128
    iPairingResult.Close();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   129
    iAuthenResult.Close();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   130
    if ( iPairingServ )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   131
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   132
        iPairingServ->Close();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   133
        delete iPairingServ;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   134
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   135
    iRegistry.Close();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   136
    delete iLocalAddrActive;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   137
    iPropertyLocalAddr.Close();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   138
    if ( !iMessage.IsNull() )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   139
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   140
        iMessage.Complete( KErrCancel );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   141
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   142
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   143
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   144
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   145
// Initialises the paired devices list.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   146
// If the local address is not available from the P&S key 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   147
// KPropertyKeyBluetoothGetLocalDeviceAddress, then the list may need to be 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   148
// updated once the H/W is switched on. This is so that any registry update 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   149
// from a restore operation can be included in the list, without mistaking the 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   150
// new devices for new pairings.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   151
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   152
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   153
void CBTNotifPairingManager::SubscribeLocalAddress()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   154
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   155
    // Check that we have the Bluetooth local address. If we don't then initialise anyway, but subscribe for an update.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   156
    // This allows us to refresh our paired devices list to include updates made to the remote devices table of the 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   157
    // Bluetooth registry from a restore operation. We need to include these devices without mistaking them for new 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   158
    // pairings. We look solely at the P&S key for the address to avoid the condition whereby the address has been
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   159
    // entered into the reigstry but the Bluetooth Manager server has not begun the restore process yet. The signalling
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   160
    // of the P&S key will cause Bluetooth Manager to update the registry with any restored devices before fulfilling
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   161
    // any further requests.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   162
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   163
    // Subscribe to local address property in case we need an update.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   164
    iPropertyLocalAddr.Subscribe( iLocalAddrActive->iStatus );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   165
    iLocalAddrActive->SetRequestId( ERegistryGetLocalAddress );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   166
    iLocalAddrActive->GoActive();
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
// Tells whether the local address is available from the P&S key 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   171
// KPropertyKeyBluetoothGetLocalDeviceAddress.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   172
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   173
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   174
TBool CBTNotifPairingManager::IsLocalAddressAvailable()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   175
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   176
    // Attempt to read address from P&S key.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   177
    TBuf8<KBTDevAddrSize> btAddrDes;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   178
    TInt err = iPropertyLocalAddr.Get( btAddrDes );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   179
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   180
    // Is the P&S key defined yet? (if not, stack not up yet)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   181
    if ( err == KErrNone )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   182
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   183
        // P&S key defined, is local address set? (if not, H/W not initialised yet)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   184
        if ( btAddrDes.Length() == KBTDevAddrSize )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   185
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   186
            TBTDevAddr btAddr = btAddrDes;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   187
            if ( btAddr != TBTDevAddr() )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   188
                {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   189
                return ETrue;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   190
                }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   191
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   192
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   193
    return EFalse;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   194
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   195
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   196
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   197
// Handles pairing related requests from BTNotif clients.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   198
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   199
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   200
void CBTNotifPairingManager::HandleBondingRequestL( const RMessage2& aMessage )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   201
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   202
    TInt opcode = aMessage.Function();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   203
    TBTDevAddrPckgBuf addrPkg;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   204
    switch( opcode )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   205
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   206
        case EBTNotifPairDevice:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   207
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   208
            if ( !iMessage.IsNull() )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   209
                {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   210
                User::Leave( KErrServerBusy );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   211
                }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   212
            TBTDevAddrPckgBuf addrPkg;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   213
            aMessage.ReadL( EBTNotifSrvParamSlot, addrPkg );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   214
            UnpairDevice( addrPkg() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   215
            PairDeviceL( addrPkg(), aMessage.Int2() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   216
            iMessage = RMessage2( aMessage );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   217
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   218
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   219
        case EBTNotifCancelPairDevice:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   220
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   221
            // Only the client who requested pairing can cancel it:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   222
            if ( !iMessage.IsNull() && aMessage.Session() == iMessage.Session() )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   223
                {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   224
                iPairingHandler->CancelOutgoingPair();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   225
                iMessage.Complete( KErrCancel );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   226
                }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   227
            aMessage.Complete( KErrNone );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   228
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   229
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   230
        default:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   231
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   232
            User::Leave( KErrArgument );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   233
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   234
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   235
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   236
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   237
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   238
// Process a client message related to notifiers.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   239
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   240
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   241
void CBTNotifPairingManager::HandlePairingNotifierRequestL( const RMessage2& aMessage )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   242
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   243
    iPairNotifier->StartPairingNotifierL( aMessage );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   244
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   245
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   246
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   247
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   248
// Returns the RBluetoothPairingServer instance.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   249
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   250
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   251
RBluetoothPairingServer* CBTNotifPairingManager::PairingServer()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   252
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   253
    return iPairingServ;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   254
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   255
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   256
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   257
// Access the reference of RSockServ
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   258
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   259
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   260
RSocketServ& CBTNotifPairingManager::SocketServ()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   261
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   262
    return iParent.SocketServerSession();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   263
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   264
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   265
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   266
// Access the reference of RBTRegSrv
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   267
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   268
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   269
CBtDevRepository& CBTNotifPairingManager::BTDevRepository()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   270
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   271
    return iDevRepository;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   272
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   273
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   274
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   275
// Access the reference of CBTNotifConnectionTracker
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   276
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   277
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   278
CBTNotifConnectionTracker& CBTNotifPairingManager::ConnectionTracker()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   279
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   280
    return iParent;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   281
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   282
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   283
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   284
// Deletes the current pairing handler and transfer the responsibility
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   285
// to the specified.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   286
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   287
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   288
void CBTNotifPairingManager::RenewPairingHandler( 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   289
        CBTNotifBasePairingHandler* aPairingHandler )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   290
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   291
    delete iPairingHandler;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   292
    iPairingHandler = aPairingHandler;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   293
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   294
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   295
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   296
// Find the session who requested this and completes its request.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   297
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   298
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   299
void CBTNotifPairingManager::OutgoingPairCompleted( TInt aErr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   300
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   301
    // the meaning of KHCIErrorBase equals KErrNone. Hide this specific BT stack
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   302
	// detail from clients:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   303
    if ( !iMessage.IsNull()  )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   304
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   305
        iMessage.Complete( (aErr == KHCIErrorBase) ? KErrNone : aErr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   306
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   307
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   308
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   309
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   310
// A session will be ended, completes the pending request for this session.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   311
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   312
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   313
void CBTNotifPairingManager::SessionClosed( CSession2* aSession )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   314
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   315
    // TRACE_FUNC_ARG( ( _L( " session %x"), aSession ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   316
    if ( !iMessage.IsNull() && iMessage.Session() == aSession )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   317
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   318
        iMessage.Complete( KErrCancel );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   319
        }
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
// Unpair the device from registry
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 CBTNotifPairingManager::UnpairDevice( const TBTDevAddr& aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   327
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   328
    TIdentityRelation<TBTNamelessDevice> addrComp( CompareDeviceByAddress );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   329
    TBTNamelessDevice dev;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   330
    dev.SetAddress( aAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   331
    // only do unpairing if the we have a link key with it.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   332
    TInt index = iPairedDevices.Find( dev, addrComp );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   333
    if ( index > KErrNotFound )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   334
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   335
        dev = iPairedDevices[index];
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   336
        TRequestStatus status( KRequestPending );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   337
        // Unpair the device in registry (synchronously)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   338
        iRegistry.UnpairDevice( dev.Address(), status );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   339
        User::WaitForRequest( status );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   340
        // TRACE_INFO( ( _L( "Delete link key, res %d"), status.Int() ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   341
        if ( status == KErrNone )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   342
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   343
            TBTDeviceSecurity security = dev.GlobalSecurity();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   344
            // Clear trust setting so that correct icon will be shown in ui applications.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   345
            security.SetNoAuthenticate(EFalse );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   346
            security.SetNoAuthorise(EFalse );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   347
            dev.SetGlobalSecurity(security);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   348
            dev.DeleteLinkKey();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   349
            if ( dev.IsValidUiCookie() && 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   350
                 ( dev.UiCookie() & EBTUiCookieJustWorksPaired ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   351
                {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   352
                // Remove the UI cookie bit for Just Works pairing.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   353
                TInt32 cookie = dev.UiCookie() & ~EBTUiCookieJustWorksPaired;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   354
                dev.SetUiCookie( cookie );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   355
                // TRACE_INFO( ( _L( "UI cookie %x cleared"), EBTUiCookieJustWorksPaired ) );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   356
                }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   357
            // modify the device in registry synchronously
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   358
            // status.Int() could be -1 if the device is not in registry 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   359
            // which is totally fine for us.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   360
            (void) UpdateRegDevice( dev );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   361
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   362
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   363
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   364
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   365
TInt CBTNotifPairingManager::AddUiCookieJustWorksPaired( const TBTNamelessDevice& aDev )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   366
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   367
    TInt err( KErrNone );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   368
    // There might be UI cookies used by other applications,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   369
    // we should not overwrite them. 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   370
    TInt32 cookie = aDev.IsValidUiCookie() ? aDev.UiCookie() : EBTUiCookieUndefined;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   371
    if ( !( cookie & EBTUiCookieJustWorksPaired ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   372
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   373
        // Only update the cookie if the wanted one is not in registry yet
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   374
        // to keep minimal operations with registry.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   375
        TBTNamelessDevice dev = aDev;		
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   376
        cookie |= EBTUiCookieJustWorksPaired;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   377
        dev.SetUiCookie( cookie );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   378
        err = UpdateRegDevice( dev );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   379
        // TRACE_INFO( ( _L( "[BTENG] CBTEngOtgPair write Ui cookie ret %d"), err ) );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   380
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   381
    return err;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   382
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   383
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   384
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   385
// update a nameless device in registry
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   386
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   387
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   388
TInt CBTNotifPairingManager::UpdateRegDevice( const TBTNamelessDevice& aDev )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   389
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   390
    TRequestStatus status( KRequestPending );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   391
    // update the device in registry synchronously
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   392
    iRegistry.ModifyDevice( aDev, status );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   393
    User::WaitForRequest( status );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   394
    // TRACE_INFO( ( _L( "UpdateRegDevice, ret %d"), status.Int() ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   395
    return status.Int();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   396
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   397
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   398
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   399
// 0000 for outgoing pairing with a headset.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   400
// The placeholder for future extension (pin code passed in for pairing)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   401
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   402
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   403
void CBTNotifPairingManager::GetPinCode(
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   404
        TBTPinCode& aPin, const TBTDevAddr& aAddr, TInt aMinPinLength )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   405
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   406
    if ( iPairingHandler )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   407
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   408
        iPairingHandler->GetPinCode( aPin, aAddr, aMinPinLength );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   409
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   410
    else
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   411
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   412
        // make sure not to leave any text as PIN.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   413
        aPin.Zero();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   414
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   415
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   416
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   417
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   418
// Ask server class the connection status of the specified device
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   419
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   420
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   421
TBTEngConnectionStatus CBTNotifPairingManager::ConnectStatus( const TBTDevAddr& aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   422
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   423
    const CBtDevExtension* devExt = iDevRepository.Device(aAddr);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   424
    TBTEngConnectionStatus status = EBTEngNotConnected;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   425
    if ( devExt ) 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   426
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   427
        status = devExt->ServiceConnectionStatus();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   428
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   429
    return status;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   430
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   431
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   432
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   433
// From class MBTNotifPairingAOObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   434
// Checks if there is an authentication result.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   435
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   436
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   437
void CBTNotifPairingManager::RequestCompletedL( CBtSimpleActive* aActive, TInt aStatus )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   438
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   439
    // TRACE_FUNC_ARG( ( _L( "aId: %d, aStatus: %d"), aId, aStatus ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   440
    // Check which request is completed.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   441
    switch( aActive->RequestId() )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   442
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   443
        case ESimplePairingResult:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   444
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   445
            TBTDevAddr tmpAddr = iSimplePairingRemote;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   446
            if (aStatus != KErrServerTerminated)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   447
                {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   448
                SubscribeSspPairingResult();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   449
                }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   450
            HandlePairingResultL( tmpAddr, aStatus );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   451
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   452
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   453
        case EAuthenticationResult:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   454
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   455
            TBTDevAddr tmpAddr = iAuthenticateRemote;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   456
            if (aStatus != KErrServerTerminated)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   457
                {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   458
                SubscribeAuthenticateResult();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   459
                }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   460
            HandlePairingResultL( tmpAddr, aStatus );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   461
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   462
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   463
        case ERegistryGetLocalAddress:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   464
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   465
            TBool value = IsLocalAddressAvailable();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   466
            SubscribeLocalAddress();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   467
            if ( value ) 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   468
                {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   469
                // Refresh paired devices list to include any restored devices.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   470
                iDevRepository.ReInitialize();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   471
                }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   472
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   473
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   474
        default:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   475
            // Should not be possible, but no need for handling.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   476
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   477
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   478
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   479
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   480
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   481
// From class MBTEngActiveObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   482
// cancels an outstanding request according to the given id.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   483
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   484
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   485
void CBTNotifPairingManager::CancelRequest( TInt aRequestId )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   486
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   487
    switch ( aRequestId )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   488
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   489
        case ESimplePairingResult:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   490
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   491
            // Cancel listening Simple pairing result
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   492
            iPairingResult.CancelSimplePairingResult();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   493
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   494
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   495
        case EAuthenticationResult:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   496
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   497
            // Cancel listening authentication result
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   498
            iAuthenResult.CancelAuthenticationResult();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   499
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   500
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   501
        case ERegistryGetLocalAddress:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   502
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   503
            // cancel listening local address status change
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   504
            iPropertyLocalAddr.Cancel();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   505
            break;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   506
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   507
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   508
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   509
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   510
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   511
// From class MBtSimpleActiveObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   512
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   513
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   514
void CBTNotifPairingManager::HandleError( CBtSimpleActive* aActive, TInt aError )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   515
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   516
    // TRACE_FUNC_ARG( ( _L( "request id: %d, error: %d" ), aId, aError ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   517
    (void) aActive;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   518
    (void) aError;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   519
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   520
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   521
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   522
// From class MBtDevRepositoryObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   523
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   524
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   525
void CBTNotifPairingManager::RepositoryInitialized()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   526
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   527
    TRAPD(err, UpdatePairedDeviceListL() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   528
    if ( !err && iPairingHandler )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   529
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   530
        // non-null pairing handler means we are involved in a
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   531
        // pairing operation already.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   532
        // todo: is some handling for above case needed?
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   533
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   534
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   535
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   536
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   537
// From class MBtDevRepositoryObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   538
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   539
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   540
void CBTNotifPairingManager::DeletedFromRegistry( const TBTDevAddr& aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   541
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   542
    // We are only interested in the removal of a paired device.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   543
    // thus check whether it is in our local paired list:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   544
    TInt i = iPairedDevices.Find( aAddr, MatchDeviceAddress);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   545
    if ( i > KErrNotFound )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   546
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   547
        iPairedDevices.Remove( i );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   548
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   549
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   550
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   551
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   552
// From class MBtDevRepositoryObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   553
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   554
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   555
void CBTNotifPairingManager::AddedToRegistry( const CBtDevExtension& aDevice )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   556
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   557
    // We are only interested in paired device.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   558
    if ( CBtDevExtension::IsBonded( aDevice.Device().AsNamelessDevice() ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   559
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   560
        TRAP_IGNORE( 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   561
                HandleRegistryBondingL( aDevice.Device().AsNamelessDevice() ) );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   562
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   563
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   564
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   565
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   566
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   567
// From class MBtDevRepositoryObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   568
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   569
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   570
void CBTNotifPairingManager::ChangedInRegistry(
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   571
        const CBtDevExtension& aDevice, TUint aSimilarity )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   572
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   573
    // We are only interested in paired device.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   574
    // thus check whether it is in our local paired list:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   575
    TInt i = iPairedDevices.Find( aDevice.Addr(), MatchDeviceAddress);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   576
    TBool bonded = CBtDevExtension::IsBonded( aDevice.Device().AsNamelessDevice() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   577
    if ( i == KErrNotFound )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   578
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   579
        if ( bonded ) 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   580
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   581
            TRAP_IGNORE(
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   582
                    HandleRegistryBondingL( 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   583
                            aDevice.Device().AsNamelessDevice() ) );                
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   584
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   585
        return;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   586
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   587
    // Device was inregistry before, but we need to evaluate its bonding
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   588
    // status.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   589
    // The given similarity will tell if the linkkey and paired is changed
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   590
    // or not.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   591
    TInt pairingProperty = TBTNamelessDevice::EIsPaired 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   592
            | TBTNamelessDevice::ELinkKey;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   593
    if ( ( pairingProperty & aSimilarity) == pairingProperty )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   594
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   595
        // no pairing or linkkey change. Nothing to do for pairing handling.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   596
        // but we'd better update local copy just in case other data
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   597
        // of this device is needed by someone:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   598
        iPairedDevices[i] = aDevice.Device().AsNamelessDevice();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   599
        return;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   600
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   601
    if ( !CBtDevExtension::IsBonded( aDevice.Device().AsNamelessDevice() ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   602
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   603
        // device is not user-bonded.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   604
        iPairedDevices.Remove( i );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   605
        return;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   606
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   607
    // it is a new paired device if its link-key has been upgraded
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   608
    if ( aDevice.Device().LinkKeyType() != ELinkKeyUnauthenticatedUpgradable )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   609
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   610
        iPairedDevices.Remove( i );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   611
        TRAP_IGNORE(
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   612
                HandleRegistryBondingL( 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   613
                        aDevice.Device().AsNamelessDevice() ) );                
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   614
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   615
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   616
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   617
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   618
// From class MBtDevRepositoryObserver.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   619
// This class is not interested in such events.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   620
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   621
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   622
void CBTNotifPairingManager::ServiceConnectionChanged(
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   623
        const CBtDevExtension& aDevice, TBool aConnected )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   624
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   625
    (void) aDevice;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   626
    (void) aConnected;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   627
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   628
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   629
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   630
// Activate or deactivate a pairing handler
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   631
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   632
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   633
TInt CBTNotifPairingManager::SetPairObserver(const TBTDevAddr& aAddr, TBool aActivate)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   634
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   635
    // TRACE_FUNC_ARG( ( _L( "%d" ), aActivate ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   636
    // TRACE_BDADDR( aAddr )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   637
    TInt err( KErrNone );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   638
    if ( !aActivate )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   639
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   640
        if ( iPairingHandler )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   641
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   642
            iPairingHandler->StopPairHandling( aAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   643
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   644
        return err;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   645
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   646
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   647
    if ( !iPairingHandler)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   648
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   649
        // This is an incoming pair, unpair it from registry and 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   650
        // create the handler:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   651
        UnpairDevice( aAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   652
        TRAP( err, iPairingHandler = CBTNotifIncomingPairingHandler::NewL( *this, aAddr ));     
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   653
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   654
    if ( iPairingHandler)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   655
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   656
        // let the handler decide what to do:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   657
        err = iPairingHandler->ObserveIncomingPair( aAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   658
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   659
    return err;
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   660
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   661
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   662
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   663
// Delegates the request to current pair handler
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   664
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   665
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   666
void CBTNotifPairingManager::PairDeviceL( const TBTDevAddr& aAddr, TUint32 aCod )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   667
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   668
    if ( !iPairingHandler)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   669
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   670
        // no existing pair handling, create one:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   671
        iPairingHandler = CBTNotifOutgoingPairingHandler::NewL( *this, aAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   672
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   673
    // let pair handler decide what to do:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   674
    iPairingHandler->HandleOutgoingPairL( aAddr, aCod );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   675
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   676
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   677
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   678
// cancel Subscribings to simple pairing result and authentication result from
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   679
// Pairing Server
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   680
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   681
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   682
void CBTNotifPairingManager::CancelSubscribePairingAuthenticate()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   683
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   684
    if( iSSPResultActive )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   685
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   686
        // Cancel listening Simple pairing result
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   687
        iSSPResultActive->Cancel();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   688
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   689
    if( iAuthenResultActive )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   690
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   691
        iAuthenResultActive->Cancel();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   692
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   693
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   694
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   695
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   696
// Subscribes to simple pairing result from Pairing Server (if not already 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   697
// subscribed).
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   698
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   699
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   700
void CBTNotifPairingManager::SubscribeSspPairingResult()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   701
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   702
    if ( !iSSPResultActive->IsActive() )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   703
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   704
        iPairingResult.SimplePairingResult( iSimplePairingRemote, iSSPResultActive->RequestStatus() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   705
        iSSPResultActive->GoActive();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   706
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   707
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   708
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   709
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   710
// Subscribes to authentication result from Pairing Server (if not already
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   711
// subscribed).
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   712
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   713
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   714
void CBTNotifPairingManager::SubscribeAuthenticateResult()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   715
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   716
    if ( !iAuthenResultActive->IsActive() )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   717
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   718
        // Subscribe authentication result (which requires pairing for unpaired devices)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   719
        iAuthenResult.AuthenticationResult( iAuthenticateRemote, iAuthenResultActive->RequestStatus() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   720
        iAuthenResultActive->GoActive();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   721
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   722
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   723
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   724
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   725
// Handle a pairing result from the pairing server.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   726
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   727
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   728
void CBTNotifPairingManager::HandlePairingResultL( const TBTDevAddr& aAddr, TInt aResult )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   729
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   730
    // TRACE_FUNC_ARG( (_L("result %d"), aResult ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   731
    // TRACE_BDADDR( aAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   732
    if ( !iPairingHandler && ( aResult == KErrNone || aResult == KHCIErrorBase ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   733
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   734
        // we only create new handler if incoming pairing succeeds.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   735
        // Pairing failure could be caused by user local cancellation, as the  
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   736
        // result, the handler was destroyed by notifier. We shall not
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   737
        // instantiate the handler again.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   738
        // If a pairing failed due to other reasons than user local cancelling,
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   739
        // it will be catched by the already started handler 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   740
        // (except Just Works pairing - no handler for it at all until we receive
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   741
        // registry change event. Thus if incoming JWs pairing failed, no user
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   742
        // notification will be shown.)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   743
        iPairedDevices.Find( aAddr, MatchDeviceAddress);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   744
        TInt index = iPairedDevices.Find( aAddr, MatchDeviceAddress);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   745
        // If the device is not found in the old paired device list, it is a new
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   746
        // paired device:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   747
        if ( index == KErrNotFound)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   748
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   749
            // No handler yet, create incoming pairing handler:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   750
            iPairingHandler = CBTNotifIncomingPairingHandler::NewL( *this, aAddr );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   751
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   752
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   753
    if ( iPairingHandler )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   754
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   755
        iPairingHandler->HandlePairServerResult( aAddr, aResult );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   756
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   757
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   758
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   759
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   760
// copy the nameless devices to local array
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   761
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   762
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   763
void CBTNotifPairingManager::UpdatePairedDeviceListL()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   764
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   765
    iPairedDevices.Reset();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   766
    const RDevExtensionArray& alldevs = iDevRepository.AllDevices();
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   767
    for ( TInt i = 0; i < alldevs.Count(); i++ )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   768
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   769
        // TRACE_BDADDR( iPairedDevicesResp->Results()[i]->BDAddr() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   770
        // TRACE_INFO((_L("[BTENG]\t linkkeytype %d"), 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   771
        //        iPairedDevicesResp->Results()[i]->LinkKeyType()))
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   772
        if ( CBtDevExtension::IsBonded( alldevs[i]->Device().AsNamelessDevice() ) )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   773
            {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   774
            iPairedDevices.AppendL( alldevs[i]->Device().AsNamelessDevice() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   775
            }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   776
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   777
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   778
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   779
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   780
// Create incoming pairing handler if no one exists yet.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   781
// ---------------------------------------------------------------------------
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   782
//
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   783
void CBTNotifPairingManager::HandleRegistryBondingL(
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   784
        const TBTNamelessDevice& aNameless)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   785
    {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   786
    TInt err = iPairedDevices.Append( aNameless );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   787
    if ( !err && !iPairingHandler)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   788
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   789
        // New paired device, but no pairing handler yet.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   790
        // this means an incoming pairing has occured:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   791
        TRAP( err, iPairingHandler = 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   792
                CBTNotifIncomingPairingHandler::NewL( *this, aNameless.Address() ) );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   793
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   794
    if ( !err )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   795
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   796
        // We have a pairing handler now.
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   797
        // Ask pair handler to decide what to do:
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   798
        iPairingHandler->HandleRegistryNewPairedEvent( 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   799
                aNameless );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   800
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   801
    else if ( iPairingHandler )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   802
        {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   803
        // error could occur due to no memory, 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   804
        // let us try aborting pairing handling
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   805
        iPairingHandler->StopPairHandling( aNameless.Address() );
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   806
        }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   807
    }
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   808
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   809