realtimenetprots/sipfw/SIP/ConnectionMgr/src/CReceiverTcp.cpp
changeset 0 307788aac0a8
child 17 654ed625511d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/CReceiverTcp.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,249 @@
+// Copyright (c) 2002-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:
+// Name          : CReceiverTcp.cpp
+// Part of       : ConnectionMgr
+// Version       : SIP/4.0 
+//
+
+
+
+
+#include "CReceiverTcp.h"
+#include "SipLogs.h"
+#include "CSipConnection.h"
+#include "MContext.h"
+#include "CErrorHandler.h"
+#include "CSIPMsgAssembler.h"
+#include "CSocketContainer.h"
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::NewL
+// -----------------------------------------------------------------------------
+//
+CReceiverTcp* CReceiverTcp::NewL(MContext& aContext)
+	{
+	CReceiverTcp* self = NewLC(aContext);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::NewLC
+// -----------------------------------------------------------------------------
+//
+CReceiverTcp* CReceiverTcp::NewLC(MContext& aContext)
+	{
+	CReceiverTcp* self = new (ELeave) CReceiverTcp(aContext);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;	
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CReceiverTcp::ConstructL()
+	{
+	iNextLength = CSIPMsgAssembler::EMsgBufferSize;
+	CActiveScheduler::Add(this);
+	iMsgAssembler = CSIPMsgAssembler::NewL(*this, *iContext.SigCompHandler());
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::RunL
+// -----------------------------------------------------------------------------
+//
+void CReceiverTcp::RunL()
+	{
+	TInt status( iStatus.Int() );
+	
+	TBool disconnected( EFalse );
+	
+	switch ( iReceiverState )
+	    {
+	    case EConnecting:
+	        {
+	        if ( status == KErrNone )
+    			{
+    			iReceiverState = EConnected;
+    			
+    			if ( iContext.ConnectionOpenL() )
+    			    {
+    			    // Context allowed receiving after connection was established
+    			    ReceiveDataL();
+    			    }
+    			}
+    		else
+    			{
+    			disconnected = ETrue;
+    			}
+	        break;
+	        }
+	    case EShuttingDown:
+	        {
+	        disconnected = ETrue;
+	        break;
+	        }
+	    default: // EIdle, EConnected
+	        {
+	        if ( status == KErrEof )
+    			{
+    			disconnected = ETrue;
+    			}
+    		if ( status == KErrNone )
+    			{
+    			__SIP_MESSAGE_LOG( "Connection Manager::ReceivedFromNetwork",
+    							   *iReceivedMsg )
+    			__SIP_DES8_LOG( "Received data via TCP", *iReceivedMsg )
+    			
+    			iMsgAssembler->InputL( iReceivedMsg, iNextLength );
+    			iReceivedMsg = 0; // Ownership was transferred to assembler	
+    			
+    			ReceiveDataL(); // May lead to self deletion
+    			}
+	        break;
+	        }
+	    }
+	    
+	if ( disconnected )
+	    {
+	    __SIP_INT_LOG1( "TCP connection disconnected, status:", status )
+	    
+	    iContext.DisconnectedL(); // Leads to self deletion
+	    }
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::MessageCompleteL
+// -----------------------------------------------------------------------------
+//
+void CReceiverTcp::MessageCompleteL(CSIPMessage* aSIPMessage,
+									TInt aError,
+									TBool aCompressed)
+	{
+	TInetAddr addr;
+	iContext.SocketContainer().RemoteName(addr);
+	iContext.ReceivedDataL(aSIPMessage, addr, aError, aCompressed);
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CReceiverTcp::DoCancel()
+	{
+	if ( iReceiverState == EConnected )
+		{
+		iContext.SocketContainer().CancelRecv();
+		}
+	else
+		{
+		iContext.SocketContainer().Socket().CancelAll();
+		}
+	RemoveReceived();
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CReceiverTcp::RunError(TInt /*aError*/)
+	{
+	return iContext.Remove();
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::ReceiveDataL
+// -----------------------------------------------------------------------------
+//
+void CReceiverTcp::ReceiveDataL()
+	{
+	if (!IsActive())
+		{
+		RemoveReceived();
+
+		// Trying to allocate KMaxTInt/2 or more bytes causes panic
+		__ASSERT_ALWAYS( iNextLength < KMaxTInt/2, User::Leave(KErrOverflow) );
+
+		iReceivedMsg = HBufC8::NewL(iNextLength);
+		iReceivedMsgPtr.Set(iReceivedMsg->Des());
+		iContext.SocketContainer().RecvOneOrMore(iReceivedMsgPtr,
+                                                 0,
+                                                 iStatus,
+                                                 iSockLenght);
+		SetActive();
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::Connect
+// -----------------------------------------------------------------------------
+//
+void CReceiverTcp::Connect(TInetAddr& aRemoteAddr)
+	{
+	if(!IsActive())
+		{
+		iContext.SocketContainer().Connect(aRemoteAddr, iStatus);
+		iReceiverState = EConnecting;
+		SetActive();
+		}
+	}
+	
+// -----------------------------------------------------------------------------
+// CReceiverTcp::Shutdown
+// -----------------------------------------------------------------------------
+//
+void CReceiverTcp::Shutdown()
+	{
+	Cancel();
+	iContext.SocketContainer().Socket().Shutdown( RSocket::ENormal, iStatus );
+	iReceiverState = EShuttingDown;
+	SetActive();
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::~CReceiverTcp
+// -----------------------------------------------------------------------------
+//
+CReceiverTcp::~CReceiverTcp()
+	{
+	Cancel();
+	RemoveReceived();
+	delete iMsgAssembler;
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::CReceiverTcp
+// -----------------------------------------------------------------------------
+//
+CReceiverTcp::CReceiverTcp(MContext& aContext) :
+	CActive(CActive::EPriorityStandard),
+	iContext(aContext),
+	iReceivedMsgPtr(0,0,0),
+	iReceiverState( EIdle )
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CReceiverTcp::RemoveReceived
+// -----------------------------------------------------------------------------
+//	
+void CReceiverTcp::RemoveReceived()
+    {
+    delete iReceivedMsg;
+    iReceivedMsg = 0;
+    }
+    
+// End of file