diff -r 000000000000 -r f5a58ecadc66 servicediscoveryandcontrol/pnp/test/upnp/SocketHandler/src/rsockethandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servicediscoveryandcontrol/pnp/test/upnp/SocketHandler/src/rsockethandler.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,236 @@ +// 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 "rsockethandler.h" +#include "csockethandler.h" + +/** +Constructor. +*/ +EXPORT_C RSocketHandler::RSocketHandler ( MSocketHandlerObserver& aObserver ) +: iObserver ( aObserver ) + { + } + +/** +Attaches to the open socket. + +@param aSocket. The open RInternalSocket. +*/ +EXPORT_C void RSocketHandler::Attach ( RInternalSocket& aSocket ) + { + CancelAll (); + iSocket = aSocket; + } + +/** +Connects to a remote host. + +@param aAddr. A remote destination address. +*/ +EXPORT_C void RSocketHandler::Connect ( const TSockAddr& aAddr ) + { + TSocketHandlerParams params ( EConnect, &aAddr ); + ActivateSocketHandler ( params ); + } + +/** +Facilitates a client/server connection from a remote socket. + +On successful completion a new connected socket is returned to the socket handler observer +and it may then be used to transfer data. +@param: void. +@return: void +*/ +EXPORT_C void RSocketHandler::Accept () + { + TSocketHandlerParams params( EAccept ); + ActivateSocketHandler ( params ); + } + +/** +Sends data to remote host on a connected socket. + +@param aData. The data to be sent. +*/ +EXPORT_C void RSocketHandler::Send ( RMBufChain& aData ) + { + TSocketHandlerParams params ( EMBufSend, &aData ); + ActivateSocketHandler ( params ); + } + +/** +Sends data to remote host on a unconnected socket. + +@param aData. The data to be sent. +@param aAddr. A remote destination address +*/ +EXPORT_C void RSocketHandler::SendTo ( const RMBufChain& aData, TSockAddr& aAddr ) + { + TSocketHandlerParams params ( EMBufSendTo, &aData, &aAddr ); + ActivateSocketHandler ( params ); + } + +/** +Receives data from a remote host. +*/ +EXPORT_C void RSocketHandler::Recv () + { + TSocketHandlerParams params ( ERecv ); + ActivateSocketHandler ( params ); + + } + +/** +Receives data from a remote host through a unconnected socket and returns a source address. +*/ +EXPORT_C void RSocketHandler::RecvFrom () + { + TSocketHandlerParams params ( ERecvFrom ); + ActivateSocketHandler ( params ); + + } + +/** +Sends data to remote host on a connected socket. + +@param aData. The data to be sent. + +EXPORT_C void RSocketHandler::Send ( const TDesC8& aData ) + { + TSocketHandlerParams params ( EDescSend, &aData ); + ActivateSocketHandler ( params ); + + } + +Sends data to remote host on a unconnected socket. + +@param aData. The data to be sent. +@param aAddr. A remote destination address + +EXPORT_C void RSocketHandler::SendTo ( const TDesC8& aData, TSockAddr& aAddr ) + { + TSocketHandlerParams params ( EDescSendTo, &aData, &aAddr ); + ActivateSocketHandler ( params ); + } + + +Applies an asynchronous I/O control operation on a socket. + +@param aCommand. Ioctl command. + +EXPORT_C void RSocketHandler::Ioctl ( TUint aCommand, TDes8* aData = 0 , TUint aLevel = KLevelUnspecified ) + { + TSocketHandlerParams params ( EIoctl, aCommand, aData, aLevel ); + ActivateSocketHandler ( params ); + } + + +Cancels an outstanding socket operation. + +@param aOperation. Operation to be cancelled. + +EXPORT_C void RSocketHandler::Cancel ( TOperation aOperation ) + { + CSocketHandler* handler = ActiveSocketHandler ( aOperation ); + if ( handler ) + handler->Cancel (); + } +*/ + +/** +Cancels all outstanding operations. +*/ +EXPORT_C void RSocketHandler::CancelAll () + { + // The descrtrutor of CSocketHandler will take care of cancel + iSocketHandlers.ResetAndDestroy (); + } + +/** +Finds the first free socket handler to perform the socket operation and if none +available it creates a new socket handler. + +@param aOperation. Socket operation to be performed. +@return A free socket handler to perform the socket operation. +*/ +CSocketHandler* RSocketHandler::FreeSocketHandler ( TOperation aOperation ) + { + CSocketHandler* freeHandler = ActiveSocketHandler ( aOperation ); + if ( freeHandler == NULL ) + { + // No active socket handlers for this operation + // Find the first free one + for ( TInt i = 0; i < iSocketHandlers.Count(); ++i ) + { + if ( ( iSocketHandlers[i]->IsRunning ( aOperation ) ) ) + { + return iSocketHandlers[i]; + } + } + // None available. Create one, append to the array and return + CSocketHandler* handler = new CSocketHandler ( iSocket, iObserver ); + if ( handler != NULL ) + { + iSocketHandlers.Append ( handler ); + return handler; + } + } + else if ( freeHandler->IsRunning ( aOperation ) ) + { + __ASSERT_DEBUG ( 1, User::Invariant () ); + } + + return freeHandler; + } + +/** +Finds an active socket handler which matches the socket operation. + +@param aOperation. Socket operation to be performed. +@return A free socket handler to perform the socket operation. +*/ +CSocketHandler* RSocketHandler::ActiveSocketHandler ( TOperation aOperation ) + { + // Find the active socket handler. + for ( TInt i = 0; i < iSocketHandlers.Count(); ++i ) + { + if ( (iSocketHandlers[i]->IsRunning ( aOperation )) ) + { + return iSocketHandlers[i]; + } + } + return NULL; + } + +/** +Finds or creates a socket handler which matches the socket operation and +submits the request to socket handler. + +@param aParams. Socket operation parameters. +*/ +void RSocketHandler::ActivateSocketHandler ( TSocketHandlerParams& aParams ) + { + TOperation op = static_cast < TOperation > ( aParams.iArgs[0] ); + CSocketHandler* handler = FreeSocketHandler ( op ); + if ( handler == NULL ) + { + // Possibly failed due to nomemory. + iObserver.Error ( op, KErrNoMemory ); + return; + } + handler->Activate ( aParams ); + }