bluetoothengine/btnotif/btnotifsrv/src/btnotifconnectiontracker.cpp
author hgs
Mon, 17 May 2010 11:06:23 +0300
changeset 31 a0ea99b6fa53
parent 29 48ae3789ce00
child 40 997690c3397a
permissions -rw-r--r--
201019_1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     1
/*
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
     3
* All rights reserved.
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
     4
* This component and the accompanying materials are made available
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
     6
* which accompanies this distribution, and is available
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
     8
*
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
     9
* Initial Contributors:
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    10
* Nokia Corporation - initial contribution.
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    11
*
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    12
* Contributors:
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    13
*
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    14
* Description: Bluetooth connection tracker and manager.
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    15
*
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    16
*/
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    17
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    18
#include "btnotifconnectiontracker.h"
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    19
#include <btextnotifiers.h>
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    20
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    21
#include <btextnotifierspartner.h>
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    22
#endif
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    23
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    24
#include <btservices/btdevextension.h>
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    25
#include <btservices/btdevrepository.h>
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    26
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    27
#include "btnotifsession.h"
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    28
#include "btnotifclientserver.h"
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    29
#include "bluetoothtrace.h"
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    30
#include "btnotifpairingmanager.h"
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    31
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    32
/**  Time window for determining if there are too many requests. */
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    33
#ifndef __WINS__
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    34
#define KDENYTHRESHOLD TTimeIntervalSeconds(3)
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    35
#else   //__WINS__
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    36
#define KDENYTHRESHOLD TTimeIntervalSeconds(5)
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    37
#endif  //__WINS__
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    38
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    39
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    40
// ======== LOCAL FUNCTIONS ========
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    41
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    42
// ======== MEMBER FUNCTIONS ========
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    43
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    44
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    45
// C++ default constructor
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    46
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    47
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    48
CBTNotifConnectionTracker::CBTNotifConnectionTracker( CBTNotifServer* aServer )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    49
:   iServer( aServer )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    50
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    51
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    52
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    53
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    54
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    55
// Symbian 2nd-phase constructor
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    56
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    57
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    58
void CBTNotifConnectionTracker::ConstructL()
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    59
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    60
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    61
    // Open a handle to the registry server
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    62
    User::LeaveIfError( iBTRegistrySession.Connect() );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    63
    // Open a handle to the socket server
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    64
    User::LeaveIfError( iSockServ.Connect() );
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    65
    iPairingManager = CBTNotifPairingManager::NewL(*this, iServer->DevRepository() );
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    66
    BOstraceFunctionExit0( DUMMY_DEVLIST );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    67
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    68
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    69
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    70
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    71
// NewL.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    72
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    73
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    74
CBTNotifConnectionTracker* CBTNotifConnectionTracker::NewL( CBTNotifServer* aServer )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    75
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    76
    CBTNotifConnectionTracker* self = new( ELeave ) CBTNotifConnectionTracker( aServer );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    77
    CleanupStack::PushL( self );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    78
    self->ConstructL();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    79
    CleanupStack::Pop( self );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    80
    return self;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    81
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    82
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    83
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    84
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    85
// Destructor
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    86
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    87
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    88
CBTNotifConnectionTracker::~CBTNotifConnectionTracker()
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    89
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    90
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    91
    iDeniedRequests.Close();
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    92
    delete iPairingManager;
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    93
    iSockServ.Close();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    94
    iBTRegistrySession.Close();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    95
    BOstraceFunctionExit0( DUMMY_DEVLIST );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    96
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    97
48ae3789ce00 201017_2
hgs
parents:
diff changeset
    98
// ---------------------------------------------------------------------------
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
    99
// Process notifier message related to pairing notifiers.
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   100
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   101
//
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
   102
void CBTNotifConnectionTracker::HandlePairingNotifierRequestL( const RMessage2& aMessage )
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   103
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   104
    BOstraceFunctionEntryExt ( DUMMY_LIST, this, aMessage.Function() );
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
   105
    iPairingManager->HandlePairingNotifierRequestL(aMessage);
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   106
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   107
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   108
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   109
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   110
// Handle a request related to pairing.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   111
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   112
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   113
void CBTNotifConnectionTracker::HandleBondingRequestL( const RMessage2& aMessage )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   114
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   115
    BOstraceFunctionEntryExt ( DUMMY_LIST, this, aMessage.Function() );
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
   116
    iPairingManager->HandleBondingRequestL(aMessage);
29
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   117
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   118
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   119
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   120
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   121
// Check if this device has been denied a connection already before.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   122
// Also check if a previous connection attempt has just been rejected.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   123
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   124
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   125
TBool CBTNotifConnectionTracker::UpdateBlockingHistoryL( const CBTDevice* aDevice, 
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   126
    TBool aAccepted )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   127
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   128
    BOstraceFunctionEntry0( DUMMY_DEVLIST );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   129
    __ASSERT_ALWAYS( aDevice, PanicServer( EBTNotifPanicBadArgument ) );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   130
    // Check the time since the previous event.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   131
    TBool result = RecordConnectionAttempts( aAccepted );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   132
    TInt pos = iDeniedRequests.Find( aDevice->BDAddr() );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   133
    if( !aAccepted )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   134
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   135
        if( pos == KErrNotFound )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   136
            {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   137
            // The user denied the request from a new device, record the device address.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   138
            if( aDevice->IsValidPaired() && aDevice->IsPaired() )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   139
                //[MCL]: && iDevice->LinkKeyType() != ELinkKeyUnauthenticatedUpgradable )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   140
                {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   141
                // Paired devices are allowed one time rejection without a prompt for blocking.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   142
                result = EFalse;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   143
                }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   144
            iDeniedRequests.AppendL( aDevice->BDAddr() );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   145
            }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   146
        // Nothing needed here if the address is already in the array.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   147
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   148
    else if( pos > KErrNotFound )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   149
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   150
        // The user accepted a request, and it was from a device he/she 
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   151
        // previously rejected. Clear the history for this device from the array.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   152
        iDeniedRequests.Remove( pos );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   153
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   154
    BOstraceFunctionExit0( DUMMY_DEVLIST );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   155
    return result;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   156
    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   157
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   158
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   159
// Record and check the time between connection attempts.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   160
// ---------------------------------------------------------------------------
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   161
//
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   162
TBool CBTNotifConnectionTracker::RecordConnectionAttempts( TBool aAccepted )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   163
    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   164
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   165
    TBool result = ETrue;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   166
    TTime now( 0 );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   167
    if( !aAccepted )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   168
        {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   169
        now.UniversalTime();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   170
        if( iLastReject )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   171
            {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   172
            // Check the time between denied connections, that it does not go too fast.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   173
            TTimeIntervalSeconds prev( 0 );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   174
            if( !now.SecondsFrom( TTime( iLastReject ), prev ) )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   175
                {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   176
                if( prev <= KDENYTHRESHOLD )
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   177
                    {
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   178
                    // We are getting the requests too fast. Present the user with
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   179
                    // an option to turn BT off.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   180
                    //iServer->SettingsTracker()->SetPower( EFalse );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   181
                    result = EFalse;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   182
                    }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   183
                }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   184
            }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   185
        }
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   186
    // Record the current timestamp.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   187
    // It is reset in case the user accepted the request.
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   188
    iLastReject = now.Int64();
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   189
    BOstraceFunctionExitExt( DUMMY_DEVLIST, this, result );
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   190
    return result;
48ae3789ce00 201017_2
hgs
parents:
diff changeset
   191
    }
31
a0ea99b6fa53 201019_1
hgs
parents: 29
diff changeset
   192