plugins/networking/winsockprt/inc/wsp_socket.h
changeset 0 7f656887cf89
--- /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 <winsock2.h>
+#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__