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