diff -r 613943a21004 -r 9386f31cc85b bluetoothengine/btnotif/inc/btnotiflock.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/inc/btnotiflock.inl Wed Sep 01 12:20:04 2010 +0100 @@ -0,0 +1,234 @@ +/* +* 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: Implements getting/setting notifier locks on BT devices +* from/to P&S KBTNotifierLocks from btengprivatepskeys.h. +* +*/ + +#include "btengprivatepskeys.h" +#include + +// ---------------------------------------------------------- +// Initialize members to zero +// ---------------------------------------------------------- +// +inline TBTNotifLock::TBTNotifLock() + : iAddr(TBTDevAddr()), iLocks(EBTNotifierLockNone) + { + } + +// ---------------------------------------------------------- +// initialize members to the specified values +// ---------------------------------------------------------- +// +inline TBTNotifLock::TBTNotifLock(const TBTDevAddr& aAddr, TInt aLocks) + : iAddr( aAddr ), iLocks( aLocks ) + { + } + +// ---------------------------------------------------------- +// returns the address +// ---------------------------------------------------------- +// +inline const TBTDevAddr& TBTNotifLock::Addr() const + { + return iAddr; + } + +// ---------------------------------------------------------- +// returns the lock as value +// ---------------------------------------------------------- +// +inline TInt TBTNotifLock::Locks() const + { + return iLocks; + } + +// ---------------------------------------------------------- +// returns the lock as modifiable reference +// ---------------------------------------------------------- +// +inline TInt& TBTNotifLock::Locks() + { + return iLocks; + } + +// ---------------------------------------------------------- +// Locally instantiate a RProperty and invoke GetNotifLocks +// ---------------------------------------------------------- +// +inline void TBTNotifLockPublish::GetNotifLocks( TInt& aLocks, const TBTDevAddr& aAddr ) + { + RProperty property; + TInt err = property.Attach( + KPSUidBluetoothEnginePrivateCategory, KBTNotifierLocks ); + if ( !err ) + { + GetNotifLocks( property, aLocks, aAddr ); + } + property.Close(); + } + +// ---------------------------------------------------------- +// Extracts from PS key and returns the lock value for +// the specified device +// ---------------------------------------------------------- +// +inline void TBTNotifLockPublish::GetNotifLocks(RProperty& aProperty, + TInt& aLocks, const TBTDevAddr& aAddr ) + { + aLocks = EBTNotifierLockNone; + TInt infoSize( sizeof( TBTNotifLock ) ); + TBuf8 infoDes; + TInt err = aProperty.Get( infoDes ); + if ( err || infoDes.Length() < infoSize ) + { + // zero length of the PS content indicates no lock set at all. + return; + } + TInt infoCount = infoDes.Length() / infoSize; + + TPckgBuf tmpPckg; + for ( TInt i = 0; i < infoCount; i++ ) + { + tmpPckg.Copy(infoDes.Mid( i * infoSize, infoSize )); + if ( tmpPckg().Addr() == aAddr ) + { + // found the locks for the device, writes to client. + aLocks = tmpPckg().Locks(); + return; + } + } + } + +// ---------------------------------------------------------- +// Locally instantiate a RProperty and invoke AddNotifLocks +// ---------------------------------------------------------- +// +inline void TBTNotifLockPublish::AddNotifLocks( TInt aLocks, const TBTDevAddr& aAddr ) + { + RProperty property; + TInt err = property.Attach( + KPSUidBluetoothEnginePrivateCategory, KBTNotifierLocks ); + if ( !err ) + { + AddNotifLocks( property, aLocks, aAddr ); + } + property.Close(); + } + +// ---------------------------------------------------------- +// Find the lock for the device from PS key and updates its value if +// needed. +// ---------------------------------------------------------- +// +inline void TBTNotifLockPublish::AddNotifLocks( RProperty& aProperty, + TInt aLocks, const TBTDevAddr& aAddr ) + { + TBuf8 infoDes; + TInt infoSize( sizeof( TBTNotifLock ) ); + TInt err = aProperty.Get( infoDes ); + if ( err ) + { + return; + } + TInt infoCount = infoDes.Length() / infoSize; + TPckgBuf tmpPckg; + + for ( TInt i = 0; i < infoCount; i++ ) + { + tmpPckg.Copy(infoDes.Mid( i * infoSize, infoSize )); + if ( tmpPckg().Addr() == aAddr ) + { + TInt newOps = tmpPckg().Locks() | aLocks; + // update the value only if it is really changed: + if ( tmpPckg().Locks() != newOps ) + { + tmpPckg().Locks() = newOps; + infoDes.Replace( i * infoSize, infoSize, tmpPckg ); + (void) aProperty.Set( infoDes ); + } + return; + } + } + // no lock for the device so far, append it to the end: + tmpPckg() = TBTNotifLock( aAddr, aLocks ); + if ( infoCount ) + { + infoDes.Append( tmpPckg ); + (void) aProperty.Set( infoDes ); + } + (void) aProperty.Set( tmpPckg ); + } + +// ---------------------------------------------------------- +// Locally instantiate a RProperty and invoke DeleteNotifLocks +// ---------------------------------------------------------- +// +inline void TBTNotifLockPublish::DeleteNotifLocks( TInt aLocks, const TBTDevAddr& aAddr ) + { + RProperty property; + TInt err = property.Attach( + KPSUidBluetoothEnginePrivateCategory, KBTNotifierLocks ); + if ( !err ) + { + DeleteNotifLocks( property, aLocks, aAddr ); + } + property.Close(); + } + +// ---------------------------------------------------------- +// Find the lock for the device from PS key and updates its value if +// needed. +// ---------------------------------------------------------- +// +inline void TBTNotifLockPublish::DeleteNotifLocks( RProperty& aProperty, + TInt aLocks, const TBTDevAddr& aAddr ) + { + TBuf8 infoDes; + TInt infoSize( sizeof( TBTNotifLock ) ); + TInt err = aProperty.Get( infoDes ); + if ( err || infoDes.Length() < infoSize ) + { + return; + } + TInt infoCount = infoDes.Length() / infoSize; + TPckgBuf tmpPckg; + for ( TInt i = 0; i < infoCount; i++ ) + { + tmpPckg.Copy( infoDes.Mid( i * infoSize, infoSize ) ); + if ( tmpPckg().Addr() == aAddr ) + { + TInt newOps = tmpPckg().Locks() & ~aLocks; + // update PS only if the value is changed: + if ( tmpPckg().Locks() != newOps ) + { + tmpPckg().Locks() = newOps; + if ( tmpPckg().Locks() == 0) + { + // no lock for this device anymore, remove from PS: + infoDes.Delete( i * infoSize, infoSize ); + } + else + { + // Update the lock value: + infoDes.Replace( i * infoSize, infoSize, tmpPckg ); + } + (void) aProperty.Set( infoDes ); + } + return; + } + } + } +