1*f6dc9357SAndroid Build Coastguard Worker // ProgressDialog2.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_PROGRESS_DIALOG_2_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_PROGRESS_DIALOG_2_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h" 9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h" 10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/Dialog.h" 13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/ListView.h" 14*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/ProgressBar.h" 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker #include "MyWindowsNew.h" 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker struct CProgressMessageBoxPair 19*f6dc9357SAndroid Build Coastguard Worker { 20*f6dc9357SAndroid Build Coastguard Worker UString Title; 21*f6dc9357SAndroid Build Coastguard Worker UString Message; 22*f6dc9357SAndroid Build Coastguard Worker }; 23*f6dc9357SAndroid Build Coastguard Worker 24*f6dc9357SAndroid Build Coastguard Worker struct CProgressFinalMessage 25*f6dc9357SAndroid Build Coastguard Worker { 26*f6dc9357SAndroid Build Coastguard Worker CProgressMessageBoxPair ErrorMessage; 27*f6dc9357SAndroid Build Coastguard Worker CProgressMessageBoxPair OkMessage; 28*f6dc9357SAndroid Build Coastguard Worker ThereIsMessageCProgressFinalMessage29*f6dc9357SAndroid Build Coastguard Worker bool ThereIsMessage() const { return !ErrorMessage.Message.IsEmpty() || !OkMessage.Message.IsEmpty(); } 30*f6dc9357SAndroid Build Coastguard Worker }; 31*f6dc9357SAndroid Build Coastguard Worker 32*f6dc9357SAndroid Build Coastguard Worker class CProgressSync 33*f6dc9357SAndroid Build Coastguard Worker { 34*f6dc9357SAndroid Build Coastguard Worker bool _stopped; 35*f6dc9357SAndroid Build Coastguard Worker bool _paused; 36*f6dc9357SAndroid Build Coastguard Worker public: 37*f6dc9357SAndroid Build Coastguard Worker bool _filesProgressMode; 38*f6dc9357SAndroid Build Coastguard Worker bool _isDir; 39*f6dc9357SAndroid Build Coastguard Worker UInt64 _totalBytes; 40*f6dc9357SAndroid Build Coastguard Worker UInt64 _completedBytes; 41*f6dc9357SAndroid Build Coastguard Worker UInt64 _totalFiles; 42*f6dc9357SAndroid Build Coastguard Worker UInt64 _curFiles; 43*f6dc9357SAndroid Build Coastguard Worker UInt64 _inSize; 44*f6dc9357SAndroid Build Coastguard Worker UInt64 _outSize; 45*f6dc9357SAndroid Build Coastguard Worker 46*f6dc9357SAndroid Build Coastguard Worker UString _titleFileName; 47*f6dc9357SAndroid Build Coastguard Worker UString _status; 48*f6dc9357SAndroid Build Coastguard Worker UString _filePath; 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker UStringVector Messages; 51*f6dc9357SAndroid Build Coastguard Worker CProgressFinalMessage FinalMessage; 52*f6dc9357SAndroid Build Coastguard Worker 53*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSection _cs; 54*f6dc9357SAndroid Build Coastguard Worker 55*f6dc9357SAndroid Build Coastguard Worker CProgressSync(); 56*f6dc9357SAndroid Build Coastguard Worker Get_Stopped()57*f6dc9357SAndroid Build Coastguard Worker bool Get_Stopped() 58*f6dc9357SAndroid Build Coastguard Worker { 59*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 60*f6dc9357SAndroid Build Coastguard Worker return _stopped; 61*f6dc9357SAndroid Build Coastguard Worker } Set_Stopped(bool val)62*f6dc9357SAndroid Build Coastguard Worker void Set_Stopped(bool val) 63*f6dc9357SAndroid Build Coastguard Worker { 64*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 65*f6dc9357SAndroid Build Coastguard Worker _stopped = val; 66*f6dc9357SAndroid Build Coastguard Worker } 67*f6dc9357SAndroid Build Coastguard Worker 68*f6dc9357SAndroid Build Coastguard Worker bool Get_Paused(); Set_Paused(bool val)69*f6dc9357SAndroid Build Coastguard Worker void Set_Paused(bool val) 70*f6dc9357SAndroid Build Coastguard Worker { 71*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 72*f6dc9357SAndroid Build Coastguard Worker _paused = val; 73*f6dc9357SAndroid Build Coastguard Worker } 74*f6dc9357SAndroid Build Coastguard Worker Set_FilesProgressMode(bool filesProgressMode)75*f6dc9357SAndroid Build Coastguard Worker void Set_FilesProgressMode(bool filesProgressMode) 76*f6dc9357SAndroid Build Coastguard Worker { 77*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(_cs); 78*f6dc9357SAndroid Build Coastguard Worker _filesProgressMode = filesProgressMode; 79*f6dc9357SAndroid Build Coastguard Worker } 80*f6dc9357SAndroid Build Coastguard Worker 81*f6dc9357SAndroid Build Coastguard Worker HRESULT CheckStop(); 82*f6dc9357SAndroid Build Coastguard Worker void Clear_Stop_Status(); 83*f6dc9357SAndroid Build Coastguard Worker HRESULT ScanProgress(UInt64 numFiles, UInt64 totalSize, const FString &fileName, bool isDir = false); 84*f6dc9357SAndroid Build Coastguard Worker 85*f6dc9357SAndroid Build Coastguard Worker HRESULT Set_NumFilesTotal(UInt64 val); 86*f6dc9357SAndroid Build Coastguard Worker void Set_NumBytesTotal(UInt64 val); 87*f6dc9357SAndroid Build Coastguard Worker void Set_NumFilesCur(UInt64 val); 88*f6dc9357SAndroid Build Coastguard Worker HRESULT Set_NumBytesCur(const UInt64 *val); 89*f6dc9357SAndroid Build Coastguard Worker HRESULT Set_NumBytesCur(UInt64 val); 90*f6dc9357SAndroid Build Coastguard Worker void Set_Ratio(const UInt64 *inSize, const UInt64 *outSize); 91*f6dc9357SAndroid Build Coastguard Worker 92*f6dc9357SAndroid Build Coastguard Worker void Set_TitleFileName(const UString &fileName); 93*f6dc9357SAndroid Build Coastguard Worker void Set_Status(const UString &s); 94*f6dc9357SAndroid Build Coastguard Worker HRESULT Set_Status2(const UString &s, const wchar_t *path, bool isDir = false); 95*f6dc9357SAndroid Build Coastguard Worker void Set_FilePath(const wchar_t *path, bool isDir = false); 96*f6dc9357SAndroid Build Coastguard Worker 97*f6dc9357SAndroid Build Coastguard Worker void AddError_Message(const wchar_t *message); 98*f6dc9357SAndroid Build Coastguard Worker void AddError_Message_Name(const wchar_t *message, const wchar_t *name); 99*f6dc9357SAndroid Build Coastguard Worker // void AddError_Code_Name(DWORD systemError, const wchar_t *name); 100*f6dc9357SAndroid Build Coastguard Worker void AddError_Code_Name(HRESULT systemError, const wchar_t *name); 101*f6dc9357SAndroid Build Coastguard Worker ThereIsMessage()102*f6dc9357SAndroid Build Coastguard Worker bool ThereIsMessage() const { return !Messages.IsEmpty() || FinalMessage.ThereIsMessage(); } 103*f6dc9357SAndroid Build Coastguard Worker }; 104*f6dc9357SAndroid Build Coastguard Worker 105*f6dc9357SAndroid Build Coastguard Worker 106*f6dc9357SAndroid Build Coastguard Worker class CProgressDialog: public NWindows::NControl::CModalDialog 107*f6dc9357SAndroid Build Coastguard Worker { 108*f6dc9357SAndroid Build Coastguard Worker bool _isDir; 109*f6dc9357SAndroid Build Coastguard Worker bool _wasCreated; 110*f6dc9357SAndroid Build Coastguard Worker bool _needClose; 111*f6dc9357SAndroid Build Coastguard Worker bool _errorsWereDisplayed; 112*f6dc9357SAndroid Build Coastguard Worker bool _waitCloseByCancelButton; 113*f6dc9357SAndroid Build Coastguard Worker bool _cancelWasPressed; 114*f6dc9357SAndroid Build Coastguard Worker bool _inCancelMessageBox; 115*f6dc9357SAndroid Build Coastguard Worker bool _externalCloseMessageWasReceived; 116*f6dc9357SAndroid Build Coastguard Worker bool _background; 117*f6dc9357SAndroid Build Coastguard Worker public: 118*f6dc9357SAndroid Build Coastguard Worker bool WaitMode; 119*f6dc9357SAndroid Build Coastguard Worker bool MessagesDisplayed; // = true if user pressed OK on all messages or there are no messages. 120*f6dc9357SAndroid Build Coastguard Worker bool CompressingMode; 121*f6dc9357SAndroid Build Coastguard Worker bool ShowCompressionInfo; 122*f6dc9357SAndroid Build Coastguard Worker 123*f6dc9357SAndroid Build Coastguard Worker private: 124*f6dc9357SAndroid Build Coastguard Worker unsigned _numPostedMessages; 125*f6dc9357SAndroid Build Coastguard Worker unsigned _numAutoSizeMessages; 126*f6dc9357SAndroid Build Coastguard Worker unsigned _numMessages; 127*f6dc9357SAndroid Build Coastguard Worker 128*f6dc9357SAndroid Build Coastguard Worker UString _titleFileName; 129*f6dc9357SAndroid Build Coastguard Worker UString _filePath; 130*f6dc9357SAndroid Build Coastguard Worker UString _status; 131*f6dc9357SAndroid Build Coastguard Worker 132*f6dc9357SAndroid Build Coastguard Worker UString _background_String; 133*f6dc9357SAndroid Build Coastguard Worker UString _backgrounded_String; 134*f6dc9357SAndroid Build Coastguard Worker UString _foreground_String; 135*f6dc9357SAndroid Build Coastguard Worker UString _pause_String; 136*f6dc9357SAndroid Build Coastguard Worker UString _continue_String; 137*f6dc9357SAndroid Build Coastguard Worker UString _paused_String; 138*f6dc9357SAndroid Build Coastguard Worker 139*f6dc9357SAndroid Build Coastguard Worker int _buttonSizeX; 140*f6dc9357SAndroid Build Coastguard Worker int _buttonSizeY; 141*f6dc9357SAndroid Build Coastguard Worker 142*f6dc9357SAndroid Build Coastguard Worker UINT_PTR _timer; 143*f6dc9357SAndroid Build Coastguard Worker 144*f6dc9357SAndroid Build Coastguard Worker UString _title; 145*f6dc9357SAndroid Build Coastguard Worker 146*f6dc9357SAndroid Build Coastguard Worker class CU64ToI32Converter 147*f6dc9357SAndroid Build Coastguard Worker { 148*f6dc9357SAndroid Build Coastguard Worker unsigned _numShiftBits; 149*f6dc9357SAndroid Build Coastguard Worker UInt64 _range; 150*f6dc9357SAndroid Build Coastguard Worker public: CU64ToI32Converter()151*f6dc9357SAndroid Build Coastguard Worker CU64ToI32Converter(): _numShiftBits(0), _range(1) {} Init(UInt64 range)152*f6dc9357SAndroid Build Coastguard Worker void Init(UInt64 range) 153*f6dc9357SAndroid Build Coastguard Worker { 154*f6dc9357SAndroid Build Coastguard Worker _range = range; 155*f6dc9357SAndroid Build Coastguard Worker // Windows CE doesn't like big number for ProgressBar. 156*f6dc9357SAndroid Build Coastguard Worker for (_numShiftBits = 0; range >= ((UInt32)1 << 15); _numShiftBits++) 157*f6dc9357SAndroid Build Coastguard Worker range >>= 1; 158*f6dc9357SAndroid Build Coastguard Worker } Count(UInt64 val)159*f6dc9357SAndroid Build Coastguard Worker int Count(UInt64 val) 160*f6dc9357SAndroid Build Coastguard Worker { 161*f6dc9357SAndroid Build Coastguard Worker int res = (int)(val >> _numShiftBits); 162*f6dc9357SAndroid Build Coastguard Worker if (val == _range) 163*f6dc9357SAndroid Build Coastguard Worker res++; 164*f6dc9357SAndroid Build Coastguard Worker return res; 165*f6dc9357SAndroid Build Coastguard Worker } 166*f6dc9357SAndroid Build Coastguard Worker }; 167*f6dc9357SAndroid Build Coastguard Worker 168*f6dc9357SAndroid Build Coastguard Worker CU64ToI32Converter _progressConv; 169*f6dc9357SAndroid Build Coastguard Worker UInt64 _progressBar_Pos; 170*f6dc9357SAndroid Build Coastguard Worker UInt64 _progressBar_Range; 171*f6dc9357SAndroid Build Coastguard Worker 172*f6dc9357SAndroid Build Coastguard Worker NWindows::NControl::CProgressBar m_ProgressBar; 173*f6dc9357SAndroid Build Coastguard Worker NWindows::NControl::CListView _messageList; 174*f6dc9357SAndroid Build Coastguard Worker 175*f6dc9357SAndroid Build Coastguard Worker UStringVector _messageStrings; 176*f6dc9357SAndroid Build Coastguard Worker 177*f6dc9357SAndroid Build Coastguard Worker // #ifdef __ITaskbarList3_INTERFACE_DEFINED__ 178*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ITaskbarList3> _taskbarList; 179*f6dc9357SAndroid Build Coastguard Worker // #endif 180*f6dc9357SAndroid Build Coastguard Worker HWND _hwndForTaskbar; 181*f6dc9357SAndroid Build Coastguard Worker 182*f6dc9357SAndroid Build Coastguard Worker UInt32 _prevTime; 183*f6dc9357SAndroid Build Coastguard Worker UInt64 _elapsedTime; 184*f6dc9357SAndroid Build Coastguard Worker 185*f6dc9357SAndroid Build Coastguard Worker UInt64 _prevPercentValue; 186*f6dc9357SAndroid Build Coastguard Worker UInt64 _prevElapsedSec; 187*f6dc9357SAndroid Build Coastguard Worker UInt64 _prevRemainingSec; 188*f6dc9357SAndroid Build Coastguard Worker 189*f6dc9357SAndroid Build Coastguard Worker UInt64 _totalBytes_Prev; 190*f6dc9357SAndroid Build Coastguard Worker UInt64 _processed_Prev; 191*f6dc9357SAndroid Build Coastguard Worker UInt64 _packed_Prev; 192*f6dc9357SAndroid Build Coastguard Worker UInt64 _ratio_Prev; 193*f6dc9357SAndroid Build Coastguard Worker 194*f6dc9357SAndroid Build Coastguard Worker UString _filesStr_Prev; 195*f6dc9357SAndroid Build Coastguard Worker UString _filesTotStr_Prev; 196*f6dc9357SAndroid Build Coastguard Worker 197*f6dc9357SAndroid Build Coastguard Worker unsigned _numReduceSymbols; 198*f6dc9357SAndroid Build Coastguard Worker unsigned _prevSpeed_MoveBits; 199*f6dc9357SAndroid Build Coastguard Worker UInt64 _prevSpeed; 200*f6dc9357SAndroid Build Coastguard Worker 201*f6dc9357SAndroid Build Coastguard Worker // #ifdef __ITaskbarList3_INTERFACE_DEFINED__ SetTaskbarProgressState(TBPFLAG tbpFlags)202*f6dc9357SAndroid Build Coastguard Worker void SetTaskbarProgressState(TBPFLAG tbpFlags) 203*f6dc9357SAndroid Build Coastguard Worker { 204*f6dc9357SAndroid Build Coastguard Worker if (_taskbarList && _hwndForTaskbar) 205*f6dc9357SAndroid Build Coastguard Worker _taskbarList->SetProgressState(_hwndForTaskbar, tbpFlags); 206*f6dc9357SAndroid Build Coastguard Worker } 207*f6dc9357SAndroid Build Coastguard Worker // #endif 208*f6dc9357SAndroid Build Coastguard Worker void SetTaskbarProgressState(); 209*f6dc9357SAndroid Build Coastguard Worker 210*f6dc9357SAndroid Build Coastguard Worker void UpdateStatInfo(bool showAll); 211*f6dc9357SAndroid Build Coastguard Worker void SetProgressRange(UInt64 range); 212*f6dc9357SAndroid Build Coastguard Worker void SetProgressPos(UInt64 pos); 213*f6dc9357SAndroid Build Coastguard Worker virtual bool OnTimer(WPARAM timerID, LPARAM callback) Z7_override; 214*f6dc9357SAndroid Build Coastguard Worker virtual bool OnInit() Z7_override; 215*f6dc9357SAndroid Build Coastguard Worker virtual bool OnSize(WPARAM wParam, int xSize, int ySize) Z7_override; 216*f6dc9357SAndroid Build Coastguard Worker virtual void OnCancel() Z7_override; 217*f6dc9357SAndroid Build Coastguard Worker virtual void OnOK() Z7_override; 218*f6dc9357SAndroid Build Coastguard Worker virtual bool OnNotify(UINT /* controlID */, LPNMHDR header) Z7_override; 219*f6dc9357SAndroid Build Coastguard Worker void CopyToClipboard(); 220*f6dc9357SAndroid Build Coastguard Worker 221*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CManualResetEvent _createDialogEvent; 222*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CManualResetEvent _dialogCreatedEvent; 223*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 224*f6dc9357SAndroid Build Coastguard Worker void AddToTitle(LPCWSTR string); 225*f6dc9357SAndroid Build Coastguard Worker #endif 226*f6dc9357SAndroid Build Coastguard Worker 227*f6dc9357SAndroid Build Coastguard Worker void SetPauseText(); 228*f6dc9357SAndroid Build Coastguard Worker void SetPriorityText(); 229*f6dc9357SAndroid Build Coastguard Worker void OnPauseButton(); 230*f6dc9357SAndroid Build Coastguard Worker void OnPriorityButton(); 231*f6dc9357SAndroid Build Coastguard Worker bool OnButtonClicked(unsigned buttonID, HWND buttonHWND) Z7_override; 232*f6dc9357SAndroid Build Coastguard Worker bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) Z7_override; 233*f6dc9357SAndroid Build Coastguard Worker 234*f6dc9357SAndroid Build Coastguard Worker void SetTitleText(); 235*f6dc9357SAndroid Build Coastguard Worker void ShowSize(unsigned id, UInt64 val, UInt64 &prev); 236*f6dc9357SAndroid Build Coastguard Worker 237*f6dc9357SAndroid Build Coastguard Worker void UpdateMessagesDialog(); 238*f6dc9357SAndroid Build Coastguard Worker 239*f6dc9357SAndroid Build Coastguard Worker void AddMessageDirect(LPCWSTR message, bool needNumber); 240*f6dc9357SAndroid Build Coastguard Worker void AddMessage(LPCWSTR message); 241*f6dc9357SAndroid Build Coastguard Worker 242*f6dc9357SAndroid Build Coastguard Worker bool OnExternalCloseMessage(); 243*f6dc9357SAndroid Build Coastguard Worker void EnableErrorsControls(bool enable); 244*f6dc9357SAndroid Build Coastguard Worker 245*f6dc9357SAndroid Build Coastguard Worker void ShowAfterMessages(HWND wndParent); 246*f6dc9357SAndroid Build Coastguard Worker 247*f6dc9357SAndroid Build Coastguard Worker void CheckNeedClose(); 248*f6dc9357SAndroid Build Coastguard Worker 249*f6dc9357SAndroid Build Coastguard Worker public: 250*f6dc9357SAndroid Build Coastguard Worker CProgressSync Sync; 251*f6dc9357SAndroid Build Coastguard Worker int IconID; 252*f6dc9357SAndroid Build Coastguard Worker HWND MainWindow; 253*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX 254*f6dc9357SAndroid Build Coastguard Worker UString MainTitle; 255*f6dc9357SAndroid Build Coastguard Worker UString MainAddTitle; 256*f6dc9357SAndroid Build Coastguard Worker ~CProgressDialog() Z7_DESTRUCTOR_override; 257*f6dc9357SAndroid Build Coastguard Worker #endif 258*f6dc9357SAndroid Build Coastguard Worker 259*f6dc9357SAndroid Build Coastguard Worker CProgressDialog(); WaitCreating()260*f6dc9357SAndroid Build Coastguard Worker void WaitCreating() 261*f6dc9357SAndroid Build Coastguard Worker { 262*f6dc9357SAndroid Build Coastguard Worker _createDialogEvent.Set(); 263*f6dc9357SAndroid Build Coastguard Worker _dialogCreatedEvent.Lock(); 264*f6dc9357SAndroid Build Coastguard Worker } 265*f6dc9357SAndroid Build Coastguard Worker 266*f6dc9357SAndroid Build Coastguard Worker INT_PTR Create(const UString &title, NWindows::CThread &thread, HWND wndParent = NULL); 267*f6dc9357SAndroid Build Coastguard Worker 268*f6dc9357SAndroid Build Coastguard Worker 269*f6dc9357SAndroid Build Coastguard Worker /* how it works: 270*f6dc9357SAndroid Build Coastguard Worker 1) the working thread calls ProcessWasFinished() 271*f6dc9357SAndroid Build Coastguard Worker that sends kCloseMessage message to CProgressDialog (GUI) thread 272*f6dc9357SAndroid Build Coastguard Worker 2) CProgressDialog (GUI) thread receives kCloseMessage message and 273*f6dc9357SAndroid Build Coastguard Worker calls ProcessWasFinished_GuiVirt(); 274*f6dc9357SAndroid Build Coastguard Worker So we can implement ProcessWasFinished_GuiVirt() and show special 275*f6dc9357SAndroid Build Coastguard Worker results window in GUI thread with CProgressDialog as parent window 276*f6dc9357SAndroid Build Coastguard Worker */ 277*f6dc9357SAndroid Build Coastguard Worker 278*f6dc9357SAndroid Build Coastguard Worker void ProcessWasFinished(); ProcessWasFinished_GuiVirt()279*f6dc9357SAndroid Build Coastguard Worker virtual void ProcessWasFinished_GuiVirt() {} 280*f6dc9357SAndroid Build Coastguard Worker }; 281*f6dc9357SAndroid Build Coastguard Worker 282*f6dc9357SAndroid Build Coastguard Worker 283*f6dc9357SAndroid Build Coastguard Worker class CProgressCloser 284*f6dc9357SAndroid Build Coastguard Worker { 285*f6dc9357SAndroid Build Coastguard Worker CProgressDialog *_p; 286*f6dc9357SAndroid Build Coastguard Worker public: CProgressCloser(CProgressDialog & p)287*f6dc9357SAndroid Build Coastguard Worker CProgressCloser(CProgressDialog &p) : _p(&p) {} ~CProgressCloser()288*f6dc9357SAndroid Build Coastguard Worker ~CProgressCloser() { _p->ProcessWasFinished(); } 289*f6dc9357SAndroid Build Coastguard Worker }; 290*f6dc9357SAndroid Build Coastguard Worker 291*f6dc9357SAndroid Build Coastguard Worker 292*f6dc9357SAndroid Build Coastguard Worker class CProgressThreadVirt: public CProgressDialog 293*f6dc9357SAndroid Build Coastguard Worker { 294*f6dc9357SAndroid Build Coastguard Worker protected: 295*f6dc9357SAndroid Build Coastguard Worker FStringVector ErrorPaths; 296*f6dc9357SAndroid Build Coastguard Worker CProgressFinalMessage FinalMessage; 297*f6dc9357SAndroid Build Coastguard Worker 298*f6dc9357SAndroid Build Coastguard Worker // error if any of HRESULT, ErrorMessage, ErrorPath 299*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT ProcessVirt() = 0; 300*f6dc9357SAndroid Build Coastguard Worker public: 301*f6dc9357SAndroid Build Coastguard Worker HRESULT Result; 302*f6dc9357SAndroid Build Coastguard Worker bool ThreadFinishedOK; // if there is no fatal exception 303*f6dc9357SAndroid Build Coastguard Worker 304*f6dc9357SAndroid Build Coastguard Worker void Process(); AddErrorPath(const FString & path)305*f6dc9357SAndroid Build Coastguard Worker void AddErrorPath(const FString &path) { ErrorPaths.Add(path); } 306*f6dc9357SAndroid Build Coastguard Worker 307*f6dc9357SAndroid Build Coastguard Worker HRESULT Create(const UString &title, HWND parentWindow = NULL); CProgressThreadVirt()308*f6dc9357SAndroid Build Coastguard Worker CProgressThreadVirt(): Result(E_FAIL), ThreadFinishedOK(false) {} 309*f6dc9357SAndroid Build Coastguard Worker GetMessagePair(bool isError)310*f6dc9357SAndroid Build Coastguard Worker CProgressMessageBoxPair &GetMessagePair(bool isError) { return isError ? FinalMessage.ErrorMessage : FinalMessage.OkMessage; } 311*f6dc9357SAndroid Build Coastguard Worker }; 312*f6dc9357SAndroid Build Coastguard Worker 313*f6dc9357SAndroid Build Coastguard Worker UString HResultToMessage(HRESULT errorCode); 314*f6dc9357SAndroid Build Coastguard Worker 315*f6dc9357SAndroid Build Coastguard Worker /* 316*f6dc9357SAndroid Build Coastguard Worker how it works: 317*f6dc9357SAndroid Build Coastguard Worker 318*f6dc9357SAndroid Build Coastguard Worker client code inherits CProgressThreadVirt and calls 319*f6dc9357SAndroid Build Coastguard Worker CProgressThreadVirt::Create() 320*f6dc9357SAndroid Build Coastguard Worker { 321*f6dc9357SAndroid Build Coastguard Worker it creates new thread that calls CProgressThreadVirt::Process(); 322*f6dc9357SAndroid Build Coastguard Worker it creates modal progress dialog window with ProgressDialog.Create() 323*f6dc9357SAndroid Build Coastguard Worker } 324*f6dc9357SAndroid Build Coastguard Worker 325*f6dc9357SAndroid Build Coastguard Worker CProgressThreadVirt::Process() 326*f6dc9357SAndroid Build Coastguard Worker { 327*f6dc9357SAndroid Build Coastguard Worker { 328*f6dc9357SAndroid Build Coastguard Worker Result = ProcessVirt(); // virtual function that must implement real work 329*f6dc9357SAndroid Build Coastguard Worker } 330*f6dc9357SAndroid Build Coastguard Worker if (exceptions) or FinalMessage.ErrorMessage.Message 331*f6dc9357SAndroid Build Coastguard Worker { 332*f6dc9357SAndroid Build Coastguard Worker set message to ProgressDialog.Sync.FinalMessage.ErrorMessage.Message 333*f6dc9357SAndroid Build Coastguard Worker } 334*f6dc9357SAndroid Build Coastguard Worker else if (FinalMessage.OkMessage.Message) 335*f6dc9357SAndroid Build Coastguard Worker { 336*f6dc9357SAndroid Build Coastguard Worker set message to ProgressDialog.Sync.FinalMessage.OkMessage 337*f6dc9357SAndroid Build Coastguard Worker } 338*f6dc9357SAndroid Build Coastguard Worker 339*f6dc9357SAndroid Build Coastguard Worker PostMsg(kCloseMessage); 340*f6dc9357SAndroid Build Coastguard Worker } 341*f6dc9357SAndroid Build Coastguard Worker 342*f6dc9357SAndroid Build Coastguard Worker 343*f6dc9357SAndroid Build Coastguard Worker CProgressDialog::OnExternalCloseMessage() 344*f6dc9357SAndroid Build Coastguard Worker { 345*f6dc9357SAndroid Build Coastguard Worker if (ProgressDialog.Sync.FinalMessage) 346*f6dc9357SAndroid Build Coastguard Worker { 347*f6dc9357SAndroid Build Coastguard Worker WorkWasFinishedVirt(); 348*f6dc9357SAndroid Build Coastguard Worker Show (ProgressDialog.Sync.FinalMessage) 349*f6dc9357SAndroid Build Coastguard Worker MessagesDisplayed = true; 350*f6dc9357SAndroid Build Coastguard Worker } 351*f6dc9357SAndroid Build Coastguard Worker } 352*f6dc9357SAndroid Build Coastguard Worker 353*f6dc9357SAndroid Build Coastguard Worker */ 354*f6dc9357SAndroid Build Coastguard Worker 355*f6dc9357SAndroid Build Coastguard Worker #endif 356