#include "All.h" #include "MACProgressHelper.h" #include CMACProgressHelper::CMACProgressHelper(int nTotalSteps, int * pPercentageDone, APE_PROGRESS_CALLBACK ProgressCallback, int * pKillFlag) { m_pKillFlag = pKillFlag; m_bUseCallback = FALSE; if (ProgressCallback != NULL) { m_bUseCallback = TRUE; m_CallbackFunction = ProgressCallback; } m_pPercentageDone = pPercentageDone; m_nTotalSteps = nTotalSteps; m_nCurrentStep = 0; m_nLastCallbackFiredPercentageDone = 0; UpdateProgress(0); } CMACProgressHelper::~CMACProgressHelper() { } void CMACProgressHelper::UpdateProgress(int nCurrentStep, BOOL bForceUpdate) { // update the step if (nCurrentStep == -1) m_nCurrentStep++; else m_nCurrentStep = nCurrentStep; // figure the percentage done float fPercentageDone = float(m_nCurrentStep) / float(max(m_nTotalSteps, 1)); int nPercentageDone = (int) (fPercentageDone * 1000 * 100); if (nPercentageDone > 100000) nPercentageDone = 100000; // update the percent done pointer if (m_pPercentageDone) { *m_pPercentageDone = nPercentageDone; } // fire the callback if (m_bUseCallback) { if (bForceUpdate || (nPercentageDone - m_nLastCallbackFiredPercentageDone) >= 1000) { m_CallbackFunction(nPercentageDone); m_nLastCallbackFiredPercentageDone = nPercentageDone; } } } int CMACProgressHelper::ProcessKillFlag(BOOL bSleep) { // process any messages (allows repaint, etc.) if (bSleep) { PUMP_MESSAGE_LOOP } if (m_pKillFlag) { while (*m_pKillFlag == KILL_FLAG_PAUSE) { snooze(50*1000); // SHINTA: Replacement of Windows' SLEEP() PUMP_MESSAGE_LOOP } if ((*m_pKillFlag != KILL_FLAG_CONTINUE) && (*m_pKillFlag != KILL_FLAG_PAUSE)) { return -1; } } return ERROR_SUCCESS; }