MCPcopy Create free account
hub / github.com/amule-project/amule / ProcessAICHRequest

Method ProcessAICHRequest

src/DownloadClient.cpp:1666–1716  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1664
1665
1666void 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
1718void CUpDownClient::ProcessAICHFileHash(CMemFile* data, const CPartFile* file){
1719 CPartFile* pPartFile;

Callers 1

ProcessExtPacketMethod · 0.80

Calls 15

CFormatClass · 0.85
ReadUInt16Method · 0.80
GetAICHHashsetMethod · 0.80
HasValidMasterHashMethod · 0.80
GetPartCountMethod · 0.80
WriteUInt16Method · 0.80
GetPacketSizeMethod · 0.80
Copy16ToDataBufferMethod · 0.80
wxStringClass · 0.70
ReadHashMethod · 0.45
GetFileByIDMethod · 0.45

Tested by

no test coverage detected