--- /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 <e32base.h>
+#include <bttypes.h> // BT protocol wide types
+#include <e32property.h> // pub-sub definitions
+#include <remconbatterytarget.h>
+#include <remconbatterytargetobserver.h>
+#include <absolutevolumeapitargetobserver.h>
+#include <remconinterfaceselector.h>
+
+#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<TBTDevAddr>& 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<TState> 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