bool bHasLongBlocks = false; std::list::iterator it = m_PendingBlocks_list.begin(); for (uint32 i = 0; i != 3; i++){ if (it != m_PendingBlocks_list.end()) { Pending_Block_Struct* pending = *it++; wxASSERT( pending->block->StartOffset <= pending->block->EndOffset ); if (pending->block->StartOffset > 0xFFFFFFFF || pending->block->EndOffset > 0xFFFFFFFF){ bHasLongBlocks = true; if (!SupportsLargeFiles()){ // Requesting a large block from a client that doesn't support large files? wxASSERT( false ); if (!GetSentCancelTransfer()){ CPacket* packet = new CPacket(OP_CANCELTRANSFER, 0, OP_EDONKEYPROT); theStats::AddUpOverheadFileRequest(packet->GetPacketSize()); AddDebugLogLineM( false, logLocalClient, wxT("Local Client: OP_CANCELTRANSFER to ") + GetFullIP() ); SendPacket(packet,true,true); SetSentCancelTransfer(1); } SetDownloadState(DS_ERROR); } break; } } } CMemFile data(16 /*Hash*/ + (3*(bHasLongBlocks ? 8 : 4) /* uint32/64 start*/) + (3*(bHasLongBlocks ? 8 : 4)/* uint32/64 end*/)); data.WriteHash(m_reqfile->GetFileHash()); it = m_PendingBlocks_list.begin(); for (uint32 i = 0; i != 3; i++) { if (it != m_PendingBlocks_list.end()) { Pending_Block_Struct* pending = *it++; wxASSERT( pending->block->StartOffset <= pending->block->EndOffset ); pending->fZStreamError = 0; pending->fRecovered = 0; if (bHasLongBlocks) { data.WriteUInt64(pending->block->StartOffset); } else { data.WriteUInt32(pending->block->StartOffset); } } else { if (bHasLongBlocks) { data.WriteUInt64(0); } else { data.WriteUInt32(0); } } } it = m_PendingBlocks_list.begin(); for (uint32 i = 0; i != 3; i++) { if (it != m_PendingBlocks_list.end()) { Requested_Block_Struct* block = (*it++)->block; if (bHasLongBlocks) { data.WriteUInt64(block->EndOffset+1); } else { data.WriteUInt32(block->EndOffset+1); } } else { if (bHasLongBlocks) { data.WriteUInt64(0); } else { data.WriteUInt32(0); } } } packet = new CPacket(&data, (bHasLongBlocks ? OP_EMULEPROT : OP_EDONKEYPROT), (bHasLongBlocks ? (uint8)OP_REQUESTPARTS_I64 : (uint8)OP_REQUESTPARTS));