⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remote.cpp

📁 著名的下载软件核心Shareaza
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	
	CSingleLock pLock( &theApp.m_pSection );
	if ( ! pLock.Lock( 1000 ) ) return;
	CMainWnd* pMainWnd = (CMainWnd*)theApp.m_pMainWnd;
	if ( pMainWnd == NULL || ! pMainWnd->IsKindOf( RUNTIME_CLASS(CMainWnd) ) ) return;
	
	int nSearchID = 0, nCloseID = 0;
	CSearchWnd* pSearchWnd = NULL;
	CString str;
	
	_stscanf( GetKey( _T("id") ), _T("%i"), &nSearchID );
	_stscanf( GetKey( _T("close") ), _T("%i"), &nCloseID );
	
	Prepare();
	Output( _T("searchHeader") );
	
	for ( CSearchWnd* pFindWnd = NULL ; pFindWnd = (CSearchWnd*)pMainWnd->m_pWindows.Find( RUNTIME_CLASS(CSearchWnd), pFindWnd ) ; )
	{
		Prepare();
		
		if ( nCloseID == (int)pFindWnd )
		{
			pFindWnd->PostMessage( WM_CLOSE );
			continue;
		}
		else if ( nSearchID == (int)pFindWnd )
		{
			pSearchWnd = pFindWnd;
			Add( _T("search_selected"), _T("true") );
		}
		
		str.Format( _T("%i"), (int)pFindWnd );
		Add( _T("search_id"), str );
		str = pFindWnd->m_sCaption;
		if ( str.Find( _T("Search : ") ) == 0 ) str = str.Mid( 9 ).SpanExcluding( _T("[") );
		Add( _T("search_caption"), str );
		Output( _T("searchTab") );
	}
	
	if ( pSearchWnd == NULL )
	{
		str.Empty();

		for ( POSITION pos = SchemaCache.GetIterator() ; pos != NULL ; )
		{
			CSchema* pSchema = SchemaCache.GetNext( pos );
			if ( ! pSchema->m_bPrivate && pSchema->m_nType == CSchema::stFile )
			{
				str += _T("<option value=\"") + pSchema->m_sURI;
				str += _T("\">") + pSchema->m_sTitle;
				str += _T("</option>\r\n");
			}
		}
		
		Prepare();
		Add( _T("schema_option_list"), str );
		Output( _T("searchNew") );
		Output( _T("searchFooter") );
		return;
	}
	
	if ( ! GetKey( _T("stop") ).IsEmpty() )
	{
		pSearchWnd->PostMessage( WM_COMMAND, ID_SEARCH_STOP );
		Sleep( 500 );
	}
	
	str = GetKey( _T("sort") );
	if ( ! str.IsEmpty() )
	{
		int nColumn = 0;
		_stscanf( str, _T("%i"), &nColumn );
		
		if ( pSearchWnd->m_pMatches->m_nSortColumn == nColumn )
		{
			if ( pSearchWnd->m_pMatches->m_bSortDir == 1 )
			{
				pSearchWnd->m_pMatches->SetSortColumn( nColumn, TRUE );
			}
			else
			{
				pSearchWnd->m_pMatches->SetSortColumn( nColumn, FALSE );
			}
		}
		else
		{
			pSearchWnd->m_pMatches->SetSortColumn( nColumn, TRUE );
		}
		
		pSearchWnd->PostMessage( WM_TIMER, 7 );
	}
	
	str = GetKey( _T("expcol") );
	if ( ! str.IsEmpty() )
	{
		CMatchFile** pLoop = pSearchWnd->m_pMatches->m_pFiles;
		for ( DWORD nCount = 0 ; nCount < pSearchWnd->m_pMatches->m_nFiles ; nCount++, pLoop++ )
		{
			if ( (*pLoop)->GetURN() == str )
			{
				(*pLoop)->Expand( GetKey( _T("collapse") ).IsEmpty() );
				pSearchWnd->PostMessage( WM_TIMER, 7 );
				break;
			}
		}
	}
	
	str = GetKey( _T("download") );
	if ( ! str.IsEmpty() )
	{
		CMatchFile** pLoop = pSearchWnd->m_pMatches->m_pFiles;
		for ( DWORD nCount = 0 ; nCount < pSearchWnd->m_pMatches->m_nFiles ; nCount++, pLoop++ )
		{
			if ( (*pLoop)->GetURN() == str )
			{
				Downloads.Add( *pLoop );
				pSearchWnd->PostMessage( WM_TIMER, 7 );
				m_sResponse.Empty();
				m_sRedirect = _T("downloads?group_reveal=all");
				return;
			}
		}
	}
	
	if ( ! GetKey( _T("setfilter") ).IsEmpty() )
	{
		pSearchWnd->m_pMatches->m_sFilter = GetKey( _T("filter") );
		pSearchWnd->m_pMatches->Filter();
		pSearchWnd->PostMessage( WM_TIMER, 7 );
	}
	
	Prepare();
	str.Format( _T("%i"), nSearchID );
	Add( _T("search_id"), str );
	str.Format( _T("%i"), rand() );
	Add( _T("random"), str );
	if ( ! pSearchWnd->m_bPaused ) Add( _T("searching"), _T("true") );
	Add( _T("search_filter"), pSearchWnd->m_pMatches->m_sFilter );
	Output( _T("searchTop") );
	
	PageSearchHeaderColumn( MATCH_COL_NAME, _T("Filename"), _T("left") );
	PageSearchHeaderColumn( MATCH_COL_SIZE, _T("Size"), _T("center") );
	PageSearchHeaderColumn( MATCH_COL_RATING, _T("Rating"), _T("center") );
	PageSearchHeaderColumn( MATCH_COL_STATUS, _T("Status"), _T("center") );
	PageSearchHeaderColumn( MATCH_COL_COUNT, _T("Host/Count"), _T("center") );
	PageSearchHeaderColumn( MATCH_COL_SPEED, _T("Speed"), _T("center") );
	PageSearchHeaderColumn( MATCH_COL_CLIENT, _T("Client"), _T("center") );
	
	Output( _T("searchMiddle") );
	
	pLock.Unlock();
	CSingleLock pLock2( &pSearchWnd->m_pMatches->m_pSection, TRUE );
	CMatchFile** pLoop = pSearchWnd->m_pMatches->m_pFiles;
	
	for ( DWORD nCount = 0 ; nCount < pSearchWnd->m_pMatches->m_nFiles ; nCount++, pLoop++ )
	{
		CMatchFile* pFile = *pLoop;
		if ( pFile->GetFilteredCount() == 0 ) continue;
		
		Add( _T("row_urn"), pFile->GetURN() );
		Add( _T("row_filename"), pFile->m_pBest->m_sName );
		if ( pFile->GetFilteredCount() > 1 )
		{
			if ( pFile->m_bExpanded )
				Add( _T("row_expanded"), _T("true") );
			else
				Add( _T("row_collapsed"), _T("true") );
		}
		else
		{
			Add( _T("row_single"), _T("true") );
		}
		Output( _T("searchRowStart") );
		
		PageSearchRowColumn( MATCH_COL_SIZE, pFile, Settings.SmartVolume( pFile->m_nSize, FALSE ) );
		
		str.Empty();
		for ( int nStar = pFile->m_nRating / max( 1, pFile->m_nRated ) ; nStar > 1 ; nStar -- ) str += _T("*");
		PageSearchRowColumn( MATCH_COL_RATING, pFile, str );
		
		str.Empty();
		if ( pFile->m_bBusy == TS_TRUE ) str += 'B'; else str += '-';
		if ( pFile->m_bPush == TS_TRUE ) str += 'F'; else str += '-';
		if ( pFile->m_bStable == TS_FALSE ) str += 'U'; else str += '-';
		PageSearchRowColumn( MATCH_COL_STATUS, pFile, str );
		
		if ( pFile->GetFilteredCount() > 1 )
		{
			str.Format( _T("(%i sources)"), pFile->GetFilteredCount() );
			PageSearchRowColumn( MATCH_COL_COUNT, pFile, str );
		}
		else
		{
			PageSearchRowColumn( MATCH_COL_COUNT, pFile,
				CString( inet_ntoa( pFile->m_pBest->m_pAddress ) ) );
		}
		
		PageSearchRowColumn( MATCH_COL_SPEED, pFile, pFile->m_sSpeed );
		PageSearchRowColumn( MATCH_COL_CLIENT, pFile, pFile->GetFilteredCount() == 1 ? pFile->m_pBest->m_pVendor->m_sName : _T("") );
		
		Output( _T("searchRowEnd") );
		Prepare( _T("column_") );
		Prepare( _T("row_") );
		
		if ( pFile->m_bExpanded )
		{
			for ( CQueryHit* pHit = pFile->m_pHits ; pHit != NULL ; pHit = pHit->m_pNext )
			{
				if ( ! pHit->m_bFiltered ) continue;
				
				Add( _T("row_urn"), pFile->GetURN() );
				Add( _T("row_filename"), pHit->m_sName );
				Add( _T("row_source"), _T("true") );
				Output( _T("searchRowStart") );
				
				PageSearchRowColumn( MATCH_COL_SIZE, pFile, Settings.SmartVolume( pHit->m_nSize, FALSE ) );
				str.Empty();
				for ( int nStar = pHit->m_nRating ; nStar > 1 ; nStar -- ) str += _T("*");
				PageSearchRowColumn( MATCH_COL_RATING, pFile, str );
				str.Empty();
				if ( pHit->m_bBusy == TS_TRUE ) str += 'B'; else str += '-';
				if ( pHit->m_bPush == TS_TRUE ) str += 'F'; else str += '-';
				if ( pHit->m_bStable == TS_FALSE ) str += 'U'; else str += '-';
				PageSearchRowColumn( MATCH_COL_STATUS, pFile, str );
				PageSearchRowColumn( MATCH_COL_COUNT, pFile,
					CString( inet_ntoa( pHit->m_pAddress ) ) );
				PageSearchRowColumn( MATCH_COL_SPEED, pFile, pHit->m_sSpeed );
				PageSearchRowColumn( MATCH_COL_CLIENT, pFile, pHit->m_pVendor->m_sName );
				
				Output( _T("searchRowEnd") );
				Prepare( _T("column_") );
				Prepare( _T("row_") );
			}
		}
	}
	
	Output( _T("searchBottom") );
	Prepare();
	Output( _T("searchFooter") );
}

void CRemote::PageSearchHeaderColumn(int nColumnID, LPCTSTR pszCaption, LPCTSTR pszAlign)
{
	CString str;
	str.Format( _T("%i"), nColumnID );
	Add( _T("column_id"), str );
	Add( _T("column_align"), pszAlign );
	Add( _T("column_caption"), pszCaption );
	Output( _T("searchColumn") );
	Prepare( _T("column_") );
}

void CRemote::PageSearchRowColumn(int nColumnID, CMatchFile* pFile, LPCTSTR pszValue, LPCTSTR pszAlign)
{
	CString str;
	str.Format( _T("%i"), nColumnID );
	Add( _T("column_id"), str );
	Add( _T("column_align"), pszAlign );
	Add( _T("row_urn"), pFile->GetURN() );
	Add( _T("row_value"), pszValue );
	Output( _T("searchRowColumn") );
	Prepare( _T("column_") );
	Prepare( _T("row_") );
}

/////////////////////////////////////////////////////////////////////////////
// CRemote page : newsearch

void CRemote::PageNewSearch()
{
	if ( CheckCookie() ) return;
	
	CSingleLock pLock( &theApp.m_pSection );
	if ( ! pLock.Lock( 1000 ) ) return;
	CMainWnd* pMainWnd = (CMainWnd*)theApp.m_pMainWnd;
	if ( pMainWnd == NULL || ! pMainWnd->IsKindOf( RUNTIME_CLASS(CMainWnd) ) ) return;
	
	CString strSearch	= GetKey( _T("search") );
	CString strSchema	= GetKey( _T("schema") );
	
	if ( strSearch.IsEmpty() || ( ! strSchema.IsEmpty() && SchemaCache.Get( strSchema ) == NULL ) )
	{
		m_sRedirect = _T("home");
		return;
	}
	
	CQuerySearch* pSearch	= new CQuerySearch();
	pSearch->m_sSearch		= strSearch;
	pSearch->m_pSchema		= SchemaCache.Get( strSchema );
	
	pMainWnd->PostMessage( WM_OPENSEARCH, (WPARAM)pSearch );
	pLock.Unlock();
	Sleep( 500 );
	
	m_sRedirect = _T("search");
}

/////////////////////////////////////////////////////////////////////////////
// CRemote page : downloads

void CRemote::PageDownloads()
{
	if ( CheckCookie() ) return;
	
	CSingleLock pLock( &DownloadGroups.m_pSection, TRUE );
	CString str;
	
	Prepare();
	str.Format( _T("%i"), rand() );
	Add( _T("random"), str );
	Output( _T("downloadsHeader") );
	
	BOOL bExclusive = ! GetKey( _T("group_exclusive") ).IsEmpty();
	BOOL bReveal = ! GetKey( _T("group_reveal") ).IsEmpty();
	
	for ( POSITION posGroup = DownloadGroups.GetIterator() ; posGroup != NULL ; )
	{
		CDownloadGroup* pGroup = DownloadGroups.GetNext( posGroup );
		
		str.Format( _T("%i"), pGroup );
		Add( _T("group_id"), str );
		
		if ( bExclusive )
		{
			pGroup->m_bRemoteSelected = ( GetKey( _T("group_exclusive") ) == str );
		}
		else
		{
			if ( bReveal ) pGroup->m_bRemoteSelected = TRUE;
			else if ( GetKey( _T("group_select") ) == str ) pGroup->m_bRemoteSelected = TRUE;
			else if ( GetKey( _T("group_deselect") ) == str ) pGroup->m_bRemoteSelected = FALSE;
		}
		
		Add( _T("group_caption"), pGroup->m_sName );
		if ( pGroup->m_bRemoteSelected ) Add( _T("group_selected"), _T("true") );
		Output( _T("downloadsTab") );
		Prepare( _T("group_") );
	}
	
	if ( ! GetKey( _T("filter_set") ).IsEmpty() )
	{
		Settings.Downloads.FilterMask &= ~( DLF_ACTIVE | DLF_QUEUED | DLF_SOURCES | DLF_PAUSED );
		if ( GetKey( _T("filter_active") ) == _T("1") ) Settings.Downloads.FilterMask |= DLF_ACTIVE;
		if ( GetKey( _T("filter_queued") ) == _T("1") ) Settings.Downloads.FilterMask |= DLF_QUEUED;
		if ( GetKey( _T("filter_sources") ) == _T("1") ) Settings.Downloads.FilterMask |= DLF_SOURCES;
		if ( GetKey( _T("filter_paused") ) == _T("1") ) Settings.Downloads.FilterMask |= DLF_PAUSED;
		Settings.Downloads.ShowSources = ( GetKey( _T("filter_show_all") ) == _T("1") );
	}
	
	Add( _T("filter_active"), ( Settings.Downloads.FilterMask & DLF_ACTIVE ) ? _T("checked") : _T("") );
	Add( _T("filter_queued"), ( Settings.Downloads.FilterMask & DLF_QUEUED ) ? _T("checked") : _T("") );
	Add( _T("filter_sources"), ( Settings.Downloads.FilterMask & DLF_SOURCES ) ? _T("checked") : _T("") );
	Add( _T("filter_paused"), ( Settings.Downloads.FilterMask & DLF_PAUSED ) ? _T("checked") : _T("") );
	Add( _T("filter_show_all"), Settings.Downloads.ShowSources ? _T("checked") : _T("") );
	Output( _T("downloadsTop") );
	
	for ( POSITION posDownload = Downloads.GetIterator() ; posDownload != NULL ; )
	{
		CDownload* pDownload = Downloads.GetNext( posDownload );
		str.Format( _T("%i"), pDownload );
		
		if ( GetKey( _T("modify_id") ) == str )
		{
			CString str( GetKey( _T("modify_action") ) );
			str.MakeLower();
			
			if ( str == _T("expand") && CDownloadsCtrl::IsExpandable( pDownload ) )
			{
				pDownload->m_bExpanded = TRUE;
			}
			else if ( str == _T("collapse") && CDownloadsCtrl::IsExpandable( pDownload ) )
			{
				pDownload->m_bExpanded = FALSE;
			}
			else if ( str == _T("resume") )
			{
				pDownload->Resume();
			}
			else if ( str == _T("pause") )
			{
				if ( ! pDownload->IsPaused() && ! pDownload->IsMoving() ) pDownload->Pause();
			}
			else if ( str == _T("cancel") )
			{
				pDownload->Remove();
				continue;
			}
			else if ( str == _T("clear") )
			{
				if ( pDownload->IsCompleted() && ! pDownload->IsPreviewVisible() )
				{
					pDownload->Remove();
					continue;
				}
			}
			
			str.Format( _T("%i"), pDownload );
		}
		
		if ( CDownloadsCtrl::IsFiltered( pDownload ) ) continue;
		
		CDownloadGroup* pGroup = NULL;
		
		for ( posGroup = DownloadGroups.GetIterator() ; posGroup != NULL ; )
		{
			pGroup = DownloadGroups.GetNext( posGroup );
			if ( pGroup->m_bRemoteSelected && pGroup->Contains( pDownload ) ) break;
			pGroup = NULL;
		}
		
		if ( pGroup == NULL ) continue;
		
		Add( _T("download_id"), str );
		Add( _T("download_filename"), pDownload->GetDisplayName() );
		Add( _T("download_size"), pDownload->m_nSize == SIZE_UNKNOWN ? _T("Unknown") : Settings.SmartVolume( pDownload->m_nSize, FALSE ) );
		float nProgress = ( pDownload->IsCompleted() || pDownload->IsMoving() ) ? 1.0f : pDownload->GetProgress();
		str.Format( _T("%i"), (int)( 100.0f * nProgress ) );
		Add( _T("download_percent"), str );
		str.Format( _T("%i"), (int)( 100.0f * ( 1.0f - nProgress ) ) );
		Add( _T("download_percent_inverse"), str );
		Add( _T("download_speed"), Settings.SmartVolume( pDownload->GetMeasuredSpeed() * 8, FALSE, TRUE ) );
		if ( CDownloadsCtrl::IsExpandable( pDownload ) )
		{
			if ( pDownload->m_bExpanded ) Add( _T("download_is_expanded"), _T("true") );
			else Add( _T("download_is_collapsed"), _T("true") );
		}
		if ( pDownload->IsCompleted() )
		{
			str = pDownload->IsSeeding() ? _T("Seeding") : _T("Completed");
			Add( _T("download_is_complete"), _T("true") );
		}
		else if ( pDownload->IsMoving() )
		{
			str = _T("Moving");
		}
		else if ( pDownload->IsPaused() )
		{
			Add( _T("download_is_paused"), _T("true") );
			if ( pDownload->m_bDiskFull )
				str = ( pDownload->IsCompleted() ) ? _T("Can't Move") : _T("File Error");
			else
				str = _T("Paused");
		}
		else if ( pDownload->GetProgress() == 1.0f && pDownload->IsStarted() )
			str = _T("Verifying");
		else if ( pDownload->IsDownloading() )
		{
			DWORD tNow = pDownload->GetTimeRemaining();
			if ( tNow == 0xFFFFFFFF )
				str = _T("Active");
			else
				str.Format( _T("%i:%.2i:%.2i"), tNow / 3600, ( tNow % 3600 ) / 60, tNow % 60 );
		}
		else if ( pDownload->GetSourceCount() > 0 )
			str = _T("Pending");
		else if ( pDownload->m_nSize == SIZE_UNKNOWN )
			str = _T("Searching");
		else if ( pDownload->m_bBTH )
		{
			if ( pDownload->IsTasking() )
				str = _T("Creating");
			else if ( pDownload->m_bTorrentTrackerError )
				str = _T("Tracker Down");
			else
				str = _T("Torrent");
		}
		else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -