bluetoothengine/btsac/btrcc/inc/btrccLinker.h
changeset 0 f63038272f30
child 9 a42ed326b458
--- /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