bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp
author hgs
Sun, 02 May 2010 21:30:11 +0300
changeset 28 7e2761e776bd
parent 26 b78e66e88238
child 42 b72428996822
permissions -rw-r--r--
201017
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23
hgs
parents:
diff changeset
     1
/*
25
hgs
parents: 24
diff changeset
     2
* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
23
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: Class to manage Bluetooth hardware and stack settings.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "btengsrvsettingsmgr.h"
hgs
parents:
diff changeset
    19
#include <bthci.h>
hgs
parents:
diff changeset
    20
#include <bt_subscribe_partner.h>
hgs
parents:
diff changeset
    21
#include <btnotif.h>
hgs
parents:
diff changeset
    22
#include <btengdomainpskeys.h>
hgs
parents:
diff changeset
    23
#include <centralrepository.h>
hgs
parents:
diff changeset
    24
#include <featmgr.h>
hgs
parents:
diff changeset
    25
#include <AknSmallIndicator.h>
28
hgs
parents: 26
diff changeset
    26
//#include <avkon.hrh>
23
hgs
parents:
diff changeset
    27
#include "btengserver.h"
hgs
parents:
diff changeset
    28
#include "btengsrvpluginmgr.h"
hgs
parents:
diff changeset
    29
#include "btengsrvbbconnectionmgr.h"
hgs
parents:
diff changeset
    30
#include "btengsrvstate.h"
hgs
parents:
diff changeset
    31
#include "debug.h"
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
/** ID of active object helper */
hgs
parents:
diff changeset
    34
const TInt KBTEngSettingsActive = 30;
hgs
parents:
diff changeset
    35
/** Constant for converting minutes to microseconds */
hgs
parents:
diff changeset
    36
//const TInt64 KMinutesInMicroSecs = 60000000;
hgs
parents:
diff changeset
    37
const TInt64 KMinutesInMicroSecs = MAKE_TINT64( 0, 60000000 );
hgs
parents:
diff changeset
    38
/**  Timeout for disabling Simple Pairing debug mode. The value is 30 minutes. */
hgs
parents:
diff changeset
    39
//const TInt KBTEngSspDebugModeTimeout = 1800000000;
hgs
parents:
diff changeset
    40
const TInt64 KBTEngSspDebugModeTimeout = MAKE_TINT64( 0, 1800000000 );
hgs
parents:
diff changeset
    41
/**  Timeout for turning BT off automatically. The value is 10.5 seconds. */
hgs
parents:
diff changeset
    42
const TInt KBTEngBtAutoOffTimeout = 10500000;
26
hgs
parents: 25
diff changeset
    43
 
23
hgs
parents:
diff changeset
    44
// ======== MEMBER FUNCTIONS ========
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    47
// C++ default constructor
hgs
parents:
diff changeset
    48
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    49
//
hgs
parents:
diff changeset
    50
CBTEngSrvSettingsMgr::CBTEngSrvSettingsMgr( CBTEngServer* aServer )
hgs
parents:
diff changeset
    51
:   iServer( aServer )
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
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    57
// Symbian second-phase constructor
hgs
parents:
diff changeset
    58
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    59
//
hgs
parents:
diff changeset
    60
void CBTEngSrvSettingsMgr::ConstructL()
hgs
parents:
diff changeset
    61
    {
hgs
parents:
diff changeset
    62
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
    63
    iActive = CBTEngActive::NewL( *this, KBTEngSettingsActive );
hgs
parents:
diff changeset
    64
    LoadBTPowerManagerL();
hgs
parents:
diff changeset
    65
    iEnterpriseEnablementMode = BluetoothFeatures::EnterpriseEnablementL();
hgs
parents:
diff changeset
    66
    TRACE_INFO( ( _L( "iEnterpriseEnablementMode = %d" ), iEnterpriseEnablementMode) )
hgs
parents:
diff changeset
    67
    if ( iEnterpriseEnablementMode == BluetoothFeatures::EDisabled )
hgs
parents:
diff changeset
    68
        {
hgs
parents:
diff changeset
    69
        SetVisibilityModeL( EBTVisibilityModeNoScans, 0 );
hgs
parents:
diff changeset
    70
        }
hgs
parents:
diff changeset
    71
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
    72
    }
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    76
// NewL
hgs
parents:
diff changeset
    77
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    78
//
hgs
parents:
diff changeset
    79
CBTEngSrvSettingsMgr* CBTEngSrvSettingsMgr::NewL( CBTEngServer* aServer )
hgs
parents:
diff changeset
    80
    {
hgs
parents:
diff changeset
    81
    CBTEngSrvSettingsMgr* self = new( ELeave ) CBTEngSrvSettingsMgr( aServer );
hgs
parents:
diff changeset
    82
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    83
    self->ConstructL();
hgs
parents:
diff changeset
    84
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    85
    return self;
hgs
parents:
diff changeset
    86
    }
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    90
// Destructor
hgs
parents:
diff changeset
    91
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    92
//
hgs
parents:
diff changeset
    93
CBTEngSrvSettingsMgr::~CBTEngSrvSettingsMgr()
hgs
parents:
diff changeset
    94
    {
hgs
parents:
diff changeset
    95
    delete iActive;  
hgs
parents:
diff changeset
    96
    iPowerMgr.Close();
hgs
parents:
diff changeset
    97
    }
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   101
// Power Bluetooth hardware on or off.
hgs
parents:
diff changeset
   102
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   103
//
hgs
parents:
diff changeset
   104
TInt CBTEngSrvSettingsMgr::SetHwPowerState( TBTPowerState aState )
hgs
parents:
diff changeset
   105
    {
hgs
parents:
diff changeset
   106
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   107
    TInt err = KErrNone;
hgs
parents:
diff changeset
   108
#ifndef __WINS__
hgs
parents:
diff changeset
   109
    if( iActive->IsActive() )
hgs
parents:
diff changeset
   110
        {
hgs
parents:
diff changeset
   111
        // Cancel the outstanding request.
hgs
parents:
diff changeset
   112
        iPowerMgr.Cancel();
hgs
parents:
diff changeset
   113
        iActive->Cancel();
hgs
parents:
diff changeset
   114
        }
hgs
parents:
diff changeset
   115
    iPowerMgr.SetPower( aState, NULL, iActive->RequestStatus() );
hgs
parents:
diff changeset
   116
    iActive->GoActive();
hgs
parents:
diff changeset
   117
#else   //__WINS__
hgs
parents:
diff changeset
   118
    iPowerState = aState;
hgs
parents:
diff changeset
   119
#endif  //__WINS__
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
   if( !err && aState == EBTOn )
hgs
parents:
diff changeset
   122
        {
hgs
parents:
diff changeset
   123
        TInt dutMode = EBTDutOff;
hgs
parents:
diff changeset
   124
        err = RProperty::Get( KPSUidBluetoothTestingMode, KBTDutEnabled, dutMode );
hgs
parents:
diff changeset
   125
        if( !err && dutMode == EBTDutOn )
hgs
parents:
diff changeset
   126
            {
hgs
parents:
diff changeset
   127
            // Set the DUT mode key to OFF since DUT mode is disabled at this point
hgs
parents:
diff changeset
   128
            err = RProperty::Set( KPSUidBluetoothTestingMode, KBTDutEnabled, EBTDutOff );
hgs
parents:
diff changeset
   129
            }
hgs
parents:
diff changeset
   130
        }
hgs
parents:
diff changeset
   131
    if( err )
hgs
parents:
diff changeset
   132
        {
hgs
parents:
diff changeset
   133
        // Power off if an error occurred during power on sequence.
hgs
parents:
diff changeset
   134
#ifndef __WINS__
hgs
parents:
diff changeset
   135
            // This cannot happen in emulator environment.
hgs
parents:
diff changeset
   136
        iPowerMgr.Cancel();
hgs
parents:
diff changeset
   137
        iActive->Cancel();
hgs
parents:
diff changeset
   138
        iPowerMgr.SetPower( EBTOff, NULL, iActive->RequestStatus() );
hgs
parents:
diff changeset
   139
        User::WaitForRequest( iActive->RequestStatus() );
hgs
parents:
diff changeset
   140
        // Result will be communicated through the caller of this function (by leaving).
hgs
parents:
diff changeset
   141
#else   //__WINS__
hgs
parents:
diff changeset
   142
        iPowerState = EBTOff;
hgs
parents:
diff changeset
   143
#endif  //__WINS__
hgs
parents:
diff changeset
   144
        } 
26
hgs
parents: 25
diff changeset
   145
    
hgs
parents: 25
diff changeset
   146
#ifdef __WINS__
hgs
parents: 25
diff changeset
   147
    TRequestStatus* status = &(iActive->RequestStatus());
hgs
parents: 25
diff changeset
   148
    iActive->GoActive();
hgs
parents: 25
diff changeset
   149
    User::RequestComplete(status,KErrNone);
hgs
parents: 25
diff changeset
   150
#endif  //__WINS__
hgs
parents: 25
diff changeset
   151
    
23
hgs
parents:
diff changeset
   152
    TRACE_FUNC_RES( ( _L( "result: %d" ), err ) )
hgs
parents:
diff changeset
   153
    return err;
hgs
parents:
diff changeset
   154
    }
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   158
// Turn BT on or off.
hgs
parents:
diff changeset
   159
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   160
//
hgs
parents:
diff changeset
   161
void CBTEngSrvSettingsMgr::SetPowerStateL( TBTPowerState aState, TBool aTemporary )
hgs
parents:
diff changeset
   162
    {
hgs
parents:
diff changeset
   163
    TRACE_FUNC_ARG( ( _L( "%d (temporary=%d" ), aState, aTemporary ) )
hgs
parents:
diff changeset
   164
    if ( aState == EBTOn && iEnterpriseEnablementMode == BluetoothFeatures::EDisabled )
hgs
parents:
diff changeset
   165
        {
hgs
parents:
diff changeset
   166
        TRACE_INFO( ( _L( "no we're not... Bluetooth is enterprise-IT-disabled" ) ) )
hgs
parents:
diff changeset
   167
        User::Leave(KErrNotSupported);
hgs
parents:
diff changeset
   168
        }
hgs
parents:
diff changeset
   169
    TBool idle = ( iServer->StateMachine()->CurrentOperation() == CBTEngSrvState::ESrvOpIdle );
hgs
parents:
diff changeset
   170
    TBTPowerState currentState = EBTOff;
hgs
parents:
diff changeset
   171
    CheckTemporaryPowerStateL( currentState, aState, aTemporary );
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
    if ( ( currentState == aState || ( aTemporary && aState == EBTOff ) ) && idle )
hgs
parents:
diff changeset
   174
        {
hgs
parents:
diff changeset
   175
        // The requested power state is already active, ignore silently.
hgs
parents:
diff changeset
   176
        // We don't return an error here, as there is no error situation.
hgs
parents:
diff changeset
   177
        TRACE_INFO( ( _L( "SetPowerStateL: nothing to do" ) ) )
hgs
parents:
diff changeset
   178
        if ( currentState == aState )
hgs
parents:
diff changeset
   179
            {
hgs
parents:
diff changeset
   180
            // Make sure that the CenRep key is in sync.
28
hgs
parents: 26
diff changeset
   181
            // During boot-up, the power is set from the CenRep key, so we could 
23
hgs
parents:
diff changeset
   182
            // end up out-of-sync.
hgs
parents:
diff changeset
   183
            TRACE_INFO( ( _L( "SetPowerStateL: currentState == aState" ) ) )
28
hgs
parents: 26
diff changeset
   184
            HandleHwPowerChangeL( aState );
hgs
parents: 26
diff changeset
   185
            }
23
hgs
parents:
diff changeset
   186
        return;
hgs
parents:
diff changeset
   187
        }
hgs
parents:
diff changeset
   188
    if ( aState == EBTOn )
hgs
parents:
diff changeset
   189
        {
hgs
parents:
diff changeset
   190
        // Hardware power on is the first step.
hgs
parents:
diff changeset
   191
        User::LeaveIfError( SetHwPowerState( aState ) );
hgs
parents:
diff changeset
   192
        }
hgs
parents:
diff changeset
   193
    else
hgs
parents:
diff changeset
   194
        {
hgs
parents:
diff changeset
   195
        //Prevent BT visibility in the situation when we turn OFF BT Engine 
hgs
parents:
diff changeset
   196
        //but FM Radio is still alive
hgs
parents:
diff changeset
   197
        SetVisibilityModeL( EBTVisibilityModeNoScans, 0 );
hgs
parents:
diff changeset
   198
        // Hardware power off is the last step.
hgs
parents:
diff changeset
   199
        // First disconnect all plug-ins.
hgs
parents:
diff changeset
   200
        iServer->PluginManager()->DisconnectAllPlugins();
hgs
parents:
diff changeset
   201
        }
hgs
parents:
diff changeset
   202
    // We only signal that BT is on after everything has completed (through 
hgs
parents:
diff changeset
   203
    // the CenRep power state key), so that all services are initialized.
hgs
parents:
diff changeset
   204
    // We signal that BT is off immediately though, so that our clients will 
hgs
parents:
diff changeset
   205
    // not try to use BT during power down.
hgs
parents:
diff changeset
   206
    iServer->StateMachine()->StartStateMachineL( aState );
hgs
parents:
diff changeset
   207
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   208
    }
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   211
// Turn BT on or off.
hgs
parents:
diff changeset
   212
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   213
//
hgs
parents:
diff changeset
   214
void CBTEngSrvSettingsMgr::SetPowerStateL(const RMessage2 aMessage )
hgs
parents:
diff changeset
   215
    {
hgs
parents:
diff changeset
   216
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   217
    __ASSERT_ALWAYS( aMessage.Function() == EBTEngSetPowerState, 
hgs
parents:
diff changeset
   218
            PanicServer( EBTEngPanicExpectSetPowerOpcode ) );
hgs
parents:
diff changeset
   219
    if ( !iMessage.IsNull() )
hgs
parents:
diff changeset
   220
        {
hgs
parents:
diff changeset
   221
        // A power management request from a client is outstanding.
hgs
parents:
diff changeset
   222
        User::Leave( KErrAlreadyExists );
hgs
parents:
diff changeset
   223
        }
hgs
parents:
diff changeset
   224
 
hgs
parents:
diff changeset
   225
    TBTPowerStateValue arg = (TBTPowerStateValue) aMessage.Int0();
hgs
parents:
diff changeset
   226
    // TBTPowerState power state type is inverted from TBTPowerStateValue,
hgs
parents:
diff changeset
   227
    // which is used by the client to pass the parameter...
hgs
parents:
diff changeset
   228
    TBTPowerState reqedPowerState( EBTOff );
hgs
parents:
diff changeset
   229
    if ( arg == EBTPowerOn )
hgs
parents:
diff changeset
   230
        {
hgs
parents:
diff changeset
   231
        reqedPowerState = EBTOn;
hgs
parents:
diff changeset
   232
        }
hgs
parents:
diff changeset
   233
    TBool tempPowerOn = (TBool) aMessage.Int1();
hgs
parents:
diff changeset
   234
    
hgs
parents:
diff changeset
   235
    SetPowerStateL( reqedPowerState, tempPowerOn );
hgs
parents:
diff changeset
   236
    if ( iServer->StateMachine()->CurrentOperation() == CBTEngSrvState::ESrvOpIdle )
hgs
parents:
diff changeset
   237
        {
hgs
parents:
diff changeset
   238
        // The request is accepted but the state machine is not running. This means the
hgs
parents:
diff changeset
   239
        // requested power state is already active. Request is done.
hgs
parents:
diff changeset
   240
        aMessage.Complete( KErrNone );
hgs
parents:
diff changeset
   241
        }
hgs
parents:
diff changeset
   242
    else
hgs
parents:
diff changeset
   243
        {
hgs
parents:
diff changeset
   244
        iMessage = RMessage2( aMessage );
hgs
parents:
diff changeset
   245
        }
hgs
parents:
diff changeset
   246
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   247
    }
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   250
// Initialize Bluetooth stack settings.
hgs
parents:
diff changeset
   251
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   252
//
hgs
parents:
diff changeset
   253
void CBTEngSrvSettingsMgr::InitBTStackL()
hgs
parents:
diff changeset
   254
    {
hgs
parents:
diff changeset
   255
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   256
    iServer->BasebandConnectionManager()->Subscribe();
hgs
parents:
diff changeset
   257
    TBTVisibilityMode visibility = EBTVisibilityModeHidden;
hgs
parents:
diff changeset
   258
    CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings );
hgs
parents:
diff changeset
   259
    TInt err = cenRep->Get( KBTDiscoverable, (TInt&) visibility );
hgs
parents:
diff changeset
   260
    delete cenRep;
hgs
parents:
diff changeset
   261
    if (iRestoreVisibility == EFalse)
hgs
parents:
diff changeset
   262
        {
hgs
parents:
diff changeset
   263
        if( err || visibility == EBTVisibilityModeTemporary &&
hgs
parents:
diff changeset
   264
            !( iServer->IsTimerQueued( CBTEngServer::EScanModeTimer ) ) )
hgs
parents:
diff changeset
   265
            {
hgs
parents:
diff changeset
   266
            visibility = EBTVisibilityModeHidden;
hgs
parents:
diff changeset
   267
            }
hgs
parents:
diff changeset
   268
        SetVisibilityModeL( visibility, 0 );
hgs
parents:
diff changeset
   269
        }
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
    TBool sspDebugMode = EFalse;
hgs
parents:
diff changeset
   272
    (void) RProperty::Get( KPropertyUidBluetoothCategory,
hgs
parents:
diff changeset
   273
                KPropertyKeyBluetoothGetSimplePairingDebugMode, (TInt&) sspDebugMode );
hgs
parents:
diff changeset
   274
        // Only set debug mode to off if it is on, to prevent a loop notifications.
hgs
parents:
diff changeset
   275
    if( sspDebugMode )
hgs
parents:
diff changeset
   276
        {
hgs
parents:
diff changeset
   277
        sspDebugMode = EFalse;
hgs
parents:
diff changeset
   278
        // Add LeaveIfError if unsuccessful
hgs
parents:
diff changeset
   279
        (void) RProperty::Set(KPropertyUidBluetoothCategory,
hgs
parents:
diff changeset
   280
                    KPropertyKeyBluetoothSetSimplePairingDebugMode, (TInt) sspDebugMode );
hgs
parents:
diff changeset
   281
        }
hgs
parents:
diff changeset
   282
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   283
    }
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   287
// Reset settings and disconnect all links.
hgs
parents:
diff changeset
   288
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   289
//
hgs
parents:
diff changeset
   290
void CBTEngSrvSettingsMgr::StopBTStackL()
hgs
parents:
diff changeset
   291
    {
hgs
parents:
diff changeset
   292
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   293
    TBTVisibilityMode visibility = EBTVisibilityModeHidden;
hgs
parents:
diff changeset
   294
    CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings );
hgs
parents:
diff changeset
   295
          // Ignore error here; if we can't read it, likely we can't set it either.
hgs
parents:
diff changeset
   296
    (void) cenRep->Get( KBTDiscoverable, (TInt&) visibility );
hgs
parents:
diff changeset
   297
    delete cenRep;
hgs
parents:
diff changeset
   298
    if( visibility == EBTVisibilityModeTemporary )
hgs
parents:
diff changeset
   299
        {
hgs
parents:
diff changeset
   300
        visibility = EBTVisibilityModeHidden;
hgs
parents:
diff changeset
   301
        SetVisibilityModeL( visibility, 0 );    // Also cancels scan mode timer.
hgs
parents:
diff changeset
   302
        }
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
        // Stop listening to events
hgs
parents:
diff changeset
   305
    iServer->BasebandConnectionManager()->Unsubscribe();
hgs
parents:
diff changeset
   306
        // Disconnect all links
hgs
parents:
diff changeset
   307
    TCallBack cb( CBTEngServer::DisconnectAllCallBack, iServer );
hgs
parents:
diff changeset
   308
    iServer->BasebandConnectionManager()->DisconnectAllLinksL( cb );
hgs
parents:
diff changeset
   309
        // Results in a callback (which is called directly when there are no links).
hgs
parents:
diff changeset
   310
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   311
    }
hgs
parents:
diff changeset
   312
hgs
parents:
diff changeset
   313
hgs
parents:
diff changeset
   314
// ---------------------------------------------------------------------------
28
hgs
parents: 26
diff changeset
   315
// Update the power state CenRep key, and start BTNotif server if BT is on.
23
hgs
parents:
diff changeset
   316
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   317
//
28
hgs
parents: 26
diff changeset
   318
void CBTEngSrvSettingsMgr::HandleHwPowerChangeL( TBTPowerState aState )
23
hgs
parents:
diff changeset
   319
    {
hgs
parents:
diff changeset
   320
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   321
    CRepository* cenrep = CRepository::NewLC( KCRUidBluetoothPowerState );
hgs
parents:
diff changeset
   322
    // TBTPowerState power state type is inverted from TBTPowerStateValue...
28
hgs
parents: 26
diff changeset
   323
    TBTPowerStateValue power = ( aState == EBTOn ) ? EBTPowerOn : EBTPowerOff;
23
hgs
parents:
diff changeset
   324
    User::LeaveIfError( cenrep->Set( KBTPowerState, (TInt) power ) );
hgs
parents:
diff changeset
   325
    CleanupStack::PopAndDestroy( cenrep );
hgs
parents:
diff changeset
   326
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   327
    }
hgs
parents:
diff changeset
   328
hgs
parents:
diff changeset
   329
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   330
// ?implementation_description
hgs
parents:
diff changeset
   331
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   332
//
hgs
parents:
diff changeset
   333
void CBTEngSrvSettingsMgr::SetVisibilityModeL( TBTVisibilityMode aMode, TInt aTime )
hgs
parents:
diff changeset
   334
    {
hgs
parents:
diff changeset
   335
    TRACE_FUNC_ARG( ( _L( "[aMode: %d" ), aMode ) )
hgs
parents:
diff changeset
   336
    if ( aMode != EBTVisibilityModeNoScans && iEnterpriseEnablementMode == BluetoothFeatures::EDisabled )
hgs
parents:
diff changeset
   337
        {
hgs
parents:
diff changeset
   338
        TRACE_INFO( ( _L( "\tnot changing anything... Bluetooth is enterprise-IT-disabled" ) ) )
hgs
parents:
diff changeset
   339
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   340
        }
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
    TInt err = KErrNone;
hgs
parents:
diff changeset
   343
    iServer->RemoveTimer( CBTEngServer::EScanModeTimer );
hgs
parents:
diff changeset
   344
    if( aMode != EBTVisibilityModeNoScans )
hgs
parents:
diff changeset
   345
        {
hgs
parents:
diff changeset
   346
        CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings );
hgs
parents:
diff changeset
   347
        err = cenRep->Set( KBTDiscoverable, aMode );
hgs
parents:
diff changeset
   348
        delete cenRep;
hgs
parents:
diff changeset
   349
        }
hgs
parents:
diff changeset
   350
    if( !err && aMode == EBTVisibilityModeTemporary )
hgs
parents:
diff changeset
   351
        {
hgs
parents:
diff changeset
   352
            // We need TInt64 here, as the max. time in microseconds for the 
hgs
parents:
diff changeset
   353
            // max. value (1 hour) is larger than KMaxTInt32.
hgs
parents:
diff changeset
   354
        TInt64 timeMicroSec = MAKE_TINT64( 0, aTime );
hgs
parents:
diff changeset
   355
        timeMicroSec = timeMicroSec * KMinutesInMicroSecs;
hgs
parents:
diff changeset
   356
            // Queue callback to set the visibility back to hidden.
hgs
parents:
diff changeset
   357
        iServer->QueueTimer( CBTEngServer::EScanModeTimer, (TInt64) timeMicroSec );
hgs
parents:
diff changeset
   358
        aMode = EBTVisibilityModeGeneral;
hgs
parents:
diff changeset
   359
        }
hgs
parents:
diff changeset
   360
    else if( !err && iRestoreVisibility )
hgs
parents:
diff changeset
   361
        {
hgs
parents:
diff changeset
   362
            // The user overrides, do not restore visibility mode anymore.
hgs
parents:
diff changeset
   363
        iRestoreVisibility = EFalse;
hgs
parents:
diff changeset
   364
        }
hgs
parents:
diff changeset
   365
    if( !err )
hgs
parents:
diff changeset
   366
        {
hgs
parents:
diff changeset
   367
        err = RProperty::Set( KUidSystemCategory, 
hgs
parents:
diff changeset
   368
                               KPropertyKeyBluetoothSetScanningStatus, aMode );
hgs
parents:
diff changeset
   369
        }
hgs
parents:
diff changeset
   370
    TBool hiddenMode = ( aMode == EBTVisibilityModeHidden );
hgs
parents:
diff changeset
   371
    if( !err && aMode != EBTVisibilityModeNoScans )
hgs
parents:
diff changeset
   372
        {
hgs
parents:
diff changeset
   373
            // In hidden mode, we only accept connections from paired devices.
hgs
parents:
diff changeset
   374
        err = RProperty::Set( KUidSystemCategory, 
hgs
parents:
diff changeset
   375
                               KPropertyKeyBluetoothSetAcceptPairedOnlyMode, 
hgs
parents:
diff changeset
   376
                               hiddenMode );
hgs
parents:
diff changeset
   377
        }
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
    User::LeaveIfError( err );  // To communicate the result to the client.
hgs
parents:
diff changeset
   380
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   381
    }
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
hgs
parents:
diff changeset
   384
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   385
// Timed visible mode has expired.
hgs
parents:
diff changeset
   386
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   387
//
hgs
parents:
diff changeset
   388
void CBTEngSrvSettingsMgr::ScanModeTimerCompletedL()
hgs
parents:
diff changeset
   389
    {
hgs
parents:
diff changeset
   390
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   391
    SetVisibilityModeL( EBTVisibilityModeHidden, 0 );
hgs
parents:
diff changeset
   392
    TBTPowerState power = EBTOff;
hgs
parents:
diff changeset
   393
    TInt err = GetHwPowerState( power );
25
hgs
parents: 24
diff changeset
   394
    // See p2.1.2.1.2 of the UI spec
hgs
parents: 24
diff changeset
   395
    // NB:  Please distinguish between TBTPowerState::EBTOff (defined in hcitypes.h)
hgs
parents: 24
diff changeset
   396
    //      and TBTPowerStateValue::EBTPowerOff (defined in btserversdkcrkeys.h)
hgs
parents: 24
diff changeset
   397
    //      because they have the opposite values
hgs
parents: 24
diff changeset
   398
    if( !err && (power != EBTOff))
23
hgs
parents:
diff changeset
   399
        {
hgs
parents:
diff changeset
   400
        // Show a notification to the user
hgs
parents:
diff changeset
   401
        TBTGenericInfoNotiferParamsPckg pckg;
hgs
parents:
diff changeset
   402
        pckg().iMessageType = EBTVisibilityTimeout;
hgs
parents:
diff changeset
   403
        
hgs
parents:
diff changeset
   404
        RNotifier notifier;
hgs
parents:
diff changeset
   405
        TInt err = notifier.Connect();
hgs
parents:
diff changeset
   406
        if( !err )
hgs
parents:
diff changeset
   407
            {
hgs
parents:
diff changeset
   408
            err = notifier.StartNotifier( KBTGenericInfoNotifierUid, pckg );
hgs
parents:
diff changeset
   409
            notifier.Close();
hgs
parents:
diff changeset
   410
            }
hgs
parents:
diff changeset
   411
        }
hgs
parents:
diff changeset
   412
    TRACE_FUNC_RES( ( _L( "result: %d" ), err ) )
hgs
parents:
diff changeset
   413
    }
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   417
// Check the secure simple pairing debug mode and turn it off if needed.
hgs
parents:
diff changeset
   418
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   419
//
hgs
parents:
diff changeset
   420
void CBTEngSrvSettingsMgr::CheckSspDebugModeL( TBool aDebugMode )
hgs
parents:
diff changeset
   421
    {
hgs
parents:
diff changeset
   422
    TRACE_FUNC_ARG( ( _L( "SSP debug mode state %d" ), (TInt) aDebugMode ) )
hgs
parents:
diff changeset
   423
    TBTPowerState pwr = EBTOff;
hgs
parents:
diff changeset
   424
    TBool currentMode = EFalse;
hgs
parents:
diff changeset
   425
    TInt err = RProperty::Get( KPropertyUidBluetoothCategory, 
hgs
parents:
diff changeset
   426
                                KPropertyKeyBluetoothGetSimplePairingDebugMode, 
hgs
parents:
diff changeset
   427
                                (TInt&) currentMode );
hgs
parents:
diff changeset
   428
#ifndef __WINS__
hgs
parents:
diff changeset
   429
    err = iPowerMgr.GetPower( pwr, NULL ); // Treat error as power off.
hgs
parents:
diff changeset
   430
#else   //__WINS__
hgs
parents:
diff changeset
   431
    pwr = iPowerState;
hgs
parents:
diff changeset
   432
#endif  //__WINS__
hgs
parents:
diff changeset
   433
    if( err || pwr == EBTOff )
hgs
parents:
diff changeset
   434
        {
hgs
parents:
diff changeset
   435
        iServer->RemoveTimer( CBTEngServer::ESspDebugModeTimer );
hgs
parents:
diff changeset
   436
            // Only set debug mode to off if it is on, to prevent a loop notifications.
hgs
parents:
diff changeset
   437
        if( currentMode )
hgs
parents:
diff changeset
   438
            {
hgs
parents:
diff changeset
   439
            (void) RProperty::Set( KPropertyUidBluetoothCategory, 
hgs
parents:
diff changeset
   440
                                    KPropertyKeyBluetoothSetSimplePairingDebugMode,
hgs
parents:
diff changeset
   441
                                    (TInt) aDebugMode );
hgs
parents:
diff changeset
   442
            }
hgs
parents:
diff changeset
   443
            // In case of an error in getting the power state, turn BT off. 
hgs
parents:
diff changeset
   444
            // If BT is already off, this call will be ignored.
hgs
parents:
diff changeset
   445
        SetPowerStateL( EBTOff, EFalse );
hgs
parents:
diff changeset
   446
        }
hgs
parents:
diff changeset
   447
    else if( aDebugMode )
hgs
parents:
diff changeset
   448
        {
hgs
parents:
diff changeset
   449
            // Ignore if there already is a timer queued.
hgs
parents:
diff changeset
   450
        if( !( iServer->IsTimerQueued( CBTEngServer::ESspDebugModeTimer ) ) )
hgs
parents:
diff changeset
   451
            {
hgs
parents:
diff changeset
   452
            iServer->QueueTimer( CBTEngServer::ESspDebugModeTimer, (TInt64) KBTEngSspDebugModeTimeout );
hgs
parents:
diff changeset
   453
            err =  RProperty::Set(KPropertyUidBluetoothCategory, 
hgs
parents:
diff changeset
   454
                                   KPropertyKeyBluetoothSetSimplePairingDebugMode, 
hgs
parents:
diff changeset
   455
                                   (TInt) aDebugMode );
hgs
parents:
diff changeset
   456
            }
hgs
parents:
diff changeset
   457
        }
hgs
parents:
diff changeset
   458
    else
hgs
parents:
diff changeset
   459
        {
hgs
parents:
diff changeset
   460
            // Power is on, and debug mode is set to off.
hgs
parents:
diff changeset
   461
        TInt linkCount = 0;
hgs
parents:
diff changeset
   462
        err = RProperty::Get( KPropertyUidBluetoothCategory, 
hgs
parents:
diff changeset
   463
                               KPropertyKeyBluetoothGetPHYCount, linkCount );
hgs
parents:
diff changeset
   464
        if( err || !linkCount )
hgs
parents:
diff changeset
   465
            {
hgs
parents:
diff changeset
   466
            (void) RProperty::Set(KPropertyUidBluetoothCategory, 
hgs
parents:
diff changeset
   467
                                   KPropertyKeyBluetoothSetSimplePairingDebugMode,
hgs
parents:
diff changeset
   468
                                   (TInt) aDebugMode );
hgs
parents:
diff changeset
   469
            SetPowerStateL( EBTOff, EFalse );
hgs
parents:
diff changeset
   470
            }
hgs
parents:
diff changeset
   471
        else
hgs
parents:
diff changeset
   472
            {
hgs
parents:
diff changeset
   473
            // There are still existing connections, queue the
hgs
parents:
diff changeset
   474
            // timer again for half the period.
hgs
parents:
diff changeset
   475
            TInt64 interval = KBTEngSspDebugModeTimeout / 2;
hgs
parents:
diff changeset
   476
            iServer->QueueTimer( CBTEngServer::ESspDebugModeTimer, interval );
hgs
parents:
diff changeset
   477
            }
hgs
parents:
diff changeset
   478
        }
hgs
parents:
diff changeset
   479
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   480
    }
hgs
parents:
diff changeset
   481
hgs
parents:
diff changeset
   482
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   483
// A session will be ended, completes the pending request for this session.
hgs
parents:
diff changeset
   484
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   485
//
hgs
parents:
diff changeset
   486
void CBTEngSrvSettingsMgr::SessionClosed( CSession2* aSession )
hgs
parents:
diff changeset
   487
    {
hgs
parents:
diff changeset
   488
    TRACE_FUNC_ARG( ( _L( " session %x"), aSession ) )
hgs
parents:
diff changeset
   489
    if ( !iMessage.IsNull() && iMessage.Session() == aSession )
hgs
parents:
diff changeset
   490
        {
hgs
parents:
diff changeset
   491
        iMessage.Complete( KErrCancel );
hgs
parents:
diff changeset
   492
        }
hgs
parents:
diff changeset
   493
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   494
    }
hgs
parents:
diff changeset
   495
hgs
parents:
diff changeset
   496
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   497
// Check the power state and if BT gets turned off automatically.
hgs
parents:
diff changeset
   498
// This method is invoked either when the timer has expired, or
hgs
parents:
diff changeset
   499
// if there are no more connections while the timer was running.
hgs
parents:
diff changeset
   500
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   501
//
hgs
parents:
diff changeset
   502
void CBTEngSrvSettingsMgr::CheckAutoPowerOffL()
hgs
parents:
diff changeset
   503
    {
hgs
parents:
diff changeset
   504
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   505
    if ( iAutoOffClients > 0 )
hgs
parents:
diff changeset
   506
        {
hgs
parents:
diff changeset
   507
        TRACE_INFO( ( _L( "[CBTEngServer]\t iAutoOffClients %d"), iAutoOffClients ) )
hgs
parents:
diff changeset
   508
        return;
hgs
parents:
diff changeset
   509
        }
hgs
parents:
diff changeset
   510
    TInt linkCount = 0;
hgs
parents:
diff changeset
   511
    TInt err = RProperty::Get( KPropertyUidBluetoothCategory, 
hgs
parents:
diff changeset
   512
                                KPropertyKeyBluetoothGetPHYCount, linkCount );
hgs
parents:
diff changeset
   513
    if( !err && !linkCount )
hgs
parents:
diff changeset
   514
        {
hgs
parents:
diff changeset
   515
        TRACE_INFO( ( _L( "[CBTEngServer]\t SetPowerStateL( EBTOff, EFalse );")))
hgs
parents:
diff changeset
   516
        SetPowerStateL( EBTOff, EFalse );
hgs
parents:
diff changeset
   517
        }
hgs
parents:
diff changeset
   518
    else
hgs
parents:
diff changeset
   519
        {
hgs
parents:
diff changeset
   520
        if( iRestoreVisibility )
hgs
parents:
diff changeset
   521
            {
hgs
parents:
diff changeset
   522
                // Set visibility mode back to the value selected by the user.
hgs
parents:
diff changeset
   523
            SetVisibilityModeL( EBTVisibilityModeGeneral, 0 );
hgs
parents:
diff changeset
   524
            iRestoreVisibility = EFalse;
hgs
parents:
diff changeset
   525
            }
hgs
parents:
diff changeset
   526
            // show note if non-audio connection exists
hgs
parents:
diff changeset
   527
        if ( !iServer->PluginManager()->CheckAudioConnectionsL() )
hgs
parents:
diff changeset
   528
            {
hgs
parents:
diff changeset
   529
            RNotifier notifier;
hgs
parents:
diff changeset
   530
            TInt err = notifier.Connect();
hgs
parents:
diff changeset
   531
            if( !err )
hgs
parents:
diff changeset
   532
                {
hgs
parents:
diff changeset
   533
                TRequestStatus status;
hgs
parents:
diff changeset
   534
                TBTGenericInfoNotiferParamsPckg pckg;
hgs
parents:
diff changeset
   535
                pckg().iMessageType = EBTStayPowerOn;
hgs
parents:
diff changeset
   536
                TBuf8<sizeof(TInt)> result;
hgs
parents:
diff changeset
   537
                //notifier.StartNotifier( KBTGenericInfoNotifierUid, pckg, result );
hgs
parents:
diff changeset
   538
                notifier.StartNotifierAndGetResponse( status, 
hgs
parents:
diff changeset
   539
                                                  KBTGenericInfoNotifierUid, 
hgs
parents:
diff changeset
   540
                                                  pckg, result );   // Reply buffer not used.
hgs
parents:
diff changeset
   541
                User::WaitForRequest( status );
hgs
parents:
diff changeset
   542
                notifier.Close();
hgs
parents:
diff changeset
   543
                }
hgs
parents:
diff changeset
   544
            }
hgs
parents:
diff changeset
   545
        iAutoOffClients = 0;
hgs
parents:
diff changeset
   546
        iAutoSwitchOff = EFalse;
hgs
parents:
diff changeset
   547
        TCallBack cb;
hgs
parents:
diff changeset
   548
        iServer->BasebandConnectionManager()->SetAutoSwitchOff( EFalse, cb );
hgs
parents:
diff changeset
   549
        }
hgs
parents:
diff changeset
   550
    TRACE_FUNC_EXIT 
hgs
parents:
diff changeset
   551
    }
hgs
parents:
diff changeset
   552
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   555
// The method is called when BT stack scanning mode P&S key is changed
hgs
parents:
diff changeset
   556
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   557
//
hgs
parents:
diff changeset
   558
void CBTEngSrvSettingsMgr::UpdateVisibilityModeL( TInt aStackScanMode )
hgs
parents:
diff changeset
   559
    {
hgs
parents:
diff changeset
   560
    TRACE_FUNC_ARG( ( _L( "[aStackScanMode: %d" ), aStackScanMode ) )
hgs
parents:
diff changeset
   561
    TBTVisibilityMode currentMode;
hgs
parents:
diff changeset
   562
hgs
parents:
diff changeset
   563
    CRepository* cenRep = CRepository::NewLC( KCRUidBTEngPrivateSettings );
hgs
parents:
diff changeset
   564
    User::LeaveIfError( cenRep->Get( KBTDiscoverable, (TInt&) currentMode ) );
hgs
parents:
diff changeset
   565
hgs
parents:
diff changeset
   566
        // In case we are in temp visibility mode, we cannot always know whether the BT stack
hgs
parents:
diff changeset
   567
        // scan mode key was set by some external party or by us in SetVisibilityModeL above.
hgs
parents:
diff changeset
   568
        // Therefore we cannot stop the timer in case aMode is EBTVisibilityModeGeneral and 
hgs
parents:
diff changeset
   569
        // currentmode is EBTVisibilityModeTemporary
hgs
parents:
diff changeset
   570
    if( !( currentMode == EBTVisibilityModeTemporary && aStackScanMode == EBTVisibilityModeGeneral ) )
hgs
parents:
diff changeset
   571
        {
hgs
parents:
diff changeset
   572
            // Cancel the timer and queue it again if needed.
hgs
parents:
diff changeset
   573
        iServer->RemoveTimer( CBTEngServer::EScanModeTimer );
hgs
parents:
diff changeset
   574
        if( currentMode != aStackScanMode )
hgs
parents:
diff changeset
   575
            {
hgs
parents:
diff changeset
   576
            if( aStackScanMode == EPageScanOnly || aStackScanMode == EInquiryAndPageScan )
hgs
parents:
diff changeset
   577
                {
hgs
parents:
diff changeset
   578
                User::LeaveIfError( cenRep->Set( KBTDiscoverable, aStackScanMode ) );
hgs
parents:
diff changeset
   579
                }
hgs
parents:
diff changeset
   580
            else if( aStackScanMode == EInquiryScanOnly )
hgs
parents:
diff changeset
   581
                {
hgs
parents:
diff changeset
   582
                    // We don't support ENoScansEnabled nor EInquiryScanOnly mode
hgs
parents:
diff changeset
   583
                    // -> Consider these as same as Hidden 
hgs
parents:
diff changeset
   584
                User::LeaveIfError( cenRep->Set( KBTDiscoverable, EBTVisibilityModeHidden ) );
hgs
parents:
diff changeset
   585
                }
hgs
parents:
diff changeset
   586
            else if( aStackScanMode == ENoScansEnabled )
hgs
parents:
diff changeset
   587
                {
hgs
parents:
diff changeset
   588
                //We don't change KBTDiscoverable here, because ENoScansEnabled
hgs
parents:
diff changeset
   589
                //indicates BT/SYSTEM shutdown is happening
hgs
parents:
diff changeset
   590
                }
hgs
parents:
diff changeset
   591
            }
hgs
parents:
diff changeset
   592
        }
hgs
parents:
diff changeset
   593
    SetUiIndicatorsL();
hgs
parents:
diff changeset
   594
    CleanupStack::PopAndDestroy( cenRep );
hgs
parents:
diff changeset
   595
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   596
    }
hgs
parents:
diff changeset
   597
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   600
// Set Device Under Test mode.
hgs
parents:
diff changeset
   601
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   602
//
hgs
parents:
diff changeset
   603
void CBTEngSrvSettingsMgr::SetDutMode( TInt aDutMode )
hgs
parents:
diff changeset
   604
    {
hgs
parents:
diff changeset
   605
    TRACE_FUNC_ARG( ( _L( "DUT mode %d" ), aDutMode ) )
hgs
parents:
diff changeset
   606
hgs
parents:
diff changeset
   607
    if (aDutMode == EBTDutOff)
hgs
parents:
diff changeset
   608
        {
hgs
parents:
diff changeset
   609
        return;
hgs
parents:
diff changeset
   610
        }
hgs
parents:
diff changeset
   611
hgs
parents:
diff changeset
   612
    TInt powerState = EBTOff;
hgs
parents:
diff changeset
   613
    CRepository* cenrep = NULL;
hgs
parents:
diff changeset
   614
    
hgs
parents:
diff changeset
   615
    TRAPD(err, cenrep = CRepository::NewL(KCRUidBluetoothPowerState));
hgs
parents:
diff changeset
   616
    
hgs
parents:
diff changeset
   617
    if (!err && cenrep)
hgs
parents:
diff changeset
   618
        {
hgs
parents:
diff changeset
   619
        cenrep->Get(KBTPowerState, powerState);
hgs
parents:
diff changeset
   620
        delete cenrep;
hgs
parents:
diff changeset
   621
        cenrep = NULL;
hgs
parents:
diff changeset
   622
        }
hgs
parents:
diff changeset
   623
    else
hgs
parents:
diff changeset
   624
        {
hgs
parents:
diff changeset
   625
        return;
hgs
parents:
diff changeset
   626
        }
hgs
parents:
diff changeset
   627
24
hgs
parents: 23
diff changeset
   628
    if (powerState == EBTPowerOn)
23
hgs
parents:
diff changeset
   629
        {
hgs
parents:
diff changeset
   630
hgs
parents:
diff changeset
   631
#ifndef __WINS__
hgs
parents:
diff changeset
   632
        RBluetoothDutMode dutMode;
hgs
parents:
diff changeset
   633
        TInt err = dutMode.Open();
hgs
parents:
diff changeset
   634
        TRACE_FUNC_ARG( ( _L( "Open DUT mode handle err %d" ), err) )
hgs
parents:
diff changeset
   635
        if(!err) 
hgs
parents:
diff changeset
   636
            {
hgs
parents:
diff changeset
   637
            dutMode.ActivateDutMode();
hgs
parents:
diff changeset
   638
            dutMode.Close();
hgs
parents:
diff changeset
   639
            }
hgs
parents:
diff changeset
   640
#endif  //__WINS__                        
hgs
parents:
diff changeset
   641
        }
hgs
parents:
diff changeset
   642
    }
hgs
parents:
diff changeset
   643
hgs
parents:
diff changeset
   644
hgs
parents:
diff changeset
   645
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   646
// From class MBTEngActiveObserver.
hgs
parents:
diff changeset
   647
// Callback to notify that an outstanding request has completed.
hgs
parents:
diff changeset
   648
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   649
//
28
hgs
parents: 26
diff changeset
   650
void CBTEngSrvSettingsMgr::RequestCompletedL( CBTEngActive* aActive, TInt aStatus )
23
hgs
parents:
diff changeset
   651
    {
28
hgs
parents: 26
diff changeset
   652
    __ASSERT_ALWAYS( aActive->RequestId() == KBTEngSettingsActive, PanicServer( EBTEngPanicCorrupt ) );
23
hgs
parents:
diff changeset
   653
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   654
    (void) aActive;
hgs
parents:
diff changeset
   655
    if ( aStatus != KErrNone && aStatus != KErrAlreadyExists && aStatus != KErrCancel )
hgs
parents:
diff changeset
   656
        {
hgs
parents:
diff changeset
   657
        // Something went wrong, so we turn BT off again.
hgs
parents:
diff changeset
   658
        SetPowerStateL( EBTOff, EFalse );
hgs
parents:
diff changeset
   659
        }
hgs
parents:
diff changeset
   660
    if ( !iMessage.IsNull())
hgs
parents:
diff changeset
   661
        {
hgs
parents:
diff changeset
   662
        iMessage.Complete( aStatus );
hgs
parents:
diff changeset
   663
        }
hgs
parents:
diff changeset
   664
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   665
    }
hgs
parents:
diff changeset
   666
28
hgs
parents: 26
diff changeset
   667
// ---------------------------------------------------------------------------
hgs
parents: 26
diff changeset
   668
// From class MBTEngActiveObserver.
hgs
parents: 26
diff changeset
   669
// Handles cancelation of an outstanding request
hgs
parents: 26
diff changeset
   670
// ---------------------------------------------------------------------------
hgs
parents: 26
diff changeset
   671
//
hgs
parents: 26
diff changeset
   672
void CBTEngSrvSettingsMgr::CancelRequest( TInt aRequestId )
hgs
parents: 26
diff changeset
   673
    {
hgs
parents: 26
diff changeset
   674
    TRACE_FUNC_ARG( ( _L( "reqID %d" ), aRequestId ) );
hgs
parents: 26
diff changeset
   675
    if ( aRequestId == KBTEngSettingsActive )
hgs
parents: 26
diff changeset
   676
        {
hgs
parents: 26
diff changeset
   677
        iPowerMgr.Cancel();
hgs
parents: 26
diff changeset
   678
        }
hgs
parents: 26
diff changeset
   679
    TRACE_FUNC_EXIT 
hgs
parents: 26
diff changeset
   680
    }
23
hgs
parents:
diff changeset
   681
hgs
parents:
diff changeset
   682
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   683
// From class MBTEngActiveObserver.
hgs
parents:
diff changeset
   684
// Callback to notify that an error has occurred in RunL.
hgs
parents:
diff changeset
   685
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   686
//
28
hgs
parents: 26
diff changeset
   687
void CBTEngSrvSettingsMgr::HandleError( CBTEngActive* aActive, TInt aError )
23
hgs
parents:
diff changeset
   688
    {
hgs
parents:
diff changeset
   689
    (void) aActive;
hgs
parents:
diff changeset
   690
    if ( !iMessage.IsNull())
hgs
parents:
diff changeset
   691
        {
hgs
parents:
diff changeset
   692
        iMessage.Complete( aError );
hgs
parents:
diff changeset
   693
        }
hgs
parents:
diff changeset
   694
    }
hgs
parents:
diff changeset
   695
hgs
parents:
diff changeset
   696
hgs
parents:
diff changeset
   697
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   698
// Loads the BT Power Manager; leaves if it cannot be loaded.
hgs
parents:
diff changeset
   699
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   700
//
hgs
parents:
diff changeset
   701
void CBTEngSrvSettingsMgr::LoadBTPowerManagerL()
hgs
parents:
diff changeset
   702
    {
hgs
parents:
diff changeset
   703
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   704
    TRACE_INFO( ( _L( "[CBTEngSrvSettingsMgr]\t Using HCI API v2 power manager" ) ) )
hgs
parents:
diff changeset
   705
    User::LeaveIfError( iPowerMgr.Open() );
hgs
parents:
diff changeset
   706
#ifndef __WINS__
hgs
parents:
diff changeset
   707
    iPowerMgr.SetPower( EBTOff, NULL, iActive->RequestStatus() );
hgs
parents:
diff changeset
   708
    User::WaitForRequest( iActive->RequestStatus() );
hgs
parents:
diff changeset
   709
    TInt status = ( iActive->RequestStatus().Int() == KErrAlreadyExists ? KErrNone : iActive->RequestStatus().Int() ); 
hgs
parents:
diff changeset
   710
    User::LeaveIfError( status );
hgs
parents:
diff changeset
   711
#else   //__WINS__
hgs
parents:
diff changeset
   712
    iPowerState = EBTOff;
hgs
parents:
diff changeset
   713
#endif  //__WINS__
hgs
parents:
diff changeset
   714
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   715
    }
hgs
parents:
diff changeset
   716
hgs
parents:
diff changeset
   717
hgs
parents:
diff changeset
   718
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   719
// ?implementation_description
hgs
parents:
diff changeset
   720
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   721
//
hgs
parents:
diff changeset
   722
void CBTEngSrvSettingsMgr::SetUiIndicatorsL()
hgs
parents:
diff changeset
   723
    {
hgs
parents:
diff changeset
   724
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   725
    TBTPowerStateValue powerState = EBTPowerOff;
hgs
parents:
diff changeset
   726
    TBTVisibilityMode visibilityMode = EBTVisibilityModeHidden;
hgs
parents:
diff changeset
   727
    CRepository* cenrep = NULL;
hgs
parents:
diff changeset
   728
    TInt phys = 0;
hgs
parents:
diff changeset
   729
    TInt connecting = 0;
hgs
parents:
diff changeset
   730
hgs
parents:
diff changeset
   731
    cenrep = CRepository::NewLC( KCRUidBluetoothPowerState );
hgs
parents:
diff changeset
   732
    User::LeaveIfError( cenrep->Get( KBTPowerState, (TInt&) powerState ) );
hgs
parents:
diff changeset
   733
    CleanupStack::PopAndDestroy( cenrep );
hgs
parents:
diff changeset
   734
    
hgs
parents:
diff changeset
   735
    if( powerState == EBTPowerOff )
hgs
parents:
diff changeset
   736
        {
28
hgs
parents: 26
diff changeset
   737
        // To be migrated
hgs
parents: 26
diff changeset
   738
        //SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
hgs
parents: 26
diff changeset
   739
        //SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff );
hgs
parents: 26
diff changeset
   740
        //SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
hgs
parents: 26
diff changeset
   741
        //SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff );
23
hgs
parents:
diff changeset
   742
        }
hgs
parents:
diff changeset
   743
    else
hgs
parents:
diff changeset
   744
        {
hgs
parents:
diff changeset
   745
        // Power is on.
hgs
parents:
diff changeset
   746
        RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothPHYCount, phys );
hgs
parents:
diff changeset
   747
        RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothConnecting, connecting );
hgs
parents:
diff changeset
   748
        
hgs
parents:
diff changeset
   749
        cenrep = CRepository::NewLC( KCRUidBTEngPrivateSettings );
hgs
parents:
diff changeset
   750
        User::LeaveIfError( cenrep->Get( KBTDiscoverable, (TInt&) visibilityMode ) );
hgs
parents:
diff changeset
   751
        CleanupStack::PopAndDestroy( cenrep );
hgs
parents:
diff changeset
   752
        
hgs
parents:
diff changeset
   753
        if( visibilityMode == EBTVisibilityModeHidden )
hgs
parents:
diff changeset
   754
            {
hgs
parents:
diff changeset
   755
             if ( connecting ) // BT connecting and hidden
hgs
parents:
diff changeset
   756
                {
28
hgs
parents: 26
diff changeset
   757
                // To be migrated to QT
hgs
parents: 26
diff changeset
   758
                //SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
hgs
parents: 26
diff changeset
   759
                //SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateAnimate );
23
hgs
parents:
diff changeset
   760
                }
hgs
parents:
diff changeset
   761
            else if ( phys > 0 ) // BT connection active and hidden     
hgs
parents:
diff changeset
   762
                {
28
hgs
parents: 26
diff changeset
   763
                //SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
hgs
parents: 26
diff changeset
   764
                //SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOn );
23
hgs
parents:
diff changeset
   765
                }
hgs
parents:
diff changeset
   766
            else  // BT connection not active and hidden
hgs
parents:
diff changeset
   767
                {
28
hgs
parents: 26
diff changeset
   768
                //SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOn );
hgs
parents: 26
diff changeset
   769
                //SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff );
23
hgs
parents:
diff changeset
   770
                }
28
hgs
parents: 26
diff changeset
   771
            //SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
hgs
parents: 26
diff changeset
   772
            //SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff );
23
hgs
parents:
diff changeset
   773
            }           
hgs
parents:
diff changeset
   774
        else if( visibilityMode == EBTVisibilityModeGeneral || visibilityMode == EBTVisibilityModeTemporary )
hgs
parents:
diff changeset
   775
            {     
hgs
parents:
diff changeset
   776
            if ( connecting ) // BT connecting and visible
hgs
parents:
diff changeset
   777
                {
28
hgs
parents: 26
diff changeset
   778
                //SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
hgs
parents: 26
diff changeset
   779
                //SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateAnimate );
23
hgs
parents:
diff changeset
   780
                }
hgs
parents:
diff changeset
   781
            else if ( phys > 0 ) // BT connection active and visible 
hgs
parents:
diff changeset
   782
                {
28
hgs
parents: 26
diff changeset
   783
                //SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff );
hgs
parents: 26
diff changeset
   784
                //SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOn );
23
hgs
parents:
diff changeset
   785
                }
hgs
parents:
diff changeset
   786
            else  // BT connection not active and visible
hgs
parents:
diff changeset
   787
                {
28
hgs
parents: 26
diff changeset
   788
                //SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOn );
hgs
parents: 26
diff changeset
   789
                //SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff );
23
hgs
parents:
diff changeset
   790
                }
28
hgs
parents: 26
diff changeset
   791
            //SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff );
hgs
parents: 26
diff changeset
   792
            //SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff );
23
hgs
parents:
diff changeset
   793
            }
hgs
parents:
diff changeset
   794
        }
hgs
parents:
diff changeset
   795
    TRACE_FUNC_EXIT
hgs
parents:
diff changeset
   796
    }
hgs
parents:
diff changeset
   797
hgs
parents:
diff changeset
   798
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   799
// ?implementation_description
hgs
parents:
diff changeset
   800
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   801
//
hgs
parents:
diff changeset
   802
void CBTEngSrvSettingsMgr::SetIndicatorStateL( const TInt aIndicator, const TInt aState )
hgs
parents:
diff changeset
   803
    {
28
hgs
parents: 26
diff changeset
   804
    // To be migrated to QT
hgs
parents: 26
diff changeset
   805
    (void) aIndicator;
hgs
parents: 26
diff changeset
   806
    (void) aState;
hgs
parents: 26
diff changeset
   807
    //CAknSmallIndicator* indicator = CAknSmallIndicator::NewLC( TUid::Uid( aIndicator ) );
hgs
parents: 26
diff changeset
   808
    //indicator->SetIndicatorStateL( aState );
hgs
parents: 26
diff changeset
   809
    //CleanupStack::PopAndDestroy( indicator ); //indicator
23
hgs
parents:
diff changeset
   810
    }
hgs
parents:
diff changeset
   811
hgs
parents:
diff changeset
   812
hgs
parents:
diff changeset
   813
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   814
// Gets the current HW power state.
hgs
parents:
diff changeset
   815
// For now this is a separate method to isolate the different variations.
hgs
parents:
diff changeset
   816
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   817
//
hgs
parents:
diff changeset
   818
TInt CBTEngSrvSettingsMgr::GetHwPowerState( TBTPowerState& aState )
hgs
parents:
diff changeset
   819
    {
hgs
parents:
diff changeset
   820
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   821
    TInt err = KErrNone;
hgs
parents:
diff changeset
   822
    
hgs
parents:
diff changeset
   823
#ifndef __WINS__
hgs
parents:
diff changeset
   824
    err = iPowerMgr.GetPower( aState, NULL );
hgs
parents:
diff changeset
   825
#else   //__WINS__
hgs
parents:
diff changeset
   826
    aState = iPowerState;
hgs
parents:
diff changeset
   827
#endif  //__WINS__
hgs
parents:
diff changeset
   828
    TRACE_FUNC_ARG( ( _L( "Power state is %d, result %d" ), (TInt) aState, err ) )
hgs
parents:
diff changeset
   829
    return err;
hgs
parents:
diff changeset
   830
    }
hgs
parents:
diff changeset
   831
hgs
parents:
diff changeset
   832
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   833
// Check the power state and if BT gets turned off automatically.
hgs
parents:
diff changeset
   834
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   835
//
hgs
parents:
diff changeset
   836
void CBTEngSrvSettingsMgr::CheckTemporaryPowerStateL( TBTPowerState& aCurrentState, 
hgs
parents:
diff changeset
   837
    TBTPowerState aNewState, TBool aTemporary )
hgs
parents:
diff changeset
   838
    {
hgs
parents:
diff changeset
   839
    TRACE_FUNC_ENTRY
hgs
parents:
diff changeset
   840
    User::LeaveIfError( GetHwPowerState( aCurrentState ) );
hgs
parents:
diff changeset
   841
    if( !aTemporary )
hgs
parents:
diff changeset
   842
        {
hgs
parents:
diff changeset
   843
            // Force the new power state, so clear all auto switch off flags.
hgs
parents:
diff changeset
   844
            // If power is off, this will anyway be ignored.
hgs
parents:
diff changeset
   845
        iAutoOffClients = 0;
hgs
parents:
diff changeset
   846
        iAutoSwitchOff = EFalse;
hgs
parents:
diff changeset
   847
        TCallBack cb;
hgs
parents:
diff changeset
   848
        iServer->BasebandConnectionManager()->SetAutoSwitchOff( EFalse, cb );
hgs
parents:
diff changeset
   849
        if( iRestoreVisibility && aCurrentState == EBTOn )
hgs
parents:
diff changeset
   850
            {
hgs
parents:
diff changeset
   851
                // Set visibility mode back to the value selected by the user.
hgs
parents:
diff changeset
   852
            SetVisibilityModeL( EBTVisibilityModeGeneral, 0 );
hgs
parents:
diff changeset
   853
            iRestoreVisibility = EFalse;
hgs
parents:
diff changeset
   854
            }
hgs
parents:
diff changeset
   855
        }
hgs
parents:
diff changeset
   856
    else
hgs
parents:
diff changeset
   857
        {
hgs
parents:
diff changeset
   858
        if( aCurrentState == aNewState )
hgs
parents:
diff changeset
   859
            {
hgs
parents:
diff changeset
   860
            if( iAutoSwitchOff && aNewState == EBTOn )
hgs
parents:
diff changeset
   861
                {
hgs
parents:
diff changeset
   862
                iAutoOffClients++;
hgs
parents:
diff changeset
   863
                iServer->RemoveTimer( CBTEngServer::EAutoPowerOffTimer );
hgs
parents:
diff changeset
   864
                }
hgs
parents:
diff changeset
   865
            }
hgs
parents:
diff changeset
   866
        else if( iAutoSwitchOff || aNewState == EBTOn )
hgs
parents:
diff changeset
   867
            {
hgs
parents:
diff changeset
   868
            aNewState == EBTOff ? iAutoOffClients-- : iAutoOffClients++;
hgs
parents:
diff changeset
   869
            iAutoSwitchOff = ETrue;
hgs
parents:
diff changeset
   870
            if( aNewState == EBTOff && iAutoOffClients <= 0 )
hgs
parents:
diff changeset
   871
                {
hgs
parents:
diff changeset
   872
                TCallBack powerOffCb( CBTEngServer::AutoPowerOffCallBack, iServer );
hgs
parents:
diff changeset
   873
                iServer->BasebandConnectionManager()->SetAutoSwitchOff( ETrue, powerOffCb );
hgs
parents:
diff changeset
   874
                TInt64 interval = KBTEngBtAutoOffTimeout;
hgs
parents:
diff changeset
   875
                iServer->QueueTimer( CBTEngServer::EAutoPowerOffTimer, interval );
hgs
parents:
diff changeset
   876
                }
hgs
parents:
diff changeset
   877
            else if( aNewState == EBTOn )
hgs
parents:
diff changeset
   878
                {
hgs
parents:
diff changeset
   879
                CRepository* cenRep = CRepository::NewLC( KCRUidBTEngPrivateSettings );
hgs
parents:
diff changeset
   880
                TBTVisibilityMode visibility = EBTVisibilityModeGeneral;
hgs
parents:
diff changeset
   881
                TInt err = cenRep->Get( KBTDiscoverable, (TInt&) visibility );
hgs
parents:
diff changeset
   882
                CleanupStack::PopAndDestroy( cenRep );
hgs
parents:
diff changeset
   883
                if( !err && visibility == EBTVisibilityModeGeneral )
hgs
parents:
diff changeset
   884
                    {
hgs
parents:
diff changeset
   885
                    SetVisibilityModeL( EBTVisibilityModeHidden, 0 );
hgs
parents:
diff changeset
   886
                    iRestoreVisibility = ETrue;
hgs
parents:
diff changeset
   887
                   }
hgs
parents:
diff changeset
   888
                iServer->RemoveTimer( CBTEngServer::EAutoPowerOffTimer );
hgs
parents:
diff changeset
   889
                }
hgs
parents:
diff changeset
   890
            }
hgs
parents:
diff changeset
   891
        }
hgs
parents:
diff changeset
   892
    if( iAutoOffClients < 0 )
hgs
parents:
diff changeset
   893
        {
hgs
parents:
diff changeset
   894
        iAutoOffClients = 0;
hgs
parents:
diff changeset
   895
        }
hgs
parents:
diff changeset
   896
    TRACE_FUNC_EXIT 
hgs
parents:
diff changeset
   897
    }
28
hgs
parents: 26
diff changeset
   898