2 // This file is part of the aMule Project.
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 )
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
26 #ifndef UPDOWNCLIENT_H
27 #define UPDOWNCLIENT_H
29 #include "GetTickCount.h" // Needed for GetTickCount
31 #include <common/StringFunctions.h>
32 #include "NetworkFunctions.h"
33 #include "OtherStructs.h"
34 #include "ClientCredits.h" // Needed for EIdentState
35 #include <ec/cpp/ECID.h> // Needed for CECID
36 #include "BitVector.h" // Needed for BitVector
42 class CClientTCPSocket
;
51 #define US_UPLOADING 0
52 #define US_ONUPLOADQUEUE 1
53 #define US_WAITCALLBACK 2
54 #define US_CONNECTING 3
56 #define US_LOWTOLOWIP 5
77 DS_REMOTEQUEUEFULL
// not used yet, except in statistics
100 enum EChatCaptchaState
{
109 enum ESecureIdentState
{
111 IS_ALLREQUESTSSEND
= 0,
112 IS_SIGNATURENEEDED
= 1,
113 IS_KEYANDSIGNEEDED
= 2
116 enum EInfoPacketState
{
118 IP_EDONKEYPROTPACK
= 1,
119 IP_EMULEPROTPACK
= 2,
126 KS_CONNECTING_FWCHECK
,
127 KS_CONNECTED_FWCHECK
,
132 KS_QUEUED_FWCHECK_UDP
,
134 KS_CONNECTING_FWCHECK_UDP
137 //! Used to keep track of the state of the client
140 //! New is for clients that have just been created.
142 //! Listed is for clients that are on the clientlist
144 //! Dying signifies clients that have been queued for deletion
148 // Obfuscation status
149 enum EObfuscationState
{
157 // This is fixed on ed2k v1, but can be any number on ED2Kv2
158 #define STANDARD_BLOCKS_REQUEST 3
160 class CUpDownClient
: public CECID
162 friend class CClientList
;
163 friend class CUpDownClientListRem
;
166 * Please note that only the ClientList is allowed to delete the clients.
167 * To schedule a client for deletion, call the CClientList::AddToDeleteQueue
168 * funtion, which will safely remove dead clients once every second.
174 CUpDownClient(class CEC_UpDownClient_Tag
*);
177 CUpDownClient(CClientTCPSocket
* sender
= 0);
178 CUpDownClient(uint16 in_port
, uint32 in_userid
, uint32 in_serverup
, uint16 in_serverport
,CPartFile
* in_reqfile
, bool ed2kID
, bool checkfriend
);
181 * This function should be called when the client object is to be deleted.
182 * It'll close the socket of the client and add it to the deletion queue
183 * owned by the CClientList class. However, if the CUpDownClient isn't on
184 * the normal clientlist, it will be deleted immediatly.
186 * The purpose of this is to avoid clients suddenly being removed due to
187 * asyncronous events, such as socket errors, which can result in the
188 * problems, as each CUpDownClient object is often kept in multiple lists,
189 * and instantly removing the client poses the risk of invalidating
190 * currently used iterators and/or creating dangling pointers.
192 * @see CClientList::AddToDeleteQueue
193 * @see CClientList::Process
198 * Specifies if the client has been queued for deletion.
200 * @return True if Safe_Delete has been called, false otherwise.
202 bool HasBeenDeleted() { return m_clientState
== CS_DYING
; }
204 ClientState
GetClientState() { return m_clientState
; }
206 bool Disconnected(const wxString
& strReason
, bool bFromSocket
= false);
207 bool TryToConnect(bool bIgnoreMaxCon
= false);
209 void ConnectionEstablished();
210 const wxString
& GetUserName() const { return m_Username
; }
211 //Only use this when you know the real IP or when your clearing it.
212 void SetIP( uint32 val
);
213 uint32
GetIP() const { return m_dwUserIP
; }
214 bool HasLowID() const { return IsLowID(m_nUserIDHybrid
); }
215 wxString
GetFullIP() const { return Uint32toStringIP(m_FullUserIP
); }
216 uint32
GetConnectIP() const { return m_nConnectIP
; }
217 uint32
GetUserIDHybrid() const { return m_nUserIDHybrid
; }
218 void SetUserIDHybrid(uint32 val
);
219 uint16_t GetUserPort() const { return m_nUserPort
; }
220 void SetUserPort(uint16_t port
) { m_nUserPort
= port
; }
221 uint64
GetTransferredDown() const { return m_nTransferredDown
; }
222 uint32
GetServerIP() const { return m_dwServerIP
; }
223 void SetServerIP(uint32 nIP
) { m_dwServerIP
= nIP
; }
224 uint16
GetServerPort() const { return m_nServerPort
; }
225 void SetServerPort(uint16 nPort
) { m_nServerPort
= nPort
; }
226 const CMD4Hash
& GetUserHash() const { return m_UserHash
; }
227 void SetUserHash(const CMD4Hash
& userhash
);
228 void ValidateHash() { m_HasValidHash
= !m_UserHash
.IsEmpty(); }
229 bool HasValidHash() const { return m_HasValidHash
; }
230 uint32
GetVersion() const { return m_nClientVersion
;}
231 uint8
GetMuleVersion() const { return m_byEmuleVersion
;}
232 bool ExtProtocolAvailable() const { return m_bEmuleProtocol
;}
233 bool IsEmuleClient() const { return (m_byEmuleVersion
> 0);}
234 bool IsBanned() const;
235 const wxString
& GetClientFilename() const { return m_clientFilename
; }
236 uint16
GetUDPPort() const { return m_nUDPPort
; }
237 void SetUDPPort(uint16 nPort
) { m_nUDPPort
= nPort
; }
238 uint8
GetUDPVersion() const { return m_byUDPVer
; }
239 uint8
GetExtendedRequestsVersion() const { return m_byExtendedRequestsVer
; }
240 bool IsFriend() const { return m_Friend
!= NULL
; }
241 bool IsML() const { return m_bIsML
; }
242 bool IsHybrid() const { return m_bIsHybrid
; }
243 uint32
GetCompatibleClient() const { return m_byCompatibleClient
; }
245 void ClearDownloadBlockRequests();
246 void RequestSharedFileList();
247 void ProcessSharedFileList(const byte
* pachPacket
, uint32 nSize
, wxString
& pszDirectory
);
249 wxString
GetUploadFileInfo();
251 void SetUserName(const wxString
& NewName
) { m_Username
= NewName
; }
253 uint8
GetClientSoft() const { return m_clientSoft
; }
254 void ReGetClientSoft();
255 bool ProcessHelloAnswer(const byte
* pachPacket
, uint32 nSize
);
256 bool ProcessHelloPacket(const byte
* pachPacket
, uint32 nSize
);
257 void SendHelloAnswer();
258 bool SendHelloPacket();
259 void SendMuleInfoPacket(bool bAnswer
, bool OSInfo
= false);
260 bool ProcessMuleInfoPacket(const byte
* pachPacket
, uint32 nSize
);
261 void ProcessMuleCommentPacket(const byte
* pachPacket
, uint32 nSize
);
262 bool Compare(const CUpDownClient
* tocomp
, bool bIgnoreUserhash
= false) const;
263 void SetLastSrcReqTime() { m_dwLastSourceRequest
= ::GetTickCount(); }
264 void SetLastSrcAnswerTime() { m_dwLastSourceAnswer
= ::GetTickCount(); }
265 void SetLastAskedForSources() { m_dwLastAskedForSources
= ::GetTickCount(); }
266 uint32
GetLastSrcReqTime() const { return m_dwLastSourceRequest
; }
267 uint32
GetLastSrcAnswerTime() const { return m_dwLastSourceAnswer
; }
268 uint32
GetLastAskedForSources() const { return m_dwLastAskedForSources
; }
269 bool GetFriendSlot() const { return m_bFriendSlot
; }
270 void SetFriendSlot(bool bNV
) { m_bFriendSlot
= bNV
; }
271 void SetCommentDirty(bool bDirty
= true) { m_bCommentDirty
= bDirty
; }
272 uint8
GetSourceExchange1Version() const { return m_bySourceExchange1Ver
; }
273 bool SupportsSourceExchange2() const { return m_fSupportsSourceEx2
; }
275 bool SafeSendPacket(CPacket
* packet
);
277 void ProcessRequestPartsPacket(const byte
* pachPacket
, uint32 nSize
, bool largeblocks
);
278 void ProcessRequestPartsPacketv2(const CMemFile
& data
);
280 void SendPublicKeyPacket();
281 void SendSignaturePacket();
282 void ProcessPublicKeyPacket(const byte
* pachPacket
, uint32 nSize
);
283 void ProcessSignaturePacket(const byte
* pachPacket
, uint32 nSize
);
284 uint8
GetSecureIdentState();
286 void SendSecIdentStatePacket();
287 void ProcessSecIdentStatePacket(const byte
* pachPacket
, uint32 nSize
);
289 uint8
GetInfoPacketsReceived() const { return m_byInfopacketsReceived
; }
290 void InfoPacketsReceived();
293 uint8
GetUploadState() const { return m_nUploadState
; }
294 void SetUploadState(uint8 news
);
295 uint32
GetTransferredUp() const { return m_nTransferredUp
; }
296 uint32
GetSessionUp() const { return m_nTransferredUp
- m_nCurSessionUp
; }
297 void ResetSessionUp();
298 uint32
GetUploadDatarate() const { return m_nUpDatarate
; }
301 //uint32 GetWaitTime() const { return m_dwUploadTime - GetWaitStartTime(); }
302 uint32
GetUpStartTimeDelay() const { return ::GetTickCount() - m_dwUploadTime
; }
303 uint32
GetWaitStartTime() const;
305 //uint32 m_WaitTime, m_UpStartTimeDelay, m_WaitStartTime;
306 //uint32 GetWaitTime() const { return m_WaitTime; }
307 //uint32 GetUpStartTimeDelay() const { return m_UpStartTimeDelay; }
308 //uint32 GetWaitStartTime() const { return m_WaitStartTime; }
311 bool IsDownloading() const { return (m_nUploadState
== US_UPLOADING
); }
316 bool isdownloading
= false,
317 bool onlybasevalue
= false) const;
318 uint32
GetRating() const { return GetScore(false, IsDownloading(), true); }
319 uint8
GetObfuscationStatus() const;
320 uint16
GetUploadQueueWaitingPosition() const;
321 uint16
GetNextRequestedPart() const;
325 bool WXUNUSED(sysvalue
),
326 bool WXUNUSED(isdownloading
) = false,
327 bool onlybasevalue
= false) const
329 return onlybasevalue
? m_rating
: m_score
;
331 uint16 m_waitingPosition
;
332 uint16
GetUploadQueueWaitingPosition() const { return m_waitingPosition
; }
334 uint32
GetRating() const { return m_rating
; }
335 EIdentState m_identState
;
336 uint8
GetObfuscationStatus() const { return m_obfuscationStatus
; }
337 uint8 m_obfuscationStatus
;
338 uint16 m_nextRequestedPart
;
339 uint16
GetNextRequestedPart() const { return m_nextRequestedPart
; }
342 void AddReqBlock(Requested_Block_Struct
* reqblock
);
343 void CreateNextBlockPackage();
344 void SetUpStartTime() { m_dwUploadTime
= ::GetTickCount(); }
345 void SetWaitStartTime();
346 void ClearWaitStartTime();
347 void SendHashsetPacket(const CMD4Hash
& forfileid
);
348 bool SupportMultiPacket() const { return m_bMultiPacket
; }
349 bool SupportExtMultiPacket() const { return m_fExtMultiPacket
; }
351 void SetUploadFileID(CKnownFile
*newreqfile
);
354 *Gets the file actually on upload
357 const CKnownFile
* GetUploadFile() const { return m_uploadingfile
; }
359 void SendOutOfPartReqsAndAddToWaitingQueue();
360 void ProcessExtendedInfo(const CMemFile
*data
, CKnownFile
*tempreqfile
);
361 void ProcessFileInfo(const CMemFile
* data
, const CPartFile
* file
);
362 void ProcessFileStatus(bool bUdpPacket
, const CMemFile
* data
, const CPartFile
* file
);
364 const CMD4Hash
& GetUploadFileID() const { return m_requpfileid
; }
365 void SetUploadFileID(const CMD4Hash
& new_id
);
366 void ClearUploadFileID() { m_requpfileid
.Clear(); m_uploadingfile
= NULL
;};
367 uint32
SendBlockData();
368 void ClearUploadBlockRequests();
369 void SendRankingInfo();
370 void SendCommentInfo(CKnownFile
*file
);
371 bool IsDifferentPartBlock() const;
374 bool m_bAddNextConnect
; // VQB Fix for LowID slots only on connection
375 uint32
GetAskedCount() const { return m_cAsked
; }
376 void AddAskedCount() { m_cAsked
++; }
377 void ClearAskedCount() { m_cAsked
= 1; } // 1, because it's cleared *after* the first request...
378 void FlushSendBlocks(); // call this when you stop upload,
379 // or the socket might be not able to send
380 void SetLastUpRequest() { m_dwLastUpRequest
= ::GetTickCount(); }
381 uint32
GetLastUpRequest() const { return m_dwLastUpRequest
; }
382 size_t GetUpPartCount() const { return m_upPartStatus
.size(); }
386 void SetRequestFile(CPartFile
* reqfile
);
387 CPartFile
* GetRequestFile() const { return m_reqfile
; }
389 uint8
GetDownloadState() const { return m_nDownloadState
; }
390 void SetDownloadState(uint8 byNewState
);
391 uint32
GetLastAskedTime() const { return m_dwLastAskedTime
; }
392 void ResetLastAskedTime() { m_dwLastAskedTime
= 0; }
394 bool IsPartAvailable(uint16 iPart
) const
395 { return ( iPart
< m_downPartStatus
.size() ) ? m_downPartStatus
.get(iPart
) : 0; }
396 bool IsUpPartAvailable(uint16 iPart
) const
397 { return ( iPart
< m_upPartStatus
.size() ) ? m_upPartStatus
.get(iPart
) : 0;}
399 const BitVector
& GetPartStatus() const { return m_downPartStatus
; }
400 const BitVector
& GetUpPartStatus() const { return m_upPartStatus
; }
401 float GetKBpsDown() const { return kBpsDown
; }
402 float CalculateKBpsDown();
403 uint16
GetRemoteQueueRank() const { return m_nRemoteQueueRank
; }
404 uint16
GetOldRemoteQueueRank() const { return m_nOldRemoteQueueRank
; }
405 void SetRemoteQueueFull(bool flag
) { m_bRemoteQueueFull
= flag
; }
406 bool IsRemoteQueueFull() const { return m_bRemoteQueueFull
; }
407 void SetRemoteQueueRank(uint16 nr
);
408 bool AskForDownload();
409 void SendStartupLoadReq();
410 void SendFileRequest();
411 void ProcessHashSet(const byte
* packet
, uint32 size
);
412 bool AddRequestForAnotherFile(CPartFile
* file
);
413 bool DeleteFileRequest(CPartFile
* file
);
414 void DeleteAllFileRequests();
415 void SendBlockRequests();
416 void ProcessBlockPacket(const byte
* packet
, uint32 size
, bool packed
, bool largeblocks
);
419 uint16
GetAvailablePartCount() const;
421 uint16 m_AvailPartCount
;
422 uint16
GetAvailablePartCount() const { return m_AvailPartCount
; }
425 bool SwapToAnotherFile(bool bIgnoreNoNeeded
, bool ignoreSuspensions
, bool bRemoveCompletely
, CPartFile
* toFile
= NULL
);
426 void UDPReaskACK(uint16 nNewQR
);
428 void UDPReaskForDownload();
429 bool IsSourceRequestAllowed();
430 uint16
GetUpCompleteSourcesCount() const { return m_nUpCompleteSourcesCount
; }
431 void SetUpCompleteSourcesCount(uint16 n
) { m_nUpCompleteSourcesCount
= n
; }
434 uint8
GetChatState() { return m_byChatstate
; }
435 void SetChatState(uint8 nNewS
) { m_byChatstate
= nNewS
; }
436 EChatCaptchaState
GetChatCaptchaState() const { return (EChatCaptchaState
)m_nChatCaptchaState
; }
437 void ProcessCaptchaRequest(CMemFile
* data
);
438 void ProcessCaptchaReqRes(uint8 nStatus
);
439 void ProcessChatMessage(wxString message
);
441 uint8
GetMessagesReceived() const { return m_cMessagesReceived
; }
442 void IncMessagesReceived() { m_cMessagesReceived
< 255 ? ++m_cMessagesReceived
: 255; }
443 uint8
GetMessagesSent() const { return m_cMessagesSent
; }
444 void IncMessagesSent() { m_cMessagesSent
< 255 ? ++m_cMessagesSent
: 255; }
445 bool IsSpammer() const { return m_fIsSpammer
; }
446 void SetSpammer(bool bVal
);
447 bool IsMessageFiltered(const wxString
& message
);
450 const wxString
& GetFileComment() const { return m_strComment
; }
451 uint8
GetFileRating() const { return m_iRating
; }
453 const wxString
& GetSoftStr() const { return m_clientSoftString
; }
454 const wxString
& GetSoftVerStr() const { return m_clientVerString
; }
456 const wxString
GetServerName() const;
458 wxString m_ServerName
;
459 const wxString
& GetServerName() const { return m_ServerName
; }
462 uint16
GetKadPort() const { return m_nKadPort
; }
463 void SetKadPort(uint16 nPort
) { m_nKadPort
= nPort
; }
466 void SetReqFileAICHHash(CAICHHash
* val
);
467 CAICHHash
* GetReqFileAICHHash() const {return m_pReqFileAICHHash
;}
468 bool IsSupportingAICH() const {return m_fSupportsAICH
& 0x01;}
469 void SendAICHRequest(CPartFile
* pForFile
, uint16 nPart
);
470 bool IsAICHReqPending() const {return m_fAICHRequested
; }
471 void ProcessAICHAnswer(const byte
* packet
, uint32 size
);
472 void ProcessAICHRequest(const byte
* packet
, uint32 size
);
473 void ProcessAICHFileHash(CMemFile
* data
, const CPartFile
* file
);
475 EUtf8Str
GetUnicodeSupport() const;
477 // Barry - Process zip file as it arrives, don't need to wait until end of block
478 int unzip(Pending_Block_Struct
*block
, byte
*zipped
, uint32 lenZipped
, byte
**unzipped
, uint32
*lenUnzipped
, int iRecursion
= 0);
479 void UpdateDisplayedInfo(bool force
= false);
480 int GetFileListRequested() const { return m_iFileListRequested
; }
481 void SetFileListRequested(int iFileListRequested
) { m_iFileListRequested
= iFileListRequested
; }
483 void ResetFileStatusInfo();
485 bool CheckHandshakeFinished() const;
487 bool GetSentCancelTransfer() const { return m_fSentCancelTransfer
; }
488 void SetSentCancelTransfer(bool bVal
) { m_fSentCancelTransfer
= bVal
; }
490 wxString
GetClientFullInfo();
491 wxString
GetClientShortInfo();
493 const wxString
& GetClientOSInfo() const { return m_sClientOSInfo
; }
495 void ProcessPublicIPAnswer(const byte
* pbyData
, uint32 uSize
);
496 void SendPublicIPRequest();
499 * Sets the current socket of the client.
501 * @param socket The pointer to the new socket, can be NULL.
503 * Please note that this function DOES NOT delete the old socket.
505 void SetSocket(CClientTCPSocket
* socket
);
508 * Function for accessing the socket owned by a client.
510 * @return The pointer (can be NULL) to the socket used by this client.
512 * Please note that the socket object is quite volatile and can be removed
513 * from one function call to the next, therefore, you should normally use
514 * the safer functions below, which all check if the socket is valid before
517 CClientTCPSocket
* GetSocket() const { return m_socket
; }
520 * Safe function for checking if the socket is connected.
522 * @return True if the socket exists and is connected, false otherwise.
525 bool IsConnected() const;
528 bool IsConnected() const { return m_IsConnected
; }
532 * Safe function for sending packets.
534 * @return True if the socket exists and the packet was sent, false otherwise.
536 bool SendPacket(CPacket
* packet
, bool delpacket
= true, bool controlpacket
= true);
539 * Safe function for setting the download limit of the socket.
541 * @return Current download speed of the client.
543 float SetDownloadLimit(uint32 reducedownload
);
546 * Sends a message to a client
548 * @return True if sent, false if connecting
550 bool SendChatMessage(const wxString
& message
);
552 bool HasBlocks() const { return !m_BlockRequests_queue
.empty(); }
554 /* Source comes from? */
555 ESourceFrom
GetSourceFrom() const { return (ESourceFrom
)m_nSourceFrom
; }
556 void SetSourceFrom(ESourceFrom val
) { m_nSourceFrom
= val
; }
558 /* Kad buddy support */
560 const byte
* GetBuddyID() const { return m_achBuddyID
; }
561 void SetBuddyID(const byte
* m_achTempBuddyID
);
562 bool HasValidBuddyID() const { return m_bBuddyIDValid
; }
564 void SetBuddyIP( uint32 val
) { m_nBuddyIP
= val
; }
565 uint32
GetBuddyIP() const { return m_nBuddyIP
; }
567 void SetBuddyPort( uint16 val
) { m_nBuddyPort
= val
; }
568 uint16
GetBuddyPort() const { return m_nBuddyPort
; }
571 bool SendBuddyPingPong() { return m_dwLastBuddyPingPongTime
< ::GetTickCount(); }
572 bool AllowIncomeingBuddyPingPong() { return m_dwLastBuddyPingPongTime
< (::GetTickCount()-(3*60*1000)); }
573 void SetLastBuddyPingPongTime() { m_dwLastBuddyPingPongTime
= (::GetTickCount()+(10*60*1000)); }
574 EKadState
GetKadState() const { return m_nKadState
; }
575 void SetKadState(EKadState nNewS
) { m_nKadState
= nNewS
; }
576 uint8
GetKadVersion() { return m_byKadVersion
; }
577 void ProcessFirewallCheckUDPRequest(CMemFile
*data
);
579 bool SendBuddyPing();
581 /* Returns the client hash type (SO_EMULE, mldonkey, etc) */
582 int GetHashType() const;
585 * Checks that a client isn't aggressively re-asking for files.
587 * Call this when a file is requested. If the time since the last request is
588 * less than MIN_REQUESTTIME, 3 is added to the m_Aggressiveness variable.
589 * If the time since the last request is >= MIN_REQUESTTIME, the variable is
590 * decremented by 1. The client is banned if the variable reaches 10 or above.
592 * To check if a client is aggressive use the IsClientAggressive() function.
594 * Currently this function is called when the following packets are received:
595 * - OP_STARTUPLOADREQ
598 void CheckForAggressive();
600 const wxString
& GetClientModString() const { return m_strModVersion
; }
602 const wxString
& GetClientVerString() const { return m_fullClientVerString
; }
604 const wxString
& GetVersionString() const { return m_clientVersionString
; }
608 /* Returns a pointer to the credits, only for hash purposes */
609 void* GetCreditsHash() const { return (void*)credits
; }
611 uint16
GetLastDownloadingPart() const { return m_lastDownloadingPart
; }
613 bool GetOSInfoSupport() const { return m_fOsInfoSupport
; }
615 bool GetVBTTags() const { return m_fValueBasedTypeTags
; }
617 uint16
GetLastPartAsked() const { return m_lastPartAsked
; }
619 void SetLastPartAsked(uint16 nPart
) { m_lastPartAsked
= nPart
; }
621 CFriend
* GetFriend() const { return m_Friend
; }
623 void SetFriend(CFriend
* newfriend
) { m_Friend
= newfriend
; }
625 bool IsIdentified() const;
627 bool IsBadGuy() const;
629 bool SUIFailed() const;
631 bool SUINeeded() const;
633 bool SUINotSupported() const;
635 uint64
GetDownloadedTotal() const;
637 uint64
GetUploadedTotal() const;
639 double GetScoreRatio() const;
641 uint32
GetCreationTime() const { return m_nCreationTime
; }
643 bool SupportsLargeFiles() const { return m_fSupportsLargeFiles
; }
645 EIdentState
GetCurrentIdentState() const { return credits
? credits
->GetCurrentIdentState(GetIP()) : IS_NOTAVAILABLE
; }
648 /* Kry - Debug. See connection_reason definition comment below */
649 void SetConnectionReason(const wxString
& reason
) { connection_reason
= reason
; }
652 // Encryption / Obfuscation / ConnectOptions
653 bool SupportsCryptLayer() const { return m_fSupportsCryptLayer
; }
654 bool RequestsCryptLayer() const { return SupportsCryptLayer() && m_fRequestsCryptLayer
; }
655 bool RequiresCryptLayer() const { return RequestsCryptLayer() && m_fRequiresCryptLayer
; }
656 bool SupportsDirectUDPCallback() const { return m_fDirectUDPCallback
!= 0 && HasValidHash() && GetKadPort() != 0; }
657 uint32_t GetDirectCallbackTimeout() const { return m_dwDirectCallbackTimeout
; }
658 bool HasObfuscatedConnectionBeenEstablished() const { return m_hasbeenobfuscatinglately
; }
660 void SetCryptLayerSupport(bool bVal
) { m_fSupportsCryptLayer
= bVal
? 1 : 0; }
661 void SetCryptLayerRequest(bool bVal
) { m_fRequestsCryptLayer
= bVal
? 1 : 0; }
662 void SetCryptLayerRequires(bool bVal
) { m_fRequiresCryptLayer
= bVal
? 1 : 0; }
663 void SetDirectUDPCallbackSupport(bool bVal
) { m_fDirectUDPCallback
= bVal
? 1 : 0; }
664 void SetConnectOptions(uint8_t options
, bool encryption
= true, bool callback
= true); // shortcut, sets crypt, callback, etc from the tagvalue we receive
665 bool ShouldReceiveCryptUDPPackets() const;
667 bool HasDisabledSharedFiles() const { return m_fNoViewSharedFiles
; }
671 CClientCredits
*credits
;
674 uint64 m_nTransferredUp
;
675 sint64 m_nCurQueueSessionPayloadUp
;
676 sint64 m_addedPayloadQueueSession
;
678 struct TransferredData
{
683 //////////////////////////////////////////////////////////
684 // Upload data rate computation
686 uint32 m_nUpDatarate
;
687 uint32 m_nSumForAvgUpDataRate
;
688 std::list
<TransferredData
> m_AvarageUDR_list
;
692 * This struct is used to keep track of CPartFiles which this source shares.
695 //! Signifies if this sources has needed parts for this file.
697 //! This is set when we wish to avoid swapping to this file for a while.
701 //! I typedef in the name of readability!
702 typedef std::map
<CPartFile
*, A4AFStamp
> A4AFList
;
703 //! This list contains all PartFiles which this client can be used as a source for.
704 A4AFList m_A4AF_list
;
707 * Helper function used by SwapToAnotherFile().
709 * @param it The iterator of the PartFile to be examined.
710 * @param ignorenoneeded Do not check for the status NoNeededParts when checking the file.
711 * @param ignoresuspended Do not check the timestamp when checking the file.
712 * @return True if the file is a viable target, false otherwise.
714 * This function is used to perform checks to see if we should consider
715 * this file a viable target for A4AF swapping. Unless ignoresuspended is
716 * true, it will examine the timestamp of the file and reset it if needed.
718 bool IsValidSwapTarget( A4AFList::iterator it
, bool ignorenoneeded
= false, bool ignoresuspended
= false );
720 CPartFile
* m_reqfile
;
724 bool ProcessHelloTypePacket(const CMemFile
& data
);
725 void SendHelloTypePacket(CMemFile
* data
);
726 void SendFirewallCheckUDPRequest();
727 void ClearHelloProperties(); // eMule 0.42
730 uint32 m_nConnectIP
; // holds the supposed IP or (after we had a connection) the real IP
732 uint32 m_nUserIDHybrid
;
733 uint16_t m_nUserPort
;
735 uint32 m_nClientVersion
;
737 uint8 m_byEmuleVersion
;
738 uint8 m_byDataCompVer
;
739 bool m_bEmuleProtocol
;
746 uint8 m_bySourceExchange1Ver
;
747 uint8 m_byAcceptCommentVer
;
748 uint8 m_byExtendedRequestsVer
;
750 uint32 m_dwLastSourceRequest
;
751 uint32 m_dwLastSourceAnswer
;
752 uint32 m_dwLastAskedForSources
;
753 int m_iFileListRequested
;
755 bool m_bCommentDirty
;
758 bool m_bSupportsPreview
;
759 bool m_bUnicodeSupport
;
762 ClientState m_clientState
;
763 CClientTCPSocket
* m_socket
;
764 bool m_fNeedOurPublicIP
; // we requested our IP from this client
766 // Kry - Secure User Ident import
767 ESecureIdentState m_SecureIdentState
;
768 uint8 m_byInfopacketsReceived
; // have we received the edonkeyprot and emuleprot packet already (see InfoPacketsReceived() )
769 uint32 m_dwLastSignatureIP
;
770 uint8 m_bySupportSecIdent
;
772 uint32 m_byCompatibleClient
;
773 std::list
<CPacket
*> m_WaitingPackets_list
;
774 uint32 m_lastRefreshedDLDisplay
;
777 void CreateStandardPackets(const unsigned char* data
,uint32 togo
, Requested_Block_Struct
* currentblock
);
778 void CreatePackedPackets(const unsigned char* data
,uint32 togo
, Requested_Block_Struct
* currentblock
);
780 uint8 m_nUploadState
;
781 uint32 m_dwUploadTime
;
783 uint32 m_dwLastUpRequest
;
784 uint32 m_nCurSessionUp
;
785 uint16 m_nUpPartCount
;
786 CMD4Hash m_requpfileid
;
787 uint16 m_nUpCompleteSourcesCount
;
789 //! This vector contains the avilability of parts for the file that the user
790 //! is requesting. When changing it, be sure to call CKnownFile::UpdatePartsFrequency
791 //! so that the files know the actual availability of parts.
792 BitVector m_upPartStatus
;
793 uint16 m_lastPartAsked
;
794 wxString m_strModVersion
;
796 std::list
<Requested_Block_Struct
*> m_BlockRequests_queue
;
797 std::list
<Requested_Block_Struct
*> m_DoneBlocks_list
;
800 bool m_bRemoteQueueFull
;
801 uint8 m_nDownloadState
;
803 uint32 m_dwLastAskedTime
;
804 wxString m_clientFilename
;
805 uint64 m_nTransferredDown
;
806 uint16 m_lastDownloadingPart
; // last Part that was downloading
808 uint32 m_dwLastBlockReceived
;
809 uint16 m_nRemoteQueueRank
;
810 uint16 m_nOldRemoteQueueRank
;
811 bool m_bCompleteSource
;
812 bool m_bReaskPending
;
814 bool m_bHashsetRequested
;
816 std::list
<Pending_Block_Struct
*> m_PendingBlocks_list
;
817 std::list
<Requested_Block_Struct
*> m_DownloadBlocks_list
;
819 // download speed calculation
821 uint32 msReceivedPrev
;
822 uint32 bytesReceivedCycle
;
824 wxString m_strComment
;
826 uint8 m_nChatCaptchaState
;
827 uint8 m_cCaptchasSent
;
829 uint8 m_cMessagesReceived
; // count of chatmessages he sent to me
830 uint8 m_cMessagesSent
; // count of chatmessages I sent to him
831 wxString m_strCaptchaChallenge
;
832 wxString m_strCaptchaPendingMsg
;
835 m_fHashsetRequesting
: 1, // we have sent a hashset request to this client
836 m_fNoViewSharedFiles
: 1, // client has disabled the 'View Shared Files' feature,
837 // if this flag is not set, we just know that we don't know
838 // for sure if it is enabled
839 m_fSupportsPreview
: 1,
841 m_fSentCancelTransfer
: 1, // we have sent an OP_CANCELTRANSFER in the current connection
842 m_fSharedDirectories
: 1, // client supports OP_ASKSHAREDIRS opcodes
844 m_fAICHRequested
: 1,
845 m_fSupportsLargeFiles
: 1,
846 m_fSentOutOfPartReqs
: 1,
847 m_fExtMultiPacket
: 1,
848 m_fRequestsCryptLayer
: 1,
849 m_fSupportsCryptLayer
: 1,
850 m_fRequiresCryptLayer
: 1,
851 m_fSupportsSourceEx2
: 1,
852 m_fSupportsCaptcha
: 1,
853 m_fDirectUDPCallback
: 1;
856 m_fOsInfoSupport
: 1,
857 m_fValueBasedTypeTags
: 1;
859 /* Razor 1a - Modif by MikaelB */
861 bool m_bHelloAnswerPending
;
863 //! This vector contains the avilability of parts for the file we requested
864 //! from this user. When changing it, be sure to call CPartFile::UpdatePartsFrequency
865 //! so that the files know the actual availability of parts.
866 BitVector m_downPartStatus
;
868 CAICHHash
* m_pReqFileAICHHash
;
870 ESourceFrom m_nSourceFrom
;
873 byte m_achBuddyID
[16];
874 bool m_bBuddyIDValid
;
878 EKadState m_nKadState
;
880 uint8 m_byKadVersion
;
881 uint32 m_dwLastBuddyPingPongTime
;
882 uint32_t m_dwDirectCallbackTimeout
;
884 //! This keeps track of aggressive requests for files.
885 uint16 m_Aggressiveness
;
886 //! This tracks the time of the last time since a file was requested
887 uint32 m_LastFileRequest
;
891 wxString m_clientSoftString
; /* software name */
892 wxString m_clientVerString
; /* version + optional mod name */
893 wxString m_clientVersionString
; /* version string */
894 wxString m_fullClientVerString
; /* full info string */
895 wxString m_sClientOSInfo
;
896 wxString m_pendingMessage
;
900 CKnownFile
* m_uploadingfile
;
902 uint8 m_MaxBlockRequests
;
905 uint32 m_lastClientSoft
;
906 uint32 m_lastClientVersion
;
907 wxString m_lastOSInfo
;
909 /* For buddies timeout */
910 uint32 m_nCreationTime
;
912 /* Calculation of last average speed */
913 uint32 m_lastaverage
;
914 uint32 m_last_block_start
;
916 /* Save the encryption status for display when disconnected */
917 bool m_hasbeenobfuscatinglately
;
919 /* Kry - Debug thing. Clients created just to check their data
920 have this string set to the reason we want to check them.
921 Obviously, once checked, we disconnect them. Take that, sucker.
922 This debug code is just for me I'm afraid. */
924 wxString connection_reason
;
929 #define MAKE_CLIENT_VERSION(mjr, min, upd) \
930 ((uint32)(mjr)*100U*10U*100U + (uint32)(min)*100U*10U + (uint32)(upd)*100U)
933 #endif // UPDOWNCLIENT_H
934 // File_checked_for_headers