BOOL CUploadTransferED2K::Request(MD4* pMD4) { BOOL bSame = ( m_bED2K && m_pED2K == *pMD4 ); Cleanup( ! bSame ); CSingleLock oLock( &Library.m_pSection, TRUE ); if ( CLibraryFile* pFile = LibraryMaps.LookupFileByED2K( pMD4, TRUE, TRUE ) ) { // Send comments if necessary if ( m_pClient ) m_pClient->SendCommentsPacket( pFile->m_nRating, pFile->m_sComments ); RequestComplete( pFile ); oLock.Unlock(); } else { oLock.Unlock(); if ( CDownload* pFile = Downloads.FindByED2K( pMD4, TRUE ) ) { RequestPartial( pFile ); } else { UploadQueues.Dequeue( this ); theApp.Message( MSG_ERROR, IDS_UPLOAD_FILENOTFOUND, (LPCTSTR)m_sAddress, (LPCTSTR)CED2K::HashToString( pMD4, TRUE ) ); CEDPacket* pReply = CEDPacket::New( ED2K_C2C_FILENOTFOUND ); pReply->Write( pMD4, sizeof(MD4) ); Send( pReply ); Close(); return FALSE; } } if ( UploadQueues.GetPosition( this, FALSE ) < 0 && ! UploadQueues.Enqueue( this ) ) { theApp.Message( MSG_ERROR, IDS_UPLOAD_BUSY_QUEUE, (LPCTSTR)m_sFileName, (LPCTSTR)m_sAddress, _T("ED2K") ); CEDPacket* pReply = CEDPacket::New( ED2K_C2C_FILENOTFOUND ); pReply->Write( pMD4, sizeof(MD4) ); Send( pReply ); Close(); return FALSE; } AllocateBaseFile(); theApp.Message( MSG_SYSTEM, IDS_UPLOAD_FILE, (LPCTSTR)m_sFileName, (LPCTSTR)m_sAddress ); m_nRanking = -1; return CheckRanking(); }
BOOL CUploadTransferDC::RequestFile(CLibraryFile* pFile, QWORD nOffset, QWORD nLength) { m_pXML.Clear(); if ( ! RequestComplete( pFile ) ) { ASSERT( FALSE ); return FALSE; } if ( ! UploadQueues.CanUpload( PROTOCOL_DC, pFile, FALSE ) ) { theApp.Message( MSG_ERROR, IDS_UPLOAD_FILENOTFOUND, (LPCTSTR)m_sAddress, (LPCTSTR)m_sName ); m_pClient->SendCommand( FILE_NOT_AVAILABLE ); return TRUE; } m_nOffset = nOffset; if ( m_nOffset >= m_nSize ) m_nLength = SIZE_UNKNOWN; else m_nLength = min( ( ( nLength == SIZE_UNKNOWN ) ? m_nSize : nLength ), m_nSize - m_nOffset ); m_nPosition = 0; if ( m_nLength > m_nSize || m_nOffset + m_nLength > m_nSize ) { theApp.Message( MSG_ERROR, IDS_UPLOAD_BAD_RANGE, (LPCTSTR)m_sAddress, (LPCTSTR)m_sName ); m_pClient->SendCommand( FILE_NOT_AVAILABLE ); return TRUE; } AllocateBaseFile(); if ( m_bStopTransfer ) { m_tRotateTime = 0; m_bStopTransfer = FALSE; CUploadQueue* pQueue = m_pQueue; if ( pQueue ) pQueue->Dequeue( this ); } int nPosition = UploadQueues.GetPosition( this, TRUE ); if ( nPosition < 0 && UploadQueues.Enqueue( this ) ) { nPosition = UploadQueues.GetPosition( this, TRUE ); } if ( nPosition == 0 ) { // Ready to send if ( m_bGet ) return TRUE; // Wait for $Send return SendFile(); } else if ( nPosition > 0 ) { // Queued theApp.Message( MSG_INFO, IDS_UPLOAD_QUEUED, (LPCTSTR)m_sName, (LPCTSTR)m_sAddress, nPosition, m_pQueue->GetQueuedCount(), (LPCTSTR)m_pQueue->m_sName ); CString strQueued; strQueued.Format( UPLOAD_QUEUE, nPosition ); m_pClient->SendCommand( strQueued ); StartSending( upsPreQueue ); m_tRankingCheck = GetTickCount(); return TRUE; } else { // Unable to queue anywhere UploadQueues.Dequeue( this ); ASSERT( m_pQueue == NULL ); theApp.Message( MSG_ERROR, IDS_UPLOAD_BUSY_QUEUE, (LPCTSTR)m_sName, (LPCTSTR)m_sAddress, (LPCTSTR)m_sUserAgent ); m_pClient->SendCommand( UPLOAD_BUSY ); return TRUE; } }