diff -r 000000000000 -r f5a58ecadc66 servicediscoveryandcontrol/pnp/test/upnp/SocketHandler/src/csockethandler.cpp --- /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 +#include +#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; + }; + }