bluetoothengine/bthid/bthidserver/inc/bthidconnection.h
changeset 0 f63038272f30
child 11 a42ed326b458
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/bthid/bthidserver/inc/bthidconnection.h	Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,435 @@
+/*
+* Copyright (c) 2008 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:  Declares main application class.
+ *
+*/
+
+
+#ifndef __BTCONNECTION_H__
+#define __BTCONNECTION_H__
+
+#include <es_sock.h>
+#include <bt_sock.h>
+#include "socketobserver.h"
+#include "sockinitnotifier.h"
+#include "timeoutnotifier.h"
+
+const TUint KCommandBufferSize = 2;
+
+enum
+    {
+    EControlSocketID, EInterruptSocketID
+    };
+
+const TUint KL2CAPDefaultMTU = 672;
+
+/*! 5 Minute -10 sec Inactivity Timeout (-10 sec due to Nokia Su8W*/
+const TUint KInactivityTimeout = (5 * 60 * 1000000) - 10000000;
+
+class CSocketReader;
+class CSocketWriter;
+class CSocketInitiator;
+class CDataSegmenter;
+class CTimeOutTimer;
+class CBTHidDevice;
+class MBTConnectionObserver;
+
+/*!
+ Tracks the current state of the connection
+ */
+enum TBTConnectionState
+    {
+    ENotConnected, /*!< No connection has been established. */
+    EFirstConnection, /*!< A first-time connection is in progress. */
+    ELinkLost, /*!< The connection is in link loss. */
+    EConnected, /*!< The connection is active */
+    EHostReconnecting, /*!< Host is reconnecting to the device */
+    EHIDReconnecting, /*!< The device is reconnection to the host */
+    EDisconnecting, /*!< The connection is being closed */
+    EConnecting
+    };
+
+/*!
+ This class represents a single connection to a bluetooth HID device.
+ It creates instances of separate active objects to perform reading from,
+ and writing to, the sockets.
+ */
+class CBTHidConnection : public CObject,
+        public MSocketObserver,
+        public MSockInitNotifier,
+        public MTimeOutNotifier
+    {
+public:
+    /*!
+     Create a CBTHidConnection object.
+     @param aSocketServ The socket server session.
+     @param aObserver An observer of this object.
+     @result A pointer to the created instance of CBTHidConnection.
+     */
+    static CBTHidConnection* NewL(RSocketServ& aSocketServ,
+            MBTConnectionObserver& aObserver,
+            TBTConnectionState aConnectionState);
+
+    /*!
+     Create a CBTHidConnection object.
+     @param aSocketServ The socket server session.
+     @param aObserver An observer of this object.
+     @result A pointer to the created instance of CBTHidConnection.
+     */
+    static CBTHidConnection* NewLC(RSocketServ& aSocketServ,
+            MBTConnectionObserver& aObserver,
+            TBTConnectionState aConnectionState);
+
+    /*!
+     Destroy the object and release all memory objects.
+     */
+    ~CBTHidConnection();
+
+    /*!
+     Gets the id for this connection.
+     @return A connection ID.
+     */
+    TInt ConnID();
+
+    /*!
+     Sets the id for this connection.
+     @param aConnID The new id for this connection.
+     */
+    void SetConnID(TInt aConnID);
+
+    /*!
+     Starts a first time connection to the HID device.
+     */
+    void ConnectL();
+
+    /*!
+     The connection should restart. either by connecting to the device or waiting
+     for a connection.
+     */
+    void ReconnectL();
+
+    /*!
+     Perform a deliberate disconnection from the device. 
+     Includes sending the Virtual-Cable-Unplug message if needed.
+     */
+    void Disconnect();
+
+    /*!
+     Drops the Bluetooth connection to a device
+     */
+    void DropConnection();
+
+    /*!
+     Starts the reading process on the sockets.
+     */
+    void StartMonitoringChannelsL();
+
+    /*!
+     Get access to the connections device details object.
+     @result A reference to a device details object.
+     */
+    CBTHidDevice& DeviceDetails();
+
+    /*!
+     Current status of a connection after initial connection has been performed.
+     @result ETrue device is connected.
+     @result EFalse device is in link loss.
+     */
+    TBool IsConnected() const;
+
+    TBTConnectionState ConnectStatus() const;
+
+    /*!
+     Asks to accept an incoming connection on the control channel.
+     @param aAddress address of the connecting device.
+     @param aSocket the socket for the connection. This will be set to NULL
+     if the connection accepts the socket.
+     */
+    void OfferControlSocket(const TBTDevAddr& aAddress, RSocket*& aSocket);
+
+    /*!
+     Asks to accept an incoming connection on the interrupt channel.
+     @param aAddress address of the connecting device.
+     @param aSocket the socket for the connection. This will be set to NULL
+     if the connection accepts the socket.
+     */
+    void OfferInterruptSocket(const TBTDevAddr& aAddress, RSocket*& aSocket);
+
+    /*!
+     Issues the Get Protocol Command over the control channel..
+     */
+    void GetProtocolL();
+
+    /*!
+     Issues the Set Protocol Command over the control channel.
+     @param aValue the protocol setting. 0 = Boot, 1 = Report.
+     */
+    void SetProtocolL(TUint16 aValue);
+
+    /*!
+     Issues the Get Report Command over the control channel.
+     @param aReportType the type of the report.
+     @param aReportID the report ID.
+     @param aLength the length of the report we are asking for.
+     */
+    void GetReportL(TUint8 aReportType, TUint8 aReportID, TUint16 aLength);
+
+    /*!
+     Issues the Set Report Command over the control channel.
+     @param aReportType the type of the report.
+     @param aReportID the report ID.
+     @param aReport the report.
+     */
+    void SetReportL(TUint8 aReportType, TUint8 aReportID,
+            const TDesC8& aReport);
+
+    /*!
+     Issues the DATA Out command over the Interrupt channel. This is similar to
+     SetReport which uses ReportType Output. Therefore you may use SetReport
+     to do data transfers from Host to device as well. 
+     @param aReportID
+     @param aReport reference to the report buffer
+     */
+    void DataOutL(TUint8 aReportID, const TDesC8& aReport);
+
+    /*!
+     Issues the Get Idle Command over the control channel.
+     */
+    void GetIdleL();
+
+    /*!
+     Issues the Set Idle Command over the control channel.
+     @param aDuration the idle duration.
+     */
+    void SetIdleL(TUint8 aDuration);
+
+public:
+    // from MSocketObserver
+
+    void HandleSocketError(TUint aSocketID, TBool aConnectionLost,
+            TInt aErrorCode);
+
+    TBool HandleDataReceived(TUint aSocketID, const TDesC8& aBuffer);
+
+    void HandleWriteComplete(TUint aSocketID);
+
+public:
+    // from MSockInitNotifier
+
+    void SocketsConnected();
+
+    void SocketsConnFailed(TInt aStatus);
+
+public:
+    // from MTimeOutNotifier
+    void TimerExpired();
+
+private:
+    /*!
+     Perform the first phase of two phase construction. 
+     @param aSocketServ the socket server session.
+     @param aObserver an observer of this object.
+     */
+    CBTHidConnection(RSocketServ& aSocketServ,
+            MBTConnectionObserver& aObserver,
+            TBTConnectionState aConnectionState);
+
+    /*!
+     Perform the second phase construction of a CBTHidConnection object.
+     */
+    void ConstructL();
+
+    /*!
+     The BT HID Transaction Header based upon Bluetooth HID Spec Sec. 7.3
+     */
+    enum TBTTransaction
+        {
+        // Handshake commands
+        EHandshakeSuccess = 0,
+        EHandshakeNotReady = 1,
+        EHandshakeInvalidRepID = 2,
+        EHandshakeUnsupported = 3,
+        EHandshakeInvalidParam = 4,
+        EHandshakeUnknown = 14,
+        EHandshakeFatal = 15,
+        // Control Commands
+        EHIDControlNOP = 16,
+        EHIDControlHardReset = 17,
+        EHIDControlSoftReset = 18,
+        EHIDControlSuspend = 19,
+        EHIDControlExitSuspend = 20,
+        EHIDControlVCUnplug = 21,
+        // Get Report Commands
+        EGetReportFullBufReserved = 64,
+        // Set Report Commands
+        ESetReportReserved = 80,
+        // Get/Set Protocol Commands
+        EGetProtocol = 96,
+        ESetProtocol = 112,
+        // Get/Set Idle Commands
+        EGetIdle = 128,
+        ESetIdle = 144,
+        // DATA Commands
+        EDATAOther = 160,
+        EDATAInput = 161,
+        EDATAOutput = 162,
+        EDATAFeature = 163,
+        // DATC Commands
+        EDATCOther = 176,
+        EDATCInput = 177,
+        EDATCOutput = 178,
+        EDATCFeature = 179
+        };
+
+    /**
+     *  Prepare the newly-connected sockets for reading and writing.
+     */
+    void PrepareSocketsL();
+
+    /*!
+     Perform a change in the connection status
+     @param aNewStatus new connection status
+     */
+    void ChangeState(TBTConnectionState aNewStatus);
+
+    /*!
+     Handle the situation when the link to a device is lost.
+     */
+    void ConnectionLost();
+
+    /*!
+     The HID device has sent the virtual cable unplug command.
+     */
+    void ReceivedVirtualCableUnplug();
+
+    /*!
+     Checks to see if the connections is in a state able to service a set/get
+     command.
+     */
+    void LeaveIfCommandNotReadyL() const;
+
+    /*!
+     Closes the L2CAP Control and Interrupt channels
+     */
+    void CloseChannels();
+
+    /*!
+     Handle data received on the control channel.
+     @param aBuffer the data buffer.
+     @result ETrue to continue reading.
+     @result EFalse to stop reading.
+     */
+    TBool ProcessControlData(const TDesC8& aBuffer);
+
+    /*!
+     Append as much data to a buffer as can be handled.
+     @param aDest the destination buffer.
+     @param aSource the source buffer.
+     */
+    void AppendData(TDes8& aDest, const TDesC8& aSource);
+
+    /*!
+     Handle data received on the interrupt channel.
+     @param aBuffer the data buffer.
+     @result ETrue to continue reading.
+     @result EFalse to stop reading.
+     */
+    TBool ProcessInterruptData(const TDesC8& aBuffer);
+
+    void HandleEDATCFeature(const TDesC8& aBuffer);
+
+    /*!
+     Begin handling a new multiple interrupt packet transaction
+     @param aBuffer the data buffer
+     */
+    void StartSegmentedInterruptDataL(const TDesC8& aBuffer);
+
+    /*!
+     Handle a Continuation data packet on the interrupt channel
+     @param aBuffer the data buffer
+     @param aFinalSegment ETrue if this is the final segment, EFalse otherwise
+     */
+    void ContinueSegmentedInterruptData(const TDesC8& aBuffer,
+            TBool aFinalSegment);
+
+private:
+
+    /*! The socket server */
+    RSocketServ& iSocketServ;
+
+    /*! An observer for status reporting */
+    MBTConnectionObserver& iObserver;
+
+    /*! The ID given to this connection */
+    TInt iConnID;
+
+    /*! The HID device details */
+    CBTHidDevice* iDevice;
+
+    /*! Current connection status */
+    TBTConnectionState iConnectionState;
+
+    /*! Control channel socket */
+    RSocket* iControlSocket;
+
+    /*! Interrupt channel socket */
+    RSocket* iInterruptSocket;
+
+    /*! Active object to control connecting sockets */
+    CSocketInitiator* iSocketInitiator;
+
+    /*! Active object to control reads from the socket */
+    CSocketReader* iControlSocketReader;
+
+    /*! Active object to control writes to the socket */
+    CSocketWriter* iControlSocketWriter;
+
+    /*! Active object to control reads from the socket */
+    CSocketReader* iInterruptSocketReader;
+
+    /*! Active object to control writes to the socket */
+    CSocketWriter* iInterruptSocketWriter;
+
+    /*! Set/Get command is outstanding with the device */
+    TBool iCommandIssued;
+
+    /*! Fixed buffer used for all Set/Get commands except SetReport*/
+    TBuf8<KCommandBufferSize> iCommandBuffer;
+
+    /*! Utility object to provide individual packets for large data */
+    CDataSegmenter* iCommandSegmenter;
+
+    /*! Dynamic buffer used for control data larger than the incoming MTU */
+    HBufC8* iControlDataBuffer;
+
+    /*! Dynamic buffer used for interrupt data larger than the incoming MTU */
+    HBufC8* iInterruptDataBuffer;
+
+    /*! Size of data host can send in a packet on the control channel*/
+    TInt iControlOutMTU;
+
+    /*! Size of data the device sends in a packet on the control channel*/
+    TInt iControlInMTU;
+
+    /*! Size of data host can send in a packet on the interrupt channel*/
+    TInt iInterruptOutMTU;
+
+    /*! Size of data the device sends in a packet on the interrupt channel*/
+    TInt iInterruptInMTU;
+
+    /*! A timer to track inactivity on the Bluetooth Connection */
+    CTimeOutTimer* iInactivityTimer;
+    };
+
+#endif // __BTCONNECTION_H__