1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2002-2011 Merkur ( devs@emule-project.net / http://www.emule-project.net )
6 //
7 // Any parts of this program derived from the xMule, lMule or eMule project,
8 // or contributed by third-party developers are copyrighted by their
9 // respective authors.
10 //
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
24 //
25 
26 #ifndef EMSOCKET_H
27 #define EMSOCKET_H
28 
29 #include "EncryptedStreamSocket.h"				// Needed for CEncryptedStreamSocket
30 
31 #include "ThrottledSocket.h"	// Needed for ThrottledFileSocket
32 
33 class CPacket;
34 
35 #define ERR_WRONGHEADER		0x01
36 #define ERR_TOOBIG			0x02
37 
38 #define	ES_DISCONNECTED		0xFF
39 #define	ES_NOTCONNECTED		0x00
40 #define	ES_CONNECTED		0x01
41 
42 
43 const uint32 PACKET_HEADER_SIZE	= 6;
44 
45 
46 class CEMSocket : public CEncryptedStreamSocket, public ThrottledFileSocket
47 {
48 public:
49 	CEMSocket(const CProxyData *ProxyData = NULL);
50 	virtual ~CEMSocket();
51 
52 	virtual void	SendPacket(CPacket* packet, bool delpacket = true, bool controlpacket = true, uint32 actualPayloadSize = 0);
IsConnected()53 	bool	IsConnected() { return byConnected==ES_CONNECTED;};
GetConState()54 	uint8	GetConState()	{return byConnected;}
55 	void	SetDownloadLimit(uint32 limit);
56 	void	DisableDownloadLimit();
57 
58 	virtual uint32	GetTimeOut() const;
59 	virtual void	SetTimeOut(uint32 uTimeOut);
60 
GetLastCalledSend()61     uint32	GetLastCalledSend() { return lastCalledSend; }
62 
63     uint64	GetSentBytesCompleteFileSinceLastCallAndReset();
64     uint64	GetSentBytesPartFileSinceLastCallAndReset();
65     uint64	GetSentBytesControlPacketSinceLastCallAndReset();
66     uint64	GetSentPayloadSinceLastCallAndReset();
67     void	TruncateQueues();
68 
SendControlData(uint32 maxNumberOfBytesToSend,uint32 minFragSize)69     virtual SocketSentBytes SendControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize) { return Send(maxNumberOfBytesToSend, minFragSize, true); };
SendFileAndControlData(uint32 maxNumberOfBytesToSend,uint32 minFragSize)70     virtual SocketSentBytes SendFileAndControlData(uint32 maxNumberOfBytesToSend, uint32 minFragSize) { return Send(maxNumberOfBytesToSend, minFragSize, false); };
71 
72     uint32	GetNeededBytes();
73 
74 	//protected:
75 	// these functions are public on our code because of the amuleDlg::socketHandler
OnError(int WXUNUSED (nErrorCode))76 	virtual void	OnError(int WXUNUSED(nErrorCode)) { };
77 	virtual void	OnSend(int nErrorCode);
78 	virtual void	OnReceive(int nErrorCode);
79 	virtual void	OnConnect(int nErrorCode) = 0;
80 
81 protected:
82 
PacketReceived(CPacket * WXUNUSED (packet))83 	virtual bool	PacketReceived(CPacket* WXUNUSED(packet)) { return false; };
84 	virtual void	OnClose(int nErrorCode);
85 
86 	uint8	byConnected;
87 	uint32	m_uTimeOut;
88 
89 private:
90     virtual SocketSentBytes Send(uint32 maxNumberOfBytesToSend, uint32 minFragSize, bool onlyAllowedToSendControlPacket);
91 	void	ClearQueues();
92 
93     uint32	GetNextFragSize(uint32 current, uint32 minFragSize);
HasSent()94     bool    HasSent() { return m_hasSent; }
95 
96 	// Download (pseudo) rate control
97 	uint32	downloadLimit;
98 	bool	downloadLimitEnable;
99 	bool	pendingOnReceive;
100 
101 	// Download partial header
102 	uint8	pendingHeader[PACKET_HEADER_SIZE];
103 	uint32	pendingHeaderSize;
104 
105 	// Download partial packet
106 	uint8*	pendingPacket;
107 	uint32	pendingPacketSize;
108 
109 	// Upload control
110 	uint8*	sendbuffer;
111 	uint32	sendblen;
112 	uint32	sent;
113 
114 	typedef std::list<CPacket*> CPacketQueue;
115 	CPacketQueue m_control_queue;
116 
117 	struct StandardPacketQueueEntry
118 	{
119 		uint32 actualPayloadSize;
120 		CPacket* packet;
121 	};
122 
123 	typedef	std::list<StandardPacketQueueEntry> CStdPacketQueue;
124 	CStdPacketQueue m_standard_queue;
125 
126     bool m_currentPacket_is_controlpacket;
127 
128 	wxMutex	m_sendLocker;
129 
130 	uint64 m_numberOfSentBytesCompleteFile;
131     uint64 m_numberOfSentBytesPartFile;
132     uint64 m_numberOfSentBytesControlPacket;
133     bool m_currentPackageIsFromPartFile;
134 
135 	bool	m_bAccelerateUpload;
136 	uint32	lastCalledSend;
137     uint32	lastSent;
138 	uint32	lastFinishedStandard;
139 
140     uint32 m_actualPayloadSize;
141     uint32 m_actualPayloadSizeSent;
142 
143     bool m_bBusy;
144     bool m_hasSent;
145 };
146 
147 
148 #endif // EMSOCKET_H
149 // File_checked_for_headers
150