📄 remote.cpp
字号:
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 + -