📄 search.cpp
字号:
}
}
}
// Complete node search, just increase the answers and update the GUI
if( m_uType == NODECOMPLETE )
{
m_uAnswers++;
theApp.emuledlg->kademliawnd->searchList->SearchRef(this);
}
break;
}
}
}
catch (...)
{
AddDebugLogLine(false, _T("Exception in CSearch::ProcessResponse"));
}
delete plistResults;
}
void CSearch::StorePacket()
{
ASSERT(!m_mapPossible.empty());
// This method is currently only called by jumpstart so only use best possible.
ContactMap::const_iterator itContactMap = m_mapPossible.begin();
CUInt128 uFromDistance(itContactMap->first);
CContact* pFromContact = itContactMap->second;
// Make sure this is a valid Node to store too.
// Shouldn't LAN IPs already be filtered?
if(thePrefs.FilterLANIPs() && uFromDistance.Get32BitChunk(0) > SEARCHTOLERANCE)
return;
// What kind of search are we doing?
switch(m_uType)
{
case FILE:
{
CSafeMemFile m_pfileSearchTerms;
m_pfileSearchTerms.WriteUInt128(&m_uTarget);
if (pFromContact->GetVersion() >= 3/*47b*/)
{
// Find file we are storing info about.
uchar ucharFileid[16];
m_uTarget.ToByteArray(ucharFileid);
CKnownFile* pFile = theApp.downloadqueue->GetFileByID(ucharFileid);
if(pFile)
{
// JOHNTODO -- Add start position
// Start Position range (0x0 to 0x7FFF)
m_pfileSearchTerms.WriteUInt16(0);
m_pfileSearchTerms.WriteUInt64(pFile->GetFileSize());
if (thePrefs.GetDebugClientKadUDPLevel() > 0)
DebugSend("KADEMLIA2_SEARCH_SOURCE_REQ", pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
CKademlia::GetUDPListener()->SendPacket(&m_pfileSearchTerms, KADEMLIA2_SEARCH_SOURCE_REQ, pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
}
else
{
PrepareToStop();
break;
}
}
else
{
m_pfileSearchTerms.WriteUInt8(1);
if (thePrefs.GetDebugClientKadUDPLevel() > 0)
DebugSend("KADEMLIA_SEARCH_REQ(File)", pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
CKademlia::GetUDPListener()->SendPacket(&m_pfileSearchTerms, KADEMLIA_SEARCH_REQ, pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
}
// Inc total request answers
m_uTotalRequestAnswers++;
// Update search in the GUI
theApp.emuledlg->kademliawnd->searchList->SearchRef(this);
break;
}
case KEYWORD:
{
//JOHNTODO -- We cannot precreate these packets as we do not know
// before hand if we are talking to Kad1.0 or Kad2.0..
CSafeMemFile m_pfileSearchTerms;
m_pfileSearchTerms.WriteUInt128(&m_uTarget);
if (pFromContact->GetVersion() >= 3/*47b*/)
{
if (m_uSearchTermsDataSize == 0)
{
// JOHNTODO - Need to add ability to change start position.
// Start position range (0x0 to 0x7FFF)
m_pfileSearchTerms.WriteUInt16((uint16)0x0000);
}
else
{
// JOHNTODO - Need to add ability to change start position.
// Start position range (0x8000 to 0xFFFF)
m_pfileSearchTerms.WriteUInt16((uint16)0x8000);
m_pfileSearchTerms.Write(m_pucSearchTermsData, m_uSearchTermsDataSize);
}
}
else
{
if (m_uSearchTermsDataSize == 0)
{
m_pfileSearchTerms.WriteUInt8(0);
// We send this extra byte to flag we handle large files.
m_pfileSearchTerms.WriteUInt8(0);
}
else
{
// Set to 2 to flag we handle handle large files.
m_pfileSearchTerms.WriteUInt8(2);
m_pfileSearchTerms.Write(m_pucSearchTermsData, m_uSearchTermsDataSize);
}
}
if (pFromContact->GetVersion() >= 3/*47b*/)
{
if (thePrefs.GetDebugClientKadUDPLevel() > 0)
DebugSend("KADEMLIA2_SEARCH_KEY_REQ", pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
CKademlia::GetUDPListener()->SendPacket(&m_pfileSearchTerms, KADEMLIA2_SEARCH_KEY_REQ, pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
}
else
{
if (thePrefs.GetDebugClientKadUDPLevel() > 0)
DebugSend("KADEMLIA_SEARCH_REQ(KEYWORD)", pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
CKademlia::GetUDPListener()->SendPacket(&m_pfileSearchTerms, KADEMLIA_SEARCH_REQ, pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
}
// Inc total request answers
m_uTotalRequestAnswers++;
// Update search in the GUI
theApp.emuledlg->kademliawnd->searchList->SearchRef(this);
break;
}
case NOTES:
{
// Write complete packet
CSafeMemFile m_pfileSearchTerms;
m_pfileSearchTerms.WriteUInt128(&m_uTarget);
if (pFromContact->GetVersion() >= 3/*47b*/)
{
// Find file we are storing info about.
uchar ucharFileid[16];
m_uTarget.ToByteArray(ucharFileid);
CKnownFile* pFile = theApp.sharedfiles->GetFileByID(ucharFileid);
if(pFile)
{
m_pfileSearchTerms.WriteUInt64(pFile->GetFileSize());
if (thePrefs.GetDebugClientKadUDPLevel() > 0)
DebugSend("KADEMLIA2_SEARCH_NOTES_REQ", pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
CKademlia::GetUDPListener()->SendPacket(&m_pfileSearchTerms, KADEMLIA2_SEARCH_NOTES_REQ, pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
}
else
{
PrepareToStop();
break;
}
}
else
{
m_pfileSearchTerms.WriteUInt128(&CKademlia::GetPrefs()->GetKadID());
if (thePrefs.GetDebugClientKadUDPLevel() > 0)
DebugSend("KADEMLIA_SEARCH_NOTES_REQ", pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
CKademlia::GetUDPListener()->SendPacket(&m_pfileSearchTerms, KADEMLIA_SEARCH_NOTES_REQ, pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
}
// Inc total request answers
m_uTotalRequestAnswers++;
// Update search in the GUI
theApp.emuledlg->kademliawnd->searchList->SearchRef(this);
break;
}
case STOREFILE:
{
// Try to store yourself as a source to a Node.
// As a safe guard, check to see if we already stored to the Max Nodes
if( m_uAnswers > SEARCHSTOREFILE_TOTAL )
{
PrepareToStop();
break;
}
// Find the file we are trying to store as a source too.
uchar ucharFileid[16];
m_uTarget.ToByteArray(ucharFileid);
CKnownFile* pFile = theApp.sharedfiles->GetFileByID(ucharFileid);
if (pFile)
{
// We set this mostly for GUI resonse.
m_sFileName = pFile->GetFileName();
// Get our clientID for the packet.
CUInt128 uID(CKademlia::GetPrefs()->GetClientHash());
//We can use type for different types of sources.
//1 HighID Sources..
//2 cannot be used as older clients will not work.
//3 Firewalled Kad Source.
//4 >4GB file HighID Source.
//5 >4GB file Firewalled Kad source.
TagList listTag;
if( theApp.IsFirewalled() )
{
// We are firewalled, make sure we have a buddy.
if( theApp.clientlist->GetBuddy() )
{
// We send the ID to our buddy so they can do a callback.
CUInt128 uBuddyID(true);
uBuddyID.Xor(CKademlia::GetPrefs()->GetKadID());
if(pFile->GetFileSize() > OLD_MAX_EMULE_FILE_SIZE)
listTag.push_back(new CKadTagUInt8(TAG_SOURCETYPE, 5));
else
listTag.push_back(new CKadTagUInt8(TAG_SOURCETYPE, 3));
listTag.push_back(new CKadTagUInt(TAG_SERVERIP, theApp.clientlist->GetBuddy()->GetIP()));
listTag.push_back(new CKadTagUInt(TAG_SERVERPORT, theApp.clientlist->GetBuddy()->GetUDPPort()));
listTag.push_back(new CKadTagStr(TAG_BUDDYHASH, CStringW(md4str(uBuddyID.GetData()))));
// changed by yunchenn 2006/12/13
//listTag.push_back(new CKadTagUInt(TAG_SOURCEPORT, thePrefs.GetPort()));
listTag.push_back(new CKadTagUInt(TAG_SOURCEPORT, ULONG(-1)));
if (pFromContact->GetVersion() >= 2/*47a*/)
{
listTag.push_back(new CKadTagUInt(TAG_FILESIZE, pFile->GetFileSize()));
}
}
else
{
// We are firewalled, but lost our buddy.. Stop everything.
PrepareToStop();
break;
}
}
else
{
// We are not firewalled..
if(pFile->GetFileSize() > OLD_MAX_EMULE_FILE_SIZE)
listTag.push_back(new CKadTagUInt(TAG_SOURCETYPE, 4));
else
listTag.push_back(new CKadTagUInt(TAG_SOURCETYPE, 1));
listTag.push_back(new CKadTagUInt(TAG_SOURCEPORT, thePrefs.GetPort()));
if (pFromContact->GetVersion() >= 2/*47a*/)
{
listTag.push_back(new CKadTagUInt(TAG_FILESIZE, pFile->GetFileSize()));
}
}
// Encryption options Tag
// 5 Reserved (!)
// 1 CryptLayer Required
// 1 CryptLayer Requested
// 1 CryptLayer Supported
const uint8 uSupportsCryptLayer = thePrefs.IsClientCryptLayerSupported() ? 1 : 0;
const uint8 uRequestsCryptLayer = thePrefs.IsClientCryptLayerRequested() ? 1 : 0;
const uint8 uRequiresCryptLayer = thePrefs.IsClientCryptLayerRequired() ? 1 : 0;
const uint8 byCryptOptions = (uRequiresCryptLayer << 2) | (uRequestsCryptLayer << 1) | (uSupportsCryptLayer << 0);
listTag.push_back(new CKadTagUInt8(TAG_ENCRYPTION, byCryptOptions));
// Send packet
CKademlia::GetUDPListener()->SendPublishSourcePacket(pFromContact, m_uTarget, uID, listTag);
// Inc total request answers
m_uTotalRequestAnswers++;
// Update search in the GUI
theApp.emuledlg->kademliawnd->searchList->SearchRef(this);
// Delete all tags.
for (TagList::const_iterator itTagList = listTag.begin(); itTagList != listTag.end(); ++itTagList)
delete *itTagList;
}
else
PrepareToStop();
break;
}
case STOREKEYWORD:
{
// Try to store keywords to a Node.
// As a safe guard, check to see if we already stored to the Max Nodes
if( m_uAnswers > SEARCHSTOREKEYWORD_TOTAL )
{
PrepareToStop();
break;
}
uint16 iCount = (uint16)m_listFileIDs.size();
if(iCount == 0)
{
PrepareToStop();
break;
}
else if(iCount > 150)
iCount = 150;
UIntList::const_iterator itListFileID = m_listFileIDs.begin();
uchar ucharFileid[16];
while(iCount && (itListFileID != m_listFileIDs.end()))
{
uint16 iPacketCount = 0;
byte byPacket[1024*50];
CByteIO byIO(byPacket,sizeof(byPacket));
byIO.WriteUInt128(m_uTarget);
byIO.WriteUInt16(0); // Will be corrected before sending.
while((iPacketCount < 50) && (itListFileID != m_listFileIDs.end()))
{
CUInt128 iID = *itListFileID;
iID.ToByteArray(ucharFileid);
CKnownFile* pFile = theApp.sharedfiles->GetFileByID(ucharFileid);
if(pFile)
{
iCount--;
iPacketCount++;
byIO.WriteUInt128(iID);
PreparePacketForTags( &byIO, pFile );
}
++itListFileID;
}
// Correct file count.
uint32 current_pos = byIO.GetUsed();
byIO.Seek(16);
byIO.WriteUInt16(iPacketCount);
byIO.Seek(current_pos);
// Send packet
if (pFromContact->GetVersion() >= 2/*47a*/)
{
if (thePrefs.GetDebugClientKadUDPLevel() > 0)
DebugSend("KADEMLIA2_PUBLISH_KEY_REQ", pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
CKademlia::GetUDPListener()->SendPacket( byPacket, sizeof(byPacket)-byIO.GetAvailable(), KADEMLIA2_PUBLISH_KEY_REQ, pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
}
else
{
if (thePrefs.GetDebugClientKadUDPLevel() > 0)
DebugSend("KADEMLIA_PUBLISH_REQ", pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
CKademlia::GetUDPListener()->SendPacket( byPacket, sizeof(byPacket)-byIO.GetAvailable(), KADEMLIA_PUBLISH_REQ, pFromContact->GetIPAddress(), pFromContact->GetUDPPort());
}
}
// Inc total request answers
m_uTotalRequestAnswers++;
// Update search in the GUI
theApp.emuledlg->kademliawnd->searchList->SearchRef(this);
break;
}
case STORENOTES:
{
// Find file we are storing info about.
uchar ucharFileid[16];
m_uTarget.ToByteArray(ucharFileid);
CKnownFile* pFile = theApp.sharedfiles->GetFileByID(ucharFileid);
if (pFile)
{
byte byPacket[1024*2];
CByteIO byIO(byPacket,sizeof(byPacket));
// Send the Hash of the file we are storing info about.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -