bluetoothengine/btui/btuimodel/btsettingmodel_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 "btsettingmodel_p.h"
hgs
parents:
diff changeset
    19
#include <btdevice.h>
hgs
parents:
diff changeset
    20
#include <btmanclient.h>
hgs
parents:
diff changeset
    21
#include <bt_subscribe.h>
hgs
parents:
diff changeset
    22
#include "btqtconstants.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
const int KLocalDeviceNameWatcher = 10;
hgs
parents:
diff changeset
    25
const int KBtLinkCountWatcher = 11;
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
/*!
hgs
parents:
diff changeset
    28
    Constructor.
hgs
parents:
diff changeset
    29
 */
hgs
parents:
diff changeset
    30
BtSettingModelPrivate::BtSettingModelPrivate( BtSettingModel& model, QObject *parent )
hgs
parents:
diff changeset
    31
    : QObject( parent), mModel( model ), mLocalDeviceWatcher(0)
hgs
parents:
diff changeset
    32
    {
hgs
parents:
diff changeset
    33
    int err( 0 );
hgs
parents:
diff changeset
    34
    if (!err ) {
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
    35
        err = mLocalDeviceKey.Attach( KPropertyUidBluetoothCategory,
42
hgs
parents:
diff changeset
    36
                    KPropertyKeyBluetoothGetRegistryTableChange );
hgs
parents:
diff changeset
    37
    }
hgs
parents:
diff changeset
    38
    
hgs
parents:
diff changeset
    39
    Q_CHECK_PTR( !err ); // other proper alternative?
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
    TRAP_IGNORE({
hgs
parents:
diff changeset
    42
        mBtengSetting = CBTEngSettings::NewL( this );
hgs
parents:
diff changeset
    43
        mLocalDeviceWatcher = CBtSimpleActive::NewL(*this, KLocalDeviceNameWatcher );
hgs
parents:
diff changeset
    44
    });
hgs
parents:
diff changeset
    45
    
hgs
parents:
diff changeset
    46
    Q_CHECK_PTR( mBtengSetting );
hgs
parents:
diff changeset
    47
    Q_CHECK_PTR( mLocalDeviceWatcher );
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
    for ( int i = 0; i < BtSettingModel::LocalSettingRowCount; ++i ) {
hgs
parents:
diff changeset
    50
        // Initialize the list with empty values.
hgs
parents:
diff changeset
    51
        mData.append( BtuiModelDataItem() );
hgs
parents:
diff changeset
    52
    }
hgs
parents:
diff changeset
    53
    
hgs
parents:
diff changeset
    54
    // subscribe to local device table change:
hgs
parents:
diff changeset
    55
    mLocalDeviceKey.Subscribe( mLocalDeviceWatcher->RequestStatus() );
hgs
parents:
diff changeset
    56
    mLocalDeviceWatcher->GoActive();
hgs
parents:
diff changeset
    57
    
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
    58
    // At initialization, we do not need to handle the return value
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
    59
    (void) updateLocalDeviceName();
42
hgs
parents:
diff changeset
    60
    
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
    61
    // Initialize the power setting.
42
hgs
parents:
diff changeset
    62
    TBTPowerStateValue power( EBTPowerOff );
hgs
parents:
diff changeset
    63
    (void) mBtengSetting->GetPowerState( power );
hgs
parents:
diff changeset
    64
    setPowerSetting( power );
hgs
parents:
diff changeset
    65
    
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
    66
    // Initialize the visibility mode
42
hgs
parents:
diff changeset
    67
    TBTVisibilityMode visibilityMode( EBTVisibilityModeNoScans );
hgs
parents:
diff changeset
    68
    (void) mBtengSetting->GetVisibilityMode( visibilityMode );
hgs
parents:
diff changeset
    69
    setVisibilityMode( visibilityMode );
hgs
parents:
diff changeset
    70
}
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
/*!
hgs
parents:
diff changeset
    73
    Destructor.
hgs
parents:
diff changeset
    74
 */
hgs
parents:
diff changeset
    75
BtSettingModelPrivate::~BtSettingModelPrivate()
hgs
parents:
diff changeset
    76
{
hgs
parents:
diff changeset
    77
    // delete main data structure
hgs
parents:
diff changeset
    78
    delete mBtengSetting;
hgs
parents:
diff changeset
    79
    delete mLocalDeviceWatcher;
hgs
parents:
diff changeset
    80
    mLocalDeviceKey.Close();
hgs
parents:
diff changeset
    81
    
hgs
parents:
diff changeset
    82
    // delete mBtLinkCountWatcher;
hgs
parents:
diff changeset
    83
    //mBtLinkCountKey.Close();
hgs
parents:
diff changeset
    84
}
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
/*!
hgs
parents:
diff changeset
    88
    Tells whether the given column is in the range of the setting list.
hgs
parents:
diff changeset
    89
    
hgs
parents:
diff changeset
    90
    \param row the row number to be checked
hgs
parents:
diff changeset
    91
    \param col the column number to be checked
hgs
parents:
diff changeset
    92
    
hgs
parents:
diff changeset
    93
    \return true if the given row and column are valid; false otherwise.
hgs
parents:
diff changeset
    94
*/
hgs
parents:
diff changeset
    95
bool BtSettingModelPrivate::isValid( int row, int column) const
hgs
parents:
diff changeset
    96
{
hgs
parents:
diff changeset
    97
    return row >= 0 && row < mData.count() && column == 0;
hgs
parents:
diff changeset
    98
}
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
/*!
hgs
parents:
diff changeset
   101
    \return the total amount of rows.
hgs
parents:
diff changeset
   102
    
hgs
parents:
diff changeset
   103
*/
hgs
parents:
diff changeset
   104
int BtSettingModelPrivate::rowCount() const
hgs
parents:
diff changeset
   105
{
hgs
parents:
diff changeset
   106
    return mData.count();
hgs
parents:
diff changeset
   107
}
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
/*!
hgs
parents:
diff changeset
   110
    \return the total amount of columns.
hgs
parents:
diff changeset
   111
    
hgs
parents:
diff changeset
   112
*/
hgs
parents:
diff changeset
   113
int BtSettingModelPrivate::columnCount() const
hgs
parents:
diff changeset
   114
{
hgs
parents:
diff changeset
   115
    return 1;
hgs
parents:
diff changeset
   116
}
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
/*!
hgs
parents:
diff changeset
   119
    Gets the value within a data item.
hgs
parents:
diff changeset
   120
    \param val contains the value at return.
hgs
parents:
diff changeset
   121
    \param row the row number which the value is from
hgs
parents:
diff changeset
   122
    \param col the column number which the value is from
hgs
parents:
diff changeset
   123
    \param role the role idenfier of the value.
hgs
parents:
diff changeset
   124
 */
hgs
parents:
diff changeset
   125
void BtSettingModelPrivate::data(QVariant& val, int row,  int col, int role ) const
hgs
parents:
diff changeset
   126
{
hgs
parents:
diff changeset
   127
    if ( isValid( row, col ) ) {
hgs
parents:
diff changeset
   128
        val = mData.at( row ).value( role );
hgs
parents:
diff changeset
   129
    }
hgs
parents:
diff changeset
   130
    else {
hgs
parents:
diff changeset
   131
        val = QVariant( QVariant::Invalid );
hgs
parents:
diff changeset
   132
    }
hgs
parents:
diff changeset
   133
}
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
/*!
hgs
parents:
diff changeset
   136
    Gets the whole item data at the specified column
hgs
parents:
diff changeset
   137
    \param row the row number of the item data to be returned
hgs
parents:
diff changeset
   138
    \param col the column number of the item data to be returned
hgs
parents:
diff changeset
   139
    \return the item data
hgs
parents:
diff changeset
   140
 */
hgs
parents:
diff changeset
   141
BtuiModelDataItem BtSettingModelPrivate::itemData( int row, int col ) const
hgs
parents:
diff changeset
   142
{
hgs
parents:
diff changeset
   143
    if ( isValid( row, col ) ) {
hgs
parents:
diff changeset
   144
        return mData.at( row );
hgs
parents:
diff changeset
   145
    }
hgs
parents:
diff changeset
   146
    return BtuiModelDataItem();
hgs
parents:
diff changeset
   147
}
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
/*!
hgs
parents:
diff changeset
   150
    Provides notification of changes in the power state
hgs
parents:
diff changeset
   151
    of the Bluetooth hardware.
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
    \param state EBTPowerOff if the BT hardware has been turned off,
hgs
parents:
diff changeset
   154
                 EBTPowerOn if it has been turned on.
hgs
parents:
diff changeset
   155
 */
hgs
parents:
diff changeset
   156
void BtSettingModelPrivate::PowerStateChanged( TBTPowerStateValue state ) 
hgs
parents:
diff changeset
   157
{
hgs
parents:
diff changeset
   158
    setPowerSetting( state );
hgs
parents:
diff changeset
   159
    emit settingDataChanged( BtSettingModel::PowerStateRow, this );
hgs
parents:
diff changeset
   160
}
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
/*!
hgs
parents:
diff changeset
   163
    Provides notification of changes in the discoverability
hgs
parents:
diff changeset
   164
    mode of the Bluetooth hardware.
hgs
parents:
diff changeset
   165
    \param state EBTDiscModeHidden if the BT hardware is in hidden mode,
hgs
parents:
diff changeset
   166
                  EBTDiscModeGeneral if it is in visible mode.
hgs
parents:
diff changeset
   167
 */
hgs
parents:
diff changeset
   168
void BtSettingModelPrivate::VisibilityModeChanged( TBTVisibilityMode state )
hgs
parents:
diff changeset
   169
{
hgs
parents:
diff changeset
   170
    setVisibilityMode( state );
hgs
parents:
diff changeset
   171
    emit settingDataChanged( BtSettingModel::VisibilityRow, this );
hgs
parents:
diff changeset
   172
}
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
void BtSettingModelPrivate::RequestCompletedL( CBtSimpleActive* active, TInt status ) {
hgs
parents:
diff changeset
   175
    Q_UNUSED( active );
hgs
parents:
diff changeset
   176
    Q_UNUSED( status );
hgs
parents:
diff changeset
   177
    if ( active->RequestId() == KLocalDeviceNameWatcher ) {
hgs
parents:
diff changeset
   178
        mLocalDeviceKey.Subscribe( mLocalDeviceWatcher->RequestStatus() );
hgs
parents:
diff changeset
   179
        mLocalDeviceWatcher->GoActive();
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   180
        // Refresh local name of this model only when the local device table is changed.
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   181
        TInt changedTable;
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   182
        TInt err = mLocalDeviceKey.Get( changedTable );
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   183
        if( !err && changedTable == KRegistryChangeLocalTable ) {
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   184
            bool updated = updateLocalDeviceName();
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   185
            if (updated) {
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   186
                emit settingDataChanged( BtSettingModel::LocalBtNameRow, this );
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   187
            }
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   188
        }
42
hgs
parents:
diff changeset
   189
    }
hgs
parents:
diff changeset
   190
}
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
void BtSettingModelPrivate::CancelRequest( TInt requestId ) {
hgs
parents:
diff changeset
   193
    if ( requestId == KLocalDeviceNameWatcher ) {
hgs
parents:
diff changeset
   194
        mLocalDeviceKey.Cancel();
hgs
parents:
diff changeset
   195
    }
hgs
parents:
diff changeset
   196
    else if ( requestId == KBtLinkCountWatcher ) {
hgs
parents:
diff changeset
   197
        //mBtLinkCountKey.Cancel();
hgs
parents:
diff changeset
   198
    }
hgs
parents:
diff changeset
   199
}
hgs
parents:
diff changeset
   200
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   201
/*!
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   202
    AO's RunL() cannot leave in Qt applications. No handling.
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   203
 */
42
hgs
parents:
diff changeset
   204
void BtSettingModelPrivate::HandleError( CBtSimpleActive* active, TInt error ) {
hgs
parents:
diff changeset
   205
    Q_UNUSED( active );
hgs
parents:
diff changeset
   206
    Q_UNUSED( error );
hgs
parents:
diff changeset
   207
}
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
/*!
hgs
parents:
diff changeset
   210
    Update local Bluetooth device name in the data store.
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   211
    \return true if the local name is really updated in this model; false, otherwise.
42
hgs
parents:
diff changeset
   212
 */
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   213
bool BtSettingModelPrivate::updateLocalDeviceName() 
42
hgs
parents:
diff changeset
   214
{
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   215
    QString nameInReg;
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   216
    getNameFromRegistry( nameInReg );
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   217
    QString currentName = mData.at(BtSettingModel::LocalBtNameRow).value(
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   218
                    BtSettingModel::settingDisplayRole).toString();
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   219
    if ( nameInReg != currentName ) {
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   220
        mData[BtSettingModel::LocalBtNameRow][BtSettingModel::settingDisplayRole] = QVariant(nameInReg);
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   221
        mData[BtSettingModel::LocalBtNameRow][BtSettingModel::SettingValueRole] = QVariant(nameInReg);
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   222
        return true;
42
hgs
parents:
diff changeset
   223
    }
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   224
    return false;
42
hgs
parents:
diff changeset
   225
}
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
/*!
hgs
parents:
diff changeset
   228
    Updates all values related to the power setting.
hgs
parents:
diff changeset
   229
 */
hgs
parents:
diff changeset
   230
void BtSettingModelPrivate::setPowerSetting( TBTPowerStateValue state )
hgs
parents:
diff changeset
   231
{
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   232
    mData[BtSettingModel::PowerStateRow][BtSettingModel::SettingValueRole] = QVariant(QtPowerMode(state));
42
hgs
parents:
diff changeset
   233
}
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
void BtSettingModelPrivate::setVisibilityMode( TBTVisibilityMode state )
hgs
parents:
diff changeset
   236
{
57
5ebadcda06cb 201035_7
hgs
parents: 42
diff changeset
   237
    mData[BtSettingModel::VisibilityRow][BtSettingModel::SettingValueRole] = QVariant(QtVisibilityMode(state));
42
hgs
parents:
diff changeset
   238
}
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
/*!
hgs
parents:
diff changeset
   241
    Get local Bluetooth device name from BTRegistry.
hgs
parents:
diff changeset
   242
 */
hgs
parents:
diff changeset
   243
void BtSettingModelPrivate::getNameFromRegistry( QString &name )
hgs
parents:
diff changeset
   244
{
hgs
parents:
diff changeset
   245
    RBTRegServ btRegServ;   // Session with BTMan
hgs
parents:
diff changeset
   246
    RBTLocalDevice btReg;   // Subsession with local device table
hgs
parents:
diff changeset
   247
    TBTLocalDevice localDev;// Data structure holding local device information
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
    TInt err = btRegServ.Connect();
hgs
parents:
diff changeset
   250
    if ( !err ) {
hgs
parents:
diff changeset
   251
        err = btReg.Open( btRegServ );
hgs
parents:
diff changeset
   252
    }
hgs
parents:
diff changeset
   253
    if ( !err ) {
hgs
parents:
diff changeset
   254
        // Read the BT local name from BT Registry.
hgs
parents:
diff changeset
   255
        err = btReg.Get( localDev );
hgs
parents:
diff changeset
   256
    }
hgs
parents:
diff changeset
   257
    if ( !err ) {
hgs
parents:
diff changeset
   258
        name = QString::fromUtf8( (const char*) localDev.DeviceName().Ptr(), (int) localDev.DeviceName().Length() );
hgs
parents:
diff changeset
   259
    }
hgs
parents:
diff changeset
   260
    btReg.Close();
hgs
parents:
diff changeset
   261
    btRegServ.Close();
hgs
parents:
diff changeset
   262
}