diff -r 000000000000 -r f63038272f30 bluetoothengine/bteng/btengsettings/src/btengsettingsnotify.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/bteng/btengsettings/src/btengsettingsnotify.cpp Mon Jan 18 20:28:57 2010 +0200 @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: ?Description +* +*/ + + + +#include +#include + +#include "btengprivatecrkeys.h" +#include "btengsettingsnotify.h" +#include "btengsettings.h" +#include "debug.h" + +const TInt KPowerKeyReqId = 20; +const TInt KVisibilityKeyReqId = 21; + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// C++ default constructor +// --------------------------------------------------------------------------- +// +CBTEngSettingsNotify::CBTEngSettingsNotify( MBTEngSettingsObserver* aObserver ) +: iObserver( aObserver ) + { + } + + +// --------------------------------------------------------------------------- +// Symbian 2nd-phase constructor +// --------------------------------------------------------------------------- +// +void CBTEngSettingsNotify::ConstructL() + { + TRACE_FUNC_ENTRY + if( iObserver ) + { + // Power status: + iPowerKeyWatcher = CBTEngActive::NewL( *this, KPowerKeyReqId, + CActive::EPriorityStandard ); + iPowerKeyCenRep = CRepository::NewL( KCRUidBluetoothPowerState ); + iPowerKeyCenRep->NotifyRequest( KBTPowerState, + iPowerKeyWatcher->RequestStatus() ); + iPowerKeyWatcher->GoActive(); + // Visibility mode: + iVisiKeyWatcher = CBTEngActive::NewL( *this, KVisibilityKeyReqId, + CActive::EPriorityStandard ); + iVisiKeyCenRep = CRepository::NewL( KCRUidBTEngPrivateSettings ); + iVisiKeyCenRep->NotifyRequest( KBTDiscoverable, + iVisiKeyWatcher->RequestStatus() ); + iVisiKeyWatcher->GoActive(); + } + + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CBTEngSettingsNotify* CBTEngSettingsNotify::NewL( MBTEngSettingsObserver* aObserver ) + { + CBTEngSettingsNotify* self = new( ELeave ) CBTEngSettingsNotify( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CBTEngSettingsNotify::~CBTEngSettingsNotify() + { + if ( iPowerKeyCenRep ) + { + iPowerKeyCenRep->NotifyCancel( KBTPowerState ); + } + delete iPowerKeyWatcher; // Will call Cancel() + delete iPowerKeyCenRep; + if ( iVisiKeyCenRep ) + { + iVisiKeyCenRep->NotifyCancel( KBTDiscoverable ); + } + delete iVisiKeyWatcher; // Will call Cancel() + delete iVisiKeyCenRep; + if( iBTeng.Handle() ) + { + iBTeng.Close(); + } + } + + +// --------------------------------------------------------------------------- +// Toggles Bluetooth power based on the existence of a session. +// --------------------------------------------------------------------------- +// +TInt CBTEngSettingsNotify::TogglePowerTemporarily() + { + TRACE_FUNC_ENTRY + TInt err = KErrNone; + if( !iBTeng.Handle() ) + { + err = iBTeng.Connect(); + if( !err ) + { + err = iBTeng.SetPowerState( EBTPowerOn, ETrue ); + } + } + else + { + iBTeng.Close(); + } + return err; + } + + +// --------------------------------------------------------------------------- +// From class MBTEngCenRepNotify. +// Handles notification of a setting change, and informs our observer. +// --------------------------------------------------------------------------- +// +void CBTEngSettingsNotify::RequestCompletedL( CBTEngActive* aActive, TInt aId, + TInt aStatus ) + { + TRACE_FUNC_ARG( ( _L( "Id(%d), status(%d)" ), aId, aStatus ) ) + + if( aId == KPowerKeyReqId && aStatus == KBTPowerState ) + { + iPowerKeyCenRep->NotifyRequest( KBTPowerState, + iPowerKeyWatcher->RequestStatus() ); + iPowerKeyWatcher->GoActive(); + TInt value = 0; + TInt err = iPowerKeyCenRep->Get( KBTPowerState, value ); + if( !err ) + { + iObserver->PowerStateChanged( (TBTPowerStateValue) value ); + } + } + else if( aId == KVisibilityKeyReqId && aStatus == KBTDiscoverable ) + { + iVisiKeyCenRep->NotifyRequest( KBTDiscoverable, + iVisiKeyWatcher->RequestStatus() ); + iVisiKeyWatcher->GoActive(); + TInt value = 0; + TInt err = iVisiKeyCenRep->Get( KBTDiscoverable, value ); + if( !err ) + { + iObserver->VisibilityModeChanged( (TBTVisibilityMode) value ); + } + } + else + { + // Coudl be a repository-wide reset (KInvalidNotificationId), + // or an invalid key ID. Anyway we know the ID of the active + // object, so we can just reset the watcher. + HandleError( aActive, aId, aStatus ); + } + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// From class MBTEngCenRepNotify. +// Handles error situation by just re-ordering notification from CenRep. +// --------------------------------------------------------------------------- +// +void CBTEngSettingsNotify::HandleError( CBTEngActive* aActive, TInt aId, + TInt aError ) + { + TRACE_FUNC_ARG( ( _L( "Id(%d), status(%d)" ), aId, aError ) ) + (void) aError; + if( aId == KPowerKeyReqId ) + { + delete iPowerKeyCenRep; + iPowerKeyCenRep = NULL; + TRAPD( err, iPowerKeyCenRep = + CRepository::NewL( KCRUidBluetoothPowerState ) ); + if( !err ) + { + iPowerKeyCenRep->NotifyRequest( KBTPowerState, + aActive->RequestStatus() ); + aActive->GoActive(); + } + } + else if( aId == KVisibilityKeyReqId ) + { + delete iVisiKeyCenRep; + iVisiKeyCenRep = NULL; + TRAPD( err, iVisiKeyCenRep = + CRepository::NewL( KCRUidBTEngPrivateSettings ) ); + if( !err ) + { + iVisiKeyCenRep->NotifyRequest( KBTDiscoverable, + aActive->RequestStatus() ); + aActive->GoActive(); + } + } + }