void CDownloadQueue::AddSearchToDownload(CSearchFile* toadd, uint8 category) { if ( IsFileExisting(toadd->GetFileHash()) ) { return; } if (toadd->GetFileSize() > OLD_MAX_FILE_SIZE) { if (!PlatformSpecific::CanFSHandleLargeFiles(thePrefs::GetTempDir())) { AddLogLineC(_("Filesystem for Temp directory cannot handle large files.")); return; } else if (!PlatformSpecific::CanFSHandleLargeFiles(theApp->glob_prefs->GetCatPath(category))) { AddLogLineC(_("Filesystem for Incoming directory cannot handle large files.")); return; } } CPartFile* newfile = NULL; try { newfile = new CPartFile(toadd); } catch (const CInvalidPacket& WXUNUSED(e)) { AddDebugLogLineC(logDownloadQueue, wxT("Search-result contained invalid tags, could not add")); } if ( newfile && newfile->GetStatus() != PS_ERROR ) { AddDownload( newfile, thePrefs::AddNewFilesPaused(), category ); // Add any possible sources if (toadd->GetClientID() && toadd->GetClientPort()) { CMemFile sources(1+4+2); sources.WriteUInt8(1); sources.WriteUInt32(toadd->GetClientID()); sources.WriteUInt16(toadd->GetClientPort()); sources.Reset(); newfile->AddSources(sources, toadd->GetClientServerIP(), toadd->GetClientServerPort(), SF_SEARCH_RESULT, false); } for (std::list<CSearchFile::ClientStruct>::const_iterator it = toadd->GetClients().begin(); it != toadd->GetClients().end(); ++it) { CMemFile sources(1+4+2); sources.WriteUInt8(1); sources.WriteUInt32(it->m_ip); sources.WriteUInt16(it->m_port); sources.Reset(); newfile->AddSources(sources, it->m_serverIP, it->m_serverPort, SF_SEARCH_RESULT, false); } } else { delete newfile; } }
void CDownloadQueue::OnHostnameResolved(uint32 ip) { wxMutexLocker lock( m_mutex ); wxASSERT( m_toresolve.size() ); Hostname_Entry resolved = m_toresolve.front(); m_toresolve.pop_front(); if ( ip ) { CPartFile* file = GetFileByID( resolved.fileid ); if ( file ) { CMemFile sources(1+4+2); sources.WriteUInt8(1); // No. Sources sources.WriteUInt32(ip); sources.WriteUInt16(resolved.port); sources.WriteUInt8(resolved.cryptoptions); if (resolved.cryptoptions & 0x80) { wxASSERT(!resolved.hash.IsEmpty()); CMD4Hash sourcehash; sourcehash.Decode(resolved.hash); sources.WriteHash(sourcehash); } sources.Seek(0,wxFromStart); file->AddSources(sources, 0, 0, SF_LINK, true); } } while (m_toresolve.size()) { Hostname_Entry entry = m_toresolve.front(); // Check if it is a simple dot address uint32 tmpIP = StringIPtoUint32(entry.strHostname); if (tmpIP) { OnHostnameResolved(tmpIP); } else { CAsyncDNS* dns = new CAsyncDNS(entry.strHostname, DNS_SOURCE, theApp); if ((dns->Create() != wxTHREAD_NO_ERROR) || (dns->Run() != wxTHREAD_NO_ERROR)) { dns->Delete(); m_toresolve.pop_front(); } else { break; } } } }