// 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