bluetoothengine/btui/btuimodel/btdevicemodel_p.cpp
author hgs
Fri, 03 Sep 2010 16:17:59 +0300
changeset 57 5ebadcda06cb
parent 42 b72428996822
permissions -rw-r--r--
201035_7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: 
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "btdevicemodel_p.h"
hgs
parents:
diff changeset
    19
#include <QDateTime>
hgs
parents:
diff changeset
    20
#include <btservices/advancedevdiscoverer.h>
hgs
parents:
diff changeset
    21
#include <btengconnman.h>
hgs
parents:
diff changeset
    22
#include "btuiutil.h"
hgs
parents:
diff changeset
    23
#include "btuidevtypemap.h"
hgs
parents:
diff changeset
    24
#include "btqtconstants.h"
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
/*!
hgs
parents:
diff changeset
    27
    Constructor.
hgs
parents:
diff changeset
    28
 */
hgs
parents:
diff changeset
    29
BtDeviceModelPrivate::BtDeviceModelPrivate( BtDeviceModel& model, QObject *parent )
hgs
parents:
diff changeset
    30
    : QObject( parent ), mModel( model ), mDiscover( 0 ), mSeqNum( 0 )
hgs
parents:
diff changeset
    31
{
hgs
parents:
diff changeset
    32
    mDeviceRepo = 0;
hgs
parents:
diff changeset
    33
    isSearchingDevice = false;
hgs
parents:
diff changeset
    34
    TRAP_IGNORE({
hgs
parents:
diff changeset
    35
        mDeviceRepo = CBtDevRepository::NewL();
hgs
parents:
diff changeset
    36
    });
hgs
parents:
diff changeset
    37
    Q_CHECK_PTR( mDeviceRepo );
hgs
parents:
diff changeset
    38
    TRAP_IGNORE( mDeviceRepo->AddObserverL( this ) );
hgs
parents:
diff changeset
    39
    
hgs
parents:
diff changeset
    40
    if ( mDeviceRepo->IsInitialized() ) {
hgs
parents:
diff changeset
    41
        initializeDataStore();
hgs
parents:
diff changeset
    42
    }
hgs
parents:
diff changeset
    43
}
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
/*!
hgs
parents:
diff changeset
    46
    Destructor.
hgs
parents:
diff changeset
    47
 */
hgs
parents:
diff changeset
    48
BtDeviceModelPrivate::~BtDeviceModelPrivate()
hgs
parents:
diff changeset
    49
{
hgs
parents:
diff changeset
    50
    delete mDeviceRepo;
hgs
parents:
diff changeset
    51
    delete mDiscover;
hgs
parents:
diff changeset
    52
}
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
/*!
hgs
parents:
diff changeset
    56
    Tells whether the given column is in the range of the setting list.
hgs
parents:
diff changeset
    57
    
hgs
parents:
diff changeset
    58
    \param row the row number to be checked
hgs
parents:
diff changeset
    59
    \param col the column number to be checked
hgs
parents:
diff changeset
    60
    
hgs
parents:
diff changeset
    61
    \return true if the given row and column are valid; false otherwise.
hgs
parents:
diff changeset
    62
*/
hgs
parents:
diff changeset
    63
bool BtDeviceModelPrivate::isValid( int row, int column) const
hgs
parents:
diff changeset
    64
{
hgs
parents:
diff changeset
    65
    return row >= 0 && row < mData.count() && column == 0;
hgs
parents:
diff changeset
    66
}
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
/*!
hgs
parents:
diff changeset
    69
    \return the total amount of rows.
hgs
parents:
diff changeset
    70
    
hgs
parents:
diff changeset
    71
*/
hgs
parents:
diff changeset
    72
int BtDeviceModelPrivate::rowCount() const
hgs
parents:
diff changeset
    73
{
hgs
parents:
diff changeset
    74
    return mData.count();
hgs
parents:
diff changeset
    75
}
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
/*!
hgs
parents:
diff changeset
    78
    \return the total amount of columns.
hgs
parents:
diff changeset
    79
    
hgs
parents:
diff changeset
    80
*/
hgs
parents:
diff changeset
    81
int BtDeviceModelPrivate::columnCount() const
hgs
parents:
diff changeset
    82
{
hgs
parents:
diff changeset
    83
    return 1;
hgs
parents:
diff changeset
    84
}
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
/*!
hgs
parents:
diff changeset
    87
    Gets the value within a data item.
hgs
parents:
diff changeset
    88
    \param val contains the value at return.
hgs
parents:
diff changeset
    89
    \param row the row number which the value is from
hgs
parents:
diff changeset
    90
    \param col the column number which the value is from
hgs
parents:
diff changeset
    91
    \param role the role identifier of the value.
hgs
parents:
diff changeset
    92
 */
hgs
parents:
diff changeset
    93
void BtDeviceModelPrivate::data(QVariant& val, int row,  int col, int role ) const
hgs
parents:
diff changeset
    94
{
hgs
parents:
diff changeset
    95
    if ( isValid( row, col ) ) {
hgs
parents:
diff changeset
    96
        val = mData.at( row ).value( role );
hgs
parents:
diff changeset
    97
    }
hgs
parents:
diff changeset
    98
    else {
hgs
parents:
diff changeset
    99
        val = QVariant( QVariant::Invalid );
hgs
parents:
diff changeset
   100
    }
hgs
parents:
diff changeset
   101
}
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
/*!
hgs
parents:
diff changeset
   104
    Gets the whole item data at the specified column
hgs
parents:
diff changeset
   105
    \param row the row number of the item data to be returned
hgs
parents:
diff changeset
   106
    \param col the column number of the item data to be returned
hgs
parents:
diff changeset
   107
    \return the item data
hgs
parents:
diff changeset
   108
 */
hgs
parents:
diff changeset
   109
BtuiModelDataItem BtDeviceModelPrivate::itemData( int row, int col ) const
hgs
parents:
diff changeset
   110
{
hgs
parents:
diff changeset
   111
    if ( isValid( row, col ) ) {
hgs
parents:
diff changeset
   112
        return mData.at( row );
hgs
parents:
diff changeset
   113
    }
hgs
parents:
diff changeset
   114
    return BtuiModelDataItem();
hgs
parents:
diff changeset
   115
}
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
/*!
hgs
parents:
diff changeset
   119
    Requests the model to searching Bluetooth devices.
hgs
parents:
diff changeset
   120
    \return true if the request is accepted; false otherwise
hgs
parents:
diff changeset
   121
 */
hgs
parents:
diff changeset
   122
bool BtDeviceModelPrivate::searchDevice()
hgs
parents:
diff changeset
   123
{
hgs
parents:
diff changeset
   124
    int err ( 0 );
hgs
parents:
diff changeset
   125
    removeTransientDevices();
hgs
parents:
diff changeset
   126
    if ( !mDiscover ) {
hgs
parents:
diff changeset
   127
        TRAP(err, mDiscover = CAdvanceDevDiscoverer::NewL( *mDeviceRepo, *this) );
hgs
parents:
diff changeset
   128
    }
hgs
parents:
diff changeset
   129
    if ( !err ) {
hgs
parents:
diff changeset
   130
        TRAP(err, mDiscover->DiscoverDeviceL() );
hgs
parents:
diff changeset
   131
    }
hgs
parents:
diff changeset
   132
    isSearchingDevice = true;
hgs
parents:
diff changeset
   133
    return err == 0;
hgs
parents:
diff changeset
   134
}
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
/*!
hgs
parents:
diff changeset
   137
    Cancels a possible outstanding device search request.
hgs
parents:
diff changeset
   138
 */
hgs
parents:
diff changeset
   139
void BtDeviceModelPrivate::cancelSearchDevice()
hgs
parents:
diff changeset
   140
{
hgs
parents:
diff changeset
   141
    if ( mDiscover ) {
hgs
parents:
diff changeset
   142
        isSearchingDevice = false;
hgs
parents:
diff changeset
   143
        mDiscover->CancelDiscovery();
hgs
parents:
diff changeset
   144
    }
hgs
parents:
diff changeset
   145
}
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
/*!
hgs
parents:
diff changeset
   148
    Removes transient (not-in-registry) devices 
hgs
parents:
diff changeset
   149
    (added as the result of device search).
hgs
parents:
diff changeset
   150
 */
hgs
parents:
diff changeset
   151
void BtDeviceModelPrivate::removeTransientDevices()
hgs
parents:
diff changeset
   152
{
hgs
parents:
diff changeset
   153
    // clear in-range property for all device items in this model.
hgs
parents:
diff changeset
   154
    int cnt = mData.count();
hgs
parents:
diff changeset
   155
    for ( int i = mData.count() - 1; i > -1; --i)
hgs
parents:
diff changeset
   156
        {
hgs
parents:
diff changeset
   157
        const BtuiModelDataItem& qtdev = mData.at(i);
hgs
parents:
diff changeset
   158
        if(isDeviceInRange(qtdev)) {
hgs
parents:
diff changeset
   159
            if(isDeviceInRegistry(qtdev)) {
hgs
parents:
diff changeset
   160
                // we cannot remove this device as it is in registry.
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   161
                // remove its in-range property.
42
hgs
parents:
diff changeset
   162
                setMajorProperty(mData[i], BtuiDevProperty::InRange, false);
hgs
parents:
diff changeset
   163
                updateRssi(mData[i], RssiInvalid);
hgs
parents:
diff changeset
   164
                updateSeqNum(mData[i], -1);
hgs
parents:
diff changeset
   165
                emit deviceDataChanged(i, this);
hgs
parents:
diff changeset
   166
            }
hgs
parents:
diff changeset
   167
            else {
hgs
parents:
diff changeset
   168
                // this device is not in-registry. Delete it from local
hgs
parents:
diff changeset
   169
                // store.
hgs
parents:
diff changeset
   170
                emit beginRemoveDevices(i, i, this);
hgs
parents:
diff changeset
   171
                mData.removeAt( i );
hgs
parents:
diff changeset
   172
                emit endRemoveDevices();
hgs
parents:
diff changeset
   173
            }
hgs
parents:
diff changeset
   174
        }
hgs
parents:
diff changeset
   175
    }
hgs
parents:
diff changeset
   176
}
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
/*!
hgs
parents:
diff changeset
   179
    callback from repository.
hgs
parents:
diff changeset
   180
    re-initialize our store.
hgs
parents:
diff changeset
   181
 */
hgs
parents:
diff changeset
   182
void BtDeviceModelPrivate::RepositoryInitialized() 
hgs
parents:
diff changeset
   183
{
hgs
parents:
diff changeset
   184
    initializeDataStore();
hgs
parents:
diff changeset
   185
}
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
/*!
hgs
parents:
diff changeset
   188
    callback from repository.
hgs
parents:
diff changeset
   189
    update our store.
hgs
parents:
diff changeset
   190
 */
hgs
parents:
diff changeset
   191
void BtDeviceModelPrivate::DeletedFromRegistry( const TBTDevAddr& addr ) 
hgs
parents:
diff changeset
   192
{
hgs
parents:
diff changeset
   193
    int i = indexOf( addr );
hgs
parents:
diff changeset
   194
    if ( i > -1 ) {
hgs
parents:
diff changeset
   195
        if ( isSearchingDevice && isDeviceInRange( mData.at(i) ) ) {
hgs
parents:
diff changeset
   196
            // device searching is ongoing, and it is in-range. we can not 
hgs
parents:
diff changeset
   197
            // remove it from model now.
hgs
parents:
diff changeset
   198
            // clear-registry related properties, so that
hgs
parents:
diff changeset
   199
            // we get a chance to clean it after device searching later.
hgs
parents:
diff changeset
   200
            setMajorProperty(mData[i], BtuiDevProperty::RegistryProperties, false);
hgs
parents:
diff changeset
   201
            emit deviceDataChanged(i, this);
hgs
parents:
diff changeset
   202
        }
hgs
parents:
diff changeset
   203
        else {
hgs
parents:
diff changeset
   204
            emit beginRemoveDevices(i, i, this);
hgs
parents:
diff changeset
   205
            mData.removeAt( i );
hgs
parents:
diff changeset
   206
            emit endRemoveDevices();
hgs
parents:
diff changeset
   207
        }
hgs
parents:
diff changeset
   208
    }
hgs
parents:
diff changeset
   209
}
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
/*!
hgs
parents:
diff changeset
   212
    callback from repository.
hgs
parents:
diff changeset
   213
    update our store.
hgs
parents:
diff changeset
   214
 */
hgs
parents:
diff changeset
   215
void BtDeviceModelPrivate::AddedToRegistry( const CBtDevExtension& dev ) 
hgs
parents:
diff changeset
   216
{
hgs
parents:
diff changeset
   217
    ChangedInRegistry( dev, 0 );
hgs
parents:
diff changeset
   218
}
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
/*!
hgs
parents:
diff changeset
   221
    callback from repository.
hgs
parents:
diff changeset
   222
    update our store.
hgs
parents:
diff changeset
   223
 */
hgs
parents:
diff changeset
   224
void BtDeviceModelPrivate::ChangedInRegistry( 
hgs
parents:
diff changeset
   225
        const CBtDevExtension& dev, TUint similarity )
hgs
parents:
diff changeset
   226
{
hgs
parents:
diff changeset
   227
    int i = indexOf( dev.Addr() );
hgs
parents:
diff changeset
   228
    if ( i == -1 ) {
hgs
parents:
diff changeset
   229
        BtuiModelDataItem devData;
hgs
parents:
diff changeset
   230
        if ( !isSearchingDevice ) {
hgs
parents:
diff changeset
   231
            // Rssi is only available at device inquiry stage. 
hgs
parents:
diff changeset
   232
            // We initialize this property to an invalid value
hgs
parents:
diff changeset
   233
            updateRssi(devData, RssiInvalid);
hgs
parents:
diff changeset
   234
        }
hgs
parents:
diff changeset
   235
        // add device-in-registry property:
hgs
parents:
diff changeset
   236
        setMajorProperty(devData, BtuiDevProperty::InRegistry, true);
hgs
parents:
diff changeset
   237
        updateDeviceProperty(devData, dev, 0 );
hgs
parents:
diff changeset
   238
        emit beginInsertDevices( mData.count(), mData.count(), this );
hgs
parents:
diff changeset
   239
        mData.append( devData );
hgs
parents:
diff changeset
   240
        emit endInsertDevices();
hgs
parents:
diff changeset
   241
    }
hgs
parents:
diff changeset
   242
    else {
hgs
parents:
diff changeset
   243
        updateDeviceProperty(mData[i], dev, similarity );
hgs
parents:
diff changeset
   244
        setMajorProperty(mData[i], BtuiDevProperty::InRegistry, true);
hgs
parents:
diff changeset
   245
        emit deviceDataChanged( i, this );
hgs
parents:
diff changeset
   246
    }
hgs
parents:
diff changeset
   247
}
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
/*!
hgs
parents:
diff changeset
   250
    callback from repository.
hgs
parents:
diff changeset
   251
    update our store.
hgs
parents:
diff changeset
   252
 */
hgs
parents:
diff changeset
   253
void BtDeviceModelPrivate::ServiceConnectionChanged(
hgs
parents:
diff changeset
   254
        const CBtDevExtension& dev, TBool connected )
hgs
parents:
diff changeset
   255
{
hgs
parents:
diff changeset
   256
    int i = indexOf( dev.Addr() );
hgs
parents:
diff changeset
   257
    if ( i > -1 ) {
hgs
parents:
diff changeset
   258
        int preconn =  BtuiDevProperty::Connected 
hgs
parents:
diff changeset
   259
                & mData[i][BtDeviceModel::MajorPropertyRole].toInt();
hgs
parents:
diff changeset
   260
        // we only update and signal if connection status is really
hgs
parents:
diff changeset
   261
        // changed:
hgs
parents:
diff changeset
   262
        if ( ( preconn != 0 && !connected )
hgs
parents:
diff changeset
   263
            || ( preconn == 0 && connected ) ) {
hgs
parents:
diff changeset
   264
            setMajorProperty(mData[i], BtuiDevProperty::Connected, connected );
hgs
parents:
diff changeset
   265
            emit deviceDataChanged( i, this );
hgs
parents:
diff changeset
   266
        }
hgs
parents:
diff changeset
   267
    }
hgs
parents:
diff changeset
   268
    // it is impossible that a device has connected but it is not in
hgs
parents:
diff changeset
   269
    // our local store according to current bteng services.
hgs
parents:
diff changeset
   270
    // need to take more care in future when this becomes possible.
hgs
parents:
diff changeset
   271
}
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
/*!
hgs
parents:
diff changeset
   274
    callback from device search.
hgs
parents:
diff changeset
   275
    update our store.
hgs
parents:
diff changeset
   276
 */
hgs
parents:
diff changeset
   277
void BtDeviceModelPrivate::HandleNextDiscoveryResultL( 
hgs
parents:
diff changeset
   278
        const TInquirySockAddr& inqAddr, const TDesC& name )
hgs
parents:
diff changeset
   279
{
hgs
parents:
diff changeset
   280
    int pos = indexOf( inqAddr.BTAddr() );
hgs
parents:
diff changeset
   281
    
hgs
parents:
diff changeset
   282
    //RssiRole
hgs
parents:
diff changeset
   283
    int rssi( RssiInvalid ); // initialize to an invalid value.
hgs
parents:
diff changeset
   284
    if( inqAddr.ResultFlags() & TInquirySockAddr::ERssiValid ) {
hgs
parents:
diff changeset
   285
        rssi = inqAddr.Rssi();
hgs
parents:
diff changeset
   286
    }
hgs
parents:
diff changeset
   287
    
hgs
parents:
diff changeset
   288
    if ( pos == -1 ) {
hgs
parents:
diff changeset
   289
        BtuiModelDataItem devData;
hgs
parents:
diff changeset
   290
        setMajorProperty(devData, BtuiDevProperty::InRange, true);
hgs
parents:
diff changeset
   291
        updateRssi(devData, rssi);
hgs
parents:
diff changeset
   292
        updateSeqNum( devData, mSeqNum++ );
hgs
parents:
diff changeset
   293
        CBtDevExtension* devExt(NULL);
hgs
parents:
diff changeset
   294
        TRAP_IGNORE( {
hgs
parents:
diff changeset
   295
            devExt = CBtDevExtension::NewLC( inqAddr, name );
hgs
parents:
diff changeset
   296
            CleanupStack::Pop(); });
hgs
parents:
diff changeset
   297
        updateDeviceProperty(devData, *devExt, 0);
hgs
parents:
diff changeset
   298
        delete devExt;
hgs
parents:
diff changeset
   299
        emit beginInsertDevices( mData.count(), mData.count(), this );
hgs
parents:
diff changeset
   300
        mData.append( devData );
hgs
parents:
diff changeset
   301
        emit endInsertDevices();
hgs
parents:
diff changeset
   302
    }
hgs
parents:
diff changeset
   303
    else {
hgs
parents:
diff changeset
   304
        setMajorProperty(mData[pos], BtuiDevProperty::InRange, true);
hgs
parents:
diff changeset
   305
        updateRssi(mData[pos], rssi);
hgs
parents:
diff changeset
   306
        updateSeqNum( mData[pos], mSeqNum++ );
hgs
parents:
diff changeset
   307
        emit deviceDataChanged( pos, this );
hgs
parents:
diff changeset
   308
    }
hgs
parents:
diff changeset
   309
}
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
/*!
hgs
parents:
diff changeset
   312
    callback from device search.
hgs
parents:
diff changeset
   313
    inform client.
hgs
parents:
diff changeset
   314
 */
hgs
parents:
diff changeset
   315
void BtDeviceModelPrivate::HandleDiscoveryCompleted( TInt error )
hgs
parents:
diff changeset
   316
{
hgs
parents:
diff changeset
   317
    isSearchingDevice = false;
hgs
parents:
diff changeset
   318
    // Reset the sequence number for the next search
hgs
parents:
diff changeset
   319
    mSeqNum = 0;
hgs
parents:
diff changeset
   320
    emit deviceSearchCompleted( (int) error );
hgs
parents:
diff changeset
   321
}
hgs
parents:
diff changeset
   322
hgs
parents:
diff changeset
   323
void BtDeviceModelPrivate::initializeDataStore()
hgs
parents:
diff changeset
   324
    {
hgs
parents:
diff changeset
   325
    
hgs
parents:
diff changeset
   326
    mSeqNum = 0;  // reset when starting search again
hgs
parents:
diff changeset
   327
    
hgs
parents:
diff changeset
   328
    // it is possible that we are searching devices.
hgs
parents:
diff changeset
   329
    // We use a simple but not-so-efficient method to update the model.
hgs
parents:
diff changeset
   330
    
hgs
parents:
diff changeset
   331
    // If the device store is not empty, we clear
hgs
parents:
diff changeset
   332
    // registry property from these devices first.
hgs
parents:
diff changeset
   333
    for (int i = 0; i < mData.count(); ++i) {
hgs
parents:
diff changeset
   334
        setMajorProperty(mData[i], BtuiDevProperty::RegistryProperties, false);
hgs
parents:
diff changeset
   335
    }
hgs
parents:
diff changeset
   336
    if ( mData.count() ) {
hgs
parents:
diff changeset
   337
        // need to update view because we have changed device properties.
hgs
parents:
diff changeset
   338
        emit deviceDataChanged( 0, mData.count() - 1, this );
hgs
parents:
diff changeset
   339
    }
hgs
parents:
diff changeset
   340
hgs
parents:
diff changeset
   341
    const RDevExtensionArray& devs = mDeviceRepo->AllDevices();
hgs
parents:
diff changeset
   342
    for (int i = 0; i < devs.Count(); ++i) {
hgs
parents:
diff changeset
   343
        int pos = indexOf( devs[i]->Addr() );
hgs
parents:
diff changeset
   344
        if ( pos > -1 ) {
hgs
parents:
diff changeset
   345
            // add device-in-registry property:
hgs
parents:
diff changeset
   346
            setMajorProperty(mData[pos], BtuiDevProperty::InRegistry, true);            
hgs
parents:
diff changeset
   347
            updateDeviceProperty(mData[pos], *(devs[i]), 0);
hgs
parents:
diff changeset
   348
            updateSeqNum(mData[pos], -1);
hgs
parents:
diff changeset
   349
            emit deviceDataChanged( pos, this );
hgs
parents:
diff changeset
   350
        }
hgs
parents:
diff changeset
   351
        else {
hgs
parents:
diff changeset
   352
            BtuiModelDataItem devData;
hgs
parents:
diff changeset
   353
            // add device-in-registry property:
hgs
parents:
diff changeset
   354
            setMajorProperty(devData, BtuiDevProperty::InRegistry, true);
hgs
parents:
diff changeset
   355
            updateDeviceProperty(devData, *( devs[i] ), 0 );
hgs
parents:
diff changeset
   356
            updateSeqNum(devData, -1);
hgs
parents:
diff changeset
   357
            emit beginInsertDevices(mData.count(), mData.count(), this );
hgs
parents:
diff changeset
   358
            mData.append( devData );
hgs
parents:
diff changeset
   359
            emit endInsertDevices();
hgs
parents:
diff changeset
   360
        }
hgs
parents:
diff changeset
   361
    }
hgs
parents:
diff changeset
   362
}
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
void BtDeviceModelPrivate::updateDeviceProperty(BtuiModelDataItem& qtdev,
hgs
parents:
diff changeset
   365
        const CBtDevExtension& dev, TUint similarity )
hgs
parents:
diff changeset
   366
{
hgs
parents:
diff changeset
   367
    // similarity is not used currently. 
hgs
parents:
diff changeset
   368
    // It is possible to gain better performance
hgs
parents:
diff changeset
   369
    // with this info to avoid re-manipulate
hgs
parents:
diff changeset
   370
    // unchanged properties.
hgs
parents:
diff changeset
   371
    Q_UNUSED(similarity);
hgs
parents:
diff changeset
   372
    
hgs
parents:
diff changeset
   373
    //DevDisplayNameRole
hgs
parents:
diff changeset
   374
    QString str = QString::fromUtf16( 
hgs
parents:
diff changeset
   375
            dev.Alias().Ptr(), dev.Alias().Length() );
hgs
parents:
diff changeset
   376
    qtdev[BtDeviceModel::NameAliasRole] = QVariant( str );
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
    //DevAddrReadableRole
hgs
parents:
diff changeset
   379
    addrSymbianToReadbleString( str, dev.Addr() );
hgs
parents:
diff changeset
   380
    qtdev[BtDeviceModel::ReadableBdaddrRole] = QVariant( str );
hgs
parents:
diff changeset
   381
hgs
parents:
diff changeset
   382
    //LastUsedTimeRole
hgs
parents:
diff changeset
   383
    TDateTime symDt = dev.Device().Used().DateTime();
hgs
parents:
diff changeset
   384
    QDate date( symDt.Year(), symDt.Month(), symDt.Day() );
hgs
parents:
diff changeset
   385
    QTime time( symDt.Hour(), symDt.Minute(), symDt.MicroSecond() / 1000 );
hgs
parents:
diff changeset
   386
    QDateTime qdt(date, time);
hgs
parents:
diff changeset
   387
    qtdev[BtDeviceModel::LastUsedTimeRole] = QVariant(qdt);
hgs
parents:
diff changeset
   388
 
hgs
parents:
diff changeset
   389
    // set paired status:
hgs
parents:
diff changeset
   390
    setMajorProperty(qtdev, BtuiDevProperty::Bonded, isBonded( dev.Device() ));
hgs
parents:
diff changeset
   391
    
hgs
parents:
diff changeset
   392
    // set blocked status:
hgs
parents:
diff changeset
   393
    setMajorProperty(qtdev, BtuiDevProperty::Blocked, 
hgs
parents:
diff changeset
   394
            dev.Device().GlobalSecurity().Banned() );
hgs
parents:
diff changeset
   395
    // set trusted status:
hgs
parents:
diff changeset
   396
    setMajorProperty(qtdev, BtuiDevProperty::Trusted, 
hgs
parents:
diff changeset
   397
            dev.Device().GlobalSecurity().NoAuthorise() );
hgs
parents:
diff changeset
   398
    // set connected status:
hgs
parents:
diff changeset
   399
    // EBTEngConnecting is an intermediate state between connected and not-connected, 
hgs
parents:
diff changeset
   400
    // we do not treat it as connected:         
hgs
parents:
diff changeset
   401
    setMajorProperty(qtdev, BtuiDevProperty::Connected, dev.ServiceConnectionStatus() == EBTEngConnected);
hgs
parents:
diff changeset
   402
hgs
parents:
diff changeset
   403
    // Check whether the device has services that are connectable in bteng scope.
hgs
parents:
diff changeset
   404
    CBTEngConnMan* connMan( 0 );
hgs
parents:
diff changeset
   405
    TRAP_IGNORE( connMan = CBTEngConnMan::NewL(0));
hgs
parents:
diff changeset
   406
    TBool connectable(EFalse);
hgs
parents:
diff changeset
   407
    if ( connMan ) {
hgs
parents:
diff changeset
   408
        (void) connMan->IsConnectable(dev.Addr(), dev.Device().DeviceClass(), connectable);
hgs
parents:
diff changeset
   409
        delete connMan;
hgs
parents:
diff changeset
   410
    }
hgs
parents:
diff changeset
   411
    setMajorProperty(qtdev, BtuiDevProperty::Connectable, connectable);
hgs
parents:
diff changeset
   412
    
hgs
parents:
diff changeset
   413
    int cod = static_cast<int>( dev.Device().DeviceClass().DeviceClass() );
hgs
parents:
diff changeset
   414
    qtdev[BtDeviceModel::CoDRole] = QVariant(cod);
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
    int majorDeviceType;
hgs
parents:
diff changeset
   417
    int minorDeviceType;
hgs
parents:
diff changeset
   418
    // device type is mapped according to CoD:
hgs
parents:
diff changeset
   419
    BtuiDevProperty::mapDeiveType(majorDeviceType, minorDeviceType, cod);
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
    qtdev[BtDeviceModel::MajorPropertyRole] = 
hgs
parents:
diff changeset
   422
            QVariant( qtdev[BtDeviceModel::MajorPropertyRole].toInt() | majorDeviceType );
hgs
parents:
diff changeset
   423
    qtdev[BtDeviceModel::MinorPropertyRole] = QVariant( minorDeviceType );
hgs
parents:
diff changeset
   424
}
hgs
parents:
diff changeset
   425
hgs
parents:
diff changeset
   426
int BtDeviceModelPrivate::indexOf( const TBTDevAddr& addr ) const
hgs
parents:
diff changeset
   427
{
hgs
parents:
diff changeset
   428
    QString addrStr;
hgs
parents:
diff changeset
   429
    addrSymbianToReadbleString( addrStr, addr );
hgs
parents:
diff changeset
   430
    for (int i = 0; i < mData.count(); ++i ) {
hgs
parents:
diff changeset
   431
        if ( mData.at( i ).value( BtDeviceModel::ReadableBdaddrRole ) 
hgs
parents:
diff changeset
   432
                == addrStr ) {
hgs
parents:
diff changeset
   433
            return i;
hgs
parents:
diff changeset
   434
        }
hgs
parents:
diff changeset
   435
    }
hgs
parents:
diff changeset
   436
    return -1;
hgs
parents:
diff changeset
   437
}
hgs
parents:
diff changeset
   438
hgs
parents:
diff changeset
   439
void BtDeviceModelPrivate::updateRssi(BtuiModelDataItem& qtdev, int rssi )
hgs
parents:
diff changeset
   440
{
hgs
parents:
diff changeset
   441
    qtdev[BtDeviceModel::RssiRole] = QVariant( rssi );
hgs
parents:
diff changeset
   442
}
hgs
parents:
diff changeset
   443
hgs
parents:
diff changeset
   444
void BtDeviceModelPrivate::updateSeqNum(BtuiModelDataItem& qtdev, int seqNum )
hgs
parents:
diff changeset
   445
{
hgs
parents:
diff changeset
   446
    qtdev[BtDeviceModel::SeqNumRole] = QVariant( seqNum );
hgs
parents:
diff changeset
   447
}
hgs
parents:
diff changeset
   448
hgs
parents:
diff changeset
   449
/*!
hgs
parents:
diff changeset
   450
    Add the specified major property to the device if addto is true.
hgs
parents:
diff changeset
   451
    Otherwise the property is removed from the device. 
hgs
parents:
diff changeset
   452
 */
hgs
parents:
diff changeset
   453
void BtDeviceModelPrivate::setMajorProperty(
hgs
parents:
diff changeset
   454
        BtuiModelDataItem& qtdev, int prop, bool addto)
hgs
parents:
diff changeset
   455
{
hgs
parents:
diff changeset
   456
    if ( addto ) {
hgs
parents:
diff changeset
   457
        qtdev[BtDeviceModel::MajorPropertyRole] = 
hgs
parents:
diff changeset
   458
            QVariant( qtdev[BtDeviceModel::MajorPropertyRole].toInt() | prop);
hgs
parents:
diff changeset
   459
    }
hgs
parents:
diff changeset
   460
    else {
hgs
parents:
diff changeset
   461
        qtdev[BtDeviceModel::MajorPropertyRole] = 
hgs
parents:
diff changeset
   462
            QVariant( qtdev[BtDeviceModel::MajorPropertyRole].toInt() & ~prop);
hgs
parents:
diff changeset
   463
    }
hgs
parents:
diff changeset
   464
}
hgs
parents:
diff changeset
   465
hgs
parents:
diff changeset
   466
bool BtDeviceModelPrivate::isDeviceInRange( const BtuiModelDataItem& qtdev )
hgs
parents:
diff changeset
   467
{   
hgs
parents:
diff changeset
   468
    return BtuiDevProperty::InRange & qtdev[BtDeviceModel::MajorPropertyRole].toInt();
hgs
parents:
diff changeset
   469
}
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
bool BtDeviceModelPrivate::isDeviceInRegistry( const BtuiModelDataItem& qtdev )
hgs
parents:
diff changeset
   472
{
hgs
parents:
diff changeset
   473
    return BtuiDevProperty::InRegistry & qtdev[BtDeviceModel::MajorPropertyRole].toInt();
hgs
parents:
diff changeset
   474
}