Upstream tarball 9614
[amule.git] / src / updownclient.h
blobb5be6dc28d1af52261550472817c9394c3ec5ad4
1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2002-2008 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.
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.
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
26 #ifndef UPDOWNCLIENT_H
27 #define UPDOWNCLIENT_H
29 #include "GetTickCount.h" // Needed for GetTickCount
30 #include "MD4Hash.h"
31 #include <common/StringFunctions.h>
32 #include "NetworkFunctions.h"
33 #include "OtherStructs.h"
35 #include <map>
38 typedef std::vector<bool> BitVector;
40 class CPartFile;
41 class CClientTCPSocket;
42 class CClientCredits;
43 class CPacket;
44 class CFriend;
45 class CKnownFile;
46 class CMemFile;
47 class CAICHHash;
50 // uploadstate
51 #define US_UPLOADING 0
52 #define US_ONUPLOADQUEUE 1
53 #define US_WAITCALLBACK 2
54 #define US_CONNECTING 3
55 #define US_PENDING 4
56 #define US_LOWTOLOWIP 5
57 #define US_BANNED 6
58 #define US_ERROR 7
59 #define US_NONE 8
61 // downloadstate
62 enum EDownloadState {
63 DS_DOWNLOADING = 0,
64 DS_ONQUEUE,
65 DS_CONNECTED,
66 DS_CONNECTING,
67 DS_WAITCALLBACK,
68 DS_WAITCALLBACKKAD,
69 DS_REQHASHSET,
70 DS_NONEEDEDPARTS,
71 DS_TOOMANYCONNS,
72 DS_TOOMANYCONNSKAD,
73 DS_LOWTOLOWIP,
74 DS_BANNED,
75 DS_ERROR,
76 DS_NONE,
77 DS_REMOTEQUEUEFULL // not used yet, except in statistics
80 // m_byChatstate
81 enum {
82 MS_NONE = 0,
83 MS_CHATTING,
84 MS_CONNECTING,
85 MS_UNABLETOCONNECT
88 enum ESourceFrom {
89 SF_NONE,
90 SF_LOCAL_SERVER,
91 SF_REMOTE_SERVER,
92 SF_KADEMLIA,
93 SF_SOURCE_EXCHANGE,
94 SF_PASSIVE,
95 SF_LINK,
96 SF_SOURCE_SEEDS,
97 SF_SEARCH_RESULT
100 enum EChatCaptchaState{
101 CA_NONE = 0,
102 CA_CHALLENGESENT,
103 CA_CAPTCHASOLVED,
104 CA_ACCEPTING,
105 CA_CAPTCHARECV,
106 CA_SOLUTIONSENT
109 enum ESecureIdentState{
110 IS_UNAVAILABLE = 0,
111 IS_ALLREQUESTSSEND = 0,
112 IS_SIGNATURENEEDED = 1,
113 IS_KEYANDSIGNEEDED = 2
116 enum EInfoPacketState{
117 IP_NONE = 0,
118 IP_EDONKEYPROTPACK = 1,
119 IP_EMULEPROTPACK = 2,
120 IP_BOTH = 3
123 enum EKadState{
124 KS_NONE,
125 KS_QUEUED_FWCHECK,
126 KS_CONNECTING_FWCHECK,
127 KS_CONNECTED_FWCHECK,
128 KS_QUEUED_BUDDY,
129 KS_INCOMING_BUDDY,
130 KS_CONNECTING_BUDDY,
131 KS_CONNECTED_BUDDY,
132 KS_QUEUED_FWCHECK_UDP,
133 KS_FWCHECK_UDP,
134 KS_CONNECTING_FWCHECK_UDP
137 //! Used to keep track of the state of the client
138 enum ClientState
140 //! New is for clients that have just been created.
141 CS_NEW = 0,
142 //! Listed is for clients that are on the clientlist
143 CS_LISTED,
144 //! Dying signifies clients that have been queued for deletion
145 CS_DYING
148 // This is fixed on ed2k v1, but can be any number on ED2Kv2
149 #define STANDARD_BLOCKS_REQUEST 3
151 class CUpDownClient
153 friend class CClientList;
154 friend class CUpDownClientListRem;
155 private:
157 * Please note that only the ClientList is allowed to delete the clients.
158 * To schedule a client for deletion, call the CClientList::AddToDeleteQueue
159 * funtion, which will safely remove dead clients once every second.
161 ~CUpDownClient();
163 public:
164 #ifdef CLIENT_GUI
165 CUpDownClient(class CEC_UpDownClient_Tag *);
166 #else
167 //base
168 CUpDownClient(CClientTCPSocket* sender = 0);
169 CUpDownClient(uint16 in_port, uint32 in_userid, uint32 in_serverup, uint16 in_serverport,CPartFile* in_reqfile, bool ed2kID, bool checkfriend);
170 #endif
172 * This function should be called when the client object is to be deleted.
173 * It'll close the socket of the client and add it to the deletion queue
174 * owned by the CClientList class. However, if the CUpDownClient isn't on
175 * the normal clientlist, it will be deleted immediatly.
177 * The purpose of this is to avoid clients suddenly being removed due to
178 * asyncronous events, such as socket errors, which can result in the
179 * problems, as each CUpDownClient object is often kept in multiple lists,
180 * and instantly removing the client poses the risk of invalidating
181 * currently used iterators and/or creating dangling pointers.
183 * @see CClientList::AddToDeleteQueue
184 * @see CClientList::Process
186 void Safe_Delete();
189 * Specifies if the client has been queued for deletion.
191 * @return True if Safe_Delete has been called, false otherwise.
193 bool HasBeenDeleted() { return m_clientState == CS_DYING; }
195 ClientState GetClientState() { return m_clientState; }
197 bool Disconnected(const wxString& strReason, bool bFromSocket = false);
198 bool TryToConnect(bool bIgnoreMaxCon = false);
199 bool Connect();
200 void ConnectionEstablished();
201 const wxString& GetUserName() const { return m_Username; }
202 //Only use this when you know the real IP or when your clearing it.
203 void SetIP( uint32 val );
204 uint32 GetIP() const { return m_dwUserIP; }
205 bool HasLowID() const { return IsLowID(m_nUserIDHybrid); }
206 wxString GetFullIP() const { return Uint32toStringIP(m_FullUserIP); }
207 uint32 GetConnectIP() const { return m_nConnectIP; }
208 uint32 GetUserIDHybrid() const { return m_nUserIDHybrid; }
209 void SetUserIDHybrid(uint32 val);
210 uint16_t GetUserPort() const { return m_nUserPort; }
211 void SetUserPort(uint16_t port) { m_nUserPort = port; }
212 uint32 GetTransferredDown() const { return m_nTransferredDown; }
213 uint32 GetServerIP() const { return m_dwServerIP; }
214 void SetServerIP(uint32 nIP) { m_dwServerIP = nIP; }
215 uint16 GetServerPort() const { return m_nServerPort; }
216 void SetServerPort(uint16 nPort) { m_nServerPort = nPort; }
217 const CMD4Hash& GetUserHash() const { return m_UserHash; }
218 void SetUserHash(const CMD4Hash& userhash);
219 void ValidateHash() { m_HasValidHash = !m_UserHash.IsEmpty(); }
220 bool HasValidHash() const { return m_HasValidHash; }
221 uint32 GetVersion() const { return m_nClientVersion;}
222 uint8 GetMuleVersion() const { return m_byEmuleVersion;}
223 bool ExtProtocolAvailable() const { return m_bEmuleProtocol;}
224 bool IsEmuleClient() const { return (m_byEmuleVersion > 0);}
225 bool IsBanned() const;
226 const wxString& GetClientFilename() const { return m_clientFilename; }
227 uint16 GetUDPPort() const { return m_nUDPPort; }
228 void SetUDPPort(uint16 nPort) { m_nUDPPort = nPort; }
229 uint8 GetUDPVersion() const { return m_byUDPVer; }
230 uint8 GetExtendedRequestsVersion() const { return m_byExtendedRequestsVer; }
231 bool IsFriend() const { return m_Friend != NULL; }
232 bool IsML() const { return m_bIsML; }
233 bool IsHybrid() const { return m_bIsHybrid; }
234 uint32 GetCompatibleClient() const { return m_byCompatibleClient; }
236 void ClearDownloadBlockRequests();
237 void RequestSharedFileList();
238 void ProcessSharedFileList(const byte* pachPacket, uint32 nSize, wxString& pszDirectory);
240 wxString GetUploadFileInfo();
242 void SetUserName(const wxString& NewName) { m_Username = NewName; }
244 uint8 GetClientSoft() const { return m_clientSoft; }
245 void ReGetClientSoft();
246 bool ProcessHelloAnswer(const byte* pachPacket, uint32 nSize);
247 bool ProcessHelloPacket(const byte* pachPacket, uint32 nSize);
248 void SendHelloAnswer();
249 bool SendHelloPacket();
250 void SendMuleInfoPacket(bool bAnswer, bool OSInfo = false);
251 bool ProcessMuleInfoPacket(const byte* pachPacket, uint32 nSize);
252 void ProcessMuleCommentPacket(const byte* pachPacket, uint32 nSize);
253 bool Compare(const CUpDownClient* tocomp, bool bIgnoreUserhash = false) const;
254 void SetLastSrcReqTime() { m_dwLastSourceRequest = ::GetTickCount(); }
255 void SetLastSrcAnswerTime() { m_dwLastSourceAnswer = ::GetTickCount(); }
256 void SetLastAskedForSources() { m_dwLastAskedForSources = ::GetTickCount(); }
257 uint32 GetLastSrcReqTime() const { return m_dwLastSourceRequest; }
258 uint32 GetLastSrcAnswerTime() const { return m_dwLastSourceAnswer; }
259 uint32 GetLastAskedForSources() const { return m_dwLastAskedForSources; }
260 bool GetFriendSlot() const { return m_bFriendSlot; }
261 void SetFriendSlot(bool bNV) { m_bFriendSlot = bNV; }
262 void SetCommentDirty(bool bDirty = true) { m_bCommentDirty = bDirty; }
263 uint8 GetSourceExchange1Version() const { return m_bySourceExchange1Ver; }
264 bool SupportsSourceExchange2() const { return m_fSupportsSourceEx2; }
266 bool SafeSendPacket(CPacket* packet);
268 void ProcessRequestPartsPacket(const byte* pachPacket, uint32 nSize, bool largeblocks);
269 void ProcessRequestPartsPacketv2(const CMemFile& data);
271 void SendPublicKeyPacket();
272 void SendSignaturePacket();
273 void ProcessPublicKeyPacket(const byte* pachPacket, uint32 nSize);
274 void ProcessSignaturePacket(const byte* pachPacket, uint32 nSize);
275 uint8 GetSecureIdentState();
277 void SendSecIdentStatePacket();
278 void ProcessSecIdentStatePacket(const byte* pachPacket, uint32 nSize);
280 uint8 GetInfoPacketsReceived() const { return m_byInfopacketsReceived; }
281 void InfoPacketsReceived();
283 //upload
284 uint8 GetUploadState() const { return m_nUploadState; }
285 void SetUploadState(uint8 news);
286 uint32 GetTransferredUp() const { return m_nTransferredUp; }
287 uint32 GetSessionUp() const { return m_nTransferredUp - m_nCurSessionUp; }
288 void ResetSessionUp() {
289 m_nCurSessionUp = m_nTransferredUp;
290 m_addedPayloadQueueSession = 0;
291 m_nCurQueueSessionPayloadUp = 0;
293 uint32 GetUploadDatarate() const { return m_nUpDatarate; }
295 #ifndef CLIENT_GUI
296 uint32 GetWaitTime() const { return m_dwUploadTime - GetWaitStartTime(); }
297 uint32 GetUpStartTimeDelay() const { return ::GetTickCount() - m_dwUploadTime; }
298 uint32 GetWaitStartTime() const;
299 #else
300 uint32 m_WaitTime, m_UpStartTimeDelay, m_WaitStartTime;
301 uint32 GetWaitTime() const { return m_WaitTime; }
302 uint32 GetUpStartTimeDelay() const { return m_UpStartTimeDelay; }
303 uint32 GetWaitStartTime() const { return m_WaitStartTime; }
304 #endif
306 bool IsDownloading() const { return (m_nUploadState == US_UPLOADING); }
308 #ifndef CLIENT_GUI
309 uint32 GetScore(
310 bool sysvalue,
311 bool isdownloading = false,
312 bool onlybasevalue = false) const;
313 #else
314 uint32 m_score;
315 uint32 GetScore(
316 bool WXUNUSED(sysvalue),
317 bool WXUNUSED(isdownloading) = false,
318 bool WXUNUSED(onlybasevalue) = false) const
320 return m_score;
322 uint16 m_waitingPosition;
323 uint16 GetWaitingPosition() const { return m_waitingPosition; }
324 #endif
325 double GetRating() const { return (double)GetScore(false, IsDownloading(), true); }
327 void AddReqBlock(Requested_Block_Struct* reqblock);
328 void CreateNextBlockPackage();
329 void SetUpStartTime() { m_dwUploadTime = ::GetTickCount(); }
330 void SetWaitStartTime();
331 void ClearWaitStartTime();
332 void SendHashsetPacket(const CMD4Hash& forfileid);
333 bool SupportMultiPacket() const { return m_bMultiPacket; }
334 bool SupportExtMultiPacket() const { return m_fExtMultiPacket; }
336 void SetUploadFileID(CKnownFile *newreqfile);
339 *Gets the file actually on upload
342 const CKnownFile* GetUploadFile() const { return m_uploadingfile; }
344 void SendOutOfPartReqsAndAddToWaitingQueue();
345 void ProcessExtendedInfo(const CMemFile *data, CKnownFile *tempreqfile);
346 void ProcessFileInfo(const CMemFile* data, const CPartFile* file);
347 void ProcessFileStatus(bool bUdpPacket, const CMemFile* data, const CPartFile* file);
349 const CMD4Hash& GetUploadFileID() const { return m_requpfileid; }
350 void SetUploadFileID(const CMD4Hash& new_id);
351 void ClearUploadFileID() { m_requpfileid.Clear(); m_uploadingfile = NULL;};
352 uint32 SendBlockData();
353 void ClearUploadBlockRequests();
354 void SendRankingInfo();
355 void SendCommentInfo(CKnownFile *file);
356 bool IsDifferentPartBlock() const;
357 void UnBan();
358 void Ban();
359 bool m_bAddNextConnect; // VQB Fix for LowID slots only on connection
360 uint32 GetAskedCount() const { return m_cAsked; }
361 void AddAskedCount() { m_cAsked++; }
362 void ClearAskedCount() { m_cAsked = 1; } // 1, because it's cleared *after* the first request...
363 void FlushSendBlocks(); // call this when you stop upload,
364 // or the socket might be not able to send
365 void SetLastUpRequest() { m_dwLastUpRequest = ::GetTickCount(); }
366 uint32 GetLastUpRequest() const { return m_dwLastUpRequest; }
367 size_t GetUpPartCount() const { return m_upPartStatus.size(); }
370 //download
371 void SetRequestFile(CPartFile* reqfile);
372 CPartFile* GetRequestFile() const { return m_reqfile; }
374 uint8 GetDownloadState() const { return m_nDownloadState; }
375 void SetDownloadState(uint8 byNewState);
376 uint32 GetLastAskedTime() const { return m_dwLastAskedTime; }
378 bool IsPartAvailable(uint16 iPart) const
379 { return ( iPart < m_downPartStatus.size() ) ? m_downPartStatus[iPart] : 0; }
380 bool IsUpPartAvailable(uint16 iPart) const
381 { return ( iPart < m_upPartStatus.size() ) ? m_upPartStatus[iPart] : 0;}
383 const BitVector& GetPartStatus() const { return m_downPartStatus; }
384 const BitVector& GetUpPartStatus() const { return m_upPartStatus; }
385 float GetKBpsDown() const { return kBpsDown; }
386 float CalculateKBpsDown();
387 uint16 GetRemoteQueueRank() const { return m_nRemoteQueueRank; }
388 uint16 GetOldRemoteQueueRank() const { return m_nOldRemoteQueueRank; }
389 void SetRemoteQueueFull(bool flag) { m_bRemoteQueueFull = flag; }
390 bool IsRemoteQueueFull() const { return m_bRemoteQueueFull; }
391 void SetRemoteQueueRank(uint16 nr);
392 bool AskForDownload();
393 void SendStartupLoadReq();
394 void SendFileRequest();
395 void ProcessHashSet(const byte* packet, uint32 size);
396 bool AddRequestForAnotherFile(CPartFile* file);
397 bool DeleteFileRequest(CPartFile* file);
398 void DeleteAllFileRequests();
399 void SendBlockRequests();
400 void ProcessBlockPacket(const byte* packet, uint32 size, bool packed, bool largeblocks);
402 #ifndef CLIENT_GUI
403 uint16 GetAvailablePartCount() const;
404 #else
405 uint16 m_AvailPartCount;
406 uint16 GetAvailablePartCount() const { return m_AvailPartCount; }
407 #endif
409 bool SwapToAnotherFile(bool bIgnoreNoNeeded, bool ignoreSuspensions, bool bRemoveCompletely, CPartFile* toFile = NULL);
410 void UDPReaskACK(uint16 nNewQR);
411 void UDPReaskFNF();
412 void UDPReaskForDownload();
413 bool IsSourceRequestAllowed();
414 uint16 GetUpCompleteSourcesCount() const { return m_nUpCompleteSourcesCount; }
415 void SetUpCompleteSourcesCount(uint16 n) { m_nUpCompleteSourcesCount = n; }
417 //chat
418 uint8 GetChatState() { return m_byChatstate; }
419 void SetChatState(uint8 nNewS) { m_byChatstate = nNewS; }
420 EChatCaptchaState GetChatCaptchaState() const { return (EChatCaptchaState)m_nChatCaptchaState; }
421 void ProcessCaptchaRequest(CMemFile* data);
422 void ProcessCaptchaReqRes(uint8 nStatus);
423 void ProcessChatMessage(wxString message);
424 // message filtering
425 uint8 GetMessagesReceived() const { return m_cMessagesReceived; }
426 void IncMessagesReceived() { m_cMessagesReceived < 255 ? ++m_cMessagesReceived : 255; }
427 uint8 GetMessagesSent() const { return m_cMessagesSent; }
428 void IncMessagesSent() { m_cMessagesSent < 255 ? ++m_cMessagesSent : 255; }
429 bool IsSpammer() const { return m_fIsSpammer; }
430 void SetSpammer(bool bVal);
431 bool IsMessageFiltered(const wxString& message);
433 //File Comment
434 const wxString& GetFileComment() const { return m_strComment; }
435 uint8 GetFileRating() const { return m_iRating; }
437 const wxString& GetSoftStr() const { return m_clientSoftString; }
438 const wxString& GetSoftVerStr() const { return m_clientVerString; }
439 #ifndef CLIENT_GUI
440 const wxString GetServerName() const;
441 #else
442 wxString m_ServerName;
443 const wxString& GetServerName() const { return m_ServerName; }
444 #endif
446 uint16 GetKadPort() const { return m_nKadPort; }
447 void SetKadPort(uint16 nPort) { m_nKadPort = nPort; }
449 // Kry - AICH import
450 void SetReqFileAICHHash(CAICHHash* val);
451 CAICHHash* GetReqFileAICHHash() const {return m_pReqFileAICHHash;}
452 bool IsSupportingAICH() const {return m_fSupportsAICH & 0x01;}
453 void SendAICHRequest(CPartFile* pForFile, uint16 nPart);
454 bool IsAICHReqPending() const {return m_fAICHRequested; }
455 void ProcessAICHAnswer(const byte* packet, uint32 size);
456 void ProcessAICHRequest(const byte* packet, uint32 size);
457 void ProcessAICHFileHash(CMemFile* data, const CPartFile* file);
459 EUtf8Str GetUnicodeSupport() const;
461 // Barry - Process zip file as it arrives, don't need to wait until end of block
462 int unzip(Pending_Block_Struct *block, byte *zipped, uint32 lenZipped, byte **unzipped, uint32 *lenUnzipped, int iRecursion = 0);
463 // Barry - Sets string to show parts downloading, eg NNNYNNNNYYNYN
464 wxString ShowDownloadingParts() const;
465 void UpdateDisplayedInfo(bool force = false);
466 int GetFileListRequested() const { return m_iFileListRequested; }
467 void SetFileListRequested(int iFileListRequested) { m_iFileListRequested = iFileListRequested; }
469 void ResetFileStatusInfo();
471 bool CheckHandshakeFinished(uint32 protocol, uint32 opcode) const;
473 bool GetSentCancelTransfer() const { return m_fSentCancelTransfer; }
474 void SetSentCancelTransfer(bool bVal) { m_fSentCancelTransfer = bVal; }
476 wxString GetClientFullInfo();
478 const wxString& GetClientOSInfo() const { return m_sClientOSInfo; }
480 void ProcessPublicIPAnswer(const byte* pbyData, uint32 uSize);
481 void SendPublicIPRequest();
484 * Sets the current socket of the client.
486 * @param socket The pointer to the new socket, can be NULL.
488 * Please note that this function DOES NOT delete the old socket.
490 void SetSocket(CClientTCPSocket* socket);
493 * Function for accessing the socket owned by a client.
495 * @return The pointer (can be NULL) to the socket used by this client.
497 * Please note that the socket object is quite volatile and can be removed
498 * from one function call to the next, therefore, you should normally use
499 * the safer functions below, which all check if the socket is valid before
500 * deferring it.
502 CClientTCPSocket* GetSocket() const { return m_socket; }
505 * Safe function for checking if the socket is connected.
507 * @return True if the socket exists and is connected, false otherwise.
509 #ifndef CLIENT_GUI
510 bool IsConnected() const;
511 #else
512 bool m_IsConnected;
513 bool IsConnected() const { return m_IsConnected; }
514 #endif
517 * Safe function for sending packets.
519 * @return True if the socket exists and the packet was sent, false otherwise.
521 bool SendPacket(CPacket* packet, bool delpacket = true, bool controlpacket = true);
524 * Safe function for setting the download limit of the socket.
526 * @return Current download speed of the client.
528 float SetDownloadLimit(uint32 reducedownload);
531 * Sends a message to a client
533 * @return True if sent, false if connecting
535 bool SendChatMessage(const wxString& message);
537 uint32 GetPayloadInBuffer() const { return m_addedPayloadQueueSession - GetQueueSessionPayloadUp(); }
538 uint32 GetQueueSessionPayloadUp() const { return m_nCurQueueSessionPayloadUp; }
539 bool HasBlocks() const { return !m_BlockRequests_queue.empty(); }
541 /* Source comes from? */
542 ESourceFrom GetSourceFrom() const { return (ESourceFrom)m_nSourceFrom; }
543 void SetSourceFrom(ESourceFrom val) { m_nSourceFrom = val; }
545 /* Kad buddy support */
546 // ID
547 const byte* GetBuddyID() const { return m_achBuddyID; }
548 void SetBuddyID(const byte* m_achTempBuddyID);
549 bool HasValidBuddyID() const { return m_bBuddyIDValid; }
550 /* IP */
551 void SetBuddyIP( uint32 val ) { m_nBuddyIP = val; }
552 uint32 GetBuddyIP() const { return m_nBuddyIP; }
553 /* Port */
554 void SetBuddyPort( uint16 val ) { m_nBuddyPort = val; }
555 uint16 GetBuddyPort() const { return m_nBuddyPort; }
557 //KadIPCheck
558 bool SendBuddyPingPong() { return m_dwLastBuddyPingPongTime < ::GetTickCount(); }
559 bool AllowIncomeingBuddyPingPong() { return m_dwLastBuddyPingPongTime < (::GetTickCount()-(3*60*1000)); }
560 void SetLastBuddyPingPongTime() { m_dwLastBuddyPingPongTime = (::GetTickCount()+(10*60*1000)); }
561 EKadState GetKadState() const { return m_nKadState; }
562 void SetKadState(EKadState nNewS) { m_nKadState = nNewS; }
563 uint8 GetKadVersion() { return m_byKadVersion; }
564 void ProcessFirewallCheckUDPRequest(CMemFile *data);
565 // Kad added by me
566 bool SendBuddyPing();
568 /* Returns the client hash type (SO_EMULE, mldonkey, etc) */
569 int GetHashType() const;
572 * Checks that a client isn't aggressively re-asking for files.
574 * Call this when a file is requested. If the time since the last request is
575 * less than MIN_REQUESTTIME, 3 is added to the m_Aggressiveness variable.
576 * If the time since the last request is >= MIN_REQUESTTIME, the variable is
577 * decremented by 1. The client is banned if the variable reaches 10 or above.
579 * To check if a client is aggressive use the IsClientAggressive() function.
581 * Currently this function is called when the following packets are received:
582 * - OP_STARTUPLOADREQ
583 * - OP_REASKFILEPING
585 void CheckForAggressive();
587 const wxString& GetClientModString() const { return m_strModVersion; }
589 const wxString& GetClientVerString() const { return m_fullClientVerString; }
591 const wxString& GetVersionString() const { return m_clientVersionString; }
593 void UpdateStats();
595 /* Returns a pointer to the credits, only for hash purposes */
596 void* GetCreditsHash() const { return (void*)credits; }
598 uint32 GetLastBlockOffset() const { return m_nLastBlockOffset; }
600 bool GetOSInfoSupport() const { return m_fOsInfoSupport; }
602 bool GetVBTTags() const { return m_fValueBasedTypeTags; }
604 uint16 GetLastPartAsked() const { return m_lastPartAsked; }
606 void SetLastPartAsked(uint16 nPart) { m_lastPartAsked = nPart; }
608 CFriend* GetFriend() const { return m_Friend; }
610 void SetFriend(CFriend* newfriend) { m_Friend = newfriend; }
612 bool IsIdentified() const;
614 bool IsBadGuy() const;
616 bool SUIFailed() const;
618 bool SUINeeded() const;
620 bool SUINotSupported() const;
622 uint64 GetDownloadedTotal() const;
624 uint64 GetUploadedTotal() const;
626 double GetScoreRatio() const;
628 uint32 GetCreationTime() const { return m_nCreationTime; }
630 bool SupportsLargeFiles() const { return m_fSupportsLargeFiles; }
632 #ifdef __DEBUG__
633 /* Kry - Debug. See connection_reason definition comment below */
634 void SetConnectionReason(const wxString& reason) { connection_reason = reason; }
635 #endif
637 // Encryption / Obfuscation / ConnectOptions
638 bool SupportsCryptLayer() const { return m_fSupportsCryptLayer; }
639 bool RequestsCryptLayer() const { return SupportsCryptLayer() && m_fRequestsCryptLayer; }
640 bool RequiresCryptLayer() const { return RequestsCryptLayer() && m_fRequiresCryptLayer; }
641 bool SupportsDirectUDPCallback() const { return m_fDirectUDPCallback != 0 && HasValidHash() && GetKadPort() != 0; }
642 uint32_t GetDirectCallbackTimeout() const { return m_dwDirectCallbackTimeout; }
643 bool HasObfuscatedConnectionBeenEstablished() const { return m_hasbeenobfuscatinglately; }
645 void SetCryptLayerSupport(bool bVal) { m_fSupportsCryptLayer = bVal ? 1 : 0; }
646 void SetCryptLayerRequest(bool bVal) { m_fRequestsCryptLayer = bVal ? 1 : 0; }
647 void SetCryptLayerRequires(bool bVal) { m_fRequiresCryptLayer = bVal ? 1 : 0; }
648 void SetDirectUDPCallbackSupport(bool bVal) { m_fDirectUDPCallback = bVal ? 1 : 0; }
649 void SetConnectOptions(uint8_t options, bool encryption = true, bool callback = true); // shortcut, sets crypt, callback, etc from the tagvalue we receive
650 bool ShouldReceiveCryptUDPPackets() const;
652 bool HasDisabledSharedFiles() const { return m_fNoViewSharedFiles; }
654 private:
656 CClientCredits *credits;
657 CFriend *m_Friend;
659 uint32 m_nTransferredUp;
660 uint32 m_nCurQueueSessionPayloadUp;
661 uint32 m_addedPayloadQueueSession;
663 struct TransferredData {
664 uint32 datalen;
665 uint32 timestamp;
668 //////////////////////////////////////////////////////////
669 // Upload data rate computation
671 uint32 m_nUpDatarate;
672 uint32 m_nSumForAvgUpDataRate;
673 std::list<TransferredData> m_AvarageUDR_list;
677 * This struct is used to keep track of CPartFiles which this source shares.
679 struct A4AFStamp {
680 //! Signifies if this sources has needed parts for this file.
681 bool NeededParts;
682 //! This is set when we wish to avoid swapping to this file for a while.
683 uint32 timestamp;
686 //! I typedef in the name of readability!
687 typedef std::map<CPartFile*, A4AFStamp> A4AFList;
688 //! This list contains all PartFiles which this client can be used as a source for.
689 A4AFList m_A4AF_list;
692 * Helper function used by SwapToAnotherFile().
694 * @param it The iterator of the PartFile to be examined.
695 * @param ignorenoneeded Do not check for the status NoNeededParts when checking the file.
696 * @param ignoresuspended Do not check the timestamp when checking the file.
697 * @return True if the file is a viable target, false otherwise.
699 * This function is used to perform checks to see if we should consider
700 * this file a viable target for A4AF swapping. Unless ignoresuspended is
701 * true, it will examine the timestamp of the file and reset it if needed.
703 bool IsValidSwapTarget( A4AFList::iterator it, bool ignorenoneeded = false, bool ignoresuspended = false );
705 CPartFile* m_reqfile;
707 // base
708 void Init();
709 bool ProcessHelloTypePacket(const CMemFile& data);
710 void SendHelloTypePacket(CMemFile* data);
711 void SendFirewallCheckUDPRequest();
712 void ClearHelloProperties(); // eMule 0.42
713 uint32 m_dwUserIP;
714 uint32 m_nConnectIP; // holds the supposed IP or (after we had a connection) the real IP
715 uint32 m_dwServerIP;
716 uint32 m_nUserIDHybrid;
717 uint16_t m_nUserPort;
718 int16 m_nServerPort;
719 uint32 m_nClientVersion;
720 uint32 m_cSendblock;
721 uint8 m_byEmuleVersion;
722 uint8 m_byDataCompVer;
723 bool m_bEmuleProtocol;
724 wxString m_Username;
725 uint32 m_FullUserIP;
726 CMD4Hash m_UserHash;
727 bool m_HasValidHash;
728 uint16 m_nUDPPort;
729 uint8 m_byUDPVer;
730 uint8 m_bySourceExchange1Ver;
731 uint8 m_byAcceptCommentVer;
732 uint8 m_byExtendedRequestsVer;
733 uint8 m_clientSoft;
734 uint32 m_dwLastSourceRequest;
735 uint32 m_dwLastSourceAnswer;
736 uint32 m_dwLastAskedForSources;
737 int m_iFileListRequested;
738 bool m_bFriendSlot;
739 bool m_bCommentDirty;
740 bool m_bIsHybrid;
741 bool m_bIsML;
742 bool m_bSupportsPreview;
743 bool m_bUnicodeSupport;
744 uint16 m_nKadPort;
745 bool m_bMultiPacket;
746 ClientState m_clientState;
747 CClientTCPSocket* m_socket;
748 bool m_fNeedOurPublicIP; // we requested our IP from this client
750 // Kry - Secure User Ident import
751 ESecureIdentState m_SecureIdentState;
752 uint8 m_byInfopacketsReceived; // have we received the edonkeyprot and emuleprot packet already (see InfoPacketsReceived() )
753 uint32 m_dwLastSignatureIP;
754 uint8 m_bySupportSecIdent;
756 uint32 m_byCompatibleClient;
757 std::list<CPacket*> m_WaitingPackets_list;
758 uint32 m_lastRefreshedDLDisplay;
760 //upload
761 void CreateStandartPackets(const unsigned char* data,uint32 togo, Requested_Block_Struct* currentblock);
762 void CreatePackedPackets(const unsigned char* data,uint32 togo, Requested_Block_Struct* currentblock);
764 uint8 m_nUploadState;
765 uint32 m_dwUploadTime;
766 uint32 m_cAsked;
767 uint32 m_dwLastUpRequest;
768 uint32 m_nCurSessionUp;
769 uint16 m_nUpPartCount;
770 CMD4Hash m_requpfileid;
771 uint16 m_nUpCompleteSourcesCount;
773 //! This vector contains the avilability of parts for the file that the user
774 //! is requesting. When changing it, be sure to call CKnownFile::UpdatePartsFrequency
775 //! so that the files know the actual availability of parts.
776 BitVector m_upPartStatus;
777 uint16 m_lastPartAsked;
778 wxString m_strModVersion;
780 std::list<Requested_Block_Struct*> m_BlockRequests_queue;
781 std::list<Requested_Block_Struct*> m_DoneBlocks_list;
783 //download
784 bool m_bRemoteQueueFull;
785 uint8 m_nDownloadState;
786 uint16 m_nPartCount;
787 uint32 m_dwLastAskedTime;
788 wxString m_clientFilename;
789 uint32 m_nTransferredDown;
790 uint32 m_nLastBlockOffset; // Patch for show parts that you download [Cax2]
791 uint16 m_cShowDR;
792 uint32 m_dwLastBlockReceived;
793 uint16 m_nRemoteQueueRank;
794 uint16 m_nOldRemoteQueueRank;
795 bool m_bCompleteSource;
796 bool m_bReaskPending;
797 bool m_bUDPPending;
798 bool m_bHashsetRequested;
800 std::list<Pending_Block_Struct*> m_PendingBlocks_list;
801 std::list<Requested_Block_Struct*> m_DownloadBlocks_list;
803 // download speed calculation
804 float kBpsDown;
805 uint32 msReceivedPrev;
806 uint32 bytesReceivedCycle;
807 // chat
808 wxString m_strComment;
809 uint8 m_byChatstate;
810 uint8 m_nChatCaptchaState;
811 uint8 m_cCaptchasSent;
812 int8 m_iRating;
813 uint8 m_cMessagesReceived; // count of chatmessages he sent to me
814 uint8 m_cMessagesSent; // count of chatmessages I sent to him
815 wxString m_strCaptchaChallenge;
816 wxString m_strCaptchaPendingMsg;
818 unsigned int
819 m_fHashsetRequesting : 1, // we have sent a hashset request to this client
820 m_fNoViewSharedFiles : 1, // client has disabled the 'View Shared Files' feature,
821 // if this flag is not set, we just know that we don't know
822 // for sure if it is enabled
823 m_fSupportsPreview : 1,
824 m_fIsSpammer : 1,
825 m_fSentCancelTransfer: 1, // we have sent an OP_CANCELTRANSFER in the current connection
826 m_fSharedDirectories : 1, // client supports OP_ASKSHAREDIRS opcodes
827 m_fSupportsAICH : 3,
828 m_fAICHRequested : 1,
829 m_fSupportsLargeFiles: 1,
830 m_fSentOutOfPartReqs : 1,
831 m_fExtMultiPacket : 1,
832 m_fRequestsCryptLayer: 1,
833 m_fSupportsCryptLayer: 1,
834 m_fRequiresCryptLayer: 1,
835 m_fSupportsSourceEx2 : 1,
836 m_fSupportsCaptcha : 1,
837 m_fDirectUDPCallback : 1;
839 unsigned int
840 m_fOsInfoSupport : 1,
841 m_fValueBasedTypeTags : 1;
843 /* Razor 1a - Modif by MikaelB */
845 bool m_bHelloAnswerPending;
847 //! This vector contains the avilability of parts for the file we requested
848 //! from this user. When changing it, be sure to call CPartFile::UpdatePartsFrequency
849 //! so that the files know the actual availability of parts.
850 BitVector m_downPartStatus;
852 CAICHHash* m_pReqFileAICHHash;
854 ESourceFrom m_nSourceFrom;
856 /* Kad Stuff */
857 byte m_achBuddyID[16];
858 bool m_bBuddyIDValid;
859 uint32 m_nBuddyIP;
860 uint16 m_nBuddyPort;
862 EKadState m_nKadState;
864 uint8 m_byKadVersion;
865 uint32 m_dwLastBuddyPingPongTime;
866 uint32_t m_dwDirectCallbackTimeout;
868 //! This keeps track of aggressive requests for files.
869 uint16 m_Aggressiveness;
870 //! This tracks the time of the last time since a file was requested
871 uint32 m_LastFileRequest;
873 bool m_OSInfo_sent;
875 wxString m_clientSoftString; /* software name */
876 wxString m_clientVerString; /* version + optional mod name */
877 wxString m_clientVersionString; /* version string */
878 wxString m_fullClientVerString; /* full info string */
879 wxString m_sClientOSInfo;
880 wxString m_pendingMessage;
882 int SecIdentSupRec;
884 CKnownFile* m_uploadingfile;
886 uint8 m_MaxBlockRequests;
888 // needed for stats
889 uint32 m_lastClientSoft;
890 uint32 m_lastClientVersion;
891 wxString m_lastOSInfo;
893 /* For buddies timeout */
894 uint32 m_nCreationTime;
896 /* Calculation of last average speed */
897 uint32 m_lastaverage;
898 uint32 m_last_block_start;
900 /* Save the encryption status for display when disconnected */
901 bool m_hasbeenobfuscatinglately;
903 /* Kry - Debug thing. Clients created just to check their data
904 have this string set to the reason we want to check them.
905 Obviously, once checked, we disconnect them. Take that, sucker.
906 This debug code is just for me I'm afraid. */
907 #ifdef __DEBUG__
908 wxString connection_reason;
909 #endif
913 #define MAKE_CLIENT_VERSION(mjr, min, upd) \
914 ((uint32)(mjr)*100U*10U*100U + (uint32)(min)*100U*10U + (uint32)(upd)*100U)
917 #endif // UPDOWNCLIENT_H
918 // File_checked_for_headers