bluetoothengine/btui/btuidelegate/btdelegatedevsecurity.cpp
author hgs
Fri, 03 Sep 2010 16:17:59 +0300
changeset 57 5ebadcda06cb
parent 47 9e2a905b887f
child 67 16e4b9007960
permissions -rw-r--r--
201035_7
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), 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
    35
    mDevice(0),mNewDev(0), mActiveHandling(false),mAddingBlockedDev(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
        mAddingBlockedDev = false;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   191
        emitCommandComplete(KErrNone);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   192
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   193
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   194
}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   195
42
hgs
parents: 31
diff changeset
   196
void BtDelegateDevSecurity::disconnectDelegateCompleted( int err )
hgs
parents: 31
diff changeset
   197
{
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   198
    BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, err );  
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   199
    if (mDisconnectDelegate) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   200
        delete mDisconnectDelegate;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   201
        mDisconnectDelegate = 0;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   202
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   203
    emitCommandComplete(err);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   204
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   205
}
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   206
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   207
void BtDelegateDevSecurity::HandleDevManComplete( TInt err )
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   208
{
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   209
    BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, err );  
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   210
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   211
    if ( !mActiveHandling ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   212
        BOstraceFunctionExit1( DUMMY_DEVLIST, this );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   213
        return;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   214
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   215
    if ( !err ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   216
        if ( mAddingBlockedDev ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   217
            // blocked a device which was not in the registry originally
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   218
            mAddingBlockedDev = false;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   219
            delete mNewDev;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   220
            mNewDev = 0;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   221
        }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   222
        else if ( mOperation == BtBlock || mOperation == BtUnpair) {  
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   223
            // disconnect after blocking/unpairing if device is connected;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   224
            // disconnect done after block/unpair, instead of before, to prevent a malicious device 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   225
            // from reconnecting/"re-pairing"
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   226
            CBTEngConnMan *connMan(0);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   227
            TRAP( err, connMan = CBTEngConnMan::NewL() );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   228
            TBTEngConnectionStatus connstatus(EBTEngNotConnected);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   229
            if (!err) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   230
                err = connMan->IsConnected(mBtEngAddr, connstatus );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   231
                delete connMan;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   232
            }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   233
            if ( !err && connstatus == EBTEngConnected ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   234
                if (! mDisconnectDelegate){
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   235
                    mDisconnectDelegate = BtDelegateFactory::newDelegate(
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   236
                                            BtDelegate::DisconnectService, settingModel(), deviceModel()); 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   237
                    connect( mDisconnectDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), this, 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   238
                            SLOT(disconnectDelegateCompleted(int)) );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   239
                }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   240
                QList<QVariant>list;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   241
                list.append(QVariant(ServiceLevel));
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   242
                list.append(QVariant(mStrBtAddr));
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   243
                mDisconnectDelegate->exec(QVariant(list)); // see callback for continuation
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   244
                return;
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
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   248
    emitCommandComplete(err);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   249
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
42
hgs
parents: 31
diff changeset
   250
}
hgs
parents: 31
diff changeset
   251
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   252
void BtDelegateDevSecurity::HandleGetDevicesComplete( TInt err, CBTDeviceArray* aDeviceArray )
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   253
{
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   254
    BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, err );  
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   255
    
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   256
    if ( mActiveHandling ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   257
        if ( !err && aDeviceArray->Count() ) { 
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   258
            mDevice = aDeviceArray->At( 0 );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   259
            switch ( mOperation ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   260
            case BtUnpair:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   261
                unpair();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   262
                break;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   263
            case BtAuthorize:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   264
            case BtUnauthorize:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   265
            case BtUnblock:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   266
            case BtBlock:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   267
                authorizeOrBlock();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   268
                break;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   269
            default:
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   270
                // wrong parameter
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   271
                emitCommandComplete( KErrArgument );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   272
            }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   273
        }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   274
        else if ( err == KErrNotFound && mOperation == BtBlock) {  // device not in registry, need to add it
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   275
            mAddingBlockedDev = true;
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();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   296
                    security.SetBanned( ETrue );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   297
                    security.SetNoAuthorise( EFalse ); // set trust status to false
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   298
                    mNewDev->SetGlobalSecurity( security );
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   299
                    mNewDev->DeleteLinkKey();
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   300
                    mNewDev->SetPaired(EFalse);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   301
                    err = mBtEngDevMan->AddDevice( *mNewDev );  // see callback HandleDevManComplete()
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   302
                }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   303
            }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   304
        }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   305
        if (err) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   306
            mAddingBlockedDev = false;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   307
            emitCommandComplete( err );
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
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
31
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 BtDelegateDevSecurity::emitCommandComplete(int error)
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   314
{
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   315
    BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, error );  
42
hgs
parents: 31
diff changeset
   316
    // no dialogs here since stack provides "unpaired to %1" dialog
hgs
parents: 31
diff changeset
   317
    // and failures are not reported
57
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   318
    mActiveHandling = false;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   319
    mAddingBlockedDev = false;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   320
    if ( mNewDev ) {
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   321
        delete mNewDev;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   322
        mNewDev = 0;
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   323
    }
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   324
    emit delegateCompleted(error, this);
5ebadcda06cb 201035_7
hgs
parents: 47
diff changeset
   325
    BOstraceFunctionExit1( DUMMY_DEVLIST, this );
31
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   326
}
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   327
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   328
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   329
a0ea99b6fa53 201019_1
hgs
parents:
diff changeset
   330