#include "StdAfx.h"
|
#include "MBThreadUploadSvr.h"
|
#include "MBTransExtendEvents.h"
|
|
CMBThreadUploadSvr::CMBThreadUploadSvr(void)
|
{
|
m_pTransMgr = NULL;
|
m_pSvrMgr = NULL;
|
m_pFileMD5Mgr = NULL;
|
m_bStop = false;
|
m_hWnd = NULL;
|
m_nMaxUploadQueueCount = 4;
|
m_pTaskLoopMgr =NULL;
|
}
|
|
|
CMBThreadUploadSvr::~CMBThreadUploadSvr(void)
|
{
|
}
|
|
void CMBThreadUploadSvr::SetTransAndServerMgr( CMBTransMgr *pTransMgr,CMBServerMgr *pServerMgr )
|
{
|
m_pTransMgr = pTransMgr;
|
m_pSvrMgr = pServerMgr;
|
}
|
|
void CMBThreadUploadSvr::SetFileMD5Mgr(CMBFileMD5Mgr *pFileMD5Mgr)
|
{
|
m_pFileMD5Mgr = pFileMD5Mgr;
|
}
|
|
void CMBThreadUploadSvr::SetHwnd( HWND hWnd )
|
{
|
m_hWnd = hWnd;
|
}
|
|
void CMBThreadUploadSvr::SetTaskLoopMgr(CMBTaskLoopMgr *pTaskLoopMgr)
|
{
|
m_pTaskLoopMgr = pTaskLoopMgr;
|
}
|
|
// ¿ªÊ¼Ïß³Ì
|
void CMBThreadUploadSvr::StartThread()
|
{
|
if(IsRunning())
|
return;
|
|
BeginThread();
|
}
|
|
// ½áÊøÏß³Ì
|
void CMBThreadUploadSvr::OverThread()
|
{
|
m_bStop = true;
|
|
CMBUploadQueue *pUploadQueue = m_pTransMgr->GetUploadQueue(); // ÉÏ´«¶ÓÁÐ
|
if( pUploadQueue != NULL )
|
{
|
pUploadQueue->SetEventShutdownSet();
|
}
|
|
|
if(!IsRunning())
|
return;
|
|
EndThread();
|
}
|
|
void CMBThreadUploadSvr::EventMsgUploadFile(CAutoRefPtr<CMBUploadFileInfo> &curClient)
|
{
|
EventUploadFile *pEvt = new EventUploadFile(NULL);
|
curClient.CopyTo(&pEvt->m_pUploadFileInfo);
|
SNotifyCenter::getSingleton().FireEventAsync(pEvt);
|
pEvt->Release();
|
}
|
|
// ´«Êä
|
bool CMBThreadUploadSvr::TransTimerUpload(CMBUploadQueue *pUploadQueue,BOOL &bThreadStop )
|
{
|
// ¼ÓÔØÊý¾Ý²Ù×÷
|
CString strErrInfo;
|
// ´ÓÊý¾Ý¿â¼ÓÔØ£¬Î´ÉÏ´«µÄÊý¾Ý
|
if(!m_pTransMgr->ReUploadToWaitingList(bThreadStop,strErrInfo ))
|
{
|
return false;
|
}
|
// ÒÆ³ýÒѾÉÏ´«³É¹¦µÄÊý¾Ý
|
if(!pUploadQueue->RemoveUnUseFromUploadQueue(bThreadStop ))
|
{
|
return false;
|
}
|
|
//WaitForSingleObject(g_DocThreadVal::g_hTransTimerUploadMutexThread, INFINITE);
|
if(!pUploadQueue->RemoveFinishFromWaitingQueue( bThreadStop ))
|
{
|
return false;
|
}
|
|
if(!pUploadQueue->ReUploadQueue( m_nMaxUploadQueueCount,bThreadStop ))
|
{
|
return false;
|
}
|
// ÉÏ´«Áбí
|
CUpClientAutoPtrList listUploading;
|
pUploadQueue->CopyUploadingQueue( listUploading );
|
|
CUpClientAutoPtrList::iterator it;
|
CAutoRefPtr<CMBUploadFileInfo> curClient = NULL;
|
|
for( it = listUploading.begin();it != listUploading.end();it++ )
|
{
|
if(IsStoped())
|
return false;
|
|
curClient = *it;
|
if( curClient->m_nIsDir == 1 )
|
{
|
if( curClient->GetStatus() == CMBUploadFileInfo::Status_OnUpQueue )
|
{
|
curClient->SetStatus(CMBUploadFileInfo::Status_CalledUpServer);
|
m_pTaskLoopMgr->PostCreateCatalogTask(curClient,false);
|
break;
|
}
|
}
|
//
|
if( curClient->GetMD5().IsEmpty() )
|
{
|
CString strLocalPath = curClient->GetLocalPath();
|
|
CString strKey = m_pFileMD5Mgr->GetKey(strLocalPath);
|
CMBFileMD5Info *pFileMD5Info = m_pFileMD5Mgr->GetFileMD5Info(strKey);
|
|
if( pFileMD5Info )
|
{
|
if( curClient->GetStatus() == CMBUploadFileInfo::Status_OnUpQueue )
|
{
|
curClient->SetStatus(CMBUploadFileInfo::Status_CalledUpServer);
|
|
curClient->SetMD5(pFileMD5Info->m_strMD5);
|
// Óùý¾Íɾ³ý
|
m_pFileMD5Mgr->RemoveMD5Info( strKey );
|
|
EventMsgUploadFile(curClient);
|
break;
|
}
|
}
|
else
|
{
|
if( curClient->GetMD5Status() == CMBUploadFileInfo::MD5Status_NoCalc )
|
{
|
curClient->SetMD5Status(CMBUploadFileInfo::MD5Status_Calcing);
|
DmsGenMD5( curClient );
|
}
|
} // end else
|
|
}else
|
{
|
if( curClient->GetStatus() == CMBUploadFileInfo::Status_OnUpQueue )
|
{
|
curClient->SetStatus(CMBUploadFileInfo::Status_CalledUpServer);
|
EventMsgUploadFile(curClient);
|
break;
|
}
|
}
|
}
|
|
listUploading.clear();
|
|
return true;
|
}
|
|
|
// ¼ÆËãmd5
|
void CMBThreadUploadSvr::DmsGenMD5( CMBUploadFileInfo *pUploadFileInfo )
|
{
|
if( NULL == pUploadFileInfo )
|
return ;
|
CString strLocalPath = pUploadFileInfo->GetLocalPath();
|
if( !CStrFileUtils::IsExist(strLocalPath) )
|
{
|
pUploadFileInfo->SetStatus(CMBUploadFileInfo::Status_Err); //0 ¨C δÍê³É 1 ¨C ÒÑÍê³É 3 ¨C ÕýÔÚÉÏ´« 4 -- ÔÝÍ£ 5 -- Ë𻵠6 -- ÔÚÉÏ´«»òÕßÏÂÔØ¶ÓÁÐÖÐ
|
return ;
|
}
|
m_pSvrMgr->GetFileMD5GenMgr()->AddFile(strLocalPath,m_hWnd);
|
}
|
|
UINT CMBThreadUploadSvr::Run()
|
{
|
CMBUploadQueue *pUploadQueue = m_pTransMgr->GetUploadQueue(); // ÉÏ´«¶ÓÁÐ
|
if( pUploadQueue == NULL )
|
return 0;
|
|
HANDLE handlesToWaitFor[2];
|
DWORD dwResult;
|
handlesToWaitFor[0] = pUploadQueue->GetEventExeHandle();
|
handlesToWaitFor[1] = pUploadQueue->GetEventShutdownHandle();
|
|
pUploadQueue->SetEventExeSet();
|
while ( !IsStoped() )
|
{
|
#ifdef _DEBUG
|
dwResult = ::WaitForMultipleObjects( 2, handlesToWaitFor, false, 6000 );
|
#else
|
dwResult = ::WaitForMultipleObjects( 2, handlesToWaitFor, false, 300000 );
|
#endif
|
if(m_bStop)
|
break;
|
|
if ( dwResult == WAIT_OBJECT_0 )
|
{
|
/// ·þÎñûÓгõʼ»¯£¬²»ÈÃÆäÉÏ´«
|
if( m_pSvrMgr->GetFileSvrClientMgr()->IsInit() )
|
{
|
// ÉÏ´«
|
while(TRUE){
|
Sleep(1000);
|
TransTimerUpload(pUploadQueue,m_bStop);
|
if(pUploadQueue->GetWaitingUserCount() == 0 )
|
break;
|
if(m_bStop)
|
break;
|
}
|
pUploadQueue->SetEventExeReset();
|
}
|
}
|
else if ( dwResult == WAIT_OBJECT_0 + 1 )
|
{
|
// Time to shutdown
|
break;
|
}
|
else if ( dwResult == WAIT_TIMEOUT )
|
{
|
pUploadQueue->SetEventExeSet();
|
}
|
} // End of while ( true )
|
return 0;
|
}
|