diff -r 000000000000 -r f63038272f30 bluetoothengine/btsac/btrcc/inc/btrccLinker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btsac/btrcc/inc/btrccLinker.h Mon Jan 18 20:28:57 2010 +0200 @@ -0,0 +1,330 @@ +/* +* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: State Machine of BTRCC +* +*/ + + +#ifndef BTRCCLINKER_H +#define BTRCCLINKER_H + + +// INCLUDES +#include +#include // BT protocol wide types +#include // pub-sub definitions +#include +#include +#include +#include + +#include "btrccVolumeLevelControllerBase.h" + +// DATA TYPES +enum TBTRCCStateIndex + { + EStateIndexIdle = 0, + EStateIndexConnecting, + EStateIndexConnected, + EStateIndexDisconnect + }; + +// FORWARD DECLARATIONS +class MBTAccObserver; +class CRemConInterfaceSelector; +class CRemConCoreApiController; +class CBTRCCVolumeLevelController; +class CRemConCoreApiTarget; +class CPlayerStarter; +class CBTRCCBrowsingAdapter; + +// CLASS DECLARATION + +/** +* The main controller for BT Remote Control Profile. Notifies BT Accessory Server +* about changes in remote contorl profile connections. Perform requests from BT Accessory +* Server to disconnect the accessory. +*/ +NONSHARABLE_CLASS(CBTRCCLinker) : public CActive, public MRemConBatteryTargetObserver, public MBTRCCVolumeControllerObserver + { + private: + /** + * The base class of state + */ + class TState + { + public: + + /** + * Entry of this state + * @param aStatus the client status, will be completed when this state should exit. + */ + virtual void Enter() = 0; + + /** + * Called by parent's DoCancel + * Cancels the outstanding operations in this state. + */ + virtual void DoCancel(); + + virtual void Connect(const TBTDevAddr& aAddr, TRequestStatus& aStatus); + + virtual void CancelConnect(const TBTDevAddr& aAddr); + + /** + * Makes a request to disconnect the connection. + * @param aBdAddress BT device address of remote side + */ + virtual void Disconnect(TRequestStatus& aStatus, const TBTDevAddr& aAddr); + + /** + * This will be called whenever an async operation to RemCon FW completes. + */ + virtual void RemConRequestCompleted(TInt aErr); + + virtual void UpdateRemoteVolumeControling(TBool aActivated); + + protected: + + /** + * Default constructor + */ + TState(CBTRCCLinker& aParent); + + protected: + CBTRCCLinker& iParent; + }; + friend class TState; + + class TStateIdle : public TState + { + public: + + TStateIdle(CBTRCCLinker& aParent); + + void Enter(); + + void DoCancel(); + + void Connect(const TBTDevAddr& aAddr, TRequestStatus& aStatus); + + void RemConRequestCompleted(TInt aErr); + }; + friend class TStateIdle; + + class TStateConnecting : public TState + { + public: + + TStateConnecting(CBTRCCLinker& aParent); + + void Enter(); + + void DoCancel(); + + void CancelConnect(const TBTDevAddr& aAddr); + + void RemConRequestCompleted(TInt aErr); + + private: + TBool iConnectCanceled; + }; + friend class TStateConnecting; + + class TStateConnected : public TState + { + public: + TStateConnected(CBTRCCLinker& aParent); + + void Enter(); + + void DoCancel(); + + void Connect(const TBTDevAddr& aAddr, TRequestStatus& aStatus); + + void Disconnect(TRequestStatus& aStatus, const TBTDevAddr& aAddr); + + void RemConRequestCompleted(TInt aErr); + + void UpdateRemoteVolumeControling(TBool aActivated); + }; + friend class TStateConnected; + + class TStateDisconnect : public TState + { + public: + TStateDisconnect(CBTRCCLinker& aParent); + + void Enter(); + + void DoCancel(); + + void RemConRequestCompleted(TInt aErr); + }; + friend class TStateDisconnect; + + public: // Constructors and destructor + + /** + * Two-phased constructor. + * After construction the instance is ready to serve requests. + * Also starts listening to incoming connections from BT audio + * accessories. + */ + static CBTRCCLinker* NewL(MBTAccObserver& aAccObserver); + + /** + * Destructor. + * Removes service and security registrations and stops listening to + * incoming connections. + */ + virtual ~CBTRCCLinker(); + + void MrcbstoBatteryStatus(TControllerBatteryStatus& aBatteryStatus); + + public: // New functions + + void Connect(const TBTDevAddr& aAddr, TRequestStatus& aStatus); + + void CancelConnect(const TBTDevAddr& aAddr); + + /** + * DiSconnects from the currently connected BT audio accessory. + * @return None. + */ + void Disconnect(TRequestStatus& aStatus, const TBTDevAddr& aAddr); + + MBTAccObserver& AccObserver(); + + void ActivateRemoteVolumeControl(); + + void DeActivateRemoteVolumeControl(); + + public: // From MBTRCCVolumeControllerObserver + void VolumeControlError(TInt aError); + + private: // From CActive + + /** + * Gets called when the asynchronous control connection open operation + * completes. Informs the control connection observer about the + * connection. + * @param None. + * @return None. + */ + void RunL(); + + /** + * Gets called if RunL leaves + * @param None. + * @return None. + */ + TInt RunError(TInt aError); + + /** + * Cancels the ongoing control connection open operation and informs + * the control connection observer about that. + * @param None. + * @return None. + */ + void DoCancel(); + + + private: + + /** + * C++ default constructor. + */ + CBTRCCLinker(MBTAccObserver& aAccObserver); + + /** + * Symbian 2nd phase constructor. + */ + void ConstructL(); + + /** + * Connect the accessory. + */ + void DoConnect(); + + void DoSubscribeConnetionStatus(); + + void DoCancelSubscribe(); + + /** + * DiSconnects from the currently connected BT audio accessory. + * @return None. + */ + void DoDisconnect(); + + void ChangeState(TBTRCCStateIndex aNextState); + + /** + * Re-orient AVRCP bearer plugin to the remote for the current connect /disconnect request + */ + TInt DoRemConOrientation(); + + /** + * aConnectedAddr will hold the remote BD address if there is a connection. + * otherwise it is TBTDevAddr() + */ + void DoGetRemConConnectionStatus(RArray& aConnects); + + void StartRemoteVolumeControl(); + + void StopRemoteVolumeControl(); + + void ResetVolmeControlSetting(); + + private: // Data + + CRemConInterfaceSelector *iInterfaceSelector; + + // For receiving the accessory battery status + CRemConBatteryApiTarget *iRemConBatteryTgt; + + CRemConCoreApiTarget* iCoreTarget; // not own + + CPlayerStarter* iPlayerStarter; // owned + + // For handling the browsing commands. + CBTRCCBrowsingAdapter *iBrowsingAdapter; + + // This is only needed for disconnecting a AVRCP connection + // when AVRCP Remote Volume Control is not supported. + CRemConInterfaceSelector *iInterfaceSelectorForDisconnectingTargetSession; + + TBTDevAddr iRemoteAddr; + + MBTAccObserver& iAccObserver; + + RPointerArray iStateArray; // Array of all states in BTRCC + TBTRCCStateIndex iCurrentStateIndex; // Index of current state + + TRequestStatus* iClientRequest; + TBool iRemConOriented; + + TBool iRvcActivated; + + CBTRCCVolumeLevelControllerBase* iVolController; + CBTRCCVolumeLevelControllerBase* iAbsoluteVolController; + CBTRCCVolumeLevelControllerBase* iLegacyVolController; + + TInt iRegisterVolumeChangeNotificationCounter;//Counter for re-register for remote volume control notification +}; + + +#endif // BTRCCLINKER_H + +// End of File