bluetoothengine/btui/btuidelegate/btdelegatedevsecurity.cpp
author hgs
Wed, 13 Oct 2010 13:15:31 +0300
changeset 67 16e4b9007960
parent 57 5ebadcda06cb
permissions -rw-r--r--
201039_4
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
*/
47
9e2a905b887f 201029_02
hgs
parents: 42
diff changeset
    17
#include "btdelegatedevsecurity.h"
9e2a905b887f 201029_02
hgs
parents: 42
diff changeset
    18
#include "btqtconstants.h"
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    19
#include <QModelIndex>
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    20
#include <btsettingmodel.h>
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    21
#include <btdevicemodel.h>
42
hgs
parents: 31
diff changeset
    22
#include <btdelegatefactory.h>
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    23
#include <hbnotificationdialog.h>
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    24
#include "btqtconstants.h"
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    25
#include "btuiutil.h"
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    26
#include <bluetoothuitrace.h>
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    27
#include <btengconnman.h>
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    28
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    29
BtDelegateDevSecurity::BtDelegateDevSecurity(            
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    30
        BtSettingModel* settingModel, 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    31
        BtDeviceModel* deviceModel, 
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    32
        QObject *parent) :
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    33
    BtAbstractDelegate(settingModel, deviceModel, parent), mBtEngDevMan(0),
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    34
    mDisconnectDelegate(0), mBtEngAddr(0), mRegDevArray(0), mOperation(0), 
67
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
    35
    mDevice(0),mNewDev(0), mActiveHandling(false),mAddingDevToRegistry(false)
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    36
{
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    37
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this ); 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    38
    mRegDevArray = new CBTDeviceArray(1);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    39
    BTUI_ASSERT_X( mRegDevArray, "BtDelegateDevSecurity::BtDelegateDevSecurity()", 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    40
            "can't allocate regdevarray");
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    41
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    42
}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    43
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    44
BtDelegateDevSecurity::~BtDelegateDevSecurity()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    45
{
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    46
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );  
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    47
    delete mBtEngDevMan;
42
hgs
parents: 31
diff changeset
    48
    delete mDisconnectDelegate;
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    49
    delete mRegDevArray;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    50
    delete mNewDev;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    51
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    52
}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    53
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    54
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    55
/*!
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    56
    Returns the supported editor types.
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    57
    \return the sum of supported editor types
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    58
 */
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    59
int BtDelegateDevSecurity::supportedEditorTypes() const
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    60
{
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    61
    return BtDelegate::UnpairDevice 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    62
           | BtDelegate::BlockDevice
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    63
           | BtDelegate::UnblockDevice
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    64
           | BtDelegate::TrustDevice
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    65
           | BtDelegate::UntrustDevice;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    66
}
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    67
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    68
/*!
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    69
 * performs operations on remote device:  unpair, authorize/unauthorize, block/unblock
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    70
 * params of type QList<QVariant>: 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    71
 *         1) remote device address (QString)
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    72
 *         2) DeviceSecurityService operation 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    73
 */
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    74
void BtDelegateDevSecurity::exec( const QVariant &params )
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    75
{
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    76
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    77
    // check if in use already
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    78
    if ( mActiveHandling ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    79
        emit delegateCompleted(KErrInUse, this);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    80
        BOstraceFunctionExitExt( DUMMY_DEVLIST, this, KErrInUse );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    81
        return;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    82
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    83
    mActiveHandling = true;
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
    84
    
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    85
    // check parameters
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    86
    QList<QVariant> paramList = params.value< QList<QVariant> >(); 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    87
    if (paramList.count() != 2) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    88
        // wrong parameters
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    89
        emitCommandComplete( KErrArgument ); 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    90
        BOstraceFunctionExitExt( DUMMY_DEVLIST, this, KErrArgument );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    91
        return;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    92
    }
42
hgs
parents: 31
diff changeset
    93
    
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    94
    int error = 0;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    95
    TRAP( error, {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    96
        if( !mBtEngDevMan) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    97
            mBtEngDevMan = CBTEngDevMan::NewL( this );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    98
        }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    99
    });
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   100
    if (error) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   101
        emitCommandComplete( KErrNoMemory ); 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   102
        BOstraceFunctionExitExt( DUMMY_DEVLIST, this, KErrNoMemory );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   103
        return;
42
hgs
parents: 31
diff changeset
   104
    }
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   105
    
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   106
    mStrBtAddr = paramList.at(0).value<QString>();  // device to operate on
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   107
    mOperation = paramList.at(1).toInt();                   // operation
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   108
    
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   109
    addrReadbleStringToSymbian( mStrBtAddr, mBtEngAddr );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   110
    BtTraceBtAddr1( TRACE_DEBUG, DUMMY_DEVLIST, "device addr=", mBtEngAddr );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   111
    
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   112
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   113
    // get device from registry since it is needed for all operations
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   114
    mSearchPattern.FindAddress( mBtEngAddr );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   115
    mRegDevArray->ResetAndDestroy();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   116
    mBtEngDevMan->GetDevices(mSearchPattern, mRegDevArray); // callback is HandleGetDevicesComplete()
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   117
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   118
}
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   119
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   120
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   121
void BtDelegateDevSecurity::unpair()
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   122
{
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   123
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this );  
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   124
    int error = KErrNone;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   125
    
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   126
    // unpair first since malicious device might try to connect/pair again 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   127
    // immediately after disconnecting
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   128
    mDevice->SetPaired(EFalse);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   129
    mDevice->DeleteLinkKey();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   130
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   131
    // untrust the device also
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   132
    TBTDeviceSecurity security = mDevice->GlobalSecurity();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   133
    security.SetNoAuthorise( EFalse );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   134
    mDevice->SetGlobalSecurity( security );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   135
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   136
    error = mBtEngDevMan->ModifyDevice( *mDevice );  // see callback for possible disconnect
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   137
    
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   138
    if ( error ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   139
        emitCommandComplete(error);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   140
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   141
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   142
}
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   143
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   144
void BtDelegateDevSecurity::authorizeOrBlock()
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   145
{
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   146
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this ); 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   147
    BOstraceExt1( TRACE_NORMAL, DUMMY_DEVLIST, "operation (Unpair|Block|Unblock|Authorize|Unauthorize)=%d", 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   148
            mOperation);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   149
    int error = KErrNone;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   150
    
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   151
    TBTDeviceSecurity security = mDevice->GlobalSecurity();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   152
    switch ( mOperation ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   153
    case BtAuthorize:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   154
        security.SetNoAuthorise( ETrue ); // set trust status to true
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   155
        security.SetBanned( EFalse );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   156
        break;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   157
    case BtUnauthorize:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   158
        security.SetNoAuthorise( EFalse );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   159
        break;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   160
    case BtUnblock:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   161
        security.SetBanned( EFalse );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   162
        break;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   163
    case BtBlock:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   164
        security.SetBanned( ETrue );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   165
        security.SetNoAuthorise( EFalse ); // set trust status to false
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   166
        break;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   167
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   168
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   169
    mDevice->SetGlobalSecurity( security );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   170
    if ( (mOperation == BtBlock) || (mOperation == BtUnblock) ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   171
        // deleting link key for executing unblock is safe as no 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   172
        // link key shall exist if the device has been blocked. 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   173
        mDevice->DeleteLinkKey();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   174
        if ( mOperation == BtBlock ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   175
            mDevice->SetPaired(EFalse);
42
hgs
parents: 31
diff changeset
   176
        }
hgs
parents: 31
diff changeset
   177
    }
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   178
    error = mBtEngDevMan->ModifyDevice( *mDevice );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   179
    
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   180
    if ( error ) {
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   181
        emitCommandComplete(error);
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   182
    }
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   183
    BOstraceFunctionExitExt( DUMMY_DEVLIST, this, error );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   184
}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   185
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   186
void BtDelegateDevSecurity::cancel()
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   187
{
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   188
    BOstraceFunctionEntry1( DUMMY_DEVLIST, this ); 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   189
    if ( mActiveHandling ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   190
        emitCommandComplete(KErrNone);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   191
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   192
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   193
}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   194
42
hgs
parents: 31
diff changeset
   195
void BtDelegateDevSecurity::disconnectDelegateCompleted( int err )
hgs
parents: 31
diff changeset
   196
{
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   197
    BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, err );  
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   198
    if (mDisconnectDelegate) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   199
        delete mDisconnectDelegate;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   200
        mDisconnectDelegate = 0;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   201
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   202
    emitCommandComplete(err);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   203
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   204
}
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   205
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   206
void BtDelegateDevSecurity::HandleDevManComplete( TInt err )
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   207
{
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   208
    BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, err );  
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   209
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   210
    if ( !mActiveHandling ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   211
        BOstraceFunctionExit1( DUMMY_DEVLIST, this );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   212
        return;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   213
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   214
    if ( !err ) {
67
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   215
        if ( mAddingDevToRegistry ) {
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   216
            // blocked a device which was not in the registry originally
67
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   217
            mAddingDevToRegistry = false;
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   218
            delete mNewDev;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   219
            mNewDev = 0;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   220
        }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   221
        else if ( mOperation == BtBlock || mOperation == BtUnpair) {  
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   222
            // disconnect after blocking/unpairing if device is connected;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   223
            // disconnect done after block/unpair, instead of before, to prevent a malicious device 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   224
            // from reconnecting/"re-pairing"
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   225
            CBTEngConnMan *connMan(0);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   226
            TRAP( err, connMan = CBTEngConnMan::NewL() );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   227
            TBTEngConnectionStatus connstatus(EBTEngNotConnected);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   228
            if (!err) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   229
                err = connMan->IsConnected(mBtEngAddr, connstatus );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   230
                delete connMan;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   231
            }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   232
            if ( !err && connstatus == EBTEngConnected ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   233
                if (! mDisconnectDelegate){
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   234
                    mDisconnectDelegate = BtDelegateFactory::newDelegate(
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   235
                                            BtDelegate::DisconnectService, settingModel(), deviceModel()); 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   236
                    connect( mDisconnectDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), this, 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   237
                            SLOT(disconnectDelegateCompleted(int)) );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   238
                }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   239
                QList<QVariant>list;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   240
                list.append(QVariant(ServiceLevel));
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   241
                list.append(QVariant(mStrBtAddr));
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   242
                mDisconnectDelegate->exec(QVariant(list)); // see callback for continuation
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   243
                return;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   244
            }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   245
        }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   246
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   247
    emitCommandComplete(err);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   248
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
42
hgs
parents: 31
diff changeset
   249
}
hgs
parents: 31
diff changeset
   250
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   251
void BtDelegateDevSecurity::HandleGetDevicesComplete( TInt err, CBTDeviceArray* aDeviceArray )
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   252
{
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   253
    BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, err );  
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   254
    
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   255
    if ( mActiveHandling ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   256
        if ( !err && aDeviceArray->Count() ) { 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   257
            mDevice = aDeviceArray->At( 0 );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   258
            switch ( mOperation ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   259
            case BtUnpair:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   260
                unpair();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   261
                break;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   262
            case BtAuthorize:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   263
            case BtUnauthorize:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   264
            case BtUnblock:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   265
            case BtBlock:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   266
                authorizeOrBlock();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   267
                break;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   268
            default:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   269
                // wrong parameter
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   270
                emitCommandComplete( KErrArgument );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   271
            }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   272
        }
67
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   273
        else if ( err == KErrNotFound && ((mOperation == BtBlock) ||
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   274
                (mOperation == BtAuthorize))) {  // device not in registry, need to add it
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   275
            mAddingDevToRegistry = true;
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   276
            TRAP( err, {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   277
                    mNewDev = CBTDevice::NewL( mBtEngAddr );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   278
            });
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   279
            if ( !err ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   280
                // get needed info about device from model, e.g. name, cod
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   281
                QString btStringAddr;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   282
                addrSymbianToReadbleString(btStringAddr, mBtEngAddr);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   283
                QModelIndex start = deviceModel()->index(0,0);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   284
                QModelIndexList indexList = deviceModel()->match(start,
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   285
                        BtDeviceModel::ReadableBdaddrRole, btStringAddr);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   286
                // ToDo:  can we be sure that device will always be found in the model?
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   287
                QModelIndex index = indexList.at(0);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   288
                QString devName = deviceModel()->data(index,BtDeviceModel::NameAliasRole).toString();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   289
                BtTraceQString1( TRACE_DEBUG, DUMMY_DEVLIST, "device name=", devName);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   290
                TBuf<KMaxBCBluetoothNameLen> buf( devName.utf16() );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   291
                TRAP( err, mNewDev->SetDeviceNameL( BTDeviceNameConverter::ToUTF8L( buf ) ));
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   292
                if( !err ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   293
                    int cod = (index.data(BtDeviceModel::CoDRole)).toInt();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   294
                    mNewDev->SetDeviceClass(cod);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   295
                    TBTDeviceSecurity security = mNewDev->GlobalSecurity();
67
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   296
                    if (mOperation == BtBlock) {
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   297
                        security.SetBanned( ETrue );
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   298
                        security.SetNoAuthorise( EFalse ); // set trust status to false
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   299
                        mNewDev->DeleteLinkKey();
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   300
                        mNewDev->SetPaired(EFalse);
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   301
                    } else {  // BtAuthorize
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   302
                        security.SetNoAuthorise( ETrue ); // set trust status to true
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   303
                        security.SetBanned( EFalse );
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   304
                    }
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   305
                    mNewDev->SetGlobalSecurity( security );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   306
                    err = mBtEngDevMan->AddDevice( *mNewDev );  // see callback HandleDevManComplete()
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   307
                }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   308
            }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   309
        }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   310
        if (err) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   311
            emitCommandComplete( err );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   312
        }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   313
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   314
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   315
}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   316
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   317
void BtDelegateDevSecurity::emitCommandComplete(int error)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   318
{
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   319
    BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, error );  
42
hgs
parents: 31
diff changeset
   320
    // no dialogs here since stack provides "unpaired to %1" dialog
hgs
parents: 31
diff changeset
   321
    // and failures are not reported
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   322
    mActiveHandling = false;
67
16e4b9007960 201039_4
hgs
parents: 57
diff changeset
   323
    mAddingDevToRegistry = false;
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   324
    if ( mNewDev ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   325
        delete mNewDev;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   326
        mNewDev = 0;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   327
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   328
    emit delegateCompleted(error, this);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   329
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   330
}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   331
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   332
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   333
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   334