serialserver/packetloopbackcsy/inc/LoopbackQueue.h
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/serialserver/packetloopbackcsy/inc/LoopbackQueue.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,159 @@
+// Copyright (c) 2004-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:
+// This file implements a queue for the loopback driver
+// 
+//
+
+/**
+ @file
+*/
+
+#ifndef __LOOPBACK_QUEUE_H__
+#define __LOOPBACK_QUEUE_H__
+
+#include <cs_port.h>
+#include "SLOGGER.H"
+#include <d32comm.h>
+#include <c32comm.h>
+#include <e32hal.h>
+#include <e32base.h>
+
+#include "LoopbackConfig.h"
+#include "LoopbackTimer.h"
+
+/**
+ A queue class of descriptors - all of the data for the desctiptors is contained in this class
+ */
+NONSHARABLE_CLASS(CTPtr8Queue) : CBase
+	{
+public:
+	static CTPtr8Queue* NewL(TInt aBufferLength, TInt aQueueLength);
+	~CTPtr8Queue();
+	TPtr8& GetNewBuffer();
+	TPtr8& DequeueFirstBuffer();
+	const TPtr8& PeekFirstBuffer() const;
+	TInt QueueLength() const;
+	TBool IsEmpty() const;
+	TBool IsFull() const;
+	void Clear();
+private:
+	CTPtr8Queue(TInt aQueueLength);
+	void ConstructL(TInt aBufferLength, TInt aQueueLength);
+
+	/** Index of the first buffer in the queue */
+	TInt iFirstBuffer;
+	/** Index of the next buffer in the queue */
+	TInt iNextBuffer;
+	/** True if the buffer is full (iFirstBuffer should also equal iNextBuffer */
+	TBool iQueueFull;
+	
+	/** Pointer to the descriptors, each of which represents an element in the queue */
+	CArrayFixFlat<TPtr8> iDescriptors;
+	/** Buffer for all of the data in all of the elements of the queue */
+	TDesC8 *iBuffer;
+	};
+
+/**
+ Contains the read and write queues for a given port
+ */
+NONSHARABLE_CLASS(MLoopbackQueue)
+	{
+public:
+	virtual ~MLoopbackQueue();
+	virtual TPtrC8 PeekNextReadBuffer(TBool& aCompleteIfBufferNotFull) const = 0;
+	virtual void DiscardNextReadBuffer() = 0;
+	virtual void AppendToReadBuffer(TDesC8& aSrcData) = 0;
+	virtual TPtrC8 PeekNextWriteBuffer() const = 0;
+	virtual void DiscardNextWriteBuffer() = 0;
+	virtual TPtr8 AppendToWriteBuffer(TInt aLength) = 0;
+	virtual TBool IsWriteBufferEmpty() const = 0;
+	virtual TBool IsWriteBufferFull(TInt aLength) const = 0;
+	virtual TBool IsReadBufferEmpty() const = 0;
+	virtual TBool IsReadBufferFull(TInt aLength) const = 0;
+	virtual TInt BufferSize() const = 0;
+	virtual void Clear() = 0;
+	};
+
+/**
+ Contains the read and write queues for a given port
+ */
+NONSHARABLE_CLASS(CPacketBufferQueue) : public CBase, public MLoopbackQueue
+	{
+public:
+	static CPacketBufferQueue* NewL(TInt aBufferLength, TInt aQueueLength);
+	~CPacketBufferQueue();
+	void DiscardNextReadBuffer();
+	TPtrC8 PeekNextReadBuffer(TBool& aCompleteIfBufferNotFull) const;
+	TPtr8 AppendToWriteBuffer(TInt aLength);
+	void DiscardNextWriteBuffer();
+	TPtrC8 PeekNextWriteBuffer() const;
+	void AppendToReadBuffer(TDesC8& aSrcData);
+	TBool IsWriteBufferEmpty() const;
+	TBool IsWriteBufferFull(TInt aLength) const;
+	TBool IsReadBufferEmpty() const;
+	TBool IsReadBufferFull(TInt aLength) const;
+	TInt BufferSize() const;
+	void Clear();
+private:
+	CPacketBufferQueue(TInt aBufferLength);
+	void ConstructL(TInt aBufferLength, TInt aQueueLength);
+
+	/** The length of each element in each queue */
+	TInt iBufferLength;
+
+	/** The read queue for a port */
+	CTPtr8Queue *iReadQueue;
+	/** The write queue for a port */
+	CTPtr8Queue *iWriteQueue;
+	};
+
+/**
+ Contains the read and write queues for a given port
+ */
+NONSHARABLE_CLASS(CSerialBufferQueue) : public CBase, public MLoopbackQueue
+	{
+public:
+	static CSerialBufferQueue* NewL(TInt aBufferLength, TCommConfigV01* aConfig);
+	~CSerialBufferQueue();
+	void DiscardNextReadBuffer();
+	TPtrC8 PeekNextReadBuffer(TBool& aCompleteIfBufferNotFull) const;
+	void AppendToReadBuffer(TDesC8& aSrcData);
+	TPtrC8 PeekNextWriteBuffer() const;
+	void DiscardNextWriteBuffer();
+	TPtr8 AppendToWriteBuffer(TInt aLength);
+	TBool IsWriteBufferEmpty() const;
+	TBool IsWriteBufferFull(TInt aLength) const;
+	TBool IsReadBufferEmpty() const;
+	TBool IsReadBufferFull(TInt aLength) const;
+	TInt BufferSize() const;
+	void Clear();
+private:
+	CSerialBufferQueue(TInt aBufferLength, TCommConfigV01* aConfig);
+	void ConstructL(TInt aBufferLength);
+	TPtrC8 NextBuffer(const TPtrC8& aBuffer, TBool& aTerminatorFound) const;
+	
+
+	/** The length of each element in each queue */
+	TInt iBufferLength;
+	
+	TCommConfigV01 *iConfig;
+
+	HBufC8* iWriteBuffer;
+	TPtr8 iWriteData;
+	HBufC8* iReadBuffer;
+	TPtr8 iReadData;
+	};
+
+#endif
+