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