telephonyprotocols/rawipnif/src/Receiver.cpp
changeset 23 6b1d113cdff3
parent 0 3553901f7fa8
child 24 6638e7f4bd8f
child 31 8ab6687fb94c
child 44 8b72faa1200f
--- a/telephonyprotocols/rawipnif/src/Receiver.cpp	Fri Apr 16 16:12:37 2010 +0300
+++ b/telephonyprotocols/rawipnif/src/Receiver.cpp	Mon May 03 13:37:20 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2002-2010 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"
@@ -23,7 +23,10 @@
 #include "Constants.h"
 #include <es_ini.h>
 
-CReceiver::CReceiver(CBcaIoController& aObserver, CBttLogger* aTheLogger, TInt aMaxPacketSise)
+const TUint KBufferIncreaseStep=500;
+const TUint K64k=65535;
+
+CReceiver::CReceiver(CBcaIoController& aObserver, CBttLogger* aTheLogger, TUint aMaxPacketSize)
 /**
  * Constructor. Performs standard active object initialisation.
  *
@@ -33,12 +36,12 @@
 	: CActive(EPriorityHigh), 
 	  iObserver(aObserver), 
 	  iTheLogger(aTheLogger),
-	  iMaxPacketSise(aMaxPacketSise)
+	  iMaxPacketSize(aMaxPacketSize)
 	{	
 	CActiveScheduler::Add(this);
 	}
 
-CReceiver* CReceiver::NewL(CBcaIoController& aObserver, CBttLogger* aTheLogger, TInt aMaxPacketSise)
+CReceiver* CReceiver::NewL(CBcaIoController& aObserver, CBttLogger* aTheLogger, TUint aMaxPacketSize)
 /**
  * Two-phase constructor. Creates a new CBcaIoController object, performs 
  * second-phase construction, then returns it.
@@ -48,7 +51,7 @@
  * @return A newly constructed CBcaIoController object
  */
 	{
-	CReceiver* self = new (ELeave) CReceiver(aObserver, aTheLogger, aMaxPacketSise);
+	CReceiver* self = new (ELeave) CReceiver(aObserver, aTheLogger, aMaxPacketSize);
 	CleanupStack::PushL(self);
 	self->ConstructL();
 	CleanupStack::Pop(self);
@@ -61,7 +64,7 @@
  */
 	{
 	_LOG_L1C1(_L8("CReceiver::ConstructL"));
-	iData.CreateL(iMaxPacketSise);
+	iData.CreateL(iMaxPacketSize);
 	}
 
 CReceiver::~CReceiver()
@@ -81,14 +84,32 @@
 	{
 	_LOG_L1C2(_L8("CReceiver::RunL [iStatus=%d]"), iStatus.Int());
 
-	if (iStatus!=KErrNone)
+	if (iStatus != KErrNone)
 		{
-		if(iStatus == KErrNoMemory)
+		if (iStatus == KErrNoMemory)
 			{
 			_LOG_L2C1(
-				_L8("WARNING! CReceiver: Read failed with KErrNoMemory"));
-			// Read operation failed!! Nif will re-issue the read request.
-			StartListening();
+				_L8("WARNING! CReceiver: Read failed with KErrNoMemory. Increase buffer."));
+			// Read operation failed!! Nif will re-issue the read request. Increase buffer.			
+			if ((iMaxPacketSize + KBufferIncreaseStep) > K64k)
+			    {
+			    // In theory IP packet can't be bigger than 64k, so if we come here something is wrong so stop observer. 
+                iObserver.Stop(KErrNoMemory);
+			    }
+			else
+			    {
+                iMaxPacketSize += KBufferIncreaseStep;
+                TInt err = iData.ReAlloc(iMaxPacketSize);
+                if (KErrNoMemory == err)
+                    {                
+                    iObserver.Stop(KErrNoMemory);
+                    }
+                else
+                    {
+                    (iObserver.Bca())->Read(iStatus, iData);    
+                    SetActive();
+                    }
+			    }
 			}
 		else 
 			{
@@ -97,24 +118,29 @@
 			}
 		return;
 		}
-
-	_LOG_L1C1(_L8("CReceiver: Data Packet Received"));
-
-    iRMBufPacket.CreateL(iData);
-    iRMBufPacket.Pack();
-
-    // Immediately execute new read request.
-    StartListening();
-
+	else
+	    {
+        _LOG_L1C1(_L8("CReceiver: Data Packet Received"));
+    
+        iRMBufPacket.CreateL(iData);
+        
+        // Immediately execute new read request.
+        (iObserver.Bca())->Read(iStatus, iData);
+    
+        SetActive();
+        
+        iRMBufPacket.Pack();
+    
 #ifdef RAWIP_HEADER_APPENDED_TO_PACKETS
-    TUint16 protocolCode = iObserver.RemoveHeader(iRMBufPacket);
+        TUint16 protocolCode = iObserver.RemoveHeader(iRMBufPacket);
 #else
-    TUint16 protocolCode = 0;
+        TUint16 protocolCode = 0;
 #endif // RAWIP_HEADER_APPENDED_TO_PACKETS
-
-    // Process the packet
-    iObserver.GetObserver().Process(iRMBufPacket, protocolCode);
-    iRMBufPacket.Free();
+    
+        // Process the packet
+        iObserver.GetObserver().Process(iRMBufPacket, protocolCode);
+        iRMBufPacket.Free();
+	    }
 	}
 
 void CReceiver::DoCancel()