1 #include "All.h"
2 #include "MACProgressHelper.h"
3
4 #include <OS.h>
5
CMACProgressHelper(int nTotalSteps,int * pPercentageDone,APE_PROGRESS_CALLBACK ProgressCallback,int * pKillFlag)6 CMACProgressHelper::CMACProgressHelper(int nTotalSteps, int * pPercentageDone, APE_PROGRESS_CALLBACK ProgressCallback, int * pKillFlag)
7 {
8 m_pKillFlag = pKillFlag;
9
10 m_bUseCallback = FALSE;
11 if (ProgressCallback != NULL)
12 {
13 m_bUseCallback = TRUE;
14 m_CallbackFunction = ProgressCallback;
15 }
16
17 m_pPercentageDone = pPercentageDone;
18
19 m_nTotalSteps = nTotalSteps;
20 m_nCurrentStep = 0;
21 m_nLastCallbackFiredPercentageDone = 0;
22
23 UpdateProgress(0);
24 }
25
~CMACProgressHelper()26 CMACProgressHelper::~CMACProgressHelper()
27 {
28
29 }
30
UpdateProgress(int nCurrentStep,BOOL bForceUpdate)31 void CMACProgressHelper::UpdateProgress(int nCurrentStep, BOOL bForceUpdate)
32 {
33 // update the step
34 if (nCurrentStep == -1)
35 m_nCurrentStep++;
36 else
37 m_nCurrentStep = nCurrentStep;
38
39 // figure the percentage done
40 float fPercentageDone = float(m_nCurrentStep) / float(max(m_nTotalSteps, 1));
41 int nPercentageDone = (int) (fPercentageDone * 1000 * 100);
42 if (nPercentageDone > 100000) nPercentageDone = 100000;
43
44 // update the percent done pointer
45 if (m_pPercentageDone)
46 {
47 *m_pPercentageDone = nPercentageDone;
48 }
49
50 // fire the callback
51 if (m_bUseCallback)
52 {
53 if (bForceUpdate || (nPercentageDone - m_nLastCallbackFiredPercentageDone) >= 1000)
54 {
55 m_CallbackFunction(nPercentageDone);
56 m_nLastCallbackFiredPercentageDone = nPercentageDone;
57 }
58 }
59 }
60
ProcessKillFlag(BOOL bSleep)61 int CMACProgressHelper::ProcessKillFlag(BOOL bSleep)
62 {
63 // process any messages (allows repaint, etc.)
64 if (bSleep)
65 {
66 PUMP_MESSAGE_LOOP
67 }
68
69 if (m_pKillFlag)
70 {
71 while (*m_pKillFlag == KILL_FLAG_PAUSE)
72 {
73 snooze(50*1000); // SHINTA: Replacement of Windows' SLEEP()
74 PUMP_MESSAGE_LOOP
75 }
76
77 if ((*m_pKillFlag != KILL_FLAG_CONTINUE) && (*m_pKillFlag != KILL_FLAG_PAUSE))
78 {
79 return -1;
80 }
81 }
82
83 return ERROR_SUCCESS;
84 }
85