2 // This file is part of the aMule Project.
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 )
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
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.
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.
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
29 #include "EncryptedStreamSocket.h" // Needed for CEncryptedStreamSocket
31 #include "ThrottledSocket.h" // Needed for ThrottledFileSocket
35 #define ERR_WRONGHEADER 0x01
36 #define ERR_TOOBIG 0x02
38 #define ES_DISCONNECTED 0xFF
39 #define ES_NOTCONNECTED 0x00
40 #define ES_CONNECTED 0x01
43 const uint32 PACKET_HEADER_SIZE
= 6;
46 class CEMSocket
: public CEncryptedStreamSocket
, public ThrottledFileSocket
49 CEMSocket(const CProxyData
*ProxyData
= NULL
);
52 virtual void SendPacket(CPacket
* packet
, bool delpacket
= true, bool controlpacket
= true, uint32 actualPayloadSize
= 0);
53 bool IsConnected() { return byConnected
==ES_CONNECTED
;};
54 uint8
GetConState() {return byConnected
;}
55 void SetDownloadLimit(uint32 limit
);
56 void DisableDownloadLimit();
58 virtual uint32
GetTimeOut() const;
59 virtual void SetTimeOut(uint32 uTimeOut
);
61 uint32
GetLastCalledSend() { return lastCalledSend
; }
63 uint64
GetSentBytesCompleteFileSinceLastCallAndReset();
64 uint64
GetSentBytesPartFileSinceLastCallAndReset();
65 uint64
GetSentBytesControlPacketSinceLastCallAndReset();
66 uint64
GetSentPayloadSinceLastCallAndReset();
67 void TruncateQueues();
69 virtual SocketSentBytes
SendControlData(uint32 maxNumberOfBytesToSend
, uint32 minFragSize
) { return Send(maxNumberOfBytesToSend
, minFragSize
, true); };
70 virtual SocketSentBytes
SendFileAndControlData(uint32 maxNumberOfBytesToSend
, uint32 minFragSize
) { return Send(maxNumberOfBytesToSend
, minFragSize
, false); };
72 uint32
GetNeededBytes();
75 // these functions are public on our code because of the amuleDlg::socketHandler
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;
83 virtual bool PacketReceived(CPacket
* WXUNUSED(packet
)) { return false; };
84 virtual void OnClose(int nErrorCode
);
90 virtual SocketSentBytes
Send(uint32 maxNumberOfBytesToSend
, uint32 minFragSize
, bool onlyAllowedToSendControlPacket
);
93 uint32
GetNextFragSize(uint32 current
, uint32 minFragSize
);
94 bool HasSent() { return m_hasSent
; }
96 // Download (pseudo) rate control
98 bool downloadLimitEnable
;
99 bool pendingOnReceive
;
101 // Download partial header
102 uint8 pendingHeader
[PACKET_HEADER_SIZE
];
103 uint32 pendingHeaderSize
;
105 // Download partial packet
106 uint8
* pendingPacket
;
107 uint32 pendingPacketSize
;
114 typedef std::list
<CPacket
*> CPacketQueue
;
115 CPacketQueue m_control_queue
;
117 struct StandardPacketQueueEntry
119 uint32 actualPayloadSize
;
123 typedef std::list
<StandardPacketQueueEntry
> CStdPacketQueue
;
124 CStdPacketQueue m_standard_queue
;
126 bool m_currentPacket_is_controlpacket
;
128 wxMutex m_sendLocker
;
130 uint64 m_numberOfSentBytesCompleteFile
;
131 uint64 m_numberOfSentBytesPartFile
;
132 uint64 m_numberOfSentBytesControlPacket
;
133 bool m_currentPackageIsFromPartFile
;
135 bool m_bAccelerateUpload
;
136 uint32 lastCalledSend
;
138 uint32 lastFinishedStandard
;
140 uint32 m_actualPayloadSize
;
141 uint32 m_actualPayloadSizeSent
;
149 // File_checked_for_headers