| 1664 | |
| 1665 | |
| 1666 | void CUpDownClient::ProcessAICHRequest(const uint8_t* packet, uint32 size) |
| 1667 | { |
| 1668 | if (size != 16 + 2 + CAICHHash::GetHashSize()) { |
| 1669 | throw wxString("Received AICH Request Packet with wrong size"); |
| 1670 | } |
| 1671 | |
| 1672 | CMemFile data(packet, size); |
| 1673 | |
| 1674 | CMD4Hash hash = data.ReadHash(); |
| 1675 | uint16 nPart = data.ReadUInt16(); |
| 1676 | CAICHHash ahMasterHash(&data); |
| 1677 | CKnownFile* pKnownFile = theApp->sharedfiles->GetFileByID(hash); |
| 1678 | if (pKnownFile != NULL){ |
| 1679 | if (pKnownFile->GetAICHHashset()->GetStatus() == AICH_HASHSETCOMPLETE && pKnownFile->GetAICHHashset()->HasValidMasterHash() |
| 1680 | && pKnownFile->GetAICHHashset()->GetMasterHash() == ahMasterHash && pKnownFile->GetPartCount() > nPart |
| 1681 | && pKnownFile->GetFileSize() > EMBLOCKSIZE && pKnownFile->GetFileSize() - PARTSIZE*nPart > EMBLOCKSIZE) |
| 1682 | { |
| 1683 | CMemFile fileResponse; |
| 1684 | fileResponse.WriteHash(pKnownFile->GetFileHash()); |
| 1685 | fileResponse.WriteUInt16(nPart); |
| 1686 | pKnownFile->GetAICHHashset()->GetMasterHash().Write(&fileResponse); |
| 1687 | if (pKnownFile->GetAICHHashset()->CreatePartRecoveryData(nPart*PARTSIZE, &fileResponse)){ |
| 1688 | AddDebugLogLineN(logAICHTransfer, |
| 1689 | CFormat("AICH Packet Request: Successfully created and send recoverydata for '%s' to %s") |
| 1690 | % pKnownFile->GetFileName() % GetClientFullInfo()); |
| 1691 | |
| 1692 | CPacket* packAnswer = new CPacket(fileResponse, OP_EMULEPROT, OP_AICHANSWER); |
| 1693 | theStats::AddUpOverheadOther(packAnswer->GetPacketSize()); |
| 1694 | AddDebugLogLineN(logLocalClient, "Local Client: OP_AICHANSWER to" + GetFullIP()); |
| 1695 | SafeSendPacket(packAnswer); |
| 1696 | return; |
| 1697 | } else { |
| 1698 | AddDebugLogLineN(logAICHTransfer, |
| 1699 | CFormat("AICH Packet Request: Failed to create recoverydata for '%s' to %s") |
| 1700 | % pKnownFile->GetFileName() % GetClientFullInfo()); |
| 1701 | } |
| 1702 | } else { |
| 1703 | AddDebugLogLineN(logAICHTransfer, |
| 1704 | CFormat("AICH Packet Request: Failed to create recoverydata - Hashset not ready or requested Hash differs from Masterhash for '%s' to %s") |
| 1705 | % pKnownFile->GetFileName() % GetClientFullInfo()); |
| 1706 | } |
| 1707 | } else { |
| 1708 | AddDebugLogLineN( logAICHTransfer, "AICH Packet Request: Failed to find requested shared file - " + GetClientFullInfo() ); |
| 1709 | } |
| 1710 | |
| 1711 | CPacket* packAnswer = new CPacket(OP_AICHANSWER, 16, OP_EMULEPROT); |
| 1712 | packAnswer->Copy16ToDataBuffer(hash.GetHash()); |
| 1713 | theStats::AddUpOverheadOther(packAnswer->GetPacketSize()); |
| 1714 | AddDebugLogLineN(logLocalClient, "Local Client: OP_AICHANSWER to" + GetFullIP()); |
| 1715 | SafeSendPacket(packAnswer); |
| 1716 | } |
| 1717 | |
| 1718 | void CUpDownClient::ProcessAICHFileHash(CMemFile* data, const CPartFile* file){ |
| 1719 | CPartFile* pPartFile; |
no test coverage detected