// CopyFileThread.cpp : implementation file
//
#include "stdafx.h"
#include "proofclient.h"
#include "CopyFileThread.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCopyFileThread
IMPLEMENT_DYNCREATE(CCopyFileThread, CWinThread)
CCopyFileThread::CCopyFileThread()
: m_strSource(""), m_strDest("")
{
m_pNotifyWnd=NULL;
m_bAutoDelete=FALSE;
}
CCopyFileThread::~CCopyFileThread()
{
}
BOOL CCopyFileThread::InitInstance()
{
return TRUE;
}
int CCopyFileThread::ExitInstance()
{
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CCopyFileThread, CWinThread)
//{{AFX_MSG_MAP(CCopyFileThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCopyFileThread message handlers
// this static function encapsulates the thread creation stuff...
CCopyFileThread * CCopyFileThread::CreateCopyThread(LPCSTR szSrc, LPCSTR szDest, CWnd *pNotifyWnd /*= NULL*/)
{
CCopyFileThread *pThread = (CCopyFileThread*)AfxBeginThread(RUNTIME_CLASS(CCopyFileThread),
THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (pThread!=NULL)
{
pThread->Init(szSrc, szDest, pNotifyWnd);
pThread->ResumeThread();
}
return pThread;
}
DWORD WINAPI CCopyFileThread::CopyProgressRoutine(LARGE_INTEGER TotalFileSize,
LARGE_INTEGER TotalBytesTransferred,
LARGE_INTEGER StreamSize,
LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber,
DWORD dwCallbackReason,
HANDLE hSourceFile,
HANDLE hDestinationFile,
LPVOID lpData )
{
CCopyFileThread *pThis = (CCopyFileThread *)lpData;
if (dwCallbackReason == CALLBACK_CHUNK_FINISHED)
{
TRACE("CB: size=%ld, total=%ld\n",
TotalFileSize.LowPart, TotalBytesTransferred.LowPart);
if (pThis->m_pNotifyWnd)
{
double dval = (double)TotalBytesTransferred.LowPart / (double)TotalFileSize.LowPart;
dval *= 100;
pThis->m_pNotifyWnd->SendNotifyMessage(WM_USER_THREAD_MSG, COPYTHREAD_PROGRESS, (LPARAM)dval);
}
}
if (WaitForSingleObject(pThis->m_evAbort, 0) == WAIT_OBJECT_0)
return PROGRESS_CANCEL;
Sleep(0);
return PROGRESS_CONTINUE;
}
int CCopyFileThread::Run()
{
BOOL bCancel=FALSE;
if (m_pNotifyWnd)
m_pNotifyWnd->SendNotifyMessage(WM_USER_THREAD_MSG, COPYTHREAD_START, 0L);
if (CopyFileEx(m_strSource,
m_strDest,
CopyProgressRoutine,
(LPVOID)this,
&bCancel,
COPY_FILE_RESTARTABLE)
&& m_pNotifyWnd)
m_pNotifyWnd->SendNotifyMessage(WM_USER_THREAD_MSG, COPYTHREAD_DONE, 0L);
else if (m_pNotifyWnd)
m_pNotifyWnd->SendNotifyMessage(WM_USER_THREAD_MSG, COPYTHREAD_ABORT, 0L);
m_evExit.SetEvent();
return TRUE;
}
void CCopyFileThread::Init(LPCSTR szSource, LPCSTR szDest, CWnd *pNotifyWnd /*= NULL*/)
{
m_strSource = szSource;
m_strDest = szDest;
m_pNotifyWnd = pNotifyWnd;
}
void CCopyFileThread::Abort()
{
m_evAbort.SetEvent();
}