1*f6dc9357SAndroid Build Coastguard Worker // ProgressDialog.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_PROGRESS_DIALOG_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_PROGRESS_DIALOG_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h" 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/Dialog.h" 10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/ProgressBar.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker #include "ProgressDialogRes.h" 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker class CProgressSync 15*f6dc9357SAndroid Build Coastguard Worker { 16*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSection _cs; 17*f6dc9357SAndroid Build Coastguard Worker bool _stopped; 18*f6dc9357SAndroid Build Coastguard Worker bool _paused; 19*f6dc9357SAndroid Build Coastguard Worker UInt64 _total; 20*f6dc9357SAndroid Build Coastguard Worker UInt64 _completed; 21*f6dc9357SAndroid Build Coastguard Worker public: CProgressSync()22*f6dc9357SAndroid Build Coastguard Worker CProgressSync(): _stopped(false), _paused(false), _total(1), _completed(0) {} 23*f6dc9357SAndroid Build Coastguard Worker 24*f6dc9357SAndroid Build Coastguard Worker HRESULT ProcessStopAndPause(); GetStopped()25*f6dc9357SAndroid Build Coastguard Worker bool GetStopped() 26*f6dc9357SAndroid Build Coastguard Worker { 27*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 28*f6dc9357SAndroid Build Coastguard Worker return _stopped; 29*f6dc9357SAndroid Build Coastguard Worker } SetStopped(bool value)30*f6dc9357SAndroid Build Coastguard Worker void SetStopped(bool value) 31*f6dc9357SAndroid Build Coastguard Worker { 32*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 33*f6dc9357SAndroid Build Coastguard Worker _stopped = value; 34*f6dc9357SAndroid Build Coastguard Worker } GetPaused()35*f6dc9357SAndroid Build Coastguard Worker bool GetPaused() 36*f6dc9357SAndroid Build Coastguard Worker { 37*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 38*f6dc9357SAndroid Build Coastguard Worker return _paused; 39*f6dc9357SAndroid Build Coastguard Worker } SetPaused(bool value)40*f6dc9357SAndroid Build Coastguard Worker void SetPaused(bool value) 41*f6dc9357SAndroid Build Coastguard Worker { 42*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 43*f6dc9357SAndroid Build Coastguard Worker _paused = value; 44*f6dc9357SAndroid Build Coastguard Worker } SetProgress(UInt64 total,UInt64 completed)45*f6dc9357SAndroid Build Coastguard Worker void SetProgress(UInt64 total, UInt64 completed) 46*f6dc9357SAndroid Build Coastguard Worker { 47*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 48*f6dc9357SAndroid Build Coastguard Worker _total = total; 49*f6dc9357SAndroid Build Coastguard Worker _completed = completed; 50*f6dc9357SAndroid Build Coastguard Worker } SetPos(UInt64 completed)51*f6dc9357SAndroid Build Coastguard Worker void SetPos(UInt64 completed) 52*f6dc9357SAndroid Build Coastguard Worker { 53*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 54*f6dc9357SAndroid Build Coastguard Worker _completed = completed; 55*f6dc9357SAndroid Build Coastguard Worker } GetProgress(UInt64 & total,UInt64 & completed)56*f6dc9357SAndroid Build Coastguard Worker void GetProgress(UInt64 &total, UInt64 &completed) 57*f6dc9357SAndroid Build Coastguard Worker { 58*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 59*f6dc9357SAndroid Build Coastguard Worker total = _total; 60*f6dc9357SAndroid Build Coastguard Worker completed = _completed; 61*f6dc9357SAndroid Build Coastguard Worker } 62*f6dc9357SAndroid Build Coastguard Worker }; 63*f6dc9357SAndroid Build Coastguard Worker 64*f6dc9357SAndroid Build Coastguard Worker class CU64ToI32Converter 65*f6dc9357SAndroid Build Coastguard Worker { 66*f6dc9357SAndroid Build Coastguard Worker UInt64 _numShiftBits; 67*f6dc9357SAndroid Build Coastguard Worker public: Init(UInt64 range)68*f6dc9357SAndroid Build Coastguard Worker void Init(UInt64 range) 69*f6dc9357SAndroid Build Coastguard Worker { 70*f6dc9357SAndroid Build Coastguard Worker // Windows CE doesn't like big number here. 71*f6dc9357SAndroid Build Coastguard Worker for (_numShiftBits = 0; range > (1 << 15); _numShiftBits++) 72*f6dc9357SAndroid Build Coastguard Worker range >>= 1; 73*f6dc9357SAndroid Build Coastguard Worker } Count(UInt64 value)74*f6dc9357SAndroid Build Coastguard Worker int Count(UInt64 value) { return int(value >> _numShiftBits); } 75*f6dc9357SAndroid Build Coastguard Worker }; 76*f6dc9357SAndroid Build Coastguard Worker 77*f6dc9357SAndroid Build Coastguard Worker class CProgressDialog: public NWindows::NControl::CModalDialog 78*f6dc9357SAndroid Build Coastguard Worker { 79*f6dc9357SAndroid Build Coastguard Worker private: 80*f6dc9357SAndroid Build Coastguard Worker UINT_PTR _timer; 81*f6dc9357SAndroid Build Coastguard Worker 82*f6dc9357SAndroid Build Coastguard Worker UString _title; 83*f6dc9357SAndroid Build Coastguard Worker CU64ToI32Converter _converter; 84*f6dc9357SAndroid Build Coastguard Worker UInt64 _peviousPos; 85*f6dc9357SAndroid Build Coastguard Worker UInt64 _range; 86*f6dc9357SAndroid Build Coastguard Worker NWindows::NControl::CProgressBar m_ProgressBar; 87*f6dc9357SAndroid Build Coastguard Worker 88*f6dc9357SAndroid Build Coastguard Worker UInt64 _prevPercentValue; 89*f6dc9357SAndroid Build Coastguard Worker 90*f6dc9357SAndroid Build Coastguard Worker bool _wasCreated; 91*f6dc9357SAndroid Build Coastguard Worker bool _needClose; 92*f6dc9357SAndroid Build Coastguard Worker bool _inCancelMessageBox; 93*f6dc9357SAndroid Build Coastguard Worker bool _externalCloseMessageWasReceived; 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker virtual bool OnButtonClicked(unsigned buttonID, HWND buttonHWND) Z7_override; 96*f6dc9357SAndroid Build Coastguard Worker virtual bool OnTimer(WPARAM timerID, LPARAM callback) Z7_override; 97*f6dc9357SAndroid Build Coastguard Worker virtual bool OnInit() Z7_override; 98*f6dc9357SAndroid Build Coastguard Worker virtual void OnCancel() Z7_override; 99*f6dc9357SAndroid Build Coastguard Worker virtual void OnOK() Z7_override; 100*f6dc9357SAndroid Build Coastguard Worker virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) Z7_override; 101*f6dc9357SAndroid Build Coastguard Worker 102*f6dc9357SAndroid Build Coastguard Worker void SetRange(UInt64 range); 103*f6dc9357SAndroid Build Coastguard Worker void SetPos(UInt64 pos); 104*f6dc9357SAndroid Build Coastguard Worker 105*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CManualResetEvent _dialogCreatedEvent; 106*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 107*f6dc9357SAndroid Build Coastguard Worker void AddToTitle(LPCWSTR string); 108*f6dc9357SAndroid Build Coastguard Worker #endif 109*f6dc9357SAndroid Build Coastguard Worker WaitCreating()110*f6dc9357SAndroid Build Coastguard Worker void WaitCreating() { _dialogCreatedEvent.Lock(); } 111*f6dc9357SAndroid Build Coastguard Worker void CheckNeedClose(); 112*f6dc9357SAndroid Build Coastguard Worker bool OnExternalCloseMessage(); 113*f6dc9357SAndroid Build Coastguard Worker public: 114*f6dc9357SAndroid Build Coastguard Worker CProgressSync Sync; 115*f6dc9357SAndroid Build Coastguard Worker int IconID; 116*f6dc9357SAndroid Build Coastguard Worker 117*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 118*f6dc9357SAndroid Build Coastguard Worker HWND MainWindow; 119*f6dc9357SAndroid Build Coastguard Worker UString MainTitle; 120*f6dc9357SAndroid Build Coastguard Worker UString MainAddTitle; 121*f6dc9357SAndroid Build Coastguard Worker ~CProgressDialog(); 122*f6dc9357SAndroid Build Coastguard Worker #endif 123*f6dc9357SAndroid Build Coastguard Worker CProgressDialog()124*f6dc9357SAndroid Build Coastguard Worker CProgressDialog(): _timer(0) 125*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 126*f6dc9357SAndroid Build Coastguard Worker ,MainWindow(NULL) 127*f6dc9357SAndroid Build Coastguard Worker #endif 128*f6dc9357SAndroid Build Coastguard Worker { 129*f6dc9357SAndroid Build Coastguard Worker IconID = -1; 130*f6dc9357SAndroid Build Coastguard Worker _wasCreated = false; 131*f6dc9357SAndroid Build Coastguard Worker _needClose = false; 132*f6dc9357SAndroid Build Coastguard Worker _inCancelMessageBox = false; 133*f6dc9357SAndroid Build Coastguard Worker _externalCloseMessageWasReceived = false; 134*f6dc9357SAndroid Build Coastguard Worker 135*f6dc9357SAndroid Build Coastguard Worker if (_dialogCreatedEvent.Create() != S_OK) 136*f6dc9357SAndroid Build Coastguard Worker throw 1334987; 137*f6dc9357SAndroid Build Coastguard Worker } 138*f6dc9357SAndroid Build Coastguard Worker 139*f6dc9357SAndroid Build Coastguard Worker INT_PTR Create(const UString &title, NWindows::CThread &thread, HWND wndParent = NULL) 140*f6dc9357SAndroid Build Coastguard Worker { 141*f6dc9357SAndroid Build Coastguard Worker _title = title; 142*f6dc9357SAndroid Build Coastguard Worker INT_PTR res = CModalDialog::Create(IDD_PROGRESS, wndParent); 143*f6dc9357SAndroid Build Coastguard Worker thread.Wait_Close(); 144*f6dc9357SAndroid Build Coastguard Worker return res; 145*f6dc9357SAndroid Build Coastguard Worker } 146*f6dc9357SAndroid Build Coastguard Worker 147*f6dc9357SAndroid Build Coastguard Worker enum 148*f6dc9357SAndroid Build Coastguard Worker { 149*f6dc9357SAndroid Build Coastguard Worker kCloseMessage = WM_APP + 1 150*f6dc9357SAndroid Build Coastguard Worker }; 151*f6dc9357SAndroid Build Coastguard Worker ProcessWasFinished()152*f6dc9357SAndroid Build Coastguard Worker void ProcessWasFinished() 153*f6dc9357SAndroid Build Coastguard Worker { 154*f6dc9357SAndroid Build Coastguard Worker WaitCreating(); 155*f6dc9357SAndroid Build Coastguard Worker if (_wasCreated) 156*f6dc9357SAndroid Build Coastguard Worker PostMsg(kCloseMessage); 157*f6dc9357SAndroid Build Coastguard Worker else 158*f6dc9357SAndroid Build Coastguard Worker _needClose = true; 159*f6dc9357SAndroid Build Coastguard Worker } 160*f6dc9357SAndroid Build Coastguard Worker }; 161*f6dc9357SAndroid Build Coastguard Worker 162*f6dc9357SAndroid Build Coastguard Worker 163*f6dc9357SAndroid Build Coastguard Worker class CProgressCloser 164*f6dc9357SAndroid Build Coastguard Worker { 165*f6dc9357SAndroid Build Coastguard Worker CProgressDialog *_p; 166*f6dc9357SAndroid Build Coastguard Worker public: CProgressCloser(CProgressDialog & p)167*f6dc9357SAndroid Build Coastguard Worker CProgressCloser(CProgressDialog &p) : _p(&p) {} ~CProgressCloser()168*f6dc9357SAndroid Build Coastguard Worker ~CProgressCloser() { _p->ProcessWasFinished(); } 169*f6dc9357SAndroid Build Coastguard Worker }; 170*f6dc9357SAndroid Build Coastguard Worker 171*f6dc9357SAndroid Build Coastguard Worker #endif 172