cbsref/csyrefplugins/csy27010/src/PortC32InterfaceIp.cpp
branchRCL_3
changeset 66 07a122eea281
parent 65 630d2f34d719
child 67 4eff64595c44
child 70 4814c5a49428
--- a/cbsref/csyrefplugins/csy27010/src/PortC32InterfaceIp.cpp	Tue Aug 31 16:23:08 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,670 +0,0 @@
-//
-// * Copyright 2004 Neusoft America Inc.
-// * All rights reserved.
-// * This component and the accompanying materials are made available
-// * under the terms of the Eclipse Public License v1.0
-// * which accompanies this distribution, and is available
-// * at the URL "http://www.eclipse.org/legal/epl-v10.html".
-// *
-// * Contributors:
-// * Keith Collins (Neusoft America Inc.)  original software development and additional code and modifications.
-// * Thomas Gahagen (Neusoft America Inc.)  additional code and modifications.
-// * Zhen Yuan (Neusoft America Inc.)  additional code and modifications.
-// *
-// * Description:  This file contains the implementation for the CPortC32Interface class.
-// *               This class contains methods which are invoked by C32 when the
-// *               associated client RComm public API is invoked. These methods
-// *               are used to create, configure, read, write, and close logical
-// *               serial ports. Instances of this class are created by the CSY's
-// *               Port Factory.
-//
-
-/** @file PortC32InterfaceIp.cpp
- *
- * This file contains the implementation for the CPortC32InterfaceIp class.
- * This class contains methods which are invoked by C32 when the
- * associated client RComm public API is invoked. These methods
- * are used to create, configure, read, write, and close logical
- * serial ports. Instances of this class are created by the CSY's
- * Port Factory.
- *
- */
-
-#include <cdbcols.h>
-#include "PortC32InterfaceIp.h"
-#include "Portfactory.h"
-#include "Mux0710Protocol.h"
-#include "CsyMsgBufBPFrame.h"
-#include "ChannelMgrCmdData.h"
-#include "CommFrameReaderAo.h"
-#include "CsyDebugLogger.h"
-#include "CsyGlobals.h"
-#include "CommFrameWriterAo.h"
-
-CPortC32InterfaceIp* CPortC32InterfaceIp::NewL(CPortFactory& aPortFactory, 
-										   CPortFactory::TC32PortInfo& aPortInfo)
-/**
- * This method uses two phase construction and the cleanup stack to create
- * an instance of class CPortC32InterfaceIp.
- *
- * @param aPortFactory - Reference to the port factory
- * @param aPortInfo - Reference to the port information
- * @return Pointer to the created instance
- */
-	{
-	_LOG_L4C1("CPortC32InterfaceIp::NewL");
-
-	CPortC32InterfaceIp* self =
-		new(ELeave) CPortC32InterfaceIp(aPortFactory, aPortInfo);
-
-	TCleanupItem closeSelf(CPortFactory::CloseObject, self);
-	CleanupStack::PushL(closeSelf);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-
-	return (self);
-	}
-
-CPortC32InterfaceIp::~CPortC32InterfaceIp()
-/**
- * Destructor.
- */
-	{
-	_LOG_L4C1(">>CPortC32InterfaceIp::~CPortC32InterfaceIp");
-
-	_LOG_L3C1("Remove port from the port factory");
-
-	// let port factory know we are deleted
-	iPortFactory.RemoveC32Port(this);
-	CompleteOutstandingRequest();
-
-	_LOG_L3C1("Release any packets going to the C32 client");
-
-	// remove all frames to do with the most recent IP packet
-	CCsyMsgBufBpFrame* ipPacketFrame = NULL;
-	iFramesReceivedForIpPacketIter.SetToFirst();
-	while ((ipPacketFrame = iFramesReceivedForIpPacketIter++) != NULL)
-		{
-		iFramesReceivedForIpPacket.Remove(*ipPacketFrame);
-		delete ipPacketFrame;
-		}
-
-	_LOG_L4C1("<<CPortC32InterfaceIp::~CPortC32InterfaceIp");
-	}
-
-CPortC32InterfaceIp::CPortC32InterfaceIp(CPortFactory& aPortFactory,
-									 CPortFactory::TC32PortInfo& aPortInfo)
-/**
- * Constructor.
- *
- * @param aPortFactory - Reference to the port factory
- * @param aPortInfo - Reference to the port information
- */
-: CPortC32InterfaceBase(aPortFactory, aPortInfo),
-   iFramesReceivedForIpPacket(_FOFF(CCsyMsgBufBpFrame, iMsgLink)),
-   iFramesReceivedForIpPacketIter(iFramesReceivedForIpPacket)
-	{}
-
-void CPortC32InterfaceIp::ConstructL()
-/**
- * Safe constructor
- */
-	{
-	_LOG_L4C1(">>CPortC32InterfaceIp::ConstructL");
-
-	CPortC32InterfaceBase::ConstructL();
-
-	_LOG_L4C1("<<CPortC32InterfaceIp::ConstructL");
-	}
-
-/********************************************************************************/
-/*               Start of utility methods for CPortC32InterfaceBase             */
-/********************************************************************************/
-
-TInt CPortC32InterfaceIp::QueryReceiveBuffer(TInt& aLength) const
-/**
- * Called by C32 when the client queries the size of the receive buffer,
- * which returns the number of receive characters available to be read by
- * the C32 client RComm instance.
- *
- * @param aLength - Reference to client's buffer length variable
- * @return KErrNone
- */
-	{
-	_LOG_L4C2("CPortC32InterfaceIp::QueryReceiveBuffer [port=%d]", GetPortNumber());
-
-	aLength = 0;
-
-	// MAF
-
-	return KErrNone;
-	}
-
-void CPortC32InterfaceIp::ResetBuffers(TUint aFlags)
-/**
- * Called by C32 when the client requests to reset the buffers,
- * by removing all receive and/or transmit messages according to
- * the specified flags.
- *
- * @param aFlags Indicate which buffers (receive and/or transmit) should be reset
- */
-	{
-	_LOG_L4C3(">>CPortC32InterfaceIp::ResetBuffers [aFlags=%d,port=%d]",
-		aFlags,GetPortNumber());
-
-	if (aFlags & KCommResetRx)
-		{
-		_LOG_L4C1("Removing all messages intended for the C32 client");
-
-		RemoveWaitingAllFrames();
-
-		// remove all frames to do with the most recent IP packet
-		CCsyMsgBufBpFrame* ipPacketFrame = NULL;
-		iFramesReceivedForIpPacketIter.SetToFirst();
-		while ((ipPacketFrame = iFramesReceivedForIpPacketIter++) != NULL)
-			{
-			iFramesReceivedForIpPacket.Remove(*ipPacketFrame);
-			delete ipPacketFrame;
-			}
-		}
-
-	if (aFlags & KCommResetTx)
-		{
-		_LOG_L4C1("Removing all messages intended for the modem");
-
-		GetMuxChannel()->WriteCancel();
-		}
-
-	_LOG_L4C1("<<CPortC32InterfaceIp::ResetBuffers");
-	}
-
-void CPortC32InterfaceIp::PlaceIpPacketFramesOntoFreeList()
-/**
- * Place all frames to do with recent IP packet onto free list
- */
-	{
-	_LOG_L4C2(">>CPortC32InterfaceIp::PlaceIpPacketFramesOntoFreeList [port=%d]", GetPortNumber());
-
-	CCsyMsgBufBpFrame* frame = NULL;
-	iFramesReceivedForIpPacketIter.SetToFirst();
-	while ((frame = iFramesReceivedForIpPacketIter++) != NULL)
-		{
-		iFramesReceivedForIpPacket.Remove(*frame);
-		iPortFactory.GetMux0710Protocol()->AddFrameFreeQ(frame);
-		}
-	iCurrentIpPacketLength = 0;
-
-	_LOG_L4C1("<<CPortC32InterfaceIp::PlaceIpPacketFramesOntoFreeList");
-	}
-
-void CPortC32InterfaceIp::PlaceIpPacketFramesOntoReadList()
-/**
- * Place all frames to do with recent IP packet onto read list
- */
-	{
-	_LOG_L4C2(">>CPortC32InterfaceIp::PlaceIpPacketFramesOntoReadList [port=%d]", GetPortNumber());
-
-	CCsyMsgBufBpFrame* frame = NULL;
-	iFramesReceivedForIpPacketIter.SetToFirst();
-	while ((frame = iFramesReceivedForIpPacketIter++) != NULL)
-		{
-		iFramesReceivedForIpPacket.Remove(*frame);
-		iFramesWaitingToBeReadList.AddLast(*frame);
-		}
-	iCurrentIpPacketLength = 0;
-	iNumberOfPacketsWaiting++;
-	_LOG_L4C2("iNumberOfPacketsWaiting=%d",iNumberOfPacketsWaiting);
-
-	if (iNumberOfPacketsWaiting == KMaxPacketsOutstandingForC32Client)
-		{
-		_LOG_L2C1("Client appears to be slow at reading");
-		_LOG_L2C3("iNumberOfPacketsWaiting %d > KMaxPacketsOutstandingForC32Client %d)",
-			iNumberOfPacketsWaiting,KMaxPacketsOutstandingForC32Client);
-
-		iMuxChannel->SetCsyToModemFlowControl(EFlowControlOn);
-		}
-
-	_LOG_L4C1("<<CPortC32InterfaceIp::PlaceIpPacketFramesOntoReadList");
-	}
-
-void CPortC32InterfaceIp::SendFrameToClient(CCsyMsgBufBpFrame* aFrame)
-/**
- * This method is called by a CSY Channel object when it has a single
- * frame to send to a C32 client RComm object.
- *
- * @param aFrame - Pointer to message to send to client
- */
-	{
-	_LOG_L4C2(">>CPortC32InterfaceIp::SendFrameToClient [port=%d]", GetPortNumber());
-
-	if (aFrame)
-		{
-		// frame validation
-		if (aFrame->iMsg.Length() <= KAdvOptionNumOfNonDataOctets)
-			{
-			_LOG_L1C1("** Does not appear to be a valid frame - disregarding **");
-
-			// Place received frames on the empty list
-			iPortFactory.GetMux0710Protocol()->AddFrameFreeQ(aFrame);
-			PlaceIpPacketFramesOntoFreeList();
-
-			_LOG_L4C1("<<CPortC32InterfaceIp::SendFrameToClient - bad frame");
-			return;
-			}
-
-		TUint8 framePosition = aFrame->GetType4FrameSequence();
-		_LOG_L4C2("framePosition = 0x%02x",framePosition);
-
-		// read buffer validation
-		if (iFramesReceivedForIpPacket.IsEmpty())
-			{
-			// There is no read buffer allocated for this frame
-			switch (framePosition)
-				{
-			case KSingleFrame:
-			case KStartMultiFrame:
-				{
-				_LOG_L4C1("Starting new IP frame list");
-				iCurrentIpPacketLength = 0;
-				}
-				break;
-			case KEndMultiFrame:
-			case KMiddleMultiFrame:
-			default:
-				// assumption here is that because no read buffer is allocated then
-				// there cannot have been a valid start frame
-				_LOG_L1C1("** Missed start of packet - disregarding **");
-
-				// Place received frame on the empty list
-				iPortFactory.GetMux0710Protocol()->AddFrameFreeQ(aFrame);
-
-				_LOG_L4C1("<<CPortC32InterfaceIp::SendFrameToClient - no start");
-				return;
-				}
-			}
-		else if ((framePosition == KSingleFrame)||(framePosition == KStartMultiFrame))
-			{
-			// There's been a comms error and an end packet has been lost
-			_LOG_L1C1("** Unexpected Start/Single frame - disregarded previous frames **");
-
-			// Place received frames on the empty list
-			PlaceIpPacketFramesOntoFreeList();
-
-			// Continue processing this frame
-			_LOG_L4C1("Starting new IP frame list");
-			iCurrentIpPacketLength = 0;
-			}
-
-		// If have got to here then IP frame list exists
-
-		TInt length = aFrame->iMsg.Length() - KAdvOptionNumOfNonDataOctets;
-		_LOG_L4C2("length=%d",length);
-
-		// length validation
-		if ((iCurrentIpPacketLength + length) > KMaxIpPacketSize)
-			{
-			// The length of the data in the new frame would exceed that available
-			// in the read buffer.
-
-			_LOG_L1C3("** iCurrentIpPacketLength + length %d exceeds max size %d **",
-				(iCurrentIpPacketLength + length),KMaxIpPacketSize);
-
-			// Place received frames on the empty list
-			iPortFactory.GetMux0710Protocol()->AddFrameFreeQ(aFrame);
-			PlaceIpPacketFramesOntoFreeList();
-
-			_LOG_L4C1("<<CPortC32InterfaceIp::SendFrameToClient - frame sized exceeded");
-			return;
-			}
-
-		// If have got to here IP frame list exists and length is valid
-		iCurrentIpPacketLength += length;
-
-		TBool addReadBufferToClientList = EFalse;
-		switch (framePosition)
-			{
-		// Single frame	
-		case KSingleFrame:
-			_LOG_L4C1("Only frame");
-			iFramesReceivedForIpPacket.AddFirst(*aFrame);
-			addReadBufferToClientList = ETrue;
-			break;
-
-		// Multiframe
-		case KStartMultiFrame:
-			_LOG_L4C1("Start multiframe");
-			iFramesReceivedForIpPacket.AddFirst(*aFrame);
-			break;
-
-		case KMiddleMultiFrame:
-			_LOG_L4C1("Middle multiframe");
-			iFramesReceivedForIpPacket.AddLast(*aFrame);
-			break;
-
-		case KEndMultiFrame:
-			_LOG_L4C1("Last multiframe");
-			iFramesReceivedForIpPacket.AddLast(*aFrame);
-			addReadBufferToClientList = ETrue;
-			break;
-
-		// Unknown
-		default:
-			_LOG_L1C2("** Unknown framePosition %d - ignoring **",
-				framePosition);
-
-			// Place received frame on the empty list
-			iPortFactory.GetMux0710Protocol()->AddFrameFreeQ(aFrame);
-			PlaceIpPacketFramesOntoFreeList();
-
-			_LOG_L4C1("<<CPortC32InterfaceIp::SendFrameToClient - unknown frame pos");
-			return;
-			}
-
-		if (addReadBufferToClientList)
-			{
-			// Give iFramesWaitingToBeReadList ownership of the frames making up the IP Packet
-			_LOG_L4C1("Transfer frames to client msg list");
-
-			// check if queue is empty
-			TBool trigger = iFramesWaitingToBeReadList.IsEmpty();
-
-			PlaceIpPacketFramesOntoReadList();
-
-			if (trigger)
-				{
-				_LOG_L4C1("No packets already waiting");
-				if (iIsReadInProgress)
-					{
-					_LOG_L4C1("A read is outstanding");
-					ReadFromBufOrQueue();
-					}
-				}
-
-			// inform client new data is available
-			SetDataAvailable();
-			}
-		}
-	else
-		{
-		_LOG_L1C1("** aFrame is null **");
-		// MAF __ASSERT_DEBUG(EFalse, PANIC(KPanicIllegalState));
-		}
-
-	_LOG_L4C1("<<CPortC32InterfaceIp::SendFrameToClient");
-	}
-
-TBool CPortC32InterfaceIp::CreateIpPacketFromFrames()
-/**
- * We assume that all validation has been done during SendFrameToClient so only valid
- * data exists on the iFramesWaitingToBeReadList frame list.
- *
- * @return ETrue if packet retrieved successfully
- */
-	{
-	_LOG_L4C2(">>CPortC32InterfaceIp::CreateIpPacketFromFrames [port=%d]", GetPortNumber());
-
-	iIpPacket.Zero();
-
-	TUint8	framePosition = 0;
-	TInt	length = 0;
-	TBool	packetRetrieved = EFalse;
-
-	// Remove all frames to do with the same IP Packet from waiting to be read list
-	CCsyMsgBufBpFrame* frame = NULL;
-	iFramesWaitingToBeReadIter.SetToFirst();
-	while ((frame = iFramesWaitingToBeReadIter++) != NULL)
-		{
-		iFramesWaitingToBeReadList.Remove(*frame);
-
-		framePosition = frame->GetType4FrameSequence();
-		_LOG_L4C2("framePosition = 0x%02x",framePosition);
-
-		length = frame->iMsg.Length() - KAdvOptionNumOfNonDataOctets;
-		_LOG_L4C2("length=%d",length);
-
-		iIpPacket.Append(&frame->iMsg[KAdvOptionType4StartOfMessageData], length);
-
-		iPortFactory.GetMux0710Protocol()->AddFrameFreeQ(frame);
-
-		if ((framePosition == KSingleFrame)||(framePosition == KEndMultiFrame))
-			{
-			_LOG_L4C1("retrieved packet");
-			packetRetrieved = ETrue;
-
-			if (iNumberOfPacketsWaiting == KMaxPacketsOutstandingForC32Client)
-				{
-				_LOG_L2C1("Client appears to be reading again");
-
-				// Assume it is okay to set FC to Off even in low free frame
-				// condition since just freed a frame.
-
-				iMuxChannel->SetCsyToModemFlowControl(EFlowControlOff);
-				}
-
-			iNumberOfPacketsWaiting--;
-			_LOG_L4C2("iNumberOfPacketsWaiting=%d",iNumberOfPacketsWaiting);
-			break;
-			}
-		}
-
-	_LOG_L4C2("<<CPortC32InterfaceIp::CreateIpPacketFromFrames [packetRetrieved=%d]",packetRetrieved);
-	return packetRetrieved;
-	}
-
-TBool CPortC32InterfaceIp::ReadFromBufOrQueue()
-/**
- * This method is called to read from buffer or the frame list
- * It will read as much as possible.
- *
- * @return ETrue if complete the read request
- */
-	{
-	_LOG_L4C2(">>CPortC32InterfaceIp::ReadFromBufOrQueue [port=%d]", GetPortNumber());
-
-	TBool completedRead = EFalse;
-	TInt ret = KErrNone;
-
-	_LOG_L4C2("iOneOrMore=%d",iOneOrMore);
-	_LOG_L4C2("iClientLength=%d",iClientLength);
-
-	while ((CreateIpPacketFromFrames())&&(!ret))
-		{
-		TInt ipPacketLength = iIpPacket.Length();
-		TInt length = -1; 
-		if (iClientLength - iPos < ipPacketLength)
-			{
-			length = iClientLength - iPos;
-			_LOG_L4C2("length remaining = %d",length);
-			}
-
-		if ((length > -1) && (ipPacketLength >= length))
-			{
-			// MAF should partial reads be allowed?
-			_LOG_L2C1("Partial read?");
-
-			}
-		else
-			{
-			_LOG_L4C3("read buf %d >= length %d ", ipPacketLength, length);
-
-			ret = IPCWrite(iClientBuffer, iIpPacket, iPos);
-			if (ret)
-				{
-				_LOG_L1C2("** IPCWrite Error %d **",ret);
-				}
-
-			_LOG_L4C3("Read: iPos = %d, add %d bytes", iPos, ipPacketLength);
-
-			iPos += ipPacketLength;
-			}
-		}
-
-	if (iPos>0)
-		{
-		if (iOneOrMore)
-			{
-			CompleteReadRequest(ret);
-
-			iPos = 0;
-			completedRead = ETrue;
-			}
-		else
-			{
-			//normal read? and have not filled the buffer yet
-			_LOG_L4C3( "Not filled buffer yet iPos = %d, iClientLength = %d", iPos, iClientLength);
-			}
-		}
-	
-	_LOG_L4C2("<<CPortC32InterfaceIp::ReadFromBufOrQueue [completedRead=%d]", completedRead);
-	return completedRead;
-	}
-
-
-/***
-TBool CPortC32InterfaceIp::ReadFromBufOrQueue()
-**
- * This method is called to read from buffer or the frame list
- * It will read as much as possible.
- *
- * @return ETrue if complete the read request
- *
-	{
-	_LOG_L4C2(">>CPortC32InterfaceIp::ReadFromBufOrQueue [port=%d]", GetPortNumber());
-
-	TBool completedRead = EFalse;
-	TInt err = KErrGeneral;
-	TBool cont;
-	do
-		{
-		cont = EFalse;
-		if(iQueuedIpPacket == NULL)
-			{
-			//Read data from the frame list
-			if (!iMsgToClientList.IsEmpty())
-				{
-				_LOG_L4C1("Set to first item");
-				iQueuedIpPacket = iMsgToClientList.First();
-				if (iQueuedIpPacket)
-					{
-					_LOG_L4C1("iQueuedIpPacket not null");
-					// remove msg buf from client list
-					iMsgToClientList.Remove(*iQueuedIpPacket);
-					}
-				}
-			}
-		if (iQueuedIpPacket)
-			{
-			TInt length = KErrNotFound; // <- yeaks!
-			if (iClientLength - iPos < iQueuedIpPacket->iMsg.Length())
-				{
-				length = iClientLength - iPos;
-				_LOG_L4C2("length remaining = %d",length);
-				}
-
-			if (iConfig.iTerminatorCount > 0)
-				{
-				_LOG_L4C2("iTerminatorCount = %d",iConfig.iTerminatorCount);
-
-				// First find terminator
-				TInt terminatorLoc = KErrNotFound; // <- yeaks!
-				TInt loc;
-				for (TInt i = 0; i < iConfig.iTerminatorCount; i++)
-					{
-					loc = iQueuedIpPacket->iMsg.LocateF(iConfig.iTerminator[i]);
-					if (loc > KErrNotFound)
-						{
-						if (terminatorLoc == KErrNotFound)
-							{
-							terminatorLoc = loc;
-							}
-						else
-							{
-							terminatorLoc = Min(loc,terminatorLoc);
-							}
-						}
-					}
-				if (terminatorLoc > KErrNotFound)
-					{
-					if (length > KErrNotFound)
-						length = Min(terminatorLoc + 1,length);
-					else
-						length = terminatorLoc + 1;
-					}
-				_LOG_L4C2("length = %d",length);
-				}
-
-			_LOG_L4C2("Read buf length %d",iQueuedIpPacket->iMsg.Length());
-
-			if ((iQueuedIpPacket->iMsg.Length() >= length) && (length > KErrNotFound))
-				{
-				LOGTEXT2(__DEBUGLEVELMAJOR__,"complete partial read: # %d ", length);
-
-				iPartialReadBuf.Copy(&iQueuedIpPacket->iMsg[0], length);
-				iQueuedIpPacket->iMsg.Delete(0, length);
-
-				err = IPCWrite(iClientBuffer, iPartialReadBuf, iPos); 
-				if (err)
-					{
-					_LOG_L1C2("** IPCWrite Error %d **",err);
-					}
-
-				CompleteReadRequest(err);
-				err = KErrGeneral;
-
-				completedRead = ETrue;
-				iPos = 0;
-
-				if (iQueuedIpPacket->iMsg.Length() == 0)
-					{
-					_LOG_L4C1("All data used - freeing read buffer");
-					AddToFreeC32BufferQ(iQueuedIpPacket);
-					iQueuedIpPacket = NULL;
-					}
-				}
-			else
-				{
-				LOGTEXT3(__DEBUGLEVELMAJOR__,"read buf %d >= length %d ", iQueuedIpPacket->iMsg.Length(), length);
-
-				err = IPCWrite(iClientBuffer, iQueuedIpPacket->iMsg, iPos);
-
-				_LOG_L4C3("Read: iPos = %d, add %d bytes", iPos, iQueuedIpPacket->iMsg.Length());
-
-				cont = ETrue; //try read next frame in the list
-				iPos = iPos + iQueuedIpPacket->iMsg.Length();
-
-				_LOG_L4C1("Freeing read buffer");
-				AddToFreeC32BufferQ(iQueuedIpPacket);
-				iQueuedIpPacket = NULL;
-				}
-			}
-		}
-	while (cont);
-
-	if (iPos>0)
-		{
-		if (iOneOrMore)
-			{
-			if (err)
-				{
-				_LOG_L1C2("** IPCWrite Error %d **",err);
-				}
-
-			CompleteReadRequest(err);
-
-			iPos = 0;
-			completedRead = ETrue;
-			}
-		else
-			{
-			//normal read and have not filled the buffer yet
-			_LOG_L4C3( "Not filled buffer yet iPos = %d, iClientLength = %d", iPos, iClientLength);
-			//iToClientMsgQAo->IssueNotificationRequest();
-			}
-		}
-
-	_LOG_L4C2("<<CPortC32InterfaceIp::ReadFromBufOrQueue [ret=%d]",completedRead);
-	return completedRead;
-	}
-***/
-
-