servicediscoveryandcontrol/pnp/test/upnp/SocketHandler/src/csockethandler.cpp
changeset 0 f5a58ecadc66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servicediscoveryandcontrol/pnp/test/upnp/SocketHandler/src/csockethandler.cpp	Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,281 @@
+// Copyright (c) 2008-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:
+//
+
+
+#include <in_sock.h>
+#include <eintsock.h>
+#include "rsockethandler.h"
+#include "csockethandler.h"
+
+
+
+const TInt KDefaultFlags = 0;
+/**
+Constructor.
+*/
+CSocketHandler::CSocketHandler ( RInternalSocket& aSocket, MSocketHandlerObserver& aObserver )
+: CActive ( EPriorityStandard ),
+	iSocket ( aSocket ),
+  iObserver ( aObserver )
+	{
+	CActiveScheduler::Add(this);	
+	}
+
+CSocketHandler::CSocketHandler ( MSocketHandlerObserver& aObserver )
+: CActive ( EPriorityNormal ),
+iObserver ( aObserver )
+	{
+	CActiveScheduler::Add(this);
+	}
+
+/** 
+Destructor.
+*/
+CSocketHandler::~CSocketHandler ()
+	{
+	Cancel ();		
+	}
+
+/**
+Starts a socket operation on RInternalSocket.
+
+@param aParams. Socket operation parameters.
+*/
+void CSocketHandler::Activate ( const TSocketHandlerParams& aParams )
+	{
+	iOperation = static_cast < TOperation > ( aParams.iArgs[0] );
+	TInt err = KErrNone;
+	switch ( iOperation )
+		{
+		case EConnect:
+			{
+			TSockAddr* addr = reinterpret_cast < TSockAddr* > ( aParams.iArgs[1] );
+			iSocket.Connect ( *addr, iStatus );
+			}
+		break;
+		
+		case EAccept:
+			{
+			err = iAcceptingSocket.Open ();
+			iSocket.Accept ( iAcceptingSocket, iStatus );
+			}
+		break;
+		
+		case EMBufSend:
+			{
+			iBufChain.Init ( );
+			RMBufChain* bufChain = reinterpret_cast < RMBufChain* > ( aParams.iArgs[1] );
+			iLength = 0;
+			iSocket.Send ( *bufChain, KDefaultFlags, iStatus, iLength );
+			}
+		break;
+		
+/*		case EOpenByName:
+			{
+			const TDesC* buf = reinterpret_cast < const TDesC* > ( aParams.iArgs[1] );
+			iSocket.Open ( *buf, iStatus );
+			}
+		break;
+				
+		case EDescSend:
+			{
+			const TDesC8* buf = reinterpret_cast < const TDesC8* > ( aParams.iArgs[1] );
+			iSocket.Send ( *buf, KDefaultFlags, iStatus );
+			}
+		break;
+		
+		case EDescSendTo:
+			{
+			const TDesC8* buf = reinterpret_cast < const TDesC8* > ( aParams.iArgs[1] );
+			iSockAddr = *(reinterpret_cast < TSockAddr* > ( aParams.iArgs[2] ));
+			iSocket.SendTo ( *buf, iSockAddr, KDefaultFlags, iStatus );
+			}
+		break; 
+		
+*/		case EMBufSendTo:
+			{
+			iBufChain.Init ( );
+			iBufChain = *(reinterpret_cast < RMBufChain* > ( aParams.iArgs[1] ));
+			iSockAddr = *(reinterpret_cast < TSockAddr* > ( aParams.iArgs[2] ));
+			iLength = 0;
+			iSocket.SendTo ( iBufChain, iSockAddr, KDefaultFlags, iStatus, iLength );
+			}
+		break;
+
+		case ERecv:
+			{
+			iBufChain.Init ( );
+			iSocket.Recv ( iBufChain, KDefaultFlags, iStatus );
+			}
+		break;
+
+		case ERecvFrom:
+			{
+			iBufChain.Init ();
+			iSocket.RecvFrom ( iBufChain, iSockAddr, KDefaultFlags, iStatus );
+			}
+		break;
+
+		case EOpenByProtocol:
+			{
+			TUint addrFamily = static_cast < TUint> ( aParams.iArgs[1] );	
+			TUint sockType = static_cast < TUint> ( aParams.iArgs[2] );				
+			TUint prot = static_cast < TUint> ( aParams.iArgs[3] );
+			iSocket.Open ( addrFamily, sockType, prot, iStatus );
+			}
+		break;
+
+		default:
+			User::Invariant ();
+		};
+		
+	if ( KErrNone == err )
+		{
+		SetActive();
+		}
+	else
+		{
+		CompleteSelf ( err );
+		}
+	}
+
+void CSocketHandler::CompleteSelf ( TInt aError )
+	{
+    TRequestStatus* pStat = &iStatus;
+    User::RequestComplete ( pStat, aError );
+	SetActive ( );
+    }
+	
+/**
+Handles this idle active object's request completion event.
+*/
+void CSocketHandler::RunL ()
+	{
+	TInt err = iStatus.Int ();
+	if ( err == KErrNone )
+		{
+		NotifyCompletion ();
+		}
+	else
+		{
+		iObserver.Error ( iOperation, err );
+		}
+	}
+
+/**
+Cancellation of an outstanding request.
+*/
+void CSocketHandler::DoCancel ()
+	{
+	CancelCurrent ();
+	}
+	
+void CSocketHandler::NotifyCompletion ( )
+	{
+	switch ( iOperation )
+		{
+		case EConnect:
+			{
+			iObserver.ConnectComplete();
+			}
+		break;
+		
+		case EAccept:
+			{
+			iObserver.AcceptComplete( iAcceptingSocket );
+			RInternalSocket sock;
+			iAcceptingSocket = sock;
+			}
+		break;
+		
+//		case EDescSend:
+		case EMBufSend:	
+			{
+			iObserver.SendComplete( iLength() );
+			}
+		break;
+
+//		case EDescSendTo:
+		case EMBufSendTo:
+			{
+			iObserver.SendToComplete( iLength() );
+			}
+		break;
+			
+		case ERecv:		
+			{
+			iObserver.RecvComplete( iBufChain );
+			}
+		break;
+		
+		case ERecvFrom:
+			{
+			iObserver.RecvFromComplete( iBufChain, iSockAddr );
+			}
+		break;
+
+		case EOpenByProtocol:
+//		case EOpenByName:
+			{
+			iObserver.OpenComplete(iSocket);
+			}
+		break;
+		
+/*		case EIoctl:
+			iObserver.IoctlComplete();
+		break;				
+*/		 
+		};
+	}
+
+/**
+Determines whether the socket handler has a request outstanding
+*/
+TBool CSocketHandler::IsRunning ( TOperation aOperation )
+	{
+	return ( IsActive() && ( aOperation == iOperation  ) );
+	}
+
+void CSocketHandler::CancelCurrent ()
+	{
+	switch ( iOperation )
+		{
+		case EConnect:
+			iSocket.CancelConnect ();
+		break;
+		
+		case EAccept:
+			iSocket.CancelAccept ();
+			iAcceptingSocket.Close ();
+		break;
+		
+//		case EDescSend:
+		case EMBufSend:	
+//		case EDescSendTo:
+		case EMBufSendTo:
+			iSocket.CancelSend ();
+		break;
+
+		case ERecv:
+		case ERecvFrom:
+			iSocket.CancelRecv ();
+		break;
+
+		case EOpenByProtocol:
+//		case EOpenByName:
+			iSocket.Close (); 
+		break;	
+		};
+	}