nettools/conntest/probe/src/sap.cpp
changeset 0 857a3e953887
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nettools/conntest/probe/src/sap.cpp	Thu Dec 17 08:39:25 2009 +0200
@@ -0,0 +1,188 @@
+/*
+* Copyright (c) 2002-2006 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: Packet probe hook
+*
+*/
+
+#include "sap.h"
+
+
+CProviderProbe::CProviderProbe(CProtocolProbe* aProtocol) : iProtocol(aProtocol)
+	{
+//	__DECLARE_NAME(_S("CProviderProbe"));
+	iQueueLimit = 8000;
+	}
+
+CProviderProbe::~CProviderProbe()
+	{
+	if (iProtocol)
+		iProtocol->CancelSAP(this);
+	}
+
+void CProviderProbe::Start()
+	{
+	}
+
+TInt CProviderProbe::GetOption(TUint /*aLevel*/, TUint /*aName*/, TDes8& /*aOption*/) const
+	{
+	return KErrNotSupported;
+	}
+
+TInt CProviderProbe::SetOption(TUint /*aLevel*/, TUint /*aName*/, const TDesC8& /*aOption*/)
+	{
+//	return KErrNotSupported;
+	return KErrNone;
+	}
+
+void CProviderProbe::Ioctl(TUint /*level*/,TUint /*name*/,TDes8* /*anOption*/)
+	{
+	Panic(EProbePanic_NotSupported);
+	}
+
+void CProviderProbe::CancelIoctl(TUint /*aLevel*/,TUint /*aName*/)
+	{
+	Panic(EProbePanic_NotSupported);
+	}
+
+
+TUint CProviderProbe::Write(const TDesC8 &/*aDesc*/, TUint /*aOptions*/, TSockAddr* /*aAddr*/)
+	{
+	// For now, Write does nothing on probe socket
+	return 1;
+	}
+
+void CProviderProbe::Shutdown(TCloseType /*option*/,const TDesC8& /*aDisconnectionData*/)
+	{
+	Panic(EProbePanic_NotSupported);
+	}
+
+void CProviderProbe::Shutdown(TCloseType aOption)
+	{
+	switch(aOption)
+		{
+		case EStopInput:
+			iInputStopped = ETrue;
+			iRecvQ.Free();
+			iSocket->Error(KErrNone,MSocketNotify::EErrorClose); // Complete KErrNone
+			break;
+
+		case EStopOutput:
+			iSocket->Error(KErrNone,MSocketNotify::EErrorClose); // Complete KErrNone
+			break;
+
+		default:
+	        if (aOption != EImmediate)
+				iSocket->CanClose();
+		}
+	}
+
+TInt CProviderProbe::SetLocalName(TSockAddr &/*aAddr*/)
+	{
+	return 0;	// Ignore silently
+	}
+
+void CProviderProbe::AutoBind()
+	{
+	// Ignore silently
+	}
+
+// CProviderProbe::Error
+// *********************
+// Soft errors are not immediately reported to the socket server.
+// A soft error is indicated by a zero aOperationMask.
+//
+// The socket error can be cleared by calling this routing with
+// aError == KErrNone.
+//
+void CProviderProbe::Error(TInt aError, TUint aOperationMask)
+	{
+	if (aError <= KErrNone && !FatalState())
+		{
+		if (aError == KErrNone)
+			iErrorMask = aOperationMask;
+		else
+			iErrorMask |= aOperationMask;
+	    if (iSocket && aOperationMask)
+			iSocket->Error(aError, aOperationMask);
+		}
+	}
+
+//
+// CProviderProbe::Process()
+// *************************
+// Process incoming data from the protocol object.
+//
+void CProviderProbe::Process(RMBufChain& aPacket, CProtocolBase * /*aSourceProtocol*/)
+	{
+	// iInputStopped is set at ShutDown() and no packets should be coming
+	// from the protocol after that. However, without knowing the exact
+	// details of the process model/threads, it could be possible that
+	// a Process() call has been initiated by the protocol and interrupted
+	// before the shutdown, thus there may be a need for this iInputStopped
+	// flag, although I would prefer to do without... NEED TO VERIFY IF
+	// iInputStopped is really needed!!! -- msa
+	//
+	if(!(iInputStopped ||
+		(iErrorMask & (MSocketNotify::EErrorFatal|MSocketNotify::EErrorConnect|MSocketNotify::EErrorRecv))))
+		{
+		iQueueLimit -= RMBufPacketBase::PeekInfoInChain(aPacket)->iLength;
+		iRecvQ.Append(aPacket);
+		iSocket->NewData(1);
+		}
+	else
+		aPacket.Free();
+	}
+
+// CProviderProbe::IsReceiving
+// ***************************
+//
+TBool CProviderProbe::IsReceiving(const RMBufPktInfo & /*aInfo*/)
+	{
+	if (iQueueLimit < 0)
+		{
+		// Receive Queue limit is full, cannot receive this packet
+		iPacketsDropped++;
+		return FALSE;
+		}
+	return TRUE;
+	}
+
+
+// CProviderProbe::GetData
+// ***********************
+void CProviderProbe::GetData(TDes8 &aDesc, TUint aOptions, TSockAddr *anAddr)
+	{
+	RMBufPacketBase packet;
+	if (!iRecvQ.Remove(packet))
+		Panic(EProbePanic_NoData);
+
+	const RMBufPktInfo *const info = packet.Unpack();
+
+	packet.CopyOut(aDesc, 0);
+
+	if (anAddr!=NULL)
+		*anAddr = info->iSrcAddr;
+
+	if (aOptions & KSockReadPeek)
+		{
+		packet.Pack();
+		iRecvQ.Prepend(packet);
+		iSocket->NewData(1);
+		}
+	else
+		{
+		iQueueLimit += info->iLength; // Allow more packets in..
+		packet.Free();
+		}
+	}