--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/linkmgr/AclDataQ.h Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,118 @@
+// Copyright (c) 2001-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:
+//
+
+#ifndef _ACLDATAQ_H
+#define _ACLDATAQ_H
+
+#include <e32base.h>
+#include <bttypes.h>
+
+class CACLDataItem;
+class CHCIFacade;
+class CLinkMgrProtocol;
+
+/**
+ HCI ACL Data Packet Buffer Q.
+
+ This class will handle the Qing and issuing of ACL Data Packet Buffers.
+ It pre-allocates Packet buffers on the heap on construction, hence the
+ number or size of preallocated buffers should not change after
+ construction because ESock doesn't like memory Leaves.
+
+ For a UART HCTL implementation of the HCI, we need to be able to buffer
+ HCI Data buffers of at least 255+1+4 bytes, since the HC must guarantee to
+ be able to accept/buffer data packets of 255 bytes (EXCLUDING the headers).
+
+ The general usage includes:
+ 1/ Obtaining items in the 'spare data pool'- for the client to populate
+ with data (RemoveFirstSpareItem),
+ 2/ Putting such items back on the 'data fifo' queue, for sending
+ (AddItem), and
+ 3/ When we do a send, getting an item to send (FirstItemByConnectionHandle
+ and FirstItem) and moving it back to the spare data pool (InvalidateItem).
+
+ This class is not intended for derivation, to reuse aggregate.
+*/
+NONSHARABLE_CLASS(CAclDataQ) : public CBase
+ {
+public:
+ static CAclDataQ* NewL(CLinkMgrProtocol& aProtocol,
+ TUint aNumberOfItems,
+ TUint16 aDataSize,
+ TUint16 aFramingOverhead);
+ ~CAclDataQ();
+
+public:
+ inline TUint Ceiling() const;
+ inline TUint FillLevel() const;
+ void AddItem(CACLDataItem& aACLItem);
+ inline TUint16 ItemSize() const;
+ void InvalidateAll();
+ void InvalidateByConnH(THCIConnHandle aConn, const CHCIFacade& aHCIFacade);
+ CACLDataItem* RemoveFirstSpareItem();
+ CACLDataItem* FirstItemByConnectionHandle(const CHCIFacade& aHCIFacade, const THCIConnHandle aConnH);
+ CACLDataItem* FirstItem(const CHCIFacade& aHCIFacade, THCIConnHandle& aConnH);
+ void PendingItem(CACLDataItem& aItem);
+ void ItemsSent(TUint aNumberOfItemsSent);
+ void ProcessFlush(const CHCIFacade& aHCIFacade, THCIConnHandle aConnH);
+
+private:
+ CAclDataQ();
+ void ConstructL(CLinkMgrProtocol& aProtocol,
+ TUint aNumberOfItems,
+ TUint16 aDataSize,
+ TUint16 aFramingOverhead);
+
+private: // owned
+ // size of each item (HCI ACL Data buffer) in the FIFO
+ TUint16 iItemSize;
+
+ // max number of allocated items allowed
+ TUint iCeiling;
+
+ // how many packets are pending on the Q (iDataFifo)
+ TUint iLevel;
+
+ TSglQue<CACLDataItem> iPreHardwareBuffer; // A buffer for data prior to it being
+ // sent to the hardware buffer.
+ TSglQue<CACLDataItem> iSpareDataPool; // the 'empty' slots
+ TSglQue<CACLDataItem> iPendingData; // Data on the hardware.
+ };
+
+inline TUint CAclDataQ::Ceiling() const
+/**
+ Returns the maximum number of packets this Q will hold.
+*/
+ {
+ return iCeiling;
+ }
+
+inline TUint CAclDataQ::FillLevel() const
+/**
+ Returns the number of packets currently on the Q.
+*/
+ {
+ return iLevel;
+ }
+
+inline TUint16 CAclDataQ::ItemSize() const
+/**
+ Returns the data size of the packets that can be handled by this Q.
+*/
+ {
+ return iItemSize;
+ }
+
+#endif // _ACLDATAQ_H