diff -r 000000000000 -r 7f656887cf89 plugins/networking/winsockprt/inc/wsp_socket.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/networking/winsockprt/inc/wsp_socket.h Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,175 @@ +// wsp_socket.h +// +// Copyright (c) 2002 - 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "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: +// Accenture - Initial contribution +// + +#ifndef __WSP_SOCKET_H__ +#define __WSP_SOCKET_H__ + +#include +#include "wsp_subsession.h" + + +class RWin32Factory; +class TInetAddr; + +class RWin32Socket : public RWin32SubSession + { +public: + enum TType + { + EBlank, + ETcp, + EUdp + }; +public: + TInt Open(RWin32Factory& aFactory, TType aType); + void Close(); + TInt Connect(const TInetAddr& aAddress, TRequestStatus& aStatus); + void CancelConnect(); + TInt Send(const TDesC8& aSendBuffer, TRequestStatus& aStatus); + void CancelSend(); + TInt SendTo(const TDesC8& aSendBuffer, const TInetAddr& aAddress, TRequestStatus& aStatus); + void CancelSendTo(); + TInt Receive(TDes8& aReceiveBuffer, TRequestStatus& aStatus); + void CancelReceive(); + TInt ReceiveFrom(TDes8& aReceiveBuffer, TInetAddr& aAddress, TRequestStatus& aStatus); + void CancelReceiveFrom(); + TInt GetSocketName(TInetAddr& aAddress) const; + TInt GetPeerName(TInetAddr& aAddress) const; + TInt Bind(const TInetAddr& aAddress); + TInt Listen(TUint aQueueSize); + TInt Accept(RWin32Socket& aNewSocket, TRequestStatus& aStatus); + void CancelAccept(); + TInt GetOption(TInt aLevel, TInt aName, char* aValue, TInt* aLength) const; + TInt SetOption(TInt aLevel, TInt aName, const char* aValue, TInt aLength); + }; + + +class CWin32Socket : public CWin32SubSession + { +public: + enum TOppCode + { + EConnect, + ECancelConnect, + ESend, + ECancelSend, + ESendTo, + ECancelSendTo, + EReceive, + ECancelReceive, + EReceiveFrom, + ECancelReceiveFrom, + EGetSocketName, + EBind, + EGetPeerName, + EListen, + EAccept, + ECancelAccept, + EGetOption, + ESetOption + }; +public: + static CWin32Socket* NewL(CWin32Scheduler& aScheduler, RWin32Socket::TType aType); + virtual ~CWin32Socket(); +private: // From CWin32ActiveObject. + virtual void Run(); +private: // From CWin32SubSession. + virtual void ServiceL(TWin32Message& aMessage); +private: + CWin32Socket(CWin32Scheduler& aScheduler, RWin32Socket::TType aType); + void ConstructL(); + void Connect(TWin32Message& aMessage); + void Send(TWin32Message& aMessage); + void SendTo(TWin32Message& aMessage); + void Receive(TWin32Message& aMessage); + void ReceiveFrom(TWin32Message& aMessage); + void GetSocketName(TWin32Message& aMessage) const; + void Bind(TWin32Message& aMessage); + void GetPeerName(TWin32Message& aMessage) const; + void Listen(TWin32Message& aMessage); + void Accept(TWin32Message& aMessage); + void GetOption(TWin32Message& aMessage) const; + void SetOption(TWin32Message& aMessage); + void DoSend(); + void CloseSocket(); + void HandleConnectionComplete(TInt aError); + void HandleAcceptReady(TInt aError); + static void CALLBACK SendCompletion(DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags); + static void CALLBACK SendToCompletion(DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags); + static void CALLBACK ReceiveCompletion(DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags); + static void CALLBACK ReceiveFromCompletion(DWORD dwError, DWORD cbTransferred, LPWSAOVERLAPPED lpOverlapped, DWORD dwFlags); + void ConvertAddress(const TInetAddr& aESockAddress, SOCKADDR_IN& aWinSockAddress) const; + void ConvertAddress(const SOCKADDR_IN& aWinSockAddress, TInetAddr& aESockAddress) const; +private: + RWin32Socket::TType iType; + SOCKET iSocket; + unsigned long iFlags; + WSABUF iSendBuffer; + WSABUF iReceiveBuffer; + WSAOVERLAPPED iSendOverlapped; + WSAOVERLAPPED iReceiveOverlapped; + SOCKADDR_IN iReceiveFromAddress; + TInt iReceiveFromAddressLength; + TInetAddr* iReceiveFromClientAddress; + TInt iBytesSent; + TWin32Message* iConnectMessage; + TWin32Message* iSendMessage; + TWin32Message* iReceiveMessage; + TWin32Message* iAcceptMessage; + CWin32Socket* iBlankAcceptSocket; + }; + + +class MWin32SocketObserver + { +public: + enum TRequestType + { + ENone, + EConnect, + ESend, + ESendTo, + EReceive, + EReceiveFrom, + EAccept + }; +public: + virtual void HandleWin32SocketCompletion(TRequestType aRequestType, TInt aError) = 0; + }; + + +class CWin32SocketWrapper : public CActive + { +public: + static CWin32SocketWrapper* NewL(MWin32SocketObserver& aObserver, RWin32Socket& aWin32Socket); + ~CWin32SocketWrapper(); + TInt Connect(const TInetAddr& aAddress); + TInt Send(const TDesC8& aSendBuffer); + TInt SendTo(const TDesC8& aSendBuffer, const TInetAddr& aAddress); + TInt Receive(TDes8& aReceiveBuffer); + TInt ReceiveFrom(TDes8& aReceiveBuffer, TInetAddr& aAddress); + TInt Accept(RWin32Socket& aNewSocket); +private: // From CActive. + virtual void DoCancel(); + virtual void RunL(); + virtual TInt RunError(TInt aError); +public: + CWin32SocketWrapper(MWin32SocketObserver& aObserver, RWin32Socket& aWin32Socket); + void ConstructL(); +private: + MWin32SocketObserver& iObserver; + RWin32Socket iWin32Socket; // Shallow copy to give each a unique TWin32Message object. + MWin32SocketObserver::TRequestType iRequestType; + }; + + +#endif // __WSP_SOCKET_H__