linklayerprotocols/ethernetnif/IRLAN/IRLANIO.CPP
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/ethernetnif/IRLAN/IRLANIO.CPP	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,241 @@
+// Copyright (c) 1997-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:
+// IrLAN data send/receive active objects 
+// 
+//
+
+/**
+ @file
+*/
+
+#include <nifman.h>
+#include <nifvar.h>
+#include <nifutl.h>
+#include <es_mbuf.h>
+#include "PKTDRV.H"
+#include "IRLAN.H"
+#include "IRLANUTL.H"
+#include "IRLANBUF.H"
+#include "INTSOCK.H"
+
+//#define __TRACEWIN__
+#ifdef __TRACEWIN__
+  #include <log.h>
+#else
+  #define LOG(a)
+#endif
+
+//############################ IrLAN Sender ############################
+
+/**
+Constructor.
+*/
+CIrlanSender::CIrlanSender() : CActive(EIrlanSenderPriority)
+{
+	__DECLARE_NAME(_S("CIrlanSender"));
+}
+
+/**
+Destructor.
+*/
+CIrlanSender::~CIrlanSender()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN	~CIrlanSender\r\n")));
+#endif
+}
+
+/**
+Create a new CIrlanSender object.
+@param aParent A pointer to CIrlanControlEngine object.
+@param aSock A pointer to CInternalSocket object.
+@return A pointer to CIrlanSender class.
+*/
+CIrlanSender* CIrlanSender::NewL(CIrlanControlEngine* aParent,CInternalSocket* aSock)
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN	CIrlanSender::NewL\r\n")));
+#endif
+	CIrlanSender *sd=new (ELeave) CIrlanSender;
+	CleanupStack::PushL(sd);
+	sd->InitL(aParent,aSock);
+	CActiveScheduler::Add(sd);
+	CleanupStack::Pop();
+	return sd;
+}
+
+/**
+Add the newly created object to an object container
+@param aParent A pointer to CIrlanControlEngine object.
+@param aSock A pointer to CInternalSocket object.
+*/
+void CIrlanSender::InitL(CIrlanControlEngine* aParent,CInternalSocket* aSock)
+{
+	iParent=aParent;
+	iDataSock=aSock;
+}
+
+/**
+Waits to read the data from the Queue.
+@param aPdu A reference to the packet to be sent (really an RMBufPkt)
+*/
+void CIrlanSender::QueueSend(RMBufChain& aPdu)
+{
+	if (iDataSock->Write(aPdu,NULL,iStatus,0)!=static_cast<TUint>(KErrNone))
+		IrlanUtil::Panic(EIrlanDataWrite);
+	SetActive();
+}
+
+/**
+Initiate sending for tha data.
+*/
+void CIrlanSender::KickSender()
+{
+	if (IsActive())
+		return;
+	else
+		SeeIfPacketToSend();
+}
+
+/**
+Check in Queue whether the packet to send.
+*/
+void CIrlanSender::SeeIfPacketToSend()
+{
+	RMBufChain pkt;
+	if (iParent->iDataSendQ.Remove(pkt))
+		{
+		QueueSend(pkt);
+		pkt.Free();
+		}
+}
+
+/**
+Handles an active object’s request completion event.
+*/
+void CIrlanSender::RunL()
+{
+	TInt ret=iStatus.Int();
+	if (ret!=KErrNone)
+		{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN	Data send failed with err=%d\r\n"),ret));
+#endif
+		iParent->HandleErrorL();
+		return;
+		}
+	SeeIfPacketToSend();
+}
+
+/**
+cancellation of an outstanding request.
+*/
+void CIrlanSender::DoCancel()
+{
+	iDataSock->CancelSend();
+}
+
+//############################ IrLAN Receiver ############################
+
+/**
+Constructor.
+*/
+CIrlanReceiver::CIrlanReceiver() : CActive(EIrlanReceiverPriority)
+{
+	__DECLARE_NAME(_S("CIrlanReceiver"));
+}
+
+/**
+Destructor.
+*/
+CIrlanReceiver::~CIrlanReceiver()
+{
+	DoCancel();
+}
+
+/**
+Create a new CIrlanReceiver object.
+@param aParent A pointer to CIrlanControlEngine object.
+@param aSock A pointer to CInternalSocket object.
+@return A pointer to CIrlanReceiver class.
+*/
+CIrlanReceiver* CIrlanReceiver::NewL(CIrlanControlEngine* aParent,CInternalSocket* aSock)
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN	CIrlanReceiver::NewL\r\n")));
+#endif
+	CIrlanReceiver *rv=new (ELeave) CIrlanReceiver;
+	CleanupStack::PushL(rv);
+	rv->InitL(aParent,aSock);
+	CActiveScheduler::Add(rv);
+	CleanupStack::Pop();
+	return rv;
+}
+
+/**
+Add the newly created object to an object container
+
+@param aParent A pointer to CIrlanControlEngine object.
+@param aSock A pointer to CInternalSocket object.
+*/
+void CIrlanReceiver::InitL(CIrlanControlEngine* aParent,CInternalSocket* aSock)
+{
+	iParent=aParent;
+	iDataSock=aSock;
+}
+
+/**
+Waits to read the data from the Queue.
+*/
+void CIrlanReceiver::QueueRead()
+{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN	QUEUEING WAIT FOR DATA\r\n")));
+#endif
+
+	iParent->iRecvBufPtr.SetLength(iParent->iRecvBufLength);
+	TInt ret;
+	ret = iDataSock->Recv(iParent->iRecvBufPtr,NULL,iStatus,0);
+	if (ret!=KErrNone)
+		{// what do we do here - panic?
+		IrlanUtil::Panic(EIrlanDataRead);
+		}
+	SetActive();
+}
+
+/**
+Handles an active object’s request completion event.
+*/
+void CIrlanReceiver::RunL()
+{
+	TInt ret=iStatus.Int();
+	if (ret!=KErrNone)
+		{
+#ifdef __TRACEWIN__
+	LOG(Log::Printf(_L("IRLAN	Data receive failed with err=%d\r\n"),ret));
+#endif
+		iParent->HandleErrorL();
+		return;
+		}
+	iParent->ProcessReceivedPacketL();
+	QueueRead();
+}
+
+/**
+cancellation of an outstanding request.
+*/
+void CIrlanReceiver::DoCancel()
+{
+	iDataSock->CancelRecv();
+}