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