# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1268401403 -7200 # Node ID 0707dd69d236a9dae194148cf31672d673dfd43b # Parent 6a29d5ad0713924ed2d31da7c5d63f11d43f3d9c Revision: 201007 Kit: 201008 diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/bttoggle/src/bttoggle.cpp --- a/bluetoothengine/bteng/bttoggle/src/bttoggle.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/bttoggle/src/bttoggle.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -358,8 +358,9 @@ // ========================================================== // TInt CBTToggle::RunError(TInt aError) - { - TRACE_INFO((_L("[BTENG][BTTOGGLE]RunL error %d"), aError )) - CActiveScheduler::Stop(); - return KErrNone; - } + { + TRACE_INFO((_L("[BTENG][BTTOGGLE] RunError %d"), aError )) + iActiveNotifier = ENoneQuery; + CActiveScheduler::Stop(); + return KErrNone; + } diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/data/btengsdp.rss --- a/bluetoothengine/bteng/data/btengsdp.rss Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/data/btengsdp.rss Fri Mar 12 15:43:23 2010 +0200 @@ -879,7 +879,7 @@ elements = { ELEMENT_UUID { uuid = SERVICE_CLASS_ID_HEADSET; }, - ELEMENT_WORD { value = 0x0100; } + ELEMENT_WORD { value = 0x0102; } }; } }; diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/data/bttoggle_reg.rss --- a/bluetoothengine/bteng/data/bttoggle_reg.rss Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/data/bttoggle_reg.rss Fri Mar 12 15:43:23 2010 +0200 @@ -24,7 +24,9 @@ RESOURCE APP_REGISTRATION_INFO { - app_file = "bttoggle"; + app_file = "bttoggle"; + hidden = KAppIsHidden; + launch = KAppLaunchInForeground; } diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/group/bteng.mmp --- a/bluetoothengine/bteng/group/bteng.mmp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/group/bteng.mmp Fri Mar 12 15:43:23 2010 +0200 @@ -35,11 +35,11 @@ SOURCE btengsrvbbconnectionmgr.cpp SOURCE btengsdpdbhandler.cpp SOURCE btengsrvkeywatcher.cpp -SOURCE btengactive.cpp SOURCE btengpairman.cpp SOURCE btengpairbase.cpp SOURCE btengincpair.cpp SOURCE btengotgpair.cpp +SOURCE btengsrvsettingsmgr.cpp START RESOURCE ../data/btengsdp.rss HEADER TARGETPATH RESOURCE_FILES_DIR @@ -64,6 +64,10 @@ LIBRARY aknnotify.lib LIBRARY btfeatures.lib +#ifndef SETLOCALNAME +LIBRARY btengsettings.lib +#endif + LIBRARY btpowercontrol.lib #ifndef __WINS__ LIBRARY dutmode.lib diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/group/btengconnman.mmp --- a/bluetoothengine/bteng/group/btengconnman.mmp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/group/btengconnman.mmp Fri Mar 12 15:43:23 2010 +0200 @@ -31,7 +31,6 @@ SOURCE btengconnhandler.cpp SOURCEPATH ../src SOURCE btengclient.cpp -SOURCE btengactive.cpp USERINCLUDE ../inc USERINCLUDE ../btengconnman/inc diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/group/btengdiscovery.mmp --- a/bluetoothengine/bteng/group/btengdiscovery.mmp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/group/btengdiscovery.mmp Fri Mar 12 15:43:23 2010 +0200 @@ -32,7 +32,6 @@ SOURCE btengsdpattrparser.cpp SOURCE btengdevicesearch.cpp SOURCEPATH ../src -SOURCE btengactive.cpp SOURCE btengsdpdbhandler.cpp USERINCLUDE ../inc diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/group/btengsettings.mmp --- a/bluetoothengine/bteng/group/btengsettings.mmp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/group/btengsettings.mmp Fri Mar 12 15:43:23 2010 +0200 @@ -30,7 +30,6 @@ SOURCE btengsettings.cpp SOURCE btengsettingsnotify.cpp SOURCEPATH ../src -SOURCE btengactive.cpp SOURCE btengclient.cpp USERINCLUDE ../inc diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/inc/btengactive.h --- a/bluetoothengine/bteng/inc/btengactive.h Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/inc/btengactive.h Fri Mar 12 15:43:23 2010 +0200 @@ -86,10 +86,12 @@ * @since S60 v3.2 * @param aObserver Pointer to callback interface that receives notification * that the request has been completed. + * @param aId Identifier for the CBTEngActive instance. + * @param aPriority The priority of the active object. * @return Pointer to the constructed CBTEngActive object. */ - static CBTEngActive* NewL( MBTEngActiveObserver& aObserver, - TInt aId, TInt aPriority ); + static CBTEngActive* NewL( MBTEngActiveObserver& aObserver, TInt aId, + TInt aPriority = CActive::EPriorityStandard ); /** * Destructor diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/inc/btengactive.inl --- a/bluetoothengine/bteng/inc/btengactive.inl Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/inc/btengactive.inl Fri Mar 12 15:43:23 2010 +0200 @@ -16,6 +16,66 @@ */ +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// C++ default constructor +// --------------------------------------------------------------------------- +// +inline CBTEngActive::CBTEngActive( MBTEngActiveObserver& aObserver, TInt aId, + TInt aPriority ) +: CActive( aPriority ), + iRequestId( aId ), + iObserver( aObserver ) + { + CActiveScheduler::Add( this ); + } + + +// --------------------------------------------------------------------------- +// Symbian 2nd-phase constructor +// --------------------------------------------------------------------------- +// +inline void CBTEngActive::ConstructL() + { + } + + +// --------------------------------------------------------------------------- +// NewLC +// --------------------------------------------------------------------------- +// +inline CBTEngActive* CBTEngActive::NewL( MBTEngActiveObserver& aObserver, + TInt aId, TInt aPriority ) + { + CBTEngActive* self = new( ELeave ) CBTEngActive( aObserver, aId, aPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +inline CBTEngActive::~CBTEngActive() + { + Cancel(); + } + + +// --------------------------------------------------------------------------- +// From class CActive. +// Called by the active scheduler when the request has been cancelled. +// --------------------------------------------------------------------------- +// +inline void CBTEngActive::DoCancel() + { + } + + // ----------------------------------------------------------------------------- // Get the identifier of this instance. @@ -65,3 +125,26 @@ { return iStatus; } + + +// --------------------------------------------------------------------------- +// From class CActive. +// Called by the active scheduler when the request has been completed. +// --------------------------------------------------------------------------- +// +inline void CBTEngActive::RunL() + { + iObserver.RequestCompletedL( this, iRequestId, iStatus.Int() ); + } + + +// --------------------------------------------------------------------------- +// From class CActive. +// Called by the active scheduler when an error in RunL has occurred. +// --------------------------------------------------------------------------- +// +inline TInt CBTEngActive::RunError( TInt aError ) + { + iObserver.HandleError( this, iRequestId, aError ); + return KErrNone; + } diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/inc/btengpairman.h --- a/bluetoothengine/bteng/inc/btengpairman.h Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/inc/btengpairman.h Fri Mar 12 15:43:23 2010 +0200 @@ -61,12 +61,6 @@ void ProcessCommandL( const RMessage2& aMessage ); /** - * Cancels an outstanding command. - * @param aOpcode the identifier of the command to be cancelled. - */ - void CancelCommand( TInt aOpCode ); - - /** * Handle a change in BTRegistry remote device table. * * @since S60 v5.1 @@ -103,6 +97,14 @@ void OutgoingPairCompleted( TInt aErr ); /** + * Be informed that a session will be closed. + * + * @since Symbian^3 + * @param aSession the session to be cloased. + */ + void SessionClosed(CSession2* aSession ); + + /** * Unpair a device via registry */ void UnpairDevice( const TBTDevAddr& aAddr ); @@ -313,6 +315,11 @@ * Own. */ CBTEngPairBase* iPairer; + + /** + * Client-server message for power change requests. + */ + RMessage2 iMessage; }; #endif /*BTENGPAIRMANAGER_H_*/ diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/inc/btengserver.h --- a/bluetoothengine/bteng/inc/btengserver.h Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/inc/btengserver.h Fri Mar 12 15:43:23 2010 +0200 @@ -20,13 +20,10 @@ #define BTENGSERVER_H #include -#ifndef __WINS__ -#include -#endif //__WINS__ #include #include -#include -#include "btengdomaincrkeys.h" +#include + #include "btengconstants.h" class CBTEngSrvState; @@ -40,6 +37,7 @@ class TEComResolverParams; class CImplementationInformation; class CDeltaTimer; +class CBTEngSrvSettingsMgr; /** * Main function in which the server is running. @@ -75,7 +73,8 @@ EBTEngPanicArgumentIsNull, EBTEngPanicMemberVarIsNull, EBTEngPanicCorrupt, - EBTEngPanicCorruptSettings + EBTEngPanicCorruptSettings, + EBTEngPanicExpectSetPowerOpcode, }; @@ -90,43 +89,114 @@ NONSHARABLE_CLASS( CBTEngServer ) : public CPolicyServer { - friend class CBTEngSrvSession; - friend class CBTEngSrvState; friend class CBTEngSrvPluginMgr; - friend class CBTEngSrvKeyWatcher; friend class CBTEngPairMan; public: + /** Enumeration of bitmask for keeping track of different timers. */ + enum TTimerQueued + { + ENone = 0x00, + EScanModeTimer = 0x01, + EIdleTimer = 0x02, + EAutoPowerOffTimer = 0x04, + ESspDebugModeTimer = 0x08 + }; + + /** + * Two-phased constructor. + */ static CBTEngServer* NewLC(); + /** + * Destructor. + */ virtual ~CBTEngServer(); /** - * ?description + * Getter for power change state machine instance. + * + * @since Symbian^3 + * @return Pointer to instance of state machine. + */ + inline CBTEngSrvState* StateMachine() const + { return iServerState; } + + /** + * Getter for settings manager instance. + * + * @since Symbian^3 + * @return Pointer to instance of settings manager. + */ + inline CBTEngSrvSettingsMgr* SettingsManager() const + { return iSettingsMgr; } + + /** + * Getter for plug-in manager instance. + * + * @since Symbian^3 + * @return Pointer to instance of plug-in manager. + */ + inline CBTEngSrvPluginMgr* PluginManager() const + { return iPluginMgr; } + + /** + * Getter for baseband connection manager instance. + * + * @since Symbian^3 + * @return Pointer to instance of baseband connection manager. + */ + inline CBTEngSrvBBConnMgr* BasebandConnectionManager() const + { return iBBConnMgr; } + + /** + * Getter for pairing manager. Ownership is not transferred. + * + * @since Symbian^3 + * @return Pointer to instance of baseband connection manager. + */ + inline CBTEngPairMan* PairManager() const + { return iPairMan; } + + /** + * Getter for socket server session. + * This handle can be used for creating subsessions. + * + * @since Symbian^3 + * @return Reference to session with the socket server. + */ + inline RSocketServ& SocketServer() + { return iSocketServ; } + + /** + * Getter for registry server session. + * This handle can be used for creating subsessions. + * + * @since Symbian^3 + * @return Reference to session with the registry server. + */ + inline RBTRegServ& RegistrServer() + { return iBTRegServ; } + + /** + * Set Bluetooth on or off * * @since S60 v3.2 * @param aState The new power state. - * @param aTemp Turn BT off after use (ETrue) or not (EFalse). + * @param aTemporary Turn BT off after use (ETrue) or not (EFalse). */ - void SetPowerStateL( TBTPowerStateValue aState, TBool aTemporary ); + void SetPowerStateL( TBTPowerState aState, TBool aTemporary ); /** - * ?description + * Set Bluetooth on or off upon a client power management request. + * This function is only for power management request from clients of bteng server. * - * @since S60 v3.2 - * @param ?arg1 ?description + * @since Symbian^3 + * @param aMessage The message containing the detail of power management request. */ - void SetVisibilityModeL( TBTVisibilityMode aMode, TInt aTime ); + void SetPowerStateL( const RMessage2 aMessage ); - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - void UpdateVisibilityModeL( TInt aStackScanMode ); - /** * ?description * @@ -141,23 +211,7 @@ * @since S60 v3.2 * @param ?arg1 ?description */ - void SetDutMode( TInt aDutMode ); - - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - void ScanModeTimerCompletedL(); - - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - void DisconnectAllCompleted(); + void DisconnectAllCompleted(); /** * ?description @@ -172,86 +226,89 @@ * * @since S60 v3.2 */ - void AddSession(); + void AddSession(); /** * Decrement the session count. * - * @since S60 v3.2 + * @since Symbian^3 + * @param aSession the session to be cloased. * @param aAutoOff Indicator if this session had requested BT temporary on. */ - void RemoveSession( TBool aAutoOff ); - - /** - * ?description + void RemoveSession(CSession2* aSession, TBool aAutoOff ); + + /** + * Queue a new timer. + * + * @since Symbian^3 + * @param aTimer Identifier for the timer to be queued. + * @param aInterval The interval for timer callback. + */ + void QueueTimer( CBTEngServer::TTimerQueued aTimer, TInt64 aInterval ); + + /** + * Remove a queued timer. + * + * @since Symbian^3 + * @param aTimer Identifier for the timer to be removed. + */ + void RemoveTimer( CBTEngServer::TTimerQueued aTimer ); + + /** + * Check if a specific timer is currently queued. + * + * @since Symbian^3 + * @param aTimer Identifier for the timer to check. + */ + inline TBool IsTimerQueued( CBTEngServer::TTimerQueued aTimer ) const + { return ( iTimerQueued & aTimer ); } + + /** + * Returns the service (limited to services managed in bteng scope) + * level connection status of the specified device. + * + * @param aAddr the address of the device + * @return one of TBTEngConnectionStatus enums + */ + TBTEngConnectionStatus IsDeviceConnected( const TBTDevAddr& aAddr ); + + /** + * Checks if power is off and no session are connected, and + * starts a shutdown timer if so. * * @since S60 v3.2 * @param ?arg1 ?description */ - void SetUiIndicatorsL(); - - /** + void CheckIdle(); + + /** * ?description * * @since S60 v3.2 * @param ?arg1 ?description */ - void SetIndicatorStateL( const TInt aIndicator, const TInt aState ); - - /** - * Check whether BT should be turned off automatically. - * - * @since S60 v5.0 - */ - void CheckAutoPowerOffL(); + void ManageDIServiceL( TBool aState ); /** - * Utility to get HW power state. - * - * @since S60 v5.1 - * @param aState On return, this will contain the current HW power state. - * @return KErrNone if successful, otherwise one of the system-wide error codes. - */ - TInt GetHwPowerState( TBTPowerStateValue& aState ); - - /** - * queue a timer if Simple Pairing debug mode has been enabled. + * Callback function for completion of disconnecting all + * Bluetoooth Baseband links. * * @since S60 v3.2 - * @param aDebugMode State of Simple Pairing debug mode. + * @param aPtr Pointer to ourselves. + * @return Result */ - void CheckSspDebugModeL( TBool aDebugMode ); - - /** - * Gets the access to pairing manager. Ownership is not transferred. - * @return the pairing manager - */ - CBTEngPairMan& PairManager(); - - /** - * Be informed when registry remote device table is changed - */ - void RemoteRegistryChangeDetected(); + static TInt DisconnectAllCallBack( TAny* aPtr ); - /** - * gets the reference of socket server session - */ - RSocketServ& SocketServ(); - - /** - * gets the reference of registry session. - */ - RBTRegServ& BTRegServ(); - - /** - * Returns the service (limited to services managed in bteng scope) - * level connection status of the specified device. - * - * @param aAddr the address of the device - * @return one of TBTEngConnectionStatus enums - */ - TBTEngConnectionStatus IsDeviceConnected( const TBTDevAddr& aAddr ); - + /** + * Callback function for turning BT off automatically after all + * connections are gone. + * + * @since S60 v5.0 + * @param aPtr Pointer to ourselves. + * @return Result + */ + static TInt AutoPowerOffCallBack( TAny* aPtr ); + // from base class CPolicyServer /** @@ -264,10 +321,6 @@ virtual CSession2* NewSessionL( const TVersion& aVersion, const RMessage2& aMessage ) const; -// from base class MBTPowerManagerObserver - - BluetoothFeatures::TEnterpriseEnablementMode EnterpriseEnablementMode() const; - private: CBTEngServer(); @@ -275,81 +328,6 @@ void ConstructL(); /** - * Checks if power is off and no session are connected, and - * starts a shutdown timer if so. - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - void CheckIdle(); - - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - TInt SetPowerState( TBool aState ); - - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - TInt SetLocalNameL(); - - TInt GetLocalNameFromRegistryL(TDes& aName); - - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - void SetClassOfDeviceL(); - - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - void InitBTStackL(); - - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - void StopBTStackL(); - - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - void UpdateCenRepPowerKeyL( TBTPowerStateValue aValue ); - - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - void LoadBTPowerManagerL(); - - /** - * ?description - * - * @since S60 v3.2 - * @param ?arg1 ?description - */ - void ManageDIServiceL( TBool aState ); - - /** * Reads the product-specific IDs for this phone from central repository. * These values are used in the BT Device Information profile. * @@ -358,19 +336,6 @@ * @param aProductId On return, holds the product ID for this phone. */ void GetProductIdsL( TInt& aVendorId, TInt& aProductId ); - - /** - * Checks if a client requests temporary power on/off, and keeps track - * of the number of clients requesting that. - * - * @since S60 v5.0 - * @param aCurrentState On return, will contain the current power state. - * @param aNewState The requested power state. - * @param aTemporary Indicates if this is about a tempororary state change. - */ - void CheckTemporaryPowerStateL( TBTPowerStateValue& aCurrentState, - TBTPowerStateValue aNewState, - TBool aTemporary ); /** * Callback function for expiry of CDeltaTimer timer of temporary @@ -383,16 +348,6 @@ static TInt ScanModeTimerCallBack( TAny* aPtr ); /** - * Callback function for completion of disconnecting all - * Bluetoooth Baseband links. - * - * @since S60 v3.2 - * @param aPtr Pointer to ourselves. - * @return Result - */ - static TInt DisconnectAllCallBack( TAny* aPtr ); - - /** * Callback function for expiriy CDeltaTimer timer of server idle timeout. * * @since S60 v3.2 @@ -410,17 +365,7 @@ * @return Result */ static TInt DebugModeTimerCallBack( TAny* aPtr ); - - /** - * Callback function for turning BT off automatically after all - * connections are gone. - * - * @since S60 v5.0 - * @param aPtr Pointer to ourselves. - * @return Result - */ - static TInt AutoPowerOffCallBack( TAny* aPtr ); - + private: // data /** @@ -436,28 +381,6 @@ TUint32 iDiSdpRecHandle; /** - * Flag indicating if BT is going to be switched off automatically. - */ - TBool iAutoSwitchOff; - - /** - * Number of clients that are using BT temporarily. - * Note that this is equal or less than the active number of links. - */ - TInt iAutoOffClients; - - /** - * Flag indicating hidden mode has been set for temporary power on. - */ - TBool iRestoreVisibility; - - /** - * To decide wether DUT mode should be enabled in power mode - * change callback. - */ - TBool iEnableDutMode; - - /** * Remember which timer has been queued. (CDeltaTimer does not * provide this information). */ @@ -477,24 +400,13 @@ * Callback for expiry of idle timer. */ TDeltaTimerEntry iIdleCallBack; + /** * Callback for expiry of Simple Pairing debug mode. */ TDeltaTimerEntry iDebugModeCallBack; /** - * Handle to BT Power Manager library; this handle must exist - * for the lifetime of the loaded library. - */ - RLibrary iPowerMgrLib; -#ifndef __WINS__ - /** - * Handle for DUT mode API - */ - RBluetoothDutMode iDutMode; -#endif //__WINS__ - - /** * Pairing manager. */ CBTEngPairMan* iPairMan; @@ -503,20 +415,25 @@ * Socket Server instance for this and other classes to access Bluetooth socket APIs. */ RSocketServ iSocketServ; - - + /** * Registry Server instance for bteng to access Bluetooth registry APIs. */ RBTRegServ iBTRegServ; - + /** - * BT Power Manager. + * Our state machine for handling power on/off. * Own. */ CBTEngSrvState* iServerState; /** + * Hardware and stack settings manager. + * Own. + */ + CBTEngSrvSettingsMgr* iSettingsMgr; + + /** * ECOM plugin manager. * Own. */ @@ -535,18 +452,6 @@ CBTEngSrvKeyWatcher* iWatcher; /** - * BT Power Manager (HCIv2 version). - */ - RBTPowerControl iPowerMgr; - -#ifdef __WINS__ - /** - * Current BT power state (power manager is not used in emulator). - */ - TBTPowerState iPowerState; -#endif //__WINS__ - - /** * SDP database handler. * Own. */ @@ -558,7 +463,6 @@ */ CDeltaTimer* iTimer; - BluetoothFeatures::TEnterpriseEnablementMode iEnterpriseEnablementMode; }; diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/inc/btengsrvsession.h --- a/bluetoothengine/bteng/inc/btengsrvsession.h Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/inc/btengsrvsession.h Fri Mar 12 15:43:23 2010 +0200 @@ -73,12 +73,6 @@ TBTEngConnectionStatus aConnStatus, RBTDevAddrArray* aArray, TInt aErr ); - /** - * Completes client's pairing request. - * @param aResult the resultof pairing the client will receive. - */ - TInt CompletePairRequest( TInt aResult ); - private: // from base class CSession2 /** @@ -131,22 +125,22 @@ void DispatchMessageL( const RMessage2& aMessage ); /** - * Cancels outstanding pairing request. + * Cancels outstanding request. */ - void CancelPairRequest(); - + void CancelRequest(); + + /** + * Checks if power is on, and leaves with error KErrNotReady if not. + */ + void CheckPowerOnL(); + private: // data + /** * Client-server message containing the thread handle of the client. * For connection notifications. */ RMessage2 iNotifyConnMessage; - - /** - * For connection notifications. - * For outgoing pairing request. - */ - RMessage2 iPairMessage; /** * Flag indicating if this client requested BT to be switched on temporarily. diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/inc/btengsrvsettingsmgr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/bteng/inc/btengsrvsettingsmgr.h Fri Mar 12 15:43:23 2010 +0200 @@ -0,0 +1,312 @@ +/* +* Copyright (c) 2009 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: Class to manage Bluetooth hardware and stack settings. +* +*/ + +#ifndef BTENGSRVSETTINGSMGR_H +#define BTENGSRVSETTINGSMGR_H + +#include +#include +#ifndef __WINS__ +#include +#endif //__WINS__ + +#include "btengprivatecrkeys.h" +#include "btengconstants.h" +#include "btengactive.h" + +class CBTEngServer; + + +/** + * ?one_line_short_description + * ?more_complete_description + * + * @code + * ?good_class_usage_example(s) + * @endcode + * + * @lib ?library + * @since S60 ?S60_version *** for example, S60 v3.0 + */ +NONSHARABLE_CLASS( CBTEngSrvSettingsMgr ) : public CBase, + public MBTEngActiveObserver + { + +public: + + /** + * Two-phased constructor. + * @param aServer Pointer to server instance. + */ + static CBTEngSrvSettingsMgr* NewL( CBTEngServer* aServer ); + + /** + * Destructor. + */ + virtual ~CBTEngSrvSettingsMgr(); + + /** + * Utility to get the Bluetooth hardware power state. + * + * @since Symbian^3 + * @param aState On return, this will contain the current HW power state. + * @return KErrNone if successful, otherwise one of the system-wide error codes. + */ + TInt GetHwPowerState( TBTPowerState& aState ); + + /** + * Set the Bluetooth hardware power state. + * + * @since Symbian^3 + * @param aState The new power state. + */ + TInt SetHwPowerState( TBTPowerState aState ); + + /** + * Set Bluetooth on or off. This function is for internal classes of bteng server + * for power management. + * + * @since Symbian^3 + * @param aState The new power state. + * @param aTemporary Turn BT off after use (ETrue) or not (EFalse). + */ + void SetPowerStateL( TBTPowerState aState, TBool aTemporary ); + + /** + * Set Bluetooth on or off upon a client power management request. + * This function is only for power management request from clients of bteng server. + * + * @since Symbian^3 + * @param aState The new power state. + * @param aTemporary Turn BT off after use (ETrue) or not (EFalse). + */ + void SetPowerStateL( const RMessage2 aMessage ); + + /** + * Initialize Bluetooth stack settings. + * + * @since S60 v3.2 + * @param ?arg1 ?description + */ + void InitBTStackL(); + + /** + * Reset settings and disconnect all links. + * + * @since Symbian^3 + */ + void StopBTStackL(); + + /** + * Update the central repository key for Bluetooth power state. + * + * @since Symbian^3 + * @param aValue The new Bluetooth power state. + */ + void UpdateCenRepPowerKeyL( TBTPowerState aValue ); + + /** + * ?description + * + * @since S60 v3.2 + * @param ?arg1 ?description + */ + void SetUiIndicatorsL(); + + /** + * ?description + * + * @since S60 v3.2 + * @param ?arg1 ?description + */ + void SetIndicatorStateL( const TInt aIndicator, const TInt aState ); + + /** + * Update the Bluetooth visibility mode. + * + * @since Symbian^3 + * @param ?arg1 ?description + */ + void SetVisibilityModeL( TBTVisibilityMode aMode, TInt aTime ); + + /** + * Update the Bluetooth visibility mode. + * + * @since Symbian^3 + * @param ?arg1 ?description + */ + void UpdateVisibilityModeL( TInt aStackScanMode ); + + /** + * Set Device Under Test mode. + * + * @since Symbian^3 + * @param aDutMode The mode to be set (DUT mode on or off). + */ + void SetDutMode( TInt aDutMode ); + + /** + * Timed visible mode has expired. + * + * @since Symbian^3 + */ + void ScanModeTimerCompletedL(); + + /** + * Check whether BT should be turned off automatically. + * + * @since Symbian^3 + */ + void CheckAutoPowerOffL(); + + /** + * Queue a timer if secure simple pairing debug mode has been enabled. + * + * @since Symbian^3 + * @param aDebugMode State of Simple Pairing debug mode. + */ + void CheckSspDebugModeL( TBool aDebugMode ); + + /** + * Be informed that a session will be closed. + * + * @since Symbian^3 + * @param aSession the session to be cloased. + */ + void SessionClosed(CSession2* aSession ); + +private: + +// from base class MBTEngActiveObserver + + /** + * From MBTEngActiveObserver. + * Callback to notify that an outstanding request has completed. + * + * @since Symbian^3 + * @param aActive Pointer to the active object that completed. + * @param aId The ID that identifies the outstanding request. + * @param aStatus The status of the completed request. + */ + virtual void RequestCompletedL( CBTEngActive* aActive, TInt aId, TInt aStatus ); + + /** + * From MBTEngActiveObserver. + * Callback to notify that an error has occurred in RunL. + * + * @since Symbian^3 + * @param aActive Pointer to the active object that completed. + * @param aId The ID that identifies the outstanding request. + * @param aStatus The status of the completed request. + */ + virtual void HandleError( CBTEngActive* aActive, TInt aId, TInt aError ); + +private: + + /** + * C++ default constructor. + */ + CBTEngSrvSettingsMgr( CBTEngServer* aServer ); + + /** + * Symbian second-phase constructor. + */ + void ConstructL(); + + /** + * Open a handle to the Bluetooth power manager, and + * initialize the power to off. + * + * @since Symbian^3 + */ + void LoadBTPowerManagerL(); + + /** + * Checks if a client requests temporary power on/off, and keeps track + * of the number of clients requesting that. + * + * @since Symbian^3 + * @param aCurrentState On return, will contain the current power state. + * @param aNewState The requested power state. + * @param aTemporary Indicates if this is about a tempororary state change. + */ + void CheckTemporaryPowerStateL( TBTPowerState& aCurrentState, + TBTPowerState aNewState, TBool aTemporary ); + + /** + * Set the Class of Device. + * + * @since Symbian^3 + */ + void SetClassOfDeviceL(); + +private: // data + +#ifdef __WINS__ + /** + * Current BT power state (power manager is not used in emulator). + */ + TBTPowerState iPowerState; +#endif //__WINS__ + + /** + * Flag indicating if BT is allowed to be turned on. + */ + BluetoothFeatures::TEnterpriseEnablementMode iEnterpriseEnablementMode; + + /** + * Flag indicating if BT is going to be switched off automatically. + */ + TBool iAutoSwitchOff; + + /** + * Number of clients that are using BT temporarily. + * Note that this is equal or less than the active number of links. + */ + TInt iAutoOffClients; + + /** + * Flag indicating hidden mode has been set for temporary power on. + */ + TBool iRestoreVisibility; + + /** + * BT power control. + */ + RBTPowerControl iPowerMgr; + + /** + * Active object helper. + * Own. + */ + CBTEngActive* iActive; + + /** + * The server instance. + * Not own. + */ + CBTEngServer* iServer; + + /** + * Client-server message for power change requests. + */ + RMessage2 iMessage; + + }; + + +#endif // BTENGSRVSETTINGS_H diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/inc/btengsrvstate.h --- a/bluetoothengine/bteng/inc/btengsrvstate.h Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/inc/btengsrvstate.h Fri Mar 12 15:43:23 2010 +0200 @@ -20,18 +20,13 @@ #ifndef BTENGSRVSTATE_H #define BTENGSRVSTATE_H - -//#include +#include #include "btengactive.h" -#include "btserversdkcrkeys.h" class MBTEngActiveObserver; class CBTEngServer; -/** ?description */ -//const ?type ?constant_var = ?constant; - /** * Class CBTEngSrvState @@ -93,32 +88,26 @@ virtual ~CBTEngSrvState(); /** - * ?description + * Getter for the current operation. * * @since S60 v3.2 - * @param ?arg1 ?description - * @param ?arg2 ?description - * @return ?description + * @return The current operation. */ CBTEngSrvState::TBTEngSrvOperation CurrentOperation(); /** - * ?description + * Start the state machine. If the state machine was already running, + * it is simply restarted. * * @since S60 v3.2 * @param ?arg1 ?description - * @param ?arg2 ?description - * @return ?description */ - void StartStateMachineL( TBool aState ); + void StartStateMachineL( TBTPowerState aState ); /** - * ?description + * Schedule the next state operation. * * @since S60 v3.2 - * @param ?arg1 ?description - * @param ?arg2 ?description - * @return ?description */ void ChangeState(); @@ -133,11 +122,20 @@ * Symbian 2nd-phase constructor */ void ConstructL(); - + + /** + * Callback function for asynchronous cycle. + */ static TInt ChangeStateCb(TAny* aThis); - + + /** + * Execute the next state operation. + */ void RequestCompletedL(); - + + /** + * Handle an error that occurred during a state operation. + */ void HandleError(TInt aError); private: // data diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/rom/bteng.iby --- a/bluetoothengine/bteng/rom/bteng.iby Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/rom/bteng.iby Fri Mar 12 15:43:23 2010 +0200 @@ -29,9 +29,8 @@ file=ABI_DIR\BUILD_DIR\btengdiscovery.dll SHARED_LIB_DIR\btengdiscovery.dll file=ABI_DIR\BUILD_DIR\btfeatures.dll SHARED_LIB_DIR\btfeatures.dll file=ABI_DIR\BUILD_DIR\btengsettings.dll SHARED_LIB_DIR\btengsettings.dll -data=ZPRIVATE\10005950\backup_registration.xml private\10005950\backup_registration.xml -data=ZPRIVATE\10003A3F\APPS\bttoggle_reg.rsc Private\10003a3f\apps\bttoggle_reg.rsc - +data=ZPRIVATE\10005950\backup_registration.xml private\10005950\backup_registration.xml +data=ZPRIVATE\10003A3F\APPS\bttoggle_reg.rsc Private\10003a3f\apps\bttoggle_reg.rsc data=DATAZ_\RESOURCE_FILES_DIR\btengsdp.rsc RESOURCE_FILES_DIR\btengsdp.rsc data=DATAZ_\RESOURCE_FILES_DIR\btrfs.txt RESOURCE_FILES_DIR\btrfs.txt diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/src/btengpairman.cpp --- a/bluetoothengine/bteng/src/btengpairman.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/src/btengpairman.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -134,6 +134,10 @@ iPairingServ->Close(); delete iPairingServ; } + if ( !iMessage.IsNull() ) + { + iMessage.Complete( KErrCancel ); + } TRACE_FUNC_EXIT } @@ -156,14 +160,24 @@ } case EBTEngPairDevice: { + if ( !iMessage.IsNull() ) + { + User::Leave( KErrServerBusy ); + } TBTDevAddrPckgBuf addrPkg; aMessage.ReadL( KBTEngAddrSlot, addrPkg ); PairDeviceL( addrPkg(), aMessage.Int1() ); + iMessage = RMessage2( aMessage ); break; } case EBTEngCancelPairDevice: { - CancelCommand( opcode ); + // Only the client who requested pairing can cancel it: + if ( !iMessage.IsNull() && aMessage.Session() == iMessage.Session() ) + { + iPairer->CancelOutgoingPair(); + iMessage.Complete( KErrCancel ); + } break; } default: @@ -177,27 +191,6 @@ } // --------------------------------------------------------------------------- -// Cancels outgoing pairing requests -// --------------------------------------------------------------------------- -// -void CBTEngPairMan::CancelCommand( TInt aOpCode ) - { - switch( aOpCode ) - { - case EBTEngPairDevice: - { - TRACE_FUNC_ENTRY - if ( iPairer ) - { - iPairer->CancelOutgoingPair(); - } - TRACE_FUNC_EXIT - break; - } - } - } - -// --------------------------------------------------------------------------- // Handle a change in BTRegistry remote devices table. // --------------------------------------------------------------------------- // @@ -228,7 +221,7 @@ // RSocketServ& CBTEngPairMan::SocketServ() { - return iServer.SocketServ(); + return iServer.SocketServer(); } // --------------------------------------------------------------------------- @@ -237,7 +230,7 @@ // RBTRegServ& CBTEngPairMan::BTRegServ() { - return iServer.BTRegServ(); + return iServer.RegistrServer(); } // --------------------------------------------------------------------------- @@ -265,13 +258,23 @@ aErr = KErrNone; } // we must complete client's pairing request: - iServer.iSessionIter.SetToLast(); - CBTEngSrvSession* session = (CBTEngSrvSession*) iServer.iSessionIter--; - TInt ret( KErrNotFound ); - while( session && ret ) + if ( !iMessage.IsNull() ) { - ret = session->CompletePairRequest( aErr ); - session = (CBTEngSrvSession*) iServer.iSessionIter--; + iMessage.Complete( aErr ); + } + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------------------------- +// A session will be ended, completes the pending request for this session. +// --------------------------------------------------------------------------- +// +void CBTEngPairMan::SessionClosed( CSession2* aSession ) + { + TRACE_FUNC_ARG( ( _L( " session %x"), aSession ) ) + if ( !iMessage.IsNull() && iMessage.Session() == aSession ) + { + iMessage.Complete( KErrCancel ); } TRACE_FUNC_EXIT } diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/src/btengserver.cpp --- a/bluetoothengine/bteng/src/btengserver.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/src/btengserver.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -16,12 +16,6 @@ */ - -#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS -#include -#include -#endif - #include #include #include @@ -29,20 +23,18 @@ #include #include #include -#include -#include -#include +#include #include #include "btengserver.h" #include "btengsrvstate.h" #include "btengsrvsession.h" #include "btengsrvpluginmgr.h" #include "btengsrvbbconnectionmgr.h" +#include "btengsrvsettingsmgr.h" #include "btengsrvkeywatcher.h" #include "btengsdpdbhandler.h" #include "btengclientserver.h" #include "btengsecpolicy.h" -#include "btengprivatecrkeys.h" #include "btengprivatepskeys.h" #include "btengplugin.h" #include "btengpairman.h" @@ -50,43 +42,12 @@ /** Bluetooth Engine server thread name */ _LIT( KBTEngThreadName, "BTEngine" ); - -/** Constant for converting minutes to microseconds */ -const TInt64 KMinutesInMicroSecs = MAKE_TINT64( 0, 60000000 ); - -/** Idle timeout for shutting down the server (when power is off, - * and no clients are connected). The value is 3 seconds. - */ +/** Timeout (3 sec) for shutting down the server (when power is off and no clients connected). */ const TInt KBTEngSrvIdleTimeout = 3000000; - -/** Timeout for disabling Simple Pairing debug mode. The value is 30 minutes. */ -const TInt KBTEngSspDebugModeTimeout = 1800000000; - -/** Timeout for determining that BT is not turned off automatically. - * The value is 10.5 seconds. - */ -const TInt KBTEngBtAutoOffTimeout = 10500000; +/** PubSub key read and write policies */ +_LIT_SECURITY_POLICY_C2( KBTEngPSKeyReadPolicy, ECapabilityLocalServices, ECapabilityReadDeviceData ); +_LIT_SECURITY_POLICY_C2( KBTEngPSKeyWritePolicy, ECapabilityLocalServices, ECapabilityWriteDeviceData ); -/** Enumeration of bitmask for keeping track of different timers. */ -enum TTimerQueued - { - ENone = 0x00, - EScanModeTimer = 0x01, - EIdleTimer = 0x02, - EAutoPowerOffTimer = 0x04, - ESspDebugModeTimer = 0x08 - }; - -/** PubSub key read and write policies */ -_LIT_SECURITY_POLICY_C2( KBTEngPSKeyReadPolicy, - ECapabilityLocalServices, ECapabilityReadDeviceData ); -_LIT_SECURITY_POLICY_C2( KBTEngPSKeyWritePolicy, - ECapabilityLocalServices, ECapabilityWriteDeviceData ); - -// Default values for Major and Minor Device Class -const TUint16 KCoDDefaultServiceClass = EMajorServiceTelephony | EMajorServiceObjectTransfer | EMajorServiceNetworking; -const TUint8 KCoDDefaultMajorDeviceClass = EMajorDevicePhone; -const TUint8 KCoDDefaultMinorDeviceClass = EMinorDevicePhoneSmartPhone; // ======== LOCAL FUNCTIONS ======== @@ -149,7 +110,6 @@ CBTEngServer::CBTEngServer() : CPolicyServer( EPriorityHigh, KBTEngServerPolicy ) { - iEnableDutMode = EFalse; } @@ -190,7 +150,6 @@ RProperty::EInt, KBTEngPSKeyReadPolicy, KBTEngPSKeyWritePolicy) ); - User::LeaveIfError( RProperty::Define( KPSUidBluetoothEnginePrivateCategory, KBTNotifierLocks, RProperty::EByteArray, @@ -198,18 +157,19 @@ KBTEngPSKeyWritePolicy) ); User::LeaveIfError( iSocketServ.Connect() ); - LoadBTPowerManagerL(); + // The server is only started by its client, so leave the state // machine in Init state. A request to turn power on will follow // usually immediately. iServerState = CBTEngSrvState::NewL( this ); iWatcher = CBTEngSrvKeyWatcher::NewL( this ); + iSettingsMgr = CBTEngSrvSettingsMgr::NewL( this ); iPluginMgr = CBTEngSrvPluginMgr::NewL( this ); iBBConnMgr = CBTEngSrvBBConnMgr::NewL( iSocketServ ); - + User::LeaveIfError( iBTRegServ.Connect() ); iPairMan = CBTEngPairMan::NewL( *this ); - + TCallBack idleCb( IdleTimerCallBack, this ); iIdleCallBack.Set( idleCb ); TCallBack sspCb( DebugModeTimerCallBack, this ); @@ -219,14 +179,6 @@ TCallBack powerOffCb( AutoPowerOffCallBack, this ); iPowerOffCallBack.Set( powerOffCb ); iTimer = CDeltaTimer::NewL(CActive::EPriorityLow); - - iEnterpriseEnablementMode = BluetoothFeatures::EnterpriseEnablementL(); - TRACE_INFO( ( _L( "iEnterpriseEnablementMode = %d" ), iEnterpriseEnablementMode) ) - if ( iEnterpriseEnablementMode == BluetoothFeatures::EDisabled ) - { - SetVisibilityModeL( EBTVisibilityModeNoScans, 0 ); - } - TRACE_FUNC_EXIT } @@ -256,7 +208,7 @@ iTimerQueued = ENone; iTimer->Remove( iScanModeCallBack ); iTimer->Remove( iPowerOffCallBack ); - iTimer->Remove( iIdleCallBack); + iTimer->Remove( iIdleCallBack ); iTimer->Remove( iDebugModeCallBack ); } RProperty::Delete( KPSUidBluetoothTestingMode, KBTDutEnabled ); @@ -269,171 +221,34 @@ delete iTimer; delete iSdpDbHandler; delete iWatcher; + delete iSettingsMgr; delete iPluginMgr; delete iBBConnMgr; delete iServerState; delete iPairMan; - iPowerMgr.Close(); iSocketServ.Close(); iBTRegServ.Close(); } - // --------------------------------------------------------------------------- // Turn BT on or off. // --------------------------------------------------------------------------- // -void CBTEngServer::SetPowerStateL( TBTPowerStateValue aState, TBool aTemporary ) +void CBTEngServer::SetPowerStateL( TBTPowerState aState, TBool aTemporary ) { - TRACE_FUNC_ARG( ( _L( "setting power state %d" ), (TInt) aState ) ) - if ( aState == EBTPowerOn && iEnterpriseEnablementMode == BluetoothFeatures::EDisabled ) - { - TRACE_INFO( ( _L( "\tno we're not... Bluetooth is enterprise-IT-disabled" ) ) ) - User::Leave(KErrNotSupported); - } - - TBTPowerStateValue currentState = EBTPowerOff; - CheckTemporaryPowerStateL( currentState, aState, aTemporary ); - - if( ( currentState == aState || ( aTemporary && aState == EBTPowerOff ) ) && iServerState->CurrentOperation() == CBTEngSrvState::ESrvOpIdle ) - { - // The requested power state is already active, ignore silently. - // We don't return an error here, as there is no error situation. - TRACE_INFO( ( _L( "SetPowerStateL: nothing to do" ) ) ) - if(currentState == aState) - { - // Make sure that the CenRep key is in sync. - // During boot-up, the pwoer is set from the CenRep key, so we could - // end up out-of-sync. - TRACE_INFO( ( _L( "SetPowerStateL: currentState == aState" ) ) ) - UpdateCenRepPowerKeyL( aState ); - } - return; - } - if( aState ) - { - // Hardware power on is the first step. - User::LeaveIfError( SetPowerState( aState ) ); - } - else - { - //Prevent BT visibility in the situation when we turn OFF BT Engine - //but FM Radio is still alive - SetVisibilityModeL( EBTVisibilityModeNoScans, 0 ); - // Hardware power off is the last step. - // First disconnect all plug-ins. - iPluginMgr->DisconnectAllPlugins(); - } - // We only signal that BT is on after everything has completed (through - // the CenRep power state key), so that all services are initialized. - // We signal that BT is off immediately though, so that our clients will - // not try to use BT during power down. - iServerState->StartStateMachineL( (TBool) aState ); + TRACE_FUNC_ARG( ( _L( "setting power state %d (temporary=%d" ), (TInt) aState, aTemporary ) ) + iSettingsMgr->SetPowerStateL( aState, aTemporary ); TRACE_FUNC_EXIT } - // --------------------------------------------------------------------------- -// ?implementation_description +// Turn BT on or off. // --------------------------------------------------------------------------- // -void CBTEngServer::SetVisibilityModeL( TBTVisibilityMode aMode, TInt aTime ) +void CBTEngServer::SetPowerStateL(const RMessage2 aMessage ) { TRACE_FUNC_ENTRY - - if ( aMode != EBTVisibilityModeNoScans && iEnterpriseEnablementMode == BluetoothFeatures::EDisabled ) - { - TRACE_INFO( ( _L( "\tnot changing anything... Bluetooth is enterprise-IT-disabled" ) ) ) - User::Leave(KErrNotSupported); - } - - TInt err = KErrNone; - iTimerQueued &= ~EScanModeTimer; - iTimer->Remove( iScanModeCallBack ); - if( aMode != EBTVisibilityModeNoScans ) - { - CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings ); - err = cenRep->Set( KBTDiscoverable, aMode ); - delete cenRep; - } - if( !err && aMode == EBTVisibilityModeTemporary ) - { - // We need TInt64 here, as the max. time in microseconds for the - // max. value (1 hour) is larger than KMaxTInt32. - TInt64 timeMicroSec = MAKE_TINT64( 0, aTime ); - timeMicroSec = timeMicroSec * KMinutesInMicroSecs; - TTimeIntervalMicroSeconds interval( timeMicroSec ); - // Queue callback to set the visibility back to hidden. - err = iTimer->QueueLong( interval, iScanModeCallBack ); - iTimerQueued |= EScanModeTimer; - aMode = EBTVisibilityModeGeneral; - } - else if( !err && iRestoreVisibility ) - { - // The user overrides, do not restore visibility mode anymore. - iRestoreVisibility = EFalse; - } - if( !err ) - { - err = RProperty::Set( KUidSystemCategory, - KPropertyKeyBluetoothSetScanningStatus, aMode ); - } - TBool hiddenMode = ( aMode == EBTVisibilityModeHidden ); - if( !err && aMode != EBTVisibilityModeNoScans ) - { - // In hidden mode, we only accept connections from paired devices. - err = RProperty::Set( KUidSystemCategory, - KPropertyKeyBluetoothSetAcceptPairedOnlyMode, - hiddenMode ); - } - - User::LeaveIfError( err ); // To communicate the result to the client. - TRACE_FUNC_EXIT - } - -// --------------------------------------------------------------------------- -// The method is called when BT stack scanning mode P&S key is changed -// --------------------------------------------------------------------------- -// -void CBTEngServer::UpdateVisibilityModeL( TInt aStackScanMode ) - { - TRACE_FUNC_ENTRY - TRACE_INFO( ( _L( "[BTEng]\t aStackScanMode: %d" ), aStackScanMode ) ) - TBTVisibilityMode currentMode; - - CRepository* cenRep = CRepository::NewLC( KCRUidBTEngPrivateSettings ); - User::LeaveIfError( cenRep->Get( KBTDiscoverable, (TInt&) currentMode ) ); - - // In case we are in temp visibility mode, we cannot always know whether the BT stack - // scan mode key was set by some external party or by us in SetVisibilityModeL above. - // Therefore we cannot stop the timer in case aMode is EBTVisibilityModeGeneral and - // currentmode is EBTVisibilityModeTemporary - if( !( currentMode == EBTVisibilityModeTemporary && aStackScanMode == EBTVisibilityModeGeneral ) ) - { - // Cancel the timer and queue it again if needed. - iTimerQueued &= ~EScanModeTimer; - iTimer->Remove( iScanModeCallBack ); - if( currentMode != aStackScanMode ) - { - if( aStackScanMode == EPageScanOnly || aStackScanMode == EInquiryAndPageScan ) - { - User::LeaveIfError( cenRep->Set( KBTDiscoverable, aStackScanMode ) ); - } - else if( aStackScanMode == EInquiryScanOnly ) - { - // We don't support ENoScansEnabled nor EInquiryScanOnly mode - // -> Consider these as same as Hidden - User::LeaveIfError( cenRep->Set( KBTDiscoverable, EBTVisibilityModeHidden ) ); - } - else if( aStackScanMode == ENoScansEnabled ) - { - //We don't change KBTDiscoverable here, because ENoScansEnabled - //indicates BT/SYSTEM shutdown is happening - } - } - } - SetUiIndicatorsL(); - CleanupStack::PopAndDestroy( cenRep ); + iSettingsMgr->SetPowerStateL( aMessage ); TRACE_FUNC_EXIT } @@ -454,90 +269,13 @@ // ?implementation_description // --------------------------------------------------------------------------- // -void CBTEngServer::SetDutMode( TInt aDutMode ) - { - TRACE_FUNC_ARG( ( _L( "DUT mode %d" ), aDutMode ) ) - - if (aDutMode == EBTDutOff) - { - return; - } - - TInt powerState = EBTPowerOff; - CRepository* cenrep = NULL; - - TRAPD(err, cenrep = CRepository::NewL(KCRUidBluetoothPowerState)); - - if (!err && cenrep) - { - cenrep->Get(KBTPowerState, powerState); - delete cenrep; - cenrep = NULL; - } - else - { - return; - } - - if (powerState == EBTPowerOn) - { - -#ifndef __WINS__ - - TInt err = iDutMode.Open(); - TRACE_FUNC_ARG( ( _L( "Open DUT mode handle err %d" ), err) ) - if(!err) - { - iDutMode.ActivateDutMode(); - iDutMode.Close(); - } -#endif //__WINS__ - } - iEnableDutMode = EFalse; - } - -// --------------------------------------------------------------------------- -// ?implementation_description -// --------------------------------------------------------------------------- -// -void CBTEngServer::ScanModeTimerCompletedL() - { - TRACE_FUNC_ENTRY - // The timer has completed, so remove our reference as well. - iTimerQueued &= ~EScanModeTimer; - iTimer->Remove( iScanModeCallBack ); - SetVisibilityModeL( EBTVisibilityModeHidden, 0 ); - TBTPowerStateValue power = EBTPowerOff; - TInt err = GetHwPowerState( (TBTPowerStateValue&) power ); - if( !err && power ) - { - // Show a notification to the user - TBTGenericInfoNotiferParamsPckg pckg; - pckg().iMessageType = EBTVisibilityTimeout; - - RNotifier notifier; - TInt err = notifier.Connect(); - if( !err ) - { - err = notifier.StartNotifier( KBTGenericInfoNotifierUid, pckg ); - notifier.Close(); - } - } - TRACE_FUNC_RES( ( _L( "result: %d" ), err ) ) - } - - -// --------------------------------------------------------------------------- -// ?implementation_description -// --------------------------------------------------------------------------- -// void CBTEngServer::DisconnectAllCompleted() { // Check if we are powering off. Otherwise we have just been // requested to disconnect all, e.g. for system shutdown. if( iServerState->CurrentOperation() == CBTEngSrvState::EPowerOff ) { - (void) SetPowerState( EFalse ); + (void) iSettingsMgr->SetHwPowerState( EBTOff ); // Put the state machine into idle state. iServerState->ChangeState(); } @@ -568,18 +306,20 @@ // --------------------------------------------------------------------------- -// A session has been ended, update the session count. +// A session has been ended, update the session count and inform others. // --------------------------------------------------------------------------- // -void CBTEngServer::RemoveSession( TBool aAutoOff ) +void CBTEngServer::RemoveSession( CSession2* aSession, TBool aAutoOff ) { TRACE_FUNC_ENTRY TRACE_INFO( ( _L( "[CBTEngServer]\t aAutoOff %d"), aAutoOff )) TRACE_INFO( ( _L( "[CBTEngServer]\t iSessionCount %d"), iSessionCount )) iSessionCount--; + iSettingsMgr->SessionClosed( aSession ); + iPairMan->SessionClosed( aSession ); if( aAutoOff ) { - TRAP_IGNORE( SetPowerStateL( EBTPowerOff, ETrue ) ); + TRAP_IGNORE( SetPowerStateL( EBTOff, ETrue ) ); } else { @@ -588,6 +328,64 @@ TRACE_FUNC_EXIT } +// --------------------------------------------------------------------------- +// Queue a new timer. +// --------------------------------------------------------------------------- +// +void CBTEngServer::QueueTimer( CBTEngServer::TTimerQueued aTimer, TInt64 aInterval ) + { + TRACE_FUNC_ARG( ( _L( "queueing timer %d" ), (TInt) aTimer ) ) + iTimerQueued |= aTimer; + TTimeIntervalMicroSeconds interval( aInterval ); + switch( aTimer ) + { + case EScanModeTimer: + (void) iTimer->QueueLong( interval, iScanModeCallBack ); + break; + case EIdleTimer: + iTimer->QueueLong( aInterval, iIdleCallBack ); + break; + case EAutoPowerOffTimer: + iTimer->QueueLong( aInterval, iPowerOffCallBack ); + break; + case ESspDebugModeTimer: + iTimer->QueueLong( aInterval, iDebugModeCallBack ); + break; + default: + PanicServer( EBTEngPanicCorrupt ); + } + } + + +// --------------------------------------------------------------------------- +// Remove a queued timer. +// --------------------------------------------------------------------------- +// +void CBTEngServer::RemoveTimer( CBTEngServer::TTimerQueued aTimer ) + { + TRACE_FUNC_ARG( ( _L( "removing timer %d" ), (TInt) aTimer ) ) + iTimerQueued &= ~aTimer; + // Timers can be removed without being queued, no need to check. + switch( aTimer ) + { + case EScanModeTimer: + iTimer->Remove( iScanModeCallBack ); + break; + case EIdleTimer: + iTimer->Remove( iIdleCallBack ); + break; + case EAutoPowerOffTimer: + iTimer->Remove( iPowerOffCallBack ); + break; + case ESspDebugModeTimer: + iTimer->Remove( iDebugModeCallBack ); + break; + default: + PanicServer( EBTEngPanicCorrupt ); + } + TRACE_FUNC_EXIT + } + // --------------------------------------------------------------------------- // From class CPolicyServer. @@ -628,10 +426,10 @@ if( iSessionCount <= 0 ) { // No more sessions, check the power state. - TBTPowerStateValue pwr = EBTPowerOff; - TInt err = GetHwPowerState( pwr ); - TRACE_INFO( ( _L( "[BTEng]\t No sessions; power state: %d" ), pwr ) ) - if( !err &&!pwr + TBTPowerState power = EBTOff; + TInt err = iSettingsMgr->GetHwPowerState( power ); + TRACE_INFO( ( _L( "[BTEng]\t No sessions; power state: %d" ), power ) ) + if( !err && power == EBTOff && iServerState->CurrentOperation() == CBTEngSrvState::ESrvOpIdle ) { TRACE_INFO( ( _L( "[BTEng]\t Power off; starting shutdown timer" ) ) ) @@ -648,259 +446,6 @@ // ?implementation_description // --------------------------------------------------------------------------- // -TInt CBTEngServer::SetPowerState( TBool aState ) - { - TRACE_FUNC_ENTRY - TInt err = KErrNone; - // HCIv2 power state type is inverted from BTPM-defined type... - TBTPowerState powerState = (TBTPowerState) !aState; - TRequestStatus status; - -#ifndef __WINS__ - iPowerMgr.SetPower( powerState, NULL, status ); - User::WaitForRequest( status ); - err = status.Int(); -#else //__WINS__ - iPowerState = powerState; - err = KErrNone; -#endif //__WINS__ - - if( !err && aState ) - { - TInt dutMode; - err = RProperty::Get( KPSUidBluetoothTestingMode, KBTDutEnabled, dutMode ); - if( !err && dutMode == EBTDutOn ) - { - // Set the DUT mode key to OFF since DUT mode is disabled at this point - err = RProperty::Set( KPSUidBluetoothTestingMode, KBTDutEnabled, EBTDutOff ); - } - // Set the local name straight away, so that an error - // in the loading of the BT stack will be detected here. - // Note that the HCIv2 power manager already loads the BT stack, - // so we do not need to do that here. - TRAP(err,SetLocalNameL()); - } - if( err ) - { - // Power off if an error occurred during power on sequence. -#ifndef __WINS__ - // This cannot happen in emulator environment. - iPowerMgr.SetPower( EBTOff, NULL, status ); - User::WaitForRequest( status ); -#endif //__WINS__ - } - TRACE_FUNC_RES( ( _L( "result: %d" ), err ) ) - return err; - } - - -// --------------------------------------------------------------------------- -// ?implementation_description -// --------------------------------------------------------------------------- -// -TInt CBTEngServer::SetLocalNameL() - { - TRACE_FUNC_ENTRY - RHostResolver hostResolver; - TBuf name; - name.Zero(); - TBuf tmpName; - - TInt err = RProperty::Get(KPropertyUidBluetoothCategory, - KPropertyKeyBluetoothGetDeviceName, name); - if(err == KErrNone) - { - err = RProperty::Get(KPropertyUidBluetoothCategory, - KPropertyKeyBluetoothSetDeviceName, tmpName); - if (tmpName.Compare(name)) - { - // The name has not yet been updated. Use the new one. - name.Copy(tmpName); - } - } - // if name hasn't been set, check whats in the registry - if (err || !name.Length()) - { - GetLocalNameFromRegistryL(name); - } - - TRACE_INFO( ( _L( "[CBTEngServer]\t localDev.DeviceName(): '%S'" ), &name)) - - CleanupClosePushL(hostResolver); - User::LeaveIfError(hostResolver.Open(iSocketServ, KBTAddrFamily, KBTLinkManager)); - User::LeaveIfError(hostResolver.SetHostName(name)); - CleanupStack::PopAndDestroy(&hostResolver); - - return KErrNone; - } - - -// --------------------------------------------------------------------------- -// Checks whats written in the registry in order to set host name -// --------------------------------------------------------------------------- -// -TInt CBTEngServer::GetLocalNameFromRegistryL(TDes& aName) - { - TRACE_FUNC_ENTRY - RBTRegServ btRegServ; - RBTLocalDevice btReg; - TBTLocalDevice localDev; - - CleanupClosePushL(btRegServ); - CleanupClosePushL(btReg); - - // In case of error, read local name from registry - aName.Zero(); - User::LeaveIfError(btRegServ.Connect()); - User::LeaveIfError(btReg.Open(btRegServ)); - - // Read the BT local name from BT Registry. - User::LeaveIfError(btReg.Get(localDev)); - - CleanupStack::PopAndDestroy(2,&btRegServ); - - // BT registry keeps the device name in UTF-8 format, convert to unicode. - // The error can be > 0 if there are unconverted characters. - TInt err = CnvUtfConverter::ConvertToUnicodeFromUtf8(aName, localDev.DeviceName()); - if (err != KErrNone) - User::Leave(err); - return KErrNone; - } - - -// --------------------------------------------------------------------------- -// ?implementation_description -// --------------------------------------------------------------------------- -// -void CBTEngServer::SetClassOfDeviceL() - { - TRACE_FUNC_ENTRY - TUint16 serviceClass = KCoDDefaultServiceClass; - // Check from feature manager if stereo audio is enabled. - FeatureManager::InitializeLibL(); - TBool supported = FeatureManager::FeatureSupported( KFeatureIdBtStereoAudio ); - FeatureManager::UnInitializeLib(); - if( supported ) - { - // A2DP spec says we should set this bit as we are a SRC - serviceClass |= EMajorServiceCapturing; - } - // These values may nayway be overridden by HCI - TBTDeviceClass cod( serviceClass, KCoDDefaultMajorDeviceClass, - KCoDDefaultMinorDeviceClass ); - // Ignore error, it is non-critical - (void) RProperty::Set( KPropertyUidBluetoothControlCategory, - KPropertyKeyBluetoothSetDeviceClass, cod.DeviceClass() ); - TRACE_FUNC_EXIT - } - - -// --------------------------------------------------------------------------- -// ?implementation_description -// --------------------------------------------------------------------------- -// -void CBTEngServer::InitBTStackL() - { - TRACE_FUNC_ENTRY - iBBConnMgr->Subscribe(); - TBTVisibilityMode visibility = EBTVisibilityModeHidden; - CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings ); - TInt err = cenRep->Get( KBTDiscoverable, (TInt&) visibility ); - delete cenRep; - if (iRestoreVisibility == EFalse) - { - if( err || visibility == EBTVisibilityModeTemporary && !( iTimerQueued & EScanModeTimer ) ) - { - visibility = EBTVisibilityModeHidden; - } - SetVisibilityModeL( visibility, 0 ); - } - SetClassOfDeviceL(); - TBool sspDebugMode = EFalse; - (void) RProperty::Get( KPropertyUidBluetoothCategory, - KPropertyKeyBluetoothGetSimplePairingDebugMode, - (TInt&) sspDebugMode ); - // Only set debug mode to off if it is on, to prevent a loop notifications. - if( sspDebugMode ) - { - sspDebugMode = EFalse; - // Add LeaveIfError if unsuccessful - (void) RProperty::Set(KPropertyUidBluetoothCategory, - KPropertyKeyBluetoothSetSimplePairingDebugMode, - (TInt) sspDebugMode ); - } - TRACE_FUNC_EXIT - } - - -// --------------------------------------------------------------------------- -// ?implementation_description -// --------------------------------------------------------------------------- -// -void CBTEngServer::StopBTStackL() - { - TRACE_FUNC_ENTRY - TBTVisibilityMode visibility = EBTVisibilityModeHidden; - CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings ); - // Ignore error here; if we can't read it, likely we can't set it either. - (void) cenRep->Get( KBTDiscoverable, (TInt&) visibility ); - delete cenRep; - if( visibility == EBTVisibilityModeTemporary ) - { - visibility = EBTVisibilityModeHidden; - SetVisibilityModeL( visibility, 0 ); // Also cancels scan mode timer. - } - - // Stop listening to events - iBBConnMgr->Unsubscribe(); - // Disconnect all links - TCallBack cb( DisconnectAllCallBack, this ); - iBBConnMgr->DisconnectAllLinksL( cb ); - // Results in a callback (which is called directly when there are no links). - TRACE_FUNC_EXIT - } - - -// --------------------------------------------------------------------------- -// Update the power state CenRep key. -// --------------------------------------------------------------------------- -// -void CBTEngServer::UpdateCenRepPowerKeyL( TBTPowerStateValue aState ) - { - TRACE_FUNC_ENTRY - CRepository* cenrep = CRepository::NewLC( KCRUidBluetoothPowerState ); - User::LeaveIfError( cenrep->Set( KBTPowerState, (TInt) aState ) ); - CleanupStack::PopAndDestroy( cenrep ); - TRACE_FUNC_EXIT - } - - -// --------------------------------------------------------------------------- -// Loads the BT Power Manager; leaves if it cannot be loaded. -// --------------------------------------------------------------------------- -// -void CBTEngServer::LoadBTPowerManagerL() - { - TRACE_FUNC_ENTRY - TRACE_INFO( ( _L( "[CBTEngServer]\t Using HCI API v2 power manager" ) ) ) - User::LeaveIfError( iPowerMgr.Open() ); -#ifndef __WINS__ - TRequestStatus status( KRequestPending ); - iPowerMgr.SetPower( EBTOff, NULL, status ); - User::WaitForRequest( status ); - status = ( status.Int() == KErrAlreadyExists ? KErrNone : status.Int() ); - User::LeaveIfError( status.Int() ); -#else //__WINS__ - iPowerState = EBTOff; -#endif //__WINS__ - TRACE_FUNC_EXIT - } - - -// --------------------------------------------------------------------------- -// ?implementation_description -// --------------------------------------------------------------------------- -// void CBTEngServer::ManageDIServiceL( TBool aState ) { TRACE_FUNC_ENTRY @@ -959,353 +504,6 @@ CleanupStack::PopAndDestroy( cenRep ); //cenRep } -// --------------------------------------------------------------------------- -// ?implementation_description -// --------------------------------------------------------------------------- -// -void CBTEngServer::SetUiIndicatorsL() - { - TRACE_FUNC_ENTRY - TInt powerState = EBTPowerOff; - TBTVisibilityMode visibilityMode = EBTVisibilityModeHidden; - CRepository* cenrep = NULL; - TInt phys = 0; - TInt connecting = 0; - - cenrep = CRepository::NewLC( KCRUidBluetoothPowerState ); - User::LeaveIfError( cenrep->Get( KBTPowerState, powerState ) ); - CleanupStack::PopAndDestroy( cenrep ); - - if( powerState == EBTPowerOff ) - { - SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff ); - SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff ); - SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff ); - SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff ); - } - else if( powerState == EBTPowerOn ) - { - RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothPHYCount, phys ); - RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothConnecting, connecting ); - - cenrep = CRepository::NewLC( KCRUidBTEngPrivateSettings ); - User::LeaveIfError( cenrep->Get( KBTDiscoverable, (TInt&) visibilityMode ) ); - CleanupStack::PopAndDestroy( cenrep ); - - if( visibilityMode == EBTVisibilityModeHidden ) - { - if ( connecting ) // BT connecting and hidden - { - SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff ); - SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateAnimate ); - } - else if ( phys > 0 ) // BT connection active and hidden - { - SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff ); - SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOn ); - } - else // BT connection not active and hidden - { - SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOn ); - SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff ); - } - SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff ); - SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff ); - } - else if( visibilityMode == EBTVisibilityModeGeneral || visibilityMode == EBTVisibilityModeTemporary ) - { - if ( connecting ) // BT connecting and visible - { - SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff ); - SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateAnimate ); - } - else if ( phys > 0 ) // BT connection active and visible - { - SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff ); - SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOn ); - } - else // BT connection not active and visible - { - SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOn ); - SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff ); - } - SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff ); - SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff ); - } - } - TRACE_FUNC_EXIT - } - -// --------------------------------------------------------------------------- -// ?implementation_description -// --------------------------------------------------------------------------- -// -void CBTEngServer::SetIndicatorStateL( const TInt aIndicator, const TInt aState ) - { - CAknSmallIndicator* indicator = CAknSmallIndicator::NewLC( TUid::Uid( aIndicator ) ); - indicator->SetIndicatorStateL( aState ); - CleanupStack::PopAndDestroy( indicator ); //indicator - } - -// --------------------------------------------------------------------------- -// Gets the current HW power state. -// For now this is a separate method to isolate the different variations. -// --------------------------------------------------------------------------- -// -TInt CBTEngServer::GetHwPowerState( TBTPowerStateValue& aState ) - { - TRACE_FUNC_ENTRY - TInt err = KErrNone; - -#ifndef __WINS__ - err = iPowerMgr.GetPower( (TBTPowerState&) aState, NULL ); -#else //__WINS__ - aState = (TBTPowerStateValue) iPowerState; -#endif //__WINS__ - - // HCIv2 power state type is inverted from BTPM-defined type... - aState = (TBTPowerStateValue) !aState; - TRACE_FUNC_ARG( ( _L( "Power state is %d, result %d" ), (TInt) aState, err ) ) - return err; - } - -// --------------------------------------------------------------------------- -// Check the power state and if BT gets turned off automatically. -// --------------------------------------------------------------------------- -// -void CBTEngServer::CheckTemporaryPowerStateL( TBTPowerStateValue& aCurrentState, - TBTPowerStateValue aNewState, TBool aTemporary ) - { - TRACE_FUNC_ENTRY - User::LeaveIfError( GetHwPowerState( aCurrentState ) ); - if( !aTemporary ) - { - // Force the new power state, so clear all auto switch off flags. - // If power is off, this will anyway be ignored. - iAutoOffClients = 0; - iAutoSwitchOff = EFalse; - TCallBack cb; - iBBConnMgr->SetAutoSwitchOff( EFalse, cb ); - if( iRestoreVisibility && aCurrentState == EBTPowerOn ) - { - // Set visibility mode back to the value selected by the user. - SetVisibilityModeL( EBTVisibilityModeGeneral, 0 ); - iRestoreVisibility = EFalse; - } - } - else - { - if( aCurrentState == aNewState ) - { - if( iAutoSwitchOff && aNewState == EBTPowerOn ) - { - iAutoOffClients++; - if( iTimerQueued & EAutoPowerOffTimer ) - { - iTimer->Remove( iPowerOffCallBack ); - iTimerQueued &= ~EAutoPowerOffTimer; - } - } - } - else if( iAutoSwitchOff || aNewState == EBTPowerOn ) - { - aNewState == EBTPowerOff ? iAutoOffClients-- : iAutoOffClients++; - iAutoSwitchOff = ETrue; - if( aNewState == EBTPowerOff && iAutoOffClients <= 0 ) - { - TCallBack powerOffCb( AutoPowerOffCallBack, this ); - iBBConnMgr->SetAutoSwitchOff( ETrue, powerOffCb ); - iTimer->Queue( KBTEngBtAutoOffTimeout, iPowerOffCallBack ); - iTimerQueued |= EAutoPowerOffTimer; - } - else if( aNewState == EBTPowerOn ) - { - CRepository* cenRep = CRepository::NewLC( KCRUidBTEngPrivateSettings ); - TBTVisibilityMode visibility = EBTVisibilityModeGeneral; - TInt err = cenRep->Get( KBTDiscoverable, (TInt&) visibility ); - CleanupStack::PopAndDestroy( cenRep ); - if( !err && visibility == EBTVisibilityModeGeneral ) - { - SetVisibilityModeL( EBTVisibilityModeHidden, 0 ); - iRestoreVisibility = ETrue; - } - if( iTimerQueued & EAutoPowerOffTimer ) - { - iTimer->Remove( iPowerOffCallBack ); - iTimerQueued &= ~EAutoPowerOffTimer; - } - } - } - } - if( iAutoOffClients < 0 ) - { - iAutoOffClients = 0; - } - TRACE_FUNC_EXIT - } - -// --------------------------------------------------------------------------- -// Check the power state and if BT gets turned off automatically. -// This method is invoked either when the timer has expired, or -// if there are no more connections while the timer was running. -// --------------------------------------------------------------------------- -// -void CBTEngServer::CheckAutoPowerOffL() - { - TRACE_FUNC_ENTRY - if ( iAutoOffClients > 0 ) - { - TRACE_INFO( ( _L( "[CBTEngServer]\t iAutoOffClients %d"), iAutoOffClients )) - return; - } - TInt linkCount = 0; - TInt err = RProperty::Get( KPropertyUidBluetoothCategory, - KPropertyKeyBluetoothGetPHYCount, linkCount ); - if( !err && !linkCount ) - { - TRACE_INFO( ( _L( "[CBTEngServer]\t SetPowerStateL( EBTPowerOff, EFalse );"))) - SetPowerStateL( EBTPowerOff, EFalse ); - } - else - { - if( iRestoreVisibility ) - { - // Set visibility mode back to the value selected by the user. - SetVisibilityModeL( EBTVisibilityModeGeneral, 0 ); - iRestoreVisibility = EFalse; - } - // show note if non-audio connection exists - if ( !iPluginMgr->CheckAudioConnectionsL() ) - { - RNotifier notifier; - TInt err = notifier.Connect(); - if( !err ) - { - TRequestStatus status; - TBTGenericInfoNotiferParamsPckg pckg; - pckg().iMessageType = EBTStayPowerOn; - TBuf8 result; - //notifier.StartNotifier( KBTGenericInfoNotifierUid, pckg, result ); - notifier.StartNotifierAndGetResponse( status, - KBTGenericInfoNotifierUid, - pckg, result ); // Reply buffer not used. - User::WaitForRequest( status ); - notifier.Close(); - } - } - iAutoOffClients = 0; - iAutoSwitchOff = EFalse; - TCallBack cb; - iBBConnMgr->SetAutoSwitchOff( EFalse, cb ); - } - TRACE_FUNC_EXIT - } - -// --------------------------------------------------------------------------- -// ?implementation_description -// --------------------------------------------------------------------------- -// -void CBTEngServer::CheckSspDebugModeL( TBool aDebugMode ) - { - TRACE_FUNC_ARG( ( _L( "SSP debug mode state %d" ), (TInt) aDebugMode ) ) - TBTPowerState pwr = EBTOff; - TBool currentMode = EFalse; - TInt err = RProperty::Get( KPropertyUidBluetoothCategory, - KPropertyKeyBluetoothGetSimplePairingDebugMode, - (TInt&) currentMode ); -#ifndef __WINS__ - err = iPowerMgr.GetPower( pwr, NULL ); // Treat error as power off. -#else //__WINS__ - pwr = iPowerState; -#endif //__WINS__ - if( err || pwr == EBTOff ) - { - iTimerQueued &= ~ESspDebugModeTimer; - iTimer->Remove( iDebugModeCallBack ); - // Only set debug mode to off if it is on, to prevent a loop notifications. - if( currentMode ) - { - (void) RProperty::Set( KPropertyUidBluetoothCategory, - KPropertyKeyBluetoothSetSimplePairingDebugMode, - (TInt) aDebugMode ); - } - // In case of an error in getting the power state, turn BT off. - // If BT is already off, this call will be ignored. - SetPowerStateL( EBTPowerOff, EFalse ); - } - else if( aDebugMode ) - { - // Ignore if there already is a timer queued. - if( !( iTimerQueued & ESspDebugModeTimer ) ) - { - iTimer->Queue( TTimeIntervalMicroSeconds32( KBTEngSspDebugModeTimeout ), - iDebugModeCallBack ); - iTimerQueued &= ESspDebugModeTimer; - err = RProperty::Set(KPropertyUidBluetoothCategory, - KPropertyKeyBluetoothSetSimplePairingDebugMode, - (TInt) aDebugMode ); - } - } - else - { - // Power is on, and debug mode is set to off. - TInt linkCount = 0; - err = RProperty::Get( KPropertyUidBluetoothCategory, - KPropertyKeyBluetoothGetPHYCount, linkCount ); - if( err || !linkCount ) - { - (void) RProperty::Set(KPropertyUidBluetoothCategory, - KPropertyKeyBluetoothSetSimplePairingDebugMode, - (TInt) aDebugMode ); - SetPowerStateL( EBTPowerOff, EFalse ); - } - else - { - // There are still existing connections, queue the - // timer again for half the period. - iTimer->Queue( TTimeIntervalMicroSeconds32( KBTEngSspDebugModeTimeout / 2 ), - iDebugModeCallBack ); - iTimerQueued &= ESspDebugModeTimer; - } - } - TRACE_FUNC_EXIT - } - -// --------------------------------------------------------------------------- -// returns the reference of pairing manager -// --------------------------------------------------------------------------- -// -CBTEngPairMan& CBTEngServer::PairManager() - { - return *iPairMan; - } - -// --------------------------------------------------------------------------- -// Delegate the information to pairing manager -// --------------------------------------------------------------------------- -// -void CBTEngServer::RemoteRegistryChangeDetected() - { - iPairMan->RemoteRegistryChangeDetected(); - } - -// --------------------------------------------------------------------------- -// Access the reference of RSockServ -// --------------------------------------------------------------------------- -// -RSocketServ& CBTEngServer::SocketServ() - { - return iSocketServ; - } - -// --------------------------------------------------------------------------- -// Access the reference of RBTRegSrv -// --------------------------------------------------------------------------- -// -RBTRegServ& CBTEngServer::BTRegServ() - { - return iBTRegServ; - } // --------------------------------------------------------------------------- // Ask plugin manager the connection status of the specified device @@ -1321,6 +519,7 @@ return status; } + // --------------------------------------------------------------------------- // Static callback for temporary visibility mode. // --------------------------------------------------------------------------- @@ -1328,10 +527,14 @@ TInt CBTEngServer::ScanModeTimerCallBack( TAny* aPtr ) { __ASSERT_ALWAYS(aPtr, PanicServer(EBTEngPanicArgumentIsNull) ); - TRAPD( err, ( (CBTEngServer*) aPtr )->ScanModeTimerCompletedL() ); + // The timer has completed, so remove our reference as well. + CBTEngServer* server = (CBTEngServer*) aPtr; + server->RemoveTimer( EScanModeTimer ); + TRAPD( err, server->SettingsManager()->ScanModeTimerCompletedL() ); return err; } + // --------------------------------------------------------------------------- // Static callback for disconnecting all Baseband connections. // --------------------------------------------------------------------------- @@ -1355,6 +558,7 @@ return KErrNone; } + // --------------------------------------------------------------------------- // Static callback for idle timer timeout. Turn off BT to get it out of // debug mode. If there are existing connections, queue the timer again. @@ -1362,35 +566,29 @@ // TInt CBTEngServer::DebugModeTimerCallBack( TAny* aPtr ) { + __ASSERT_ALWAYS(aPtr, PanicServer(EBTEngPanicArgumentIsNull) ); // Set our internal debug mode key to off. Ignore error, not critical here. (void) RProperty::Set( KPSUidBluetoothTestingMode, KBTSspDebugmode, EFalse ); - - __ASSERT_ALWAYS(aPtr, PanicServer(EBTEngPanicArgumentIsNull) ); - - TRAP_IGNORE( ( (CBTEngServer*) aPtr )->CheckSspDebugModeL( EFalse ) ); + CBTEngServer* server = (CBTEngServer*) aPtr; + TRAP_IGNORE( server->SettingsManager()->CheckSspDebugModeL( EFalse ) ); return KErrNone; } + // --------------------------------------------------------------------------- // Static callback for auto power off. // --------------------------------------------------------------------------- // TInt CBTEngServer::AutoPowerOffCallBack( TAny* aPtr ) { - TRACE_FUNC_ENTRY - - __ASSERT_ALWAYS(aPtr, PanicServer(EBTEngPanicArgumentIsNull) ); - + __ASSERT_ALWAYS(aPtr, PanicServer(EBTEngPanicArgumentIsNull) ); + // The timer has completed, so remove our reference as well. CBTEngServer* server = (CBTEngServer*) aPtr; - server->iTimerQueued &= ~EAutoPowerOffTimer; - TRAPD( err, server->CheckAutoPowerOffL() ); + server->RemoveTimer( EAutoPowerOffTimer ); + TRAPD( err, server->SettingsManager()->CheckAutoPowerOffL() ); return err; } -BluetoothFeatures::TEnterpriseEnablementMode CBTEngServer::EnterpriseEnablementMode() const - { - return iEnterpriseEnablementMode; - } // ======== GLOBAL FUNCTIONS ======== diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/src/btengsrvkeywatcher.cpp --- a/bluetoothengine/bteng/src/btengsrvkeywatcher.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/src/btengsrvkeywatcher.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -26,6 +26,8 @@ #include "btengsrvkeywatcher.h" #include "btengserver.h" #include "btengsrvpluginmgr.h" +#include "btengsrvsettingsmgr.h" +#include "btengpairman.h" #include "btengprivatepskeys.h" #include "btengprivatecrkeys.h" #include "debug.h" @@ -302,7 +304,7 @@ aActive->GoActive(); if( !aStatus && !iDutModeKey.Get( val ) ) { - iServer->SetDutMode( val ); + iServer->SettingsManager()->SetDutMode( val ); } } break; @@ -316,7 +318,7 @@ remoteLockVal = ERemoteLocked; if( !aStatus && !iPhoneLockKey.Get( val ) && val == remoteLockVal ) { - iServer->SetPowerStateL( EBTPowerOff, EFalse ); + iServer->SetPowerStateL( EBTOff, EFalse ); } #endif //RD_REMOTELOCK } @@ -329,7 +331,7 @@ if( !aStatus && !iSystemStateKey.Get( val ) && val == ESwStateShuttingDown ) { - iServer->SetVisibilityModeL( EBTVisibilityModeNoScans , 0 ); + iServer->SettingsManager()->SetVisibilityModeL( EBTVisibilityModeNoScans , 0 ); iServer->DisconnectAllL(); } } @@ -339,7 +341,7 @@ TRACE_INFO( ( _L( "PHY count key changed" ) ) ) iPHYCountKey.Subscribe( aActive->RequestStatus() ); aActive->GoActive(); - iServer->SetUiIndicatorsL(); + iServer->SettingsManager()->SetUiIndicatorsL(); } break; case KBTEngBtConnectionWatcher: @@ -347,7 +349,7 @@ TRACE_INFO( ( _L( "BT connection key changed" ) ) ) iBtConnectionKey.Subscribe( aActive->RequestStatus() ); aActive->GoActive(); - iServer->SetUiIndicatorsL(); + iServer->SettingsManager()->SetUiIndicatorsL(); } break; case KBTEngScanningWatcher: @@ -357,7 +359,7 @@ aActive->GoActive(); if ( !iBtScanningKey.Get( val ) ) { - iServer->UpdateVisibilityModeL( val ); + iServer->SettingsManager()->UpdateVisibilityModeL( val ); } } break; @@ -369,7 +371,7 @@ if( !aStatus && !iEmergencyCallKey.Get( val ) && val ) { // An emergency call initiated -> Close SAP connection if it's active - iServer->iPluginMgr->DisconnectProfile( EBTProfileSAP ); + iServer->PluginManager()->DisconnectProfile( EBTProfileSAP ); } } break; @@ -380,7 +382,7 @@ aActive->GoActive(); if( !aStatus && !iSspDebugModeKey.Get( val ) ) { - iServer->CheckSspDebugModeL( (TBool) val ); + iServer->SettingsManager()->CheckSspDebugModeL( (TBool) val ); } break; } @@ -396,7 +398,7 @@ if( !err && myChangedTable == KRegistryChangeRemoteTable ) { TRACE_INFO( ( _L("BT Remote registry key changed") ) ) - iServer->RemoteRegistryChangeDetected(); + iServer->PairManager()->RemoteRegistryChangeDetected(); } break; } @@ -407,18 +409,18 @@ aActive->GoActive(); iSapKeyCenRep->Get( KBTSapEnabled, val ); - TBTPowerStateValue powerState = EBTPowerOff; - User::LeaveIfError( iServer->GetHwPowerState( (TBTPowerStateValue&) powerState ) ); - if( aStatus >= 0 && powerState ) + TBTPowerState powerState = EBTOff; + User::LeaveIfError( iServer->SettingsManager()->GetHwPowerState( powerState ) ); + if( aStatus >= 0 && powerState == EBTOn ) { // Relevant only if BT is on if( val == EBTSapEnabled ) { - iServer->iPluginMgr->LoadBTSapPluginL(); + iServer->PluginManager()->LoadBTSapPluginL(); } else { - iServer->iPluginMgr->UnloadBTSapPlugin(); + iServer->PluginManager()->UnloadBTSapPlugin(); } } } diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/src/btengsrvpluginmgr.cpp --- a/bluetoothengine/bteng/src/btengsrvpluginmgr.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/src/btengsrvpluginmgr.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -229,7 +229,7 @@ { TRACE_FUNC_ENTRY TBool want = EFalse; - switch ( iServer->EnterpriseEnablementMode() ) + switch ( BluetoothFeatures::EnterpriseEnablementL() ) { case BluetoothFeatures::EDisabled: // In Disabled mode all plugins are filtered out. @@ -322,7 +322,7 @@ TRACE_FUNC_ENTRY // SAP is supported in neither Data Profiles Disabled nor Disabled mode. - if ( iServer->EnterpriseEnablementMode() != BluetoothFeatures::EEnabled ) + if ( BluetoothFeatures::EnterpriseEnablementL() != BluetoothFeatures::EEnabled ) { TRACE_INFO( ( _L( "\tno we're not... Bluetooth is enterprise-IT-disabled" ) ) ) User::Leave(KErrNotSupported); diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/src/btengsrvsession.cpp --- a/bluetoothengine/bteng/src/btengsrvsession.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/src/btengsrvsession.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -22,6 +22,7 @@ #include "btengserver.h" #include "btengsrvbbconnectionmgr.h" #include "btengpairman.h" +#include "btengsrvsettingsmgr.h" #include "btengclientserver.h" #include "debug.h" @@ -79,14 +80,11 @@ { iNotifyConnMessage.Complete( KErrCancel ); } - CancelPairRequest(); if( Server() ) { - Server()->RemoveSession( iAutoSwitchOff ); + Server()->RemoveSession(this, iAutoSwitchOff ); } - delete iConnectionEventQueue; - TRACE_FUNC_EXIT } @@ -150,20 +148,6 @@ } // --------------------------------------------------------------------------- -// Comfirm the caller if pairing request is completed in this invoke. -// --------------------------------------------------------------------------- -// -TInt CBTEngSrvSession::CompletePairRequest( TInt aResult ) - { - if ( !iPairMessage.IsNull()) - { - iPairMessage.Complete( aResult ); - return KErrNone; - } - return KErrNotFound; - } - -// --------------------------------------------------------------------------- // From class CSession2 // Handles servicing of a client request that has been passed to the server. // --------------------------------------------------------------------------- @@ -171,11 +155,11 @@ void CBTEngSrvSession::ServiceL( const RMessage2& aMessage ) { TRAPD( err, DispatchMessageL( aMessage ) ); - if( !aMessage.IsNull() && ( err || ( aMessage.Function() != EBTEngNotifyConnectionEvents && - aMessage.Function() != EBTEngPairDevice ) ) ) + aMessage.Function() != EBTEngPairDevice && + aMessage.Function() != EBTEngSetPowerState ) ) ) { // Return the error code to the client. aMessage.Complete( err ); @@ -206,15 +190,13 @@ { case EBTEngSetPowerState: { - iAutoSwitchOff = (TBool) aMessage.Int1(); - Server()->SetPowerStateL( (TBTPowerStateValue) aMessage.Int0(), - iAutoSwitchOff ); + Server()->SetPowerStateL( aMessage ); } break; case EBTEngSetVisibilityMode: { - Server()->SetVisibilityModeL( (TBTVisibilityMode) aMessage.Int0(), - aMessage.Int1() ); + Server()->SettingsManager()->SetVisibilityModeL( + (TBTVisibilityMode) aMessage.Int0(),aMessage.Int1() ); } break; case EBTEngNotifyConnectionEvents: @@ -229,7 +211,6 @@ { User::Leave(KErrInUse); } - //save the client message iNotifyConnMessage = RMessage2(aMessage); @@ -261,17 +242,9 @@ case EBTEngIsDeviceConnected: case EBTEngGetConnectedAddresses: { - TBTPowerStateValue pwr = EBTPowerOff; - Server()->GetHwPowerState( pwr ); - if( pwr ) - { - // Simply forward it to the plug-in manager - Server()->DispatchPluginMessageL( aMessage ); - } - else - { - User::Leave( KErrNotReady ); - } + CheckPowerOnL(); + // Simply forward it to the plug-in manager + Server()->DispatchPluginMessageL( aMessage ); } break; case EBTEngIsDeviceConnectable: @@ -282,38 +255,31 @@ case EBTEngPrepareDiscovery: { aMessage.Complete( KErrNone ); // Client does not have to wait. - Server()->iBBConnMgr->ManageTopology( ETrue ); + Server()->BasebandConnectionManager()->ManageTopology( ETrue ); } break; case EBTEngSetPairingObserver: + { + CheckPowerOnL(); + // Simply forward it to the pairing manager + Server()->PairManager()->ProcessCommandL( aMessage ); + break; + } case EBTEngPairDevice: { - TBTPowerStateValue pwr = EBTPowerOff; - (void) Server()->GetHwPowerState( pwr ); - if( pwr ) - { - // Simply forward it to the pairing manager - Server()->PairManager().ProcessCommandL( aMessage ); - if ( opcode == EBTEngPairDevice ) - { - iPairMessage = RMessage2( aMessage ); - } - } - else - { - User::Leave( KErrNotReady ); - } + CheckPowerOnL(); + // Simply forward it to the pairing manager + Server()->PairManager()->ProcessCommandL( aMessage ); break; } case EBTEngCancelPairDevice: { - CancelPairRequest(); + Server()->PairManager()->ProcessCommandL( aMessage ); break; } default: { - TRACE_INFO( ( _L( "[BTENG]\t DispatchMessageL: bad request (%d)" ), - aMessage.Function() ) ) + TRACE_INFO( ( _L( "[BTENG]\t DispatchMessageL: bad request (%d)" ), aMessage.Function() ) ) User::Leave( KErrArgument ); } break; @@ -322,14 +288,15 @@ } // --------------------------------------------------------------------------- -// Only the originator of pairing can cancel the pairing request. +// Check if power is on, and leave if it is not. // --------------------------------------------------------------------------- // -void CBTEngSrvSession::CancelPairRequest() +void CBTEngSrvSession::CheckPowerOnL() { - if ( !iPairMessage.IsNull() ) + TBTPowerState power = EBTOff; + (void) Server()->SettingsManager()->GetHwPowerState( power ); + if ( power == EBTOff ) { - Server()->PairManager().CancelCommand( iPairMessage.Function() ); - iPairMessage.Complete( KErrCancel ); + User::Leave( KErrNotReady ); } } diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -0,0 +1,939 @@ +/* +* Copyright (c) 2009 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: Class to manage Bluetooth hardware and stack settings. +* +*/ + +#include "btengsrvsettingsmgr.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include "btengserver.h" +#include "btengsrvpluginmgr.h" +#include "btengsrvbbconnectionmgr.h" +#include "btengsrvstate.h" +#include "debug.h" + +#ifndef SETLOCALNAME +#include +#endif + +/** ID of active object helper */ +const TInt KBTEngSettingsActive = 30; +/** Constant for converting minutes to microseconds */ +//const TInt64 KMinutesInMicroSecs = 60000000; +const TInt64 KMinutesInMicroSecs = MAKE_TINT64( 0, 60000000 ); +/** Timeout for disabling Simple Pairing debug mode. The value is 30 minutes. */ +//const TInt KBTEngSspDebugModeTimeout = 1800000000; +const TInt64 KBTEngSspDebugModeTimeout = MAKE_TINT64( 0, 1800000000 ); +/** Timeout for turning BT off automatically. The value is 10.5 seconds. */ +const TInt KBTEngBtAutoOffTimeout = 10500000; +/** Default values for Major Service Class */ +const TUint16 KCoDDefaultServiceClass = EMajorServiceTelephony | EMajorServiceObjectTransfer | EMajorServiceNetworking; +/** Default values for Major Device Class */ +const TUint8 KCoDDefaultMajorDeviceClass = EMajorDevicePhone; +/** Default values for Minor Device Class */ +const TUint8 KCoDDefaultMinorDeviceClass = EMinorDevicePhoneSmartPhone; + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// C++ default constructor +// --------------------------------------------------------------------------- +// +CBTEngSrvSettingsMgr::CBTEngSrvSettingsMgr( CBTEngServer* aServer ) +: iServer( aServer ) + { + } + + +// --------------------------------------------------------------------------- +// Symbian second-phase constructor +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::ConstructL() + { + TRACE_FUNC_ENTRY + iActive = CBTEngActive::NewL( *this, KBTEngSettingsActive ); + LoadBTPowerManagerL(); + iEnterpriseEnablementMode = BluetoothFeatures::EnterpriseEnablementL(); + TRACE_INFO( ( _L( "iEnterpriseEnablementMode = %d" ), iEnterpriseEnablementMode) ) + if ( iEnterpriseEnablementMode == BluetoothFeatures::EDisabled ) + { + SetVisibilityModeL( EBTVisibilityModeNoScans, 0 ); + } + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CBTEngSrvSettingsMgr* CBTEngSrvSettingsMgr::NewL( CBTEngServer* aServer ) + { + CBTEngSrvSettingsMgr* self = new( ELeave ) CBTEngSrvSettingsMgr( aServer ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CBTEngSrvSettingsMgr::~CBTEngSrvSettingsMgr() + { + if( iActive && iActive->IsActive() ) + { + // Cancel the outstanding request. + iPowerMgr.Cancel(); + } + delete iActive; + iPowerMgr.Close(); + } + + +// --------------------------------------------------------------------------- +// Power Bluetooth hardware on or off. +// --------------------------------------------------------------------------- +// +TInt CBTEngSrvSettingsMgr::SetHwPowerState( TBTPowerState aState ) + { + TRACE_FUNC_ENTRY + TInt err = KErrNone; +#ifndef __WINS__ + if( iActive->IsActive() ) + { + // Cancel the outstanding request. + iPowerMgr.Cancel(); + iActive->Cancel(); + } + iPowerMgr.SetPower( aState, NULL, iActive->RequestStatus() ); + iActive->GoActive(); +#else //__WINS__ + iPowerState = aState; +#endif //__WINS__ + + if( !err && aState == EBTOn ) + { + TInt dutMode = EBTDutOff; + err = RProperty::Get( KPSUidBluetoothTestingMode, KBTDutEnabled, dutMode ); + if( !err && dutMode == EBTDutOn ) + { + // Set the DUT mode key to OFF since DUT mode is disabled at this point + err = RProperty::Set( KPSUidBluetoothTestingMode, KBTDutEnabled, EBTDutOff ); + } + } + if( err ) + { + // Power off if an error occurred during power on sequence. +#ifndef __WINS__ + // This cannot happen in emulator environment. + iPowerMgr.Cancel(); + iActive->Cancel(); + iPowerMgr.SetPower( EBTOff, NULL, iActive->RequestStatus() ); + User::WaitForRequest( iActive->RequestStatus() ); + // Result will be communicated through the caller of this function (by leaving). +#else //__WINS__ + iPowerState = EBTOff; +#endif //__WINS__ + } + TRACE_FUNC_RES( ( _L( "result: %d" ), err ) ) + return err; + } + + +// --------------------------------------------------------------------------- +// Turn BT on or off. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::SetPowerStateL( TBTPowerState aState, TBool aTemporary ) + { + TRACE_FUNC_ARG( ( _L( "%d (temporary=%d" ), aState, aTemporary ) ) + if ( aState == EBTOn && iEnterpriseEnablementMode == BluetoothFeatures::EDisabled ) + { + TRACE_INFO( ( _L( "no we're not... Bluetooth is enterprise-IT-disabled" ) ) ) + User::Leave(KErrNotSupported); + } + TBool idle = ( iServer->StateMachine()->CurrentOperation() == CBTEngSrvState::ESrvOpIdle ); + TBTPowerState currentState = EBTOff; + CheckTemporaryPowerStateL( currentState, aState, aTemporary ); + + if ( ( currentState == aState || ( aTemporary && aState == EBTOff ) ) && idle ) + { + // The requested power state is already active, ignore silently. + // We don't return an error here, as there is no error situation. + TRACE_INFO( ( _L( "SetPowerStateL: nothing to do" ) ) ) + if ( currentState == aState ) + { + // Make sure that the CenRep key is in sync. + // During boot-up, the pwoer is set from the CenRep key, so we could + // end up out-of-sync. + TRACE_INFO( ( _L( "SetPowerStateL: currentState == aState" ) ) ) + UpdateCenRepPowerKeyL( aState ); + } + return; + } + if ( aState == EBTOn ) + { + // Hardware power on is the first step. + User::LeaveIfError( SetHwPowerState( aState ) ); + } + else + { + //Prevent BT visibility in the situation when we turn OFF BT Engine + //but FM Radio is still alive + SetVisibilityModeL( EBTVisibilityModeNoScans, 0 ); + // Hardware power off is the last step. + // First disconnect all plug-ins. + iServer->PluginManager()->DisconnectAllPlugins(); + } + // We only signal that BT is on after everything has completed (through + // the CenRep power state key), so that all services are initialized. + // We signal that BT is off immediately though, so that our clients will + // not try to use BT during power down. + iServer->StateMachine()->StartStateMachineL( aState ); + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------------------------- +// Turn BT on or off. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::SetPowerStateL(const RMessage2 aMessage ) + { + TRACE_FUNC_ENTRY + __ASSERT_ALWAYS( aMessage.Function() == EBTEngSetPowerState, + PanicServer( EBTEngPanicExpectSetPowerOpcode ) ); + if ( !iMessage.IsNull() ) + { + // A power management request from a client is outstanding. + User::Leave( KErrAlreadyExists ); + } + + TBTPowerStateValue arg = (TBTPowerStateValue) aMessage.Int0(); + // TBTPowerState power state type is inverted from TBTPowerStateValue, + // which is used by the client to pass the parameter... + TBTPowerState reqedPowerState( EBTOff ); + if ( arg == EBTPowerOn ) + { + reqedPowerState = EBTOn; + } + TBool tempPowerOn = (TBool) aMessage.Int1(); + + SetPowerStateL( reqedPowerState, tempPowerOn ); + if ( iServer->StateMachine()->CurrentOperation() == CBTEngSrvState::ESrvOpIdle ) + { + // The request is accepted but the state machine is not running. This means the + // requested power state is already active. Request is done. + aMessage.Complete( KErrNone ); + } + else + { + iMessage = RMessage2( aMessage ); + } + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------------------------- +// Initialize Bluetooth stack settings. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::InitBTStackL() + { + TRACE_FUNC_ENTRY + iServer->BasebandConnectionManager()->Subscribe(); + TBTVisibilityMode visibility = EBTVisibilityModeHidden; + CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings ); + TInt err = cenRep->Get( KBTDiscoverable, (TInt&) visibility ); + delete cenRep; + if (iRestoreVisibility == EFalse) + { + if( err || visibility == EBTVisibilityModeTemporary && + !( iServer->IsTimerQueued( CBTEngServer::EScanModeTimer ) ) ) + { + visibility = EBTVisibilityModeHidden; + } + SetVisibilityModeL( visibility, 0 ); + } + + TBool sspDebugMode = EFalse; + (void) RProperty::Get( KPropertyUidBluetoothCategory, + KPropertyKeyBluetoothGetSimplePairingDebugMode, (TInt&) sspDebugMode ); + // Only set debug mode to off if it is on, to prevent a loop notifications. + if( sspDebugMode ) + { + sspDebugMode = EFalse; + // Add LeaveIfError if unsuccessful + (void) RProperty::Set(KPropertyUidBluetoothCategory, + KPropertyKeyBluetoothSetSimplePairingDebugMode, (TInt) sspDebugMode ); + } + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// Reset settings and disconnect all links. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::StopBTStackL() + { + TRACE_FUNC_ENTRY + TBTVisibilityMode visibility = EBTVisibilityModeHidden; + CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings ); + // Ignore error here; if we can't read it, likely we can't set it either. + (void) cenRep->Get( KBTDiscoverable, (TInt&) visibility ); + delete cenRep; + if( visibility == EBTVisibilityModeTemporary ) + { + visibility = EBTVisibilityModeHidden; + SetVisibilityModeL( visibility, 0 ); // Also cancels scan mode timer. + } + + // Stop listening to events + iServer->BasebandConnectionManager()->Unsubscribe(); + // Disconnect all links + TCallBack cb( CBTEngServer::DisconnectAllCallBack, iServer ); + iServer->BasebandConnectionManager()->DisconnectAllLinksL( cb ); + // Results in a callback (which is called directly when there are no links). + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// Update the power state CenRep key. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::UpdateCenRepPowerKeyL( TBTPowerState aState ) + { + TRACE_FUNC_ENTRY + CRepository* cenrep = CRepository::NewLC( KCRUidBluetoothPowerState ); + // TBTPowerState power state type is inverted from TBTPowerStateValue... + TBTPowerStateValue power = (TBTPowerStateValue) !aState; + User::LeaveIfError( cenrep->Set( KBTPowerState, (TInt) power ) ); + CleanupStack::PopAndDestroy( cenrep ); + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::SetVisibilityModeL( TBTVisibilityMode aMode, TInt aTime ) + { + TRACE_FUNC_ARG( ( _L( "[aMode: %d" ), aMode ) ) + if ( aMode != EBTVisibilityModeNoScans && iEnterpriseEnablementMode == BluetoothFeatures::EDisabled ) + { + TRACE_INFO( ( _L( "\tnot changing anything... Bluetooth is enterprise-IT-disabled" ) ) ) + User::Leave( KErrNotSupported ); + } + + TInt err = KErrNone; + iServer->RemoveTimer( CBTEngServer::EScanModeTimer ); + if( aMode != EBTVisibilityModeNoScans ) + { + CRepository* cenRep = CRepository::NewL( KCRUidBTEngPrivateSettings ); + err = cenRep->Set( KBTDiscoverable, aMode ); + delete cenRep; + } + if( !err && aMode == EBTVisibilityModeTemporary ) + { + // We need TInt64 here, as the max. time in microseconds for the + // max. value (1 hour) is larger than KMaxTInt32. + TInt64 timeMicroSec = MAKE_TINT64( 0, aTime ); + timeMicroSec = timeMicroSec * KMinutesInMicroSecs; + // Queue callback to set the visibility back to hidden. + iServer->QueueTimer( CBTEngServer::EScanModeTimer, (TInt64) timeMicroSec ); + aMode = EBTVisibilityModeGeneral; + } + else if( !err && iRestoreVisibility ) + { + // The user overrides, do not restore visibility mode anymore. + iRestoreVisibility = EFalse; + } + if( !err ) + { + err = RProperty::Set( KUidSystemCategory, + KPropertyKeyBluetoothSetScanningStatus, aMode ); + } + TBool hiddenMode = ( aMode == EBTVisibilityModeHidden ); + if( !err && aMode != EBTVisibilityModeNoScans ) + { + // In hidden mode, we only accept connections from paired devices. + err = RProperty::Set( KUidSystemCategory, + KPropertyKeyBluetoothSetAcceptPairedOnlyMode, + hiddenMode ); + } + + User::LeaveIfError( err ); // To communicate the result to the client. + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// Timed visible mode has expired. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::ScanModeTimerCompletedL() + { + TRACE_FUNC_ENTRY + SetVisibilityModeL( EBTVisibilityModeHidden, 0 ); + TBTPowerState power = EBTOff; + TInt err = GetHwPowerState( power ); + if( !err && power ) + { + // Show a notification to the user + TBTGenericInfoNotiferParamsPckg pckg; + pckg().iMessageType = EBTVisibilityTimeout; + + RNotifier notifier; + TInt err = notifier.Connect(); + if( !err ) + { + err = notifier.StartNotifier( KBTGenericInfoNotifierUid, pckg ); + notifier.Close(); + } + } + TRACE_FUNC_RES( ( _L( "result: %d" ), err ) ) + } + + +// --------------------------------------------------------------------------- +// Check the secure simple pairing debug mode and turn it off if needed. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::CheckSspDebugModeL( TBool aDebugMode ) + { + TRACE_FUNC_ARG( ( _L( "SSP debug mode state %d" ), (TInt) aDebugMode ) ) + TBTPowerState pwr = EBTOff; + TBool currentMode = EFalse; + TInt err = RProperty::Get( KPropertyUidBluetoothCategory, + KPropertyKeyBluetoothGetSimplePairingDebugMode, + (TInt&) currentMode ); +#ifndef __WINS__ + err = iPowerMgr.GetPower( pwr, NULL ); // Treat error as power off. +#else //__WINS__ + pwr = iPowerState; +#endif //__WINS__ + if( err || pwr == EBTOff ) + { + iServer->RemoveTimer( CBTEngServer::ESspDebugModeTimer ); + // Only set debug mode to off if it is on, to prevent a loop notifications. + if( currentMode ) + { + (void) RProperty::Set( KPropertyUidBluetoothCategory, + KPropertyKeyBluetoothSetSimplePairingDebugMode, + (TInt) aDebugMode ); + } + // In case of an error in getting the power state, turn BT off. + // If BT is already off, this call will be ignored. + SetPowerStateL( EBTOff, EFalse ); + } + else if( aDebugMode ) + { + // Ignore if there already is a timer queued. + if( !( iServer->IsTimerQueued( CBTEngServer::ESspDebugModeTimer ) ) ) + { + iServer->QueueTimer( CBTEngServer::ESspDebugModeTimer, (TInt64) KBTEngSspDebugModeTimeout ); + err = RProperty::Set(KPropertyUidBluetoothCategory, + KPropertyKeyBluetoothSetSimplePairingDebugMode, + (TInt) aDebugMode ); + } + } + else + { + // Power is on, and debug mode is set to off. + TInt linkCount = 0; + err = RProperty::Get( KPropertyUidBluetoothCategory, + KPropertyKeyBluetoothGetPHYCount, linkCount ); + if( err || !linkCount ) + { + (void) RProperty::Set(KPropertyUidBluetoothCategory, + KPropertyKeyBluetoothSetSimplePairingDebugMode, + (TInt) aDebugMode ); + SetPowerStateL( EBTOff, EFalse ); + } + else + { + // There are still existing connections, queue the + // timer again for half the period. + TInt64 interval = KBTEngSspDebugModeTimeout / 2; + iServer->QueueTimer( CBTEngServer::ESspDebugModeTimer, interval ); + } + } + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------------------------- +// A session will be ended, completes the pending request for this session. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::SessionClosed( CSession2* aSession ) + { + TRACE_FUNC_ARG( ( _L( " session %x"), aSession ) ) + if ( !iMessage.IsNull() && iMessage.Session() == aSession ) + { + iMessage.Complete( KErrCancel ); + } + TRACE_FUNC_EXIT + } + +// --------------------------------------------------------------------------- +// Check the power state and if BT gets turned off automatically. +// This method is invoked either when the timer has expired, or +// if there are no more connections while the timer was running. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::CheckAutoPowerOffL() + { + TRACE_FUNC_ENTRY + if ( iAutoOffClients > 0 ) + { + TRACE_INFO( ( _L( "[CBTEngServer]\t iAutoOffClients %d"), iAutoOffClients ) ) + return; + } + TInt linkCount = 0; + TInt err = RProperty::Get( KPropertyUidBluetoothCategory, + KPropertyKeyBluetoothGetPHYCount, linkCount ); + if( !err && !linkCount ) + { + TRACE_INFO( ( _L( "[CBTEngServer]\t SetPowerStateL( EBTOff, EFalse );"))) + SetPowerStateL( EBTOff, EFalse ); + } + else + { + if( iRestoreVisibility ) + { + // Set visibility mode back to the value selected by the user. + SetVisibilityModeL( EBTVisibilityModeGeneral, 0 ); + iRestoreVisibility = EFalse; + } + // show note if non-audio connection exists + if ( !iServer->PluginManager()->CheckAudioConnectionsL() ) + { + RNotifier notifier; + TInt err = notifier.Connect(); + if( !err ) + { + TRequestStatus status; + TBTGenericInfoNotiferParamsPckg pckg; + pckg().iMessageType = EBTStayPowerOn; + TBuf8 result; + //notifier.StartNotifier( KBTGenericInfoNotifierUid, pckg, result ); + notifier.StartNotifierAndGetResponse( status, + KBTGenericInfoNotifierUid, + pckg, result ); // Reply buffer not used. + User::WaitForRequest( status ); + notifier.Close(); + } + } + iAutoOffClients = 0; + iAutoSwitchOff = EFalse; + TCallBack cb; + iServer->BasebandConnectionManager()->SetAutoSwitchOff( EFalse, cb ); + } + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// The method is called when BT stack scanning mode P&S key is changed +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::UpdateVisibilityModeL( TInt aStackScanMode ) + { + TRACE_FUNC_ARG( ( _L( "[aStackScanMode: %d" ), aStackScanMode ) ) + TBTVisibilityMode currentMode; + + CRepository* cenRep = CRepository::NewLC( KCRUidBTEngPrivateSettings ); + User::LeaveIfError( cenRep->Get( KBTDiscoverable, (TInt&) currentMode ) ); + + // In case we are in temp visibility mode, we cannot always know whether the BT stack + // scan mode key was set by some external party or by us in SetVisibilityModeL above. + // Therefore we cannot stop the timer in case aMode is EBTVisibilityModeGeneral and + // currentmode is EBTVisibilityModeTemporary + if( !( currentMode == EBTVisibilityModeTemporary && aStackScanMode == EBTVisibilityModeGeneral ) ) + { + // Cancel the timer and queue it again if needed. + iServer->RemoveTimer( CBTEngServer::EScanModeTimer ); + if( currentMode != aStackScanMode ) + { + if( aStackScanMode == EPageScanOnly || aStackScanMode == EInquiryAndPageScan ) + { + User::LeaveIfError( cenRep->Set( KBTDiscoverable, aStackScanMode ) ); + } + else if( aStackScanMode == EInquiryScanOnly ) + { + // We don't support ENoScansEnabled nor EInquiryScanOnly mode + // -> Consider these as same as Hidden + User::LeaveIfError( cenRep->Set( KBTDiscoverable, EBTVisibilityModeHidden ) ); + } + else if( aStackScanMode == ENoScansEnabled ) + { + //We don't change KBTDiscoverable here, because ENoScansEnabled + //indicates BT/SYSTEM shutdown is happening + } + } + } + SetUiIndicatorsL(); + CleanupStack::PopAndDestroy( cenRep ); + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// Set Device Under Test mode. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::SetDutMode( TInt aDutMode ) + { + TRACE_FUNC_ARG( ( _L( "DUT mode %d" ), aDutMode ) ) + + if (aDutMode == EBTDutOff) + { + return; + } + + TInt powerState = EBTOff; + CRepository* cenrep = NULL; + + TRAPD(err, cenrep = CRepository::NewL(KCRUidBluetoothPowerState)); + + if (!err && cenrep) + { + cenrep->Get(KBTPowerState, powerState); + delete cenrep; + cenrep = NULL; + } + else + { + return; + } + + if (powerState == EBTOn) + { + +#ifndef __WINS__ + RBluetoothDutMode dutMode; + TInt err = dutMode.Open(); + TRACE_FUNC_ARG( ( _L( "Open DUT mode handle err %d" ), err) ) + if(!err) + { + dutMode.ActivateDutMode(); + dutMode.Close(); + } +#endif //__WINS__ + } + } + + +// --------------------------------------------------------------------------- +// From class MBTEngActiveObserver. +// Callback to notify that an outstanding request has completed. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::RequestCompletedL( CBTEngActive* aActive, TInt aId, TInt aStatus ) + { + __ASSERT_ALWAYS( aId == KBTEngSettingsActive, PanicServer( EBTEngPanicCorrupt ) ); + TRACE_FUNC_ENTRY + (void) aActive; + if ( aStatus != KErrNone && aStatus != KErrAlreadyExists && aStatus != KErrCancel ) + { + // Something went wrong, so we turn BT off again. + SetPowerStateL( EBTOff, EFalse ); + } + else + { + // Write CoD only when the hardware has fully powered up. + TBTPowerState currState ( EBTOff ); + (void) GetHwPowerState( currState ); + if ( currState == EBTOn ) + { + SetClassOfDeviceL(); +#ifndef SETLOCALNAME + // the macro SETLOCALNAME is used as a workaround to tackle the BT name + // could not be saved to BT chip before chip initialization completed for the first time, + // which is one of the regression after improving the BT boot up time. + // To be removed once the final solution is in place. + CBTEngSettings* settings = CBTEngSettings::NewL(); + TBTDeviceName localName; + localName.Zero(); + TInt err = settings->GetLocalName(localName); + if (err == KErrNone) + { + settings->SetLocalName(localName); + } + delete settings; +#endif + } + } + if ( !iMessage.IsNull()) + { + iMessage.Complete( aStatus ); + } + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// From class MBTEngActiveObserver. +// Callback to notify that an error has occurred in RunL. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::HandleError( CBTEngActive* aActive, TInt aId, TInt aError ) + { + (void) aActive; + (void) aId; + if ( !iMessage.IsNull()) + { + iMessage.Complete( aError ); + } + } + + +// --------------------------------------------------------------------------- +// Loads the BT Power Manager; leaves if it cannot be loaded. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::LoadBTPowerManagerL() + { + TRACE_FUNC_ENTRY + TRACE_INFO( ( _L( "[CBTEngSrvSettingsMgr]\t Using HCI API v2 power manager" ) ) ) + User::LeaveIfError( iPowerMgr.Open() ); +#ifndef __WINS__ + iPowerMgr.SetPower( EBTOff, NULL, iActive->RequestStatus() ); + User::WaitForRequest( iActive->RequestStatus() ); + TInt status = ( iActive->RequestStatus().Int() == KErrAlreadyExists ? KErrNone : iActive->RequestStatus().Int() ); + User::LeaveIfError( status ); +#else //__WINS__ + iPowerState = EBTOff; +#endif //__WINS__ + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::SetUiIndicatorsL() + { + TRACE_FUNC_ENTRY + TBTPowerStateValue powerState = EBTPowerOff; + TBTVisibilityMode visibilityMode = EBTVisibilityModeHidden; + CRepository* cenrep = NULL; + TInt phys = 0; + TInt connecting = 0; + + cenrep = CRepository::NewLC( KCRUidBluetoothPowerState ); + User::LeaveIfError( cenrep->Get( KBTPowerState, (TInt&) powerState ) ); + CleanupStack::PopAndDestroy( cenrep ); + + if( powerState == EBTPowerOff ) + { + SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff ); + SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff ); + SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff ); + SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff ); + } + else + { + // Power is on. + RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothPHYCount, phys ); + RProperty::Get( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothConnecting, connecting ); + + cenrep = CRepository::NewLC( KCRUidBTEngPrivateSettings ); + User::LeaveIfError( cenrep->Get( KBTDiscoverable, (TInt&) visibilityMode ) ); + CleanupStack::PopAndDestroy( cenrep ); + + if( visibilityMode == EBTVisibilityModeHidden ) + { + if ( connecting ) // BT connecting and hidden + { + SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff ); + SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateAnimate ); + } + else if ( phys > 0 ) // BT connection active and hidden + { + SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff ); + SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOn ); + } + else // BT connection not active and hidden + { + SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOn ); + SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff ); + } + SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff ); + SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff ); + } + else if( visibilityMode == EBTVisibilityModeGeneral || visibilityMode == EBTVisibilityModeTemporary ) + { + if ( connecting ) // BT connecting and visible + { + SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff ); + SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateAnimate ); + } + else if ( phys > 0 ) // BT connection active and visible + { + SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOff ); + SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOn ); + } + else // BT connection not active and visible + { + SetIndicatorStateL( EAknIndicatorBluetoothModuleOnVisible, EAknIndicatorStateOn ); + SetIndicatorStateL( EAknIndicatorBluetoothVisible, EAknIndicatorStateOff ); + } + SetIndicatorStateL( EAknIndicatorBluetoothModuleOn, EAknIndicatorStateOff ); + SetIndicatorStateL( EAknIndicatorBluetooth, EAknIndicatorStateOff ); + } + } + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::SetIndicatorStateL( const TInt aIndicator, const TInt aState ) + { + CAknSmallIndicator* indicator = CAknSmallIndicator::NewLC( TUid::Uid( aIndicator ) ); + indicator->SetIndicatorStateL( aState ); + CleanupStack::PopAndDestroy( indicator ); //indicator + } + + +// --------------------------------------------------------------------------- +// Gets the current HW power state. +// For now this is a separate method to isolate the different variations. +// --------------------------------------------------------------------------- +// +TInt CBTEngSrvSettingsMgr::GetHwPowerState( TBTPowerState& aState ) + { + TRACE_FUNC_ENTRY + TInt err = KErrNone; + +#ifndef __WINS__ + err = iPowerMgr.GetPower( aState, NULL ); +#else //__WINS__ + aState = iPowerState; +#endif //__WINS__ + TRACE_FUNC_ARG( ( _L( "Power state is %d, result %d" ), (TInt) aState, err ) ) + return err; + } + +// --------------------------------------------------------------------------- +// Check the power state and if BT gets turned off automatically. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::CheckTemporaryPowerStateL( TBTPowerState& aCurrentState, + TBTPowerState aNewState, TBool aTemporary ) + { + TRACE_FUNC_ENTRY + User::LeaveIfError( GetHwPowerState( aCurrentState ) ); + if( !aTemporary ) + { + // Force the new power state, so clear all auto switch off flags. + // If power is off, this will anyway be ignored. + iAutoOffClients = 0; + iAutoSwitchOff = EFalse; + TCallBack cb; + iServer->BasebandConnectionManager()->SetAutoSwitchOff( EFalse, cb ); + if( iRestoreVisibility && aCurrentState == EBTOn ) + { + // Set visibility mode back to the value selected by the user. + SetVisibilityModeL( EBTVisibilityModeGeneral, 0 ); + iRestoreVisibility = EFalse; + } + } + else + { + if( aCurrentState == aNewState ) + { + if( iAutoSwitchOff && aNewState == EBTOn ) + { + iAutoOffClients++; + iServer->RemoveTimer( CBTEngServer::EAutoPowerOffTimer ); + } + } + else if( iAutoSwitchOff || aNewState == EBTOn ) + { + aNewState == EBTOff ? iAutoOffClients-- : iAutoOffClients++; + iAutoSwitchOff = ETrue; + if( aNewState == EBTOff && iAutoOffClients <= 0 ) + { + TCallBack powerOffCb( CBTEngServer::AutoPowerOffCallBack, iServer ); + iServer->BasebandConnectionManager()->SetAutoSwitchOff( ETrue, powerOffCb ); + TInt64 interval = KBTEngBtAutoOffTimeout; + iServer->QueueTimer( CBTEngServer::EAutoPowerOffTimer, interval ); + } + else if( aNewState == EBTOn ) + { + CRepository* cenRep = CRepository::NewLC( KCRUidBTEngPrivateSettings ); + TBTVisibilityMode visibility = EBTVisibilityModeGeneral; + TInt err = cenRep->Get( KBTDiscoverable, (TInt&) visibility ); + CleanupStack::PopAndDestroy( cenRep ); + if( !err && visibility == EBTVisibilityModeGeneral ) + { + SetVisibilityModeL( EBTVisibilityModeHidden, 0 ); + iRestoreVisibility = ETrue; + } + iServer->RemoveTimer( CBTEngServer::EAutoPowerOffTimer ); + } + } + } + if( iAutoOffClients < 0 ) + { + iAutoOffClients = 0; + } + TRACE_FUNC_EXIT + } + + +// --------------------------------------------------------------------------- +// Set the Class of Device. +// --------------------------------------------------------------------------- +// +void CBTEngSrvSettingsMgr::SetClassOfDeviceL() + { + TRACE_FUNC_ENTRY + TUint16 serviceClass = KCoDDefaultServiceClass; + // Check from feature manager if stereo audio is enabled. + FeatureManager::InitializeLibL(); + TBool supported = FeatureManager::FeatureSupported( KFeatureIdBtStereoAudio ); + FeatureManager::UnInitializeLib(); + if( supported ) + { + // A2DP spec says we should set this bit as we are a SRC + serviceClass |= EMajorServiceCapturing; + } + // These values may nayway be overridden by HCI + TBTDeviceClass cod( serviceClass, KCoDDefaultMajorDeviceClass, + KCoDDefaultMinorDeviceClass ); + // Ignore error, it is non-critical + (void) RProperty::Set( KPropertyUidBluetoothControlCategory, + KPropertyKeyBluetoothSetDeviceClass, cod.DeviceClass() ); + TRACE_FUNC_EXIT + } diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/bteng/src/btengsrvstate.cpp --- a/bluetoothengine/bteng/src/btengsrvstate.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/bteng/src/btengsrvstate.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -22,6 +22,7 @@ #include "btengsrvstate.h" #include "btengserver.h" #include "btengsrvpluginmgr.h" +#include "btengsrvsettingsmgr.h" #include "debug.h" @@ -93,10 +94,10 @@ // ?implementation_description // --------------------------------------------------------------------------- // -void CBTEngSrvState::StartStateMachineL( TBool aState ) +void CBTEngSrvState::StartStateMachineL( TBTPowerState aState ) { TRACE_FUNC_ENTRY - if( aState ) + if( aState == EBTOn ) { // Power on; starting state is initializing the stack iState = EInitBTStack; @@ -107,8 +108,8 @@ // Power off, starting state is to disconnect the plug-ins iState = EDisconnectPlugins; iOperation = EPowerOff; - iServer->UpdateCenRepPowerKeyL( EBTPowerOff ); - iServer->SetUiIndicatorsL(); + iServer->SettingsManager()->UpdateCenRepPowerKeyL( EBTOff ); + iServer->SettingsManager()->SetUiIndicatorsL(); } ChangeState(); } @@ -121,10 +122,7 @@ void CBTEngSrvState::ChangeState() { TRACE_FUNC_ENTRY - if(!iAsyncCallback->IsActive()) - { - iAsyncCallback->CallBack(); - } + iAsyncCallback->CallBack(); } // --------------------------------------------------------------------------- @@ -153,7 +151,7 @@ case EInitBTStack: { iState = ELoadDIService; - iServer->InitBTStackL(); + iServer->SettingsManager()->InitBTStackL(); } break; case ELoadDIService: @@ -166,13 +164,13 @@ { iState = ELoadNextPlugin; TEComResolverParams params; - iServer->iPluginMgr->LoadProfilePluginsL( params ); + iServer->PluginManager()->LoadProfilePluginsL( params ); } break; case ELoadNextPlugin: { // Only change the state when all plug-ins are loaded - if( iServer->iPluginMgr->LoadPluginL() <= 0 ) + if( iServer->PluginManager()->LoadPluginL() <= 0 ) { iState = EIdle; } @@ -181,7 +179,7 @@ case EStopBTStack: { iState = EWaitingForPowerOff; - iServer->StopBTStackL(); + iServer->SettingsManager()->StopBTStackL(); } break; case EUnloadDIService: @@ -193,7 +191,7 @@ case EUnloadPlugins: { iState = EUnloadDIService; - iServer->iPluginMgr->UnloadProfilePlugins(); + iServer->PluginManager()->UnloadProfilePlugins(); } break; case EDisconnectPlugins: @@ -214,8 +212,8 @@ { if( iOperation == EPowerOn ) { - iServer->UpdateCenRepPowerKeyL( EBTPowerOn ); - iServer->SetUiIndicatorsL(); + iServer->SettingsManager()->UpdateCenRepPowerKeyL( EBTOn ); + iServer->SettingsManager()->SetUiIndicatorsL(); } iOperation = ESrvOpIdle; iServer->CheckIdle(); diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btmac/inc/btmonocmdhandler/btmcoperator.h --- a/bluetoothengine/btmac/inc/btmonocmdhandler/btmcoperator.h Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btmac/inc/btmonocmdhandler/btmcoperator.h Fri Mar 12 15:43:23 2010 +0200 @@ -86,7 +86,6 @@ CBtmcProtocol& iProtocol; RTelServer iServer; RMobilePhone iPhone; - RMobileONStore iStore; RMmCustomAPI iCustomApi; RMmCustomAPI::TOperatorNameInfo iInfo; }; diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btmac/inc/btmonocmdhandler/btmcphonestatus.h --- a/bluetoothengine/btmac/inc/btmonocmdhandler/btmcphonestatus.h Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btmac/inc/btmonocmdhandler/btmcphonestatus.h Fri Mar 12 15:43:23 2010 +0200 @@ -82,8 +82,6 @@ TInt GetRssiStrength(); - TInt GetVolumeStatus(); - TInt GetBatteryCharge(); void SetRecognitionInitiator(TBTMonoVoiceRecognitionInitiator aInitiator); diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btmac/inc/btmonocmdhandler/btmcprotocol.h --- a/bluetoothengine/btmac/inc/btmonocmdhandler/btmcprotocol.h Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btmac/inc/btmonocmdhandler/btmcprotocol.h Fri Mar 12 15:43:23 2010 +0200 @@ -164,7 +164,6 @@ TBool iHandleCmdPending; CDesC8ArrayFlat* iOutgoPacketQueue; // owned TInt iCredit; // How many commands are allowed to acc - TBool iVolumeSyncFromAccessory; TBool iAccessoryInitiated; // who initiated the connection RMobilePhone::TMobilePhoneIdentityV1 iIdentity; // holds IMEI etc RMobilePhone::TMobilePhoneSubscriberId iId; // holds id diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btmac/inc/btmonocmdhandler/btmcvolume.h --- a/bluetoothengine/btmac/inc/btmonocmdhandler/btmcvolume.h Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btmac/inc/btmonocmdhandler/btmcvolume.h Fri Mar 12 15:43:23 2010 +0200 @@ -88,6 +88,8 @@ TInt GetNewPhoneVol(); + TBool IsActiveRemoteVolumeControl(); + private: enum TVolSyncAction { @@ -109,8 +111,6 @@ TInt iMaxSpkrVol; // Maximum volume level of the phone TInt iStep; TVolSyncAction iAction; - - TBool iVolCtrlActivated; }; diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallstatus.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallstatus.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmccallstatus.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -620,6 +620,14 @@ void CBtmcCallStatus::ReportCallEventL(TInt aPrevStatus, TInt aNewStatus, TBool /*aOutgoing*/) { TRACE_FUNC_ENTRY + if ( iProtocol.ProtocolStatus().iProfile == EBtmcHSP) + { + // HSP 1.2 requires either RING indicator or in-band ringing + // tone, but not both. + TRACE_INFO((_L(" HSP connection, no call indicator"))) + return; + } + // CCWA if (iProtocol.ProtocolStatus().iCallWaitingNotif == EBTMonoATCallWaitingNotifEnabled && (!(aPrevStatus & KCallRingingBit) && (aNewStatus & KCallRingingBit)) && diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btmac/src/BTMonoCmdHandler/btmcoperator.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcoperator.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcoperator.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -122,7 +122,6 @@ void CBtmcOperator::DoCancel() { TRACE_FUNC - iStore.CancelAsyncRequest(EMobilePhoneStoreRead); } // ------------------------------------------------------------------------------- diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btmac/src/BTMonoCmdHandler/btmcphonestatus.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcphonestatus.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcphonestatus.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -302,14 +302,6 @@ } } -TInt CBtmcPhoneStatus::GetVolumeStatus() - { - if(iVol) - return iVol->GetVolume(); - else - return 0; - } - // ----------------------------------------------------------------------------- // CBtmcPhoneStatus::CBtmcPhoneStatus // ----------------------------------------------------------------------------- diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcprotocol.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -389,7 +389,6 @@ { iCallStatus->ReportCallStatusL(); } - iVolumeSyncFromAccessory = EFalse; TRACE_FUNC_EXIT } @@ -938,12 +937,15 @@ LEAVE_IF_ERROR(aCmd.Parameter(0, param)) TInt value; LEAVE_IF_ERROR(param.Int(value)) - if (!iPhoneStatus) + // In HFP, AT+VGS is not valid before service level connection + // has established. + // In HSP, AT+VGS is allowed at any time. + if (!iPhoneStatus && iProtocolStatus->iProfile == EBtmcHSP ) { iPhoneStatus = CBtmcPhoneStatus::NewL(*this, iPhone, iProtocolStatus->iProfile); iPhoneStatus->SetVolumeControlFeatureL(ETrue); } - if(iVolumeSyncFromAccessory) + if(iPhoneStatus) { iPhoneStatus->SetSpeakerVolumeL(value); } @@ -1025,37 +1027,9 @@ CleanupStack::Pop(ok); SendResponseL(resarr); CleanupStack::PopAndDestroy(&resarr); - - // solution to volume sync - phone will always send its volume status back to accessory - - if( (aCmd.Id() == EATVGS) && (iVolumeSyncFromAccessory == EFalse) ) - { - iVolumeSyncFromAccessory = ETrue; - TInt vol(KErrNotFound); - - if(iPhoneStatus) - { - vol = iPhoneStatus->GetVolumeStatus(); - } - - if(vol > KErrNotFound) // volume exists - { - TATParam param = TATParam(); - LEAVE_IF_ERROR(aCmd.Parameter(0, param)) - TInt value; - LEAVE_IF_ERROR(param.Int(value)) - if(value != vol) - { - CATResult* event = CATResult::NewLC(EATVGS, EATUnsolicitedResult, vol); - SendUnsoltResultL(*event); - CleanupStack::PopAndDestroy(event); - } - } - } CmdHandlingCompletedL(); } - // ----------------------------------------------------------------------------- // CBtmcProtocol::HandleActionCommandL // diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btmac/src/BTMonoCmdHandler/btmcvolume.cpp --- a/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcvolume.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btmac/src/BTMonoCmdHandler/btmcvolume.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -60,11 +60,13 @@ void CBtmcVolume::SetSpeakerVolumeL(TInt aHfVol) { TRACE_FUNC - TRACE_INFO((_L("phone vol %d, acc vol %d"), iPhnSpkrVol, iAccSpkrVol)) + TRACE_INFO((_L("current vols phone %d, acc %d"), iPhnSpkrVol, iAccSpkrVol)) + // Store the new volume setting of headset regardless of + // whether volume control is active or not currently iAccSpkrVol = HfToPhoneVolScale(aHfVol); - if (iVolCtrlActivated) + TRACE_INFO((_L("new acc vol %d"), iAccSpkrVol)) + if ( IsActiveRemoteVolumeControl() ) { - TRACE_INFO((_L("to new vol %d"), iAccSpkrVol)) TInt vol = GetNewPhoneVol(); if (vol != KNoAudioStreaming) { @@ -73,10 +75,6 @@ DoSetSpeakerVolL( prevPhVol ); } } - else - { - TRACE_INFO((_L("volume control inactive!"))) - } } void CBtmcVolume::SetMicrophoneVolumeL(TInt /*aHfVol*/) @@ -86,13 +84,11 @@ void CBtmcVolume::ActivateRemoteVolumeControl() { - if (!iVolCtrlActivated) + TRACE_FUNC + if (!IsActiveRemoteVolumeControl() ) { - TRACE_FUNC iVolLevelProperty.Subscribe(iActive->iStatus); iActive->GoActive(); - - iVolCtrlActivated = ETrue; TInt vol = GetNewPhoneVol(); TRACE_INFO((_L("current phone vol %d, acc vol %d"), vol, iAccSpkrVol)) if (vol != KNoAudioStreaming) @@ -109,11 +105,7 @@ void CBtmcVolume::DeActivateRemoteVolumeControl() { - if (iVolCtrlActivated) - { - iVolCtrlActivated = EFalse; - iActive->Cancel(); - } + iActive->Cancel(); TRACE_FUNC } @@ -242,21 +234,15 @@ volClick = (iAccSpkrVol > iPhnSpkrVol) ? KPSVolumeUpClicked : KPSVolumeDownClicked; } } - + TInt err( KErrNotFound ); if( volClick ) { - iAction = ESpeakerVolSet; - TInt err = iVolKeyEventProperty.Set( volClick ); - if( err ) - { - iAction = ESpeakerVolSubscribe; - TRACE_ERROR((_L("Set KMediaKeysVolumeKeyEvent err %d"), err)); - } + err = iVolKeyEventProperty.Set( volClick ); + TRACE_INFO((_L("Set KMediaKeysVolumeKeyEvent click %d err %d"), volClick, err)); } - else - { - iAction = ESpeakerVolSubscribe; - } + + iAction = err ? ESpeakerVolSubscribe : ESpeakerVolSet; + TRACE_FUNC_EXIT } @@ -313,4 +299,9 @@ return iPhnSpkrVol; } +TBool CBtmcVolume::IsActiveRemoteVolumeControl() + { + return iActive->IsActive(); + } + // End of file diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btnotif/src/BTNInqNotifier.cpp --- a/bluetoothengine/btnotif/src/BTNInqNotifier.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btnotif/src/BTNInqNotifier.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -59,6 +59,7 @@ { FLOG(_L("[BTNOTIF]\t CBTInqNotifier::~CBTInqNotifier()")); delete iUi; + iUi = NULL; FLOG(_L("[BTNOTIF]\t CBTInqNotifier::~CBTInqNotifier() completed")); } @@ -84,7 +85,7 @@ { FLOG(_L("[BTNOTIF]\t CBTInqNotifier::GetParamsL()")); - if( iUi || iReplySlot!=NULL || !iMessage.IsNull() ) + if( !iMessage.IsNull() ) { aMessage.Complete(KErrInUse); return; @@ -124,6 +125,8 @@ if( iUi ) { iUi->Cancel(); + delete iUi; + iUi = NULL; } CBTNotifierBase::Cancel(); FLOG(_L("[BTNOTIF]\t CBTInqNotifier::Cancel() completed")); diff -r 6a29d5ad0713 -r 0707dd69d236 bluetoothengine/btui/Ecom/src/BTUIPairedDevicesView.cpp --- a/bluetoothengine/btui/Ecom/src/BTUIPairedDevicesView.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/bluetoothengine/btui/Ecom/src/BTUIPairedDevicesView.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -289,6 +289,11 @@ TBTDevice device; device.iIndex = iContainer->CurrentItemIndex(); iModel->GetDevice(device); + if ( device.iStatus & EStatusBtuiConnected ) + { + // If device is already connected, we do nothing here. + break; + } device.iOperation = EOpConnect; ConnectL( device, ETrue ); break; @@ -1069,6 +1074,13 @@ TBTDevice device; device.iIndex = index; iModel->GetDevice(device); + + if ( !( device.iStatus & EStatusBtuiConnected) ) + { + // If device is already disconnected, return immediately. + return; + } + iDisconnectQueryDevice = device;//remember device related with query dialog // Create confirmation query diff -r 6a29d5ad0713 -r 0707dd69d236 tsrc/public/basic/obexservapitest/src/ObexServAPItestBlocks.cpp --- a/tsrc/public/basic/obexservapitest/src/ObexServAPItestBlocks.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/tsrc/public/basic/obexservapitest/src/ObexServAPItestBlocks.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -30,6 +29,9 @@ #include "ObexServAPItest.h" +// Defined to coincide with the definition in btmsgtypeuid.h +const TUid KUidMsgTypeBt = {0x10009ED5}; + // ============================ MEMBER FUNCTIONS =============================== diff -r 6a29d5ad0713 -r 0707dd69d236 tsrc/public/basic/obexservapitest/src/testlogger.cpp --- a/tsrc/public/basic/obexservapitest/src/testlogger.cpp Fri Feb 19 22:59:18 2010 +0200 +++ b/tsrc/public/basic/obexservapitest/src/testlogger.cpp Fri Mar 12 15:43:23 2010 +0200 @@ -182,7 +182,7 @@ buffer.Insert( 0, GetPrefix( aLevel ) ); // Log a timestamp - TTimeStamp8 time; + TStifLoggerTimeStamp8 time; TRAP_IGNORE( LogTimeStampL( time ) ); buffer.Insert( 0, time ); @@ -227,7 +227,7 @@ buffer.Copy( converter ); // Log a timestamp - TTimeStamp8 time; + TStifLoggerTimeStamp8 time; TRAP_IGNORE( LogTimeStampL( time ) ); buffer.Insert( 0, time ); @@ -501,9 +501,9 @@ iLog->Log( KJSSECTION ); TBuf version( _L( "Version unknown!" ) ); (void) SysUtil::GetSWVersion( version ); - TTimeStamp8 date; + TStifLoggerTimeStamp8 date; LogTimeStampL( date, EFalse ); - TTimeStamp8 time; + TStifLoggerTimeStamp8 time; LogTimeStampL( time ); TPtrC timePtr( time.Mid( 6, 13 ) ); iLog->Log( KHtmlStatSection, &date, &timePtr, &version );