--- /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 <e32base.h>
+#include <centralrepository.h>
+
+#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();
+ }
+ }
+ }