📄 downloadclient.cpp
字号:
err = inflate(zS, Z_SYNC_FLUSH);
// Is zip finished reading all currently available input and writing all generated output
if (err == Z_STREAM_END)
{
// Finish up
err = inflateEnd(zS);
if (err != Z_OK){
TRACE_UNZIP("; Error: end stream failed: %d\n", err);
return err;
}
TRACE_UNZIP("; Z_STREAM_END\n");
// Got a good result, set the size to the amount unzipped in this call (including all recursive calls)
(*lenUnzipped) = (zS->total_out - block->totalUnzipped);
block->totalUnzipped = zS->total_out;
}
else if ((err == Z_OK) && (zS->avail_out == 0) && (zS->avail_in != 0))
{
// Output array was not big enough, call recursively until there is enough space
TRACE_UNZIP("; output array not big enough (ain=%u)\n", zS->avail_in);
// What size should we try next
uint32 newLength = (*lenUnzipped) *= 2;
if (newLength == 0)
newLength = lenZipped * 2;
// Copy any data that was successfully unzipped to new array
BYTE *temp = new BYTE[newLength];
ASSERT( zS->total_out - block->totalUnzipped <= newLength );
memcpy(temp, (*unzipped), (zS->total_out - block->totalUnzipped));
delete [] (*unzipped);
(*unzipped) = temp;
(*lenUnzipped) = newLength;
// Position stream output to correct place in new array
zS->next_out = (*unzipped) + (zS->total_out - block->totalUnzipped);
zS->avail_out = (*lenUnzipped) - (zS->total_out - block->totalUnzipped);
// Try again
err = unzip(block, zS->next_in, zS->avail_in, unzipped, lenUnzipped, iRecursion + 1);
}
else if ((err == Z_OK) && (zS->avail_in == 0))
{
TRACE_UNZIP("; all input processed\n");
// All available input has been processed, everything ok.
// Set the size to the amount unzipped in this call (including all recursive calls)
(*lenUnzipped) = (zS->total_out - block->totalUnzipped);
block->totalUnzipped = zS->total_out;
}
else
{
// Should not get here unless input data is corrupt
if (thePrefs.GetVerbose())
{
CString strZipError;
if (zS->msg)
strZipError.Format(_T(" %d: '%hs'"), err, zS->msg);
else if (err != Z_OK)
strZipError.Format(_T(" %d"), err);
TRACE_UNZIP("; Error: %s\n", strZipError);
AddDebugLogLine(false, _T("Unexpected zip error%s in file \"%s\""), strZipError, reqfile ? reqfile->GetFileName() : NULL);
}
}
if (err != Z_OK)
(*lenUnzipped) = 0;
}
catch (...){
if (thePrefs.GetVerbose())
AddDebugLogLine(false, _T("Unknown exception in %hs: file \"%s\""), __FUNCTION__, reqfile ? reqfile->GetFileName() : NULL);
err = Z_DATA_ERROR;
ASSERT(0);
}
return err;
}
uint32 CUpDownClient::CalculateDownloadRate(){
#ifndef USE_ZZ_DDR
// Patch By BadWolf - Accurate datarate Calculation
TransferredData newitem = {m_nDownDataRateMS,::GetTickCount()};
m_AvarageDDR_list.AddTail(newitem);
m_nSumForAvgDownDataRate += m_nDownDataRateMS;
m_nDownDataRateMS = 0;
while (m_AvarageDDR_list.GetCount()>500)
m_nSumForAvgDownDataRate -= m_AvarageDDR_list.RemoveHead().datalen;
if(m_AvarageDDR_list.GetCount() > 1){
DWORD dwDuration = m_AvarageDDR_list.GetTail().timestamp - m_AvarageDDR_list.GetHead().timestamp;
if (dwDuration)
m_nDownDatarate = (UINT)(1000U * (ULONGLONG)m_nSumForAvgDownDataRate / dwDuration);
}
else
m_nDownDatarate = 0;
// END Patch By BadWolf
#else//eMule_0.42e_ZZUL_20040428-2156
bool ddrListChanged = false;
if(m_nDownDataRateMS > 0) {
TransferredData newitem = {m_nDownDataRateMS,::GetTickCount()};
m_AvarageDDR_list.AddTail(newitem);
m_nSumForAvgDownDataRate += m_nDownDataRateMS;
m_nDownDataRateMS = 0;
ddrListChanged = true;
}
while (m_AvarageDDR_list.GetCount() > 1 && (::GetTickCount() - m_AvarageDDR_list.GetHead().timestamp)> 20*1000) {
m_nSumForAvgDownDataRate -= m_AvarageDDR_list.RemoveHead().datalen;
ddrListChanged = true;
}
if(m_AvarageDDR_list.GetCount() > 1) {
if(ddrListChanged == true) {
DWORD dwDuration = ::GetTickCount() - m_AvarageDDR_list.GetHead().timestamp;
if(dwDuration > 10*1000) {
m_nDownDatarate = (1000.0 * (m_nSumForAvgDownDataRate-m_AvarageDDR_list.GetHead().datalen))/dwDuration;
} else {
m_nDownDatarate = 0;
}
}
} else {
m_nDownDatarate = 0;
}
#endif
m_cShowDR++;
if (m_cShowDR == 30){
m_cShowDR = 0;
UpdateDisplayedInfo();
}
return m_nDownDatarate;
}
void CUpDownClient::CheckDownloadTimeout()
{
if (IsDownloadingFromPeerCache() && m_pPCDownSocket && m_pPCDownSocket->IsConnected())
{
ASSERT( DOWNLOADTIMEOUT < m_pPCDownSocket->GetTimeOut() );
if (GetTickCount() - m_dwLastBlockReceived > DOWNLOADTIMEOUT)
{
OnPeerCacheDownSocketTimeout();
}
}
else
{
if ((::GetTickCount() - m_dwLastBlockReceived) > DOWNLOADTIMEOUT)
{
ASSERT( socket != NULL );
if (socket != NULL)
{
ASSERT( !socket->IsRawDataMode() );
if (!socket->IsRawDataMode())
SendCancelTransfer();
}
SetDownloadState(DS_ONQUEUE);
}
}
}
UINT CUpDownClient::GetAvailablePartCount() const
{
UINT result = 0;
for (int i = 0;i < m_nPartCount;i++){
if (IsPartAvailable(i))
result++;
}
return result;
}
void CUpDownClient::SetRemoteQueueRank(uint16 nr){
m_nRemoteQueueRank = nr;
UpdateDisplayedInfo();
}
void CUpDownClient::UDPReaskACK(uint16 nNewQR){
m_bUDPPending = false;
SetRemoteQueueRank(nNewQR);
SetLastAskedTime(); // ZZ:DownloadManager
}
void CUpDownClient::UDPReaskFNF(){
m_bUDPPending = false;
if (GetDownloadState() != DS_DOWNLOADING){ // avoid premature deletion of 'this' client
if (thePrefs.GetVerbose())
AddDebugLogLine(DLP_LOW, false, _T("UDP ANSWER FNF : %s - %s"),DbgGetClientInfo(), DbgGetFileInfo(reqfile ? reqfile->GetFileHash() : NULL));
switch (GetDownloadState()) {
case DS_ONQUEUE:
case DS_NONEEDEDPARTS:
DontSwapTo(reqfile); // ZZ:DownloadManager
if (SwapToAnotherFile(_T("Source says it doesn't have the file. CUpDownClient::UDPReaskFNF()"), true, true, true, NULL, false, false))
break;
/*fall through*/
default:
theApp.downloadqueue->RemoveSource(this);
if (!socket){
if (Disconnected(_T("UDPReaskFNF socket=NULL")))
delete this;
}
}
}
else
{
if (thePrefs.GetVerbose())
AddDebugLogLine(false,_T("UDP ANSWER FNF : %s - did not remove client because of current download state"),GetUserName());
}
}
void CUpDownClient::UDPReaskForDownload()
{
ASSERT ( reqfile );
if(!reqfile || m_bUDPPending)
return;
if( m_nTotalUDPPackets > 3 && ((float)(m_nFailedUDPPackets/m_nTotalUDPPackets) > .3))
return;
//the line "m_bUDPPending = true;" use to be here
// deadlake PROXYSUPPORT
const ProxySettings& proxy = thePrefs.GetProxy();
if(m_nUDPPort != 0 && thePrefs.GetUDPPort() != 0 &&
!theApp.IsFirewalled() && !HasLowID() && !(socket && socket->IsConnected())&& (!proxy.UseProxy))
{
//don't use udp to ask for sources
if(IsSourceRequestAllowed())
return;
// ZZ:DownloadManager -->
if(SwapToAnotherFile(_T("A4AF check before OP__ReaskFilePing. CUpDownClient::UDPReaskForDownload()"), true, false, false, NULL, true, true)) {
return; // we swapped, so need to go to tcp
}
// ZZ:DownloadManager <--
m_bUDPPending = true;
CSafeMemFile data(128);
data.WriteHash16(reqfile->GetFileHash());
if (GetUDPVersion() > 3)
{
if (reqfile->IsPartFile())
((CPartFile*)reqfile)->WritePartStatus(&data);
else
data.WriteUInt16(0);
}
if (GetUDPVersion() > 2)
data.WriteUInt16(reqfile->m_nCompleteSourcesCount);
if (thePrefs.GetDebugClientUDPLevel() > 0)
DebugSend("OP__ReaskFilePing", this, (char*)reqfile->GetFileHash());
Packet* response = new Packet(&data, OP_EMULEPROT);
response->opcode = OP_REASKFILEPING;
theStats.AddUpDataOverheadFileRequest(response->size);
theApp.downloadqueue->AddUDPFileReasks();
theApp.clientudp->SendPacket(response,GetIP(),GetUDPPort());
m_nTotalUDPPackets++;
}
}
void CUpDownClient::UpdateDisplayedInfo(bool force)
{
#ifdef _DEBUG
force = true;
#endif
DWORD curTick = ::GetTickCount();
if(force || curTick-m_lastRefreshedDLDisplay > MINWAIT_BEFORE_DLDISPLAY_WINDOWUPDATE+(uint32)(rand()/(RAND_MAX/1000))) {
theApp.emuledlg->transferwnd->downloadlistctrl.UpdateItem(this);
theApp.emuledlg->transferwnd->clientlistctrl.RefreshClient(this);
m_lastRefreshedDLDisplay = curTick;
}
}
// ZZ:DownloadManager -->
const bool CUpDownClient::IsInOtherRequestList(const CPartFile* fileToCheck) const {
for (POSITION pos = m_OtherRequests_list.GetHeadPosition();pos != 0;m_OtherRequests_list.GetNext(pos)) {
if(m_OtherRequests_list.GetAt(pos) == fileToCheck) {
return true;
}
}
return false;
}
// <-- ZZ:DownloadManager
// ZZ:DownloadManager -->
const bool CUpDownClient::SwapToRightFile(CPartFile* SwapTo, CPartFile* cur_file, bool ignoreSuspensions, bool SwapToIsNNPFile, bool curFileisNNPFile, bool& wasSkippedDueToSourceExchange, bool doAgressiveSwapping, bool debug) {
bool printDebug = debug && thePrefs.GetLogA4AF();
if(printDebug) {
AddDebugLogLine(DLP_LOW, false, _T("oooo Debug: SwapToRightFile. Start compare SwapTo: %s and cur_file %s"), SwapTo?SwapTo->GetFileName():_T("null"), cur_file->GetFileName());
AddDebugLogLine(DLP_LOW, false, _T("oooo Debug: doAgressiveSwapping: %s"), doAgressiveSwapping?_T("true"):_T("false"));
}
if (!SwapTo) {
return true;
}
if(!curFileisNNPFile && cur_file->GetSourceCount() < thePrefs.GetMaxSourcePerFile() ||
curFileisNNPFile && cur_file->GetSourceCount() < thePrefs.GetMaxSourcePerFile()*.8) {
if(printDebug)
AddDebugLogLine(DLP_VERYLOW, false, _T("oooo Debug: cur_file does probably not have too many sources."));
if(SwapTo->GetSourceCount() > thePrefs.GetMaxSourcePerFile() ||
SwapTo->GetSourceCount() >= thePrefs.GetMaxSourcePerFile()*.8 &&
SwapTo == reqfile &&
(
GetDownloadState() == DS_LOWTOLOWIP ||
GetDownloadState() == DS_REMOTEQUEUEFULL
)
) {
if(printDebug)
AddDebugLogLine(DLP_VERYLOW, false, _T("oooo Debug: SwapTo is about to be deleted due to too many sources on that file, so we can steal it."));
return true;
}
if(SwapToIsNNPFile && !curFileisNNPFile) {
if(printDebug)
AddDebugLogLine(DLP_LOW, false, _T("oooo Debug: SwapTo is NNP and cur_file is not."));
return true;
}
if(SwapToIsNNPFile == curFileisNNPFile) {
if(printDebug)
AddDebugLogLine(DLP_VERYLOW, false, _T("oooo Debug: SwapToIsNNPFile == curFileisNNPFile"));
if(ignoreSuspensions || !IsSwapSuspended(cur_file, doAgressiveSwapping, curFileisNNPFile)) {
if(printDebug)
AddDebugLogLine(DLP_VERYLOW, false, _T("oooo Debug: No suspend block."));
if(
!SwapTo->IsA4AFAuto() &&
(
cur_file->IsA4AFAuto() ||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -