#include "StdAfx.h"
|
#include "MBDownloadQueue.h"
|
|
|
CMBDownloadQueue::CMBDownloadQueue(void)
|
{
|
DeleteAll();
|
}
|
|
|
CMBDownloadQueue::~CMBDownloadQueue(void)
|
{
|
DeleteAll();
|
}
|
|
HANDLE CMBDownloadQueue::GetEventShutdownHandle()
|
{
|
CSingleLock lock( &m_cs, true );
|
return m_eventShutdown.GetEvent();
|
}
|
|
HANDLE CMBDownloadQueue::GetEventExeHandle()
|
{
|
CSingleLock lock( &m_cs, true );
|
return m_eventExe.GetEvent();
|
}
|
|
void CMBDownloadQueue::SetEventShutdownSet()
|
{
|
CSingleLock lock( &m_cs, true );
|
m_eventShutdown.Set();
|
}
|
|
void CMBDownloadQueue::SetEventShutdownReset()
|
{
|
CSingleLock lock( &m_cs, true );
|
m_eventShutdown.Reset();
|
}
|
|
void CMBDownloadQueue::SetEventExeSet()
|
{
|
CSingleLock lock( &m_cs, true );
|
m_eventExe.Set();
|
}
|
|
void CMBDownloadQueue::SetEventExeReset()
|
{
|
CSingleLock lock( &m_cs, true );
|
m_eventExe.Reset();
|
}
|
|
// upload
|
void CMBDownloadQueue::AddClientToDownloadQueue(CAutoRefPtr<CMBDownloadFileInfo> & client)
|
{
|
CSingleLock lock( &m_cs, true );
|
|
m_listDownloading.push_back(client);
|
}
|
|
bool CMBDownloadQueue::RemoveFromDownloadQueue(CMBDownloadFileInfo * client)
|
{
|
CSingleLock lock( &m_cs, true );
|
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
|
for( it = m_listDownloading.begin();it != m_listDownloading.end(); )
|
{
|
curClient = *it;
|
// ´íÎó£¬É¾³ý£¬ÔÝÍ£ ´ÓÉÏ´«¶ÓÁÐÖÐɾ³ý
|
if (curClient == client)
|
{
|
m_listDownloading.erase(it++);
|
}else
|
{
|
++it;
|
}
|
}
|
return true;
|
}
|
|
bool CMBDownloadQueue::RemoveUnUseFromDownloadQueue( BOOL &bState )
|
{
|
CSingleLock lock( &m_cs, true );
|
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
|
for( it = m_listDownloading.begin();it != m_listDownloading.end(); )
|
{
|
curClient = *it;
|
// ´íÎó£¬É¾³ý£¬ÔÝÍ£ ´ÓÉÏ´«¶ÓÁÐÖÐɾ³ý
|
if (curClient->GetStatus() == CMBDownloadFileInfo::Status_Delete || curClient->GetStatus() == CMBDownloadFileInfo::Status_DeleteOnQueue
|
|| curClient->GetStatus() == CMBDownloadFileInfo::Status_Pause || curClient->GetStatus() == CMBDownloadFileInfo::Status_Err
|
)
|
{
|
m_listDownloading.erase(it++);
|
}else
|
{
|
++it;
|
}
|
}
|
return true;
|
}
|
|
int CMBDownloadQueue::GetDownloadQueueLength()
|
{
|
CSingleLock lock( &m_cs, true );
|
|
return m_listDownloading.size();
|
}
|
|
|
|
bool CMBDownloadQueue::ReDownloadQueue( int nMaxDownloadCount,BOOL &bState )
|
{
|
CSingleLock lock( &m_cs, true );
|
|
if(m_listDownloading.size() == nMaxDownloadCount)
|
return true;
|
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
|
for( it = m_listWaiting.begin();it != m_listWaiting.end();it++ )
|
{
|
curClient = *it;
|
if(m_listDownloading.size() < nMaxDownloadCount)
|
{
|
if( curClient->GetStatus() == CMBDownloadFileInfo::Status_NoFinish )
|
{
|
if( !IsOnDownloadingQueue(curClient ) ) // ×öÒ»¸ö±£»¤
|
{
|
m_listDownloading.push_back(curClient);
|
curClient->SetStatus(CMBDownloadFileInfo::Status_OnDownQueue);
|
}
|
}
|
}else
|
{
|
return true;
|
}
|
}
|
return true;
|
|
//if(m_listDownloading.GetCount() == nMaxDownloadCount)
|
// return true;
|
//for (POSITION pos = m_listWaiting.GetHeadPosition();pos != 0;){
|
// if(!bState)
|
// return false;
|
// POSITION curPos = pos;
|
// CAutoRefPtr<CMBTransInfo> & curClient = m_listWaiting.GetNext(pos);
|
// // ÕýÔÚ´¦Àí£¬Î´Íê³ÉµÄ·ÅÈ룬ÏÂÔØ¶ÓÁÐ
|
// if ( curClient->GetState() == CMBTransInfo::State_NoFinish ){ //
|
// if(m_listDownloading.GetCount() < nMaxDownloadCount)
|
// {
|
// curClient->SetState(CMBTransInfo::State_OnUpOrDownQueue);
|
// m_listDownloading.AddTail(curClient);
|
// }
|
// else{
|
// return true;
|
// }
|
// }
|
//}
|
return true;
|
}
|
|
|
bool CMBDownloadQueue::IsOnDownloadingQueue( CAutoRefPtr<CMBDownloadFileInfo> & client )
|
{
|
CSingleLock lock( &m_cs, true );
|
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
|
for( it = m_listDownloading.begin();it != m_listDownloading.end();it++ )
|
{
|
curClient = *it;
|
if( curClient->m_strFileID == client->m_strFileID )
|
{
|
return true;
|
}
|
}
|
return false;
|
}
|
|
void CMBDownloadQueue::CopyDownloadingQueue( CDownClientAutoPtrList &listDownloading )
|
{
|
CSingleLock lock( &m_cs, true );
|
listDownloading.clear();
|
listDownloading = m_listDownloading;
|
}
|
|
// µÃµ½´«ÊäËÙÂÊ
|
__int64 CMBDownloadQueue::GetTransRate()
|
{
|
CSingleLock lock( &m_cs, true );
|
|
__int64 nTransRate = 0;
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
|
for( it = m_listDownloading.begin();it != m_listDownloading.end();it++ )
|
{
|
curClient = *it;
|
if( curClient->GetStatus() != CMBDownloadFileInfo::Status_Err )
|
{
|
if( curClient->m_nTransRate > 0 )
|
nTransRate += curClient->m_nTransRate;
|
}
|
}
|
|
return nTransRate;
|
}
|
|
// waiting
|
bool CMBDownloadQueue::RemoveFinishFromWaitingQueue( BOOL &bState )
|
{
|
CSingleLock lock( &m_cs, true );
|
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
|
for( it = m_listWaiting.begin();it != m_listWaiting.end(); )
|
{
|
curClient = *it;
|
|
if (curClient->GetStatus() == CMBDownloadFileInfo::Status_Delete || curClient->GetStatus() == CMBDownloadFileInfo::Status_DeleteOnQueue ){
|
m_listWaiting.erase(it++);
|
}else{
|
++it;
|
}
|
}
|
return true;
|
}
|
|
|
bool CMBDownloadQueue::RemoveFromWaitingQueue(CMBDownloadFileInfo *client)
|
{
|
CSingleLock lock( &m_cs, true );
|
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
|
for( it = m_listWaiting.begin();it != m_listWaiting.end(); )
|
{
|
curClient = *it;
|
|
if (client == curClient ){
|
m_listWaiting.erase(it++);
|
}else{
|
++it;
|
}
|
}
|
return true;
|
}
|
|
int CMBDownloadQueue::GetWaitingUserCount()
|
{
|
CSingleLock lock( &m_cs, true );
|
return m_listWaiting.size();
|
}
|
|
bool CMBDownloadQueue::IsOnWaitingQueue(CAutoRefPtr<CMBDownloadFileInfo> & client) const
|
{
|
CSingleLock lock( &m_cs, true );
|
|
//return (m_listWaiting.find(client) != 0);
|
return true;
|
}
|
void CMBDownloadQueue::AddClientToWaitingList(CAutoRefPtr<CMBDownloadFileInfo> & newclient)
|
{
|
CSingleLock lock( &m_cs, true );
|
m_listWaiting.push_back(newclient);
|
}
|
|
CAutoRefPtr<CMBDownloadFileInfo> CMBDownloadQueue::FindBestClientInQueue()
|
{
|
CSingleLock lock( &m_cs, true );
|
|
return NULL;
|
}
|
|
void CMBDownloadQueue::RemoveQueue( CString strID )
|
{
|
CSingleLock lock( &m_cs, true );
|
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
// ´ÓµÈ´ý¶ÓÁÐɾ³ý
|
for( it = m_listWaiting.begin();it != m_listWaiting.end(); )
|
{
|
curClient = *it;
|
// ´íÎó£¬É¾³ý£¬ÔÝÍ£ ´ÓÉÏ´«¶ÓÁÐÖÐɾ³ý
|
if (curClient->m_strID == strID)
|
{
|
m_listWaiting.erase(it++);
|
}else
|
{
|
++it;
|
}
|
}
|
// ´ÓÏÂÔØ¶ÓÁÐɾ³ý
|
for( it = m_listDownloading.begin();it != m_listDownloading.end(); )
|
{
|
curClient = *it;
|
// ´íÎó£¬É¾³ý£¬ÔÝÍ£ ´ÓÉÏ´«¶ÓÁÐÖÐɾ³ý
|
if (curClient->m_strID == strID)
|
{
|
m_listDownloading.erase(it++);
|
}else
|
{
|
++it;
|
}
|
}
|
|
}
|
|
void CMBDownloadQueue::ReDownloadVector(int nResize,CMBDownloadFileAutoPtrVector &vectorDownload)
|
{
|
CSingleLock lock( &m_cs, true );
|
|
vectorDownload.clear();
|
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
|
for( it = m_listWaiting.begin();it != m_listWaiting.end();it++ )
|
{
|
curClient = *it;
|
if( nResize <= vectorDownload.size() )
|
break;
|
vectorDownload.push_back(curClient);
|
}
|
|
/*vectorTmpAllDownload.clear();
|
for (POSITION pos = m_listWaiting.GetHeadPosition();pos != 0;)
|
{
|
CAutoRefPtr<CMBTransInfo> & curClient = m_listWaiting.GetNext(pos);
|
vectorTmpAllDownload.push_back(curClient);
|
} */
|
}
|
|
//void CMBDownloadQueue::DeleteQueue( int nStatus,CString & strTrID )
|
//{
|
// CSingleLock lock( &m_cs, true );
|
//
|
// CString strTmpTrID;
|
//
|
// strTrID.Empty();
|
//
|
// m_listWaiting.clear();
|
// // ÉèÖÃ״̬Ϊɾ³ý
|
// CDownClientAutoPtrList::iterator it;
|
// CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
// int nTrID = 0;
|
// for( it = m_listDownloading.begin();it != m_listDownloading.end(); )
|
// {
|
// curClient = *it;
|
//
|
// nTrID = curClient->GetTrID();
|
// if( curClient->GetStatus() != CMBDownloadFileInfo::Status_Finish )
|
// {
|
// if( nTrID >0 )
|
// {
|
// strTmpTrID.Format(_T("%d;"),nTrID);
|
// strTrID += strTmpTrID;
|
// }
|
// curClient->SetStatus( nStatus );
|
// m_listDownloading.erase(it++);
|
// }else
|
// {
|
// ++it;
|
// }
|
// }
|
// if( !strTrID.IsEmpty() )
|
// {
|
// strTrID = strTrID.Left(strTrID.GetLength() -1);
|
// }
|
//}
|
|
|
void CMBDownloadQueue::DeleteQueue( int nStatus,CStringArray &arInfo )
|
{
|
CSingleLock lock( &m_cs, true );
|
|
arInfo.RemoveAll();
|
|
CString strTmpTrID,strTmpFileSvr;
|
|
m_listWaiting.clear();
|
// ÉèÖÃ״̬Ϊɾ³ý
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
int nTrID = 0;
|
for( it = m_listDownloading.begin();it != m_listDownloading.end(); )
|
{
|
curClient = *it;
|
|
nTrID = curClient->GetTrID();
|
strTmpFileSvr = curClient->m_strFileSvr;
|
if( curClient->GetStatus() != CMBDownloadFileInfo::Status_Finish )
|
{
|
if( nTrID >0 )
|
{
|
strTmpTrID.Format(_T("%d;"),nTrID);
|
arInfo.Add( strTmpTrID + _T(";") + strTmpFileSvr );
|
}
|
curClient->SetStatus( nStatus );
|
m_listDownloading.erase(it++);
|
}else
|
{
|
++it;
|
}
|
}
|
}
|
|
|
// ÉèÖöÓÁÐ״̬
|
//void CMBDownloadQueue::SetQueueStatus( int nStatus,CString &strTrID )
|
//{
|
// CSingleLock lock( &m_cs, true );
|
//
|
// strTrID.Empty();
|
// int nTrID = 0;
|
// CString strTmpTrID;
|
//
|
// CDownClientAutoPtrList::iterator it;
|
// CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
//
|
// ////////////////////
|
// for( it = m_listWaiting.begin();it != m_listWaiting.end();it++ )
|
// {
|
// curClient = *it;
|
// if( curClient->GetStatus() != CMBDownloadFileInfo::Status_Finish )
|
// {
|
// curClient->SetStatus( nStatus );
|
// }
|
// }
|
// /////////////////
|
// for( it = m_listDownloading.begin();it != m_listDownloading.end();it++ )
|
// {
|
// curClient = *it;
|
// curClient->SetStatus( nStatus );
|
// nTrID = curClient->GetTrID();
|
// if( curClient->GetStatus() != CMBDownloadFileInfo::Status_Finish )
|
// {
|
// if( nTrID >0 )
|
// {
|
// strTmpTrID.Format(_T("%d;"),nTrID);
|
// strTrID += strTmpTrID;
|
// }
|
// curClient->SetStatus( nStatus );
|
// }
|
// }
|
// if( !strTrID.IsEmpty() )
|
// {
|
// strTrID = strTrID.Left(strTrID.GetLength() -1);
|
// }
|
//}
|
|
void CMBDownloadQueue::SetQueueStatus( int nStatus,CStringArray &arInfo )
|
{
|
CSingleLock lock( &m_cs, true );
|
|
arInfo.RemoveAll();
|
|
CString strTmpTrID,strTmpFileSvr;
|
|
int nTrID = 0;
|
|
|
CDownClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBDownloadFileInfo> curClient = NULL;
|
|
////////////////////
|
for( it = m_listWaiting.begin();it != m_listWaiting.end();it++ )
|
{
|
curClient = *it;
|
if( curClient->GetStatus() != CMBDownloadFileInfo::Status_Finish )
|
{
|
curClient->SetStatus( nStatus );
|
}
|
}
|
/////////////////
|
for( it = m_listDownloading.begin();it != m_listDownloading.end();it++ )
|
{
|
curClient = *it;
|
curClient->SetStatus( nStatus );
|
|
nTrID = curClient->GetTrID();
|
strTmpFileSvr = curClient->m_strFileSvr;
|
|
if( curClient->GetStatus() != CMBDownloadFileInfo::Status_Finish )
|
{
|
if( nTrID >0 )
|
{
|
strTmpTrID.Format(_T("%d;"),nTrID);
|
arInfo.Add( strTmpTrID + _T(";") + strTmpFileSvr );
|
}
|
curClient->SetStatus( nStatus );
|
}
|
}
|
}
|
|
void CMBDownloadQueue::DeleteAll()
|
{
|
// ²»ÒªÍü¼ÇÊÍ·ÅÄÚ´æ
|
m_listWaiting.clear();
|
m_listDownloading.clear();
|
}
|