williamr@2: // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // sbque.h - TCP sequence block queue williamr@2: // Defines a queue for keeping tabs on contiguous blocks of sequence numbers. williamr@2: // williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @file sbque.h williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: williamr@2: #ifndef __SBQUE_H__ williamr@2: #define __SBQUE_H__ williamr@2: williamr@2: #include "tcpseq.h" williamr@2: williamr@2: /** Sequence Block. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class SequenceBlock williamr@2: { williamr@2: friend class SequenceBlockQueue; williamr@2: williamr@2: private: williamr@2: williamr@2: SequenceBlock(TTcpSeqNum aLeft, TTcpSeqNum aRight) : iLeft(aLeft), iRight(aRight) {} williamr@2: TDblQueLink iLink; williamr@2: williamr@2: public: williamr@2: williamr@2: TTcpSeqNum iLeft; williamr@2: TTcpSeqNum iRight; williamr@2: }; williamr@2: williamr@2: /** Sequence Block Queue. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class SequenceBlockQueue : public TDblQue williamr@2: { williamr@2: public: williamr@2: SequenceBlockQueue() : TDblQue(_FOFF(SequenceBlock, iLink)) { iCount = 0; iOrdered = ETrue; } williamr@2: inline ~SequenceBlockQueue() { Clear(); } williamr@2: IMPORT_C SequenceBlock *AddOrdered(TTcpSeqNum aLeft, TTcpSeqNum aRight); williamr@2: IMPORT_C SequenceBlock *AddUnordered(TTcpSeqNum aLeft, TTcpSeqNum aRight); williamr@2: inline SequenceBlock *AddOrdered(const SequenceBlock *aBlock) { return AddOrdered(aBlock->iLeft, aBlock->iRight); } williamr@2: inline SequenceBlock *AddUnordered(const SequenceBlock *aBlock) { return AddUnordered(aBlock->iLeft, aBlock->iRight); } williamr@2: IMPORT_C SequenceBlock *Find(TTcpSeqNum aSeq); williamr@2: IMPORT_C TInt FindGap(TTcpSeqNum& aLeft, TTcpSeqNum& aRight); williamr@2: IMPORT_C void Prune(TTcpSeqNum aLeft); williamr@2: IMPORT_C void Limit(TInt aCount); williamr@2: IMPORT_C void Clear(); williamr@2: inline TInt Count() const { return iCount; } williamr@2: inline TInt ByteCount() const { return iBytes; } williamr@2: williamr@2: private: williamr@2: TInt iCount; williamr@2: TInt iBytes; williamr@2: TBool iOrdered; williamr@2: }; williamr@2: williamr@2: typedef TDblQueIter SequenceBlockQueueIter; williamr@2: williamr@2: #endif