📄 downloadwithsources.cpp
字号:
}
}
else
{
nPos = strURL.Find( ':' );
if ( nPos < 1 ) continue;
int nPort = 0;
_stscanf( strURL.Mid( nPos + 1 ), _T("%i"), &nPort );
strURL.Truncate( nPos );
USES_CONVERSION;
DWORD nAddress = inet_addr( T2CA( strURL ) );
strURL.Empty();
if ( ! Network.IsFirewalledAddress( &nAddress, TRUE ) && nPort != 0 && nAddress != INADDR_NONE )
{
if ( m_bSHA1 )
{
strURL.Format( _T("http://%s:%i/uri-res/N2R?%s"),
(LPCTSTR)CString( inet_ntoa( *(IN_ADDR*)&nAddress ) ),
nPort, (LPCTSTR)CSHA::HashToString( &m_pSHA1, TRUE ) );
}
}
}
if ( AddSourceURL( strURL, bURN, bSeen ? &tSeen : NULL ) ) nCount++;
}
return nCount;
}
//////////////////////////////////////////////////////////////////////
// CDownloadWithSources internal source adder
BOOL CDownloadWithSources::AddSourceInternal(CDownloadSource* pSource)
{
for ( CDownloadSource* pExisting = m_pSourceFirst ; pExisting ; pExisting = pExisting->m_pNext )
{
if ( pExisting->Equals( pSource ) )
{
if ( pExisting->m_pTransfer != NULL ||
( pExisting->m_nProtocol == PROTOCOL_HTTP && pSource->m_nProtocol != PROTOCOL_HTTP ) )
{
delete pSource;
return FALSE;
}
else
{
pSource->m_tAttempt = pExisting->m_tAttempt;
pExisting->Remove( TRUE, FALSE );
break;
}
}
}
m_nSourceCount ++;
if ( pSource->m_nProtocol == PROTOCOL_ED2K )
{
pSource->m_pPrev = m_pSourceLast;
pSource->m_pNext = NULL;
if ( m_pSourceLast != NULL )
{
m_pSourceLast->m_pNext = pSource;
m_pSourceLast = pSource;
}
else
{
m_pSourceFirst = m_pSourceLast = pSource;
}
}
else
{
pSource->m_pPrev = NULL;
pSource->m_pNext = m_pSourceFirst;
if ( m_pSourceFirst != NULL )
{
m_pSourceFirst->m_pPrev = pSource;
m_pSourceFirst = pSource;
}
else
{
m_pSourceFirst = m_pSourceLast = pSource;
}
}
SetModified();
return TRUE;
}
//////////////////////////////////////////////////////////////////////
// CDownloadWithSources query for URLs
CString CDownloadWithSources::GetSourceURLs(CStringList* pState, int nMaximum, BOOL bHTTP, CDownloadSource* pExcept)
{
CString strSources, strURL;
for ( CDownloadSource* pSource = GetFirstSource() ; pSource ; pSource = pSource->m_pNext )
{
if ( pSource != pExcept && pSource->m_bPushOnly == FALSE &&
pSource->m_nFailures == 0 && pSource->m_bReadContent &&
( pSource->m_bSHA1 || pSource->m_bED2K ) &&
( pState == NULL || pState->Find( pSource->m_sURL ) == NULL ) )
{
if ( pState != NULL ) pState->AddTail( pSource->m_sURL );
if ( bHTTP && pSource->m_nProtocol != PROTOCOL_HTTP ) continue;
strURL = pSource->m_sURL;
Replace( strURL, _T(","), _T("%2C") );
if ( strSources.GetLength() > 0 ) strSources += _T(", ");
strSources += strURL;
strSources += ' ';
strSources += TimeToString( &pSource->m_tLastSeen );
if ( nMaximum == 1 ) break;
else if ( nMaximum > 1 ) nMaximum --;
}
}
if ( strSources.Find( _T("Zhttp://") ) >= 0 ) strSources.Empty();
return strSources;
}
//////////////////////////////////////////////////////////////////////
// CDownloadWithSources query hit handler
BOOL CDownloadWithSources::OnQueryHits(CQueryHit* pHits)
{
for ( ; pHits ; pHits = pHits->m_pNext )
{
if ( pHits->m_sURL.GetLength() ) AddSourceHit( pHits );
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////
// CDownloadWithSources remove overlapping sources
void CDownloadWithSources::RemoveOverlappingSources(QWORD nOffset, QWORD nLength)
{
for ( CDownloadSource* pSource = GetFirstSource() ; pSource ; )
{
CDownloadSource* pNext = pSource->m_pNext;
if ( pSource->TouchedRange( nOffset, nLength ) )
{
theApp.Message( MSG_ERROR, IDS_DOWNLOAD_VERIFY_DROP,
(LPCTSTR)CString( inet_ntoa( pSource->m_pAddress ) ),
(LPCTSTR)pSource->m_sServer, (LPCTSTR)m_sRemoteName,
nOffset, nOffset + nLength - 1 );
pSource->Remove( TRUE, TRUE );
}
pSource = pNext;
}
}
//////////////////////////////////////////////////////////////////////
// CDownloadWithSources remove a source
void CDownloadWithSources::RemoveSource(CDownloadSource* pSource, BOOL bBan)
{
if ( bBan && pSource->m_sURL.GetLength() )
{
m_pFailedSources.AddTail( pSource->m_sURL );
}
ASSERT( m_nSourceCount > 0 );
m_nSourceCount --;
if ( pSource->m_pPrev != NULL )
pSource->m_pPrev->m_pNext = pSource->m_pNext;
else
m_pSourceFirst = pSource->m_pNext;
if ( pSource->m_pNext != NULL )
pSource->m_pNext->m_pPrev = pSource->m_pPrev;
else
m_pSourceLast = pSource->m_pPrev;
delete pSource;
SetModified();
}
//////////////////////////////////////////////////////////////////////
// CDownloadWithSources sort a source
void CDownloadWithSources::SortSource(CDownloadSource* pSource, BOOL bTop)
{
ASSERT( m_nSourceCount > 0 );
if ( pSource->m_pPrev != NULL )
pSource->m_pPrev->m_pNext = pSource->m_pNext;
else
m_pSourceFirst = pSource->m_pNext;
if ( pSource->m_pNext != NULL )
pSource->m_pNext->m_pPrev = pSource->m_pPrev;
else
m_pSourceLast = pSource->m_pPrev;
if ( ! bTop )
{
pSource->m_pPrev = m_pSourceLast;
pSource->m_pNext = NULL;
if ( m_pSourceLast != NULL )
{
m_pSourceLast->m_pNext = pSource;
m_pSourceLast = pSource;
}
else
{
m_pSourceFirst = m_pSourceLast = pSource;
}
}
else
{
pSource->m_pPrev = NULL;
pSource->m_pNext = m_pSourceFirst;
if ( m_pSourceFirst != NULL )
{
m_pSourceFirst->m_pPrev = pSource;
m_pSourceFirst = pSource;
}
else
{
m_pSourceFirst = m_pSourceLast = pSource;
}
}
}
//////////////////////////////////////////////////////////////////////
// CDownloadWithSources source colour selector
#define SRC_COLOURS 6
int CDownloadWithSources::GetSourceColour()
{
BOOL bTaken[SRC_COLOURS];
ZeroMemory( bTaken, sizeof(BOOL) * SRC_COLOURS );
int nFree = SRC_COLOURS;
for ( CDownloadSource* pSource = GetFirstSource() ; pSource ; pSource = pSource->m_pNext )
{
if ( pSource->m_nColour >= 0 )
{
if ( bTaken[ pSource->m_nColour ] == FALSE )
{
bTaken[ pSource->m_nColour ] = TRUE;
nFree--;
}
}
}
srand( GetTickCount() + (DWORD)this );
if ( nFree == 0 ) return rand() % SRC_COLOURS;
nFree = rand() % nFree;
for ( int nColour = 0 ; nColour < SRC_COLOURS ; nColour++ )
{
if ( bTaken[ nColour ] == FALSE )
{
if ( nFree-- == 0 ) return nColour;
}
}
return rand() % SRC_COLOURS;
}
//////////////////////////////////////////////////////////////////////
// CDownloadWithSources serialize
void CDownloadWithSources::Serialize(CArchive& ar, int nVersion)
{
CDownloadBase::Serialize( ar, nVersion );
if ( ar.IsStoring() )
{
ar.WriteCount( GetSourceCount() );
for ( CDownloadSource* pSource = GetFirstSource() ; pSource ; pSource = pSource->m_pNext )
{
pSource->Serialize( ar, nVersion );
}
ar.WriteCount( m_pXML != NULL ? 1 : 0 );
if ( m_pXML ) m_pXML->Serialize( ar );
}
else
{
for ( int nSources = ar.ReadCount() ; nSources ; nSources-- )
{
CDownloadSource* pSource = new CDownloadSource( (CDownload*)this );
pSource->Serialize( ar, nVersion );
m_nSourceCount ++;
pSource->m_pPrev = m_pSourceLast;
pSource->m_pNext = NULL;
if ( m_pSourceLast != NULL )
{
m_pSourceLast->m_pNext = pSource;
m_pSourceLast = pSource;
}
else
{
m_pSourceFirst = m_pSourceLast = pSource;
}
}
if ( ar.ReadCount() )
{
m_pXML = new CXMLElement();
m_pXML->Serialize( ar );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -