1 // ExtractCallback.h 2 3 #ifndef __EXTRACTCALLBACK_H 4 #define __EXTRACTCALLBACK_H 5 6 #include "resource.h" 7 8 #include "Common/String.h" 9 #include "Windows/ResourceString.h" 10 11 #include "../../Archive/IArchive.h" 12 13 #include "../../Common/FileStreams.h" 14 #include "../../ICoder.h" 15 16 #ifndef _NO_PROGRESS 17 #include "../../FileManager/Resource/ProgressDialog/ProgressDialog.h" 18 #endif 19 20 class CExtractCallbackImp: 21 public IArchiveExtractCallback, 22 public CMyUnknownImp 23 { 24 public: 25 26 MY_UNKNOWN_IMP 27 28 // IProgress 29 STDMETHOD(SetTotal)(UInt64 size); 30 STDMETHOD(SetCompleted)(const UInt64 *completeValue); 31 32 // IExtractCallback 33 STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, 34 Int32 askExtractMode); 35 STDMETHOD(PrepareOperation)(Int32 askExtractMode); 36 STDMETHOD(SetOperationResult)(Int32 resultEOperationResult); 37 38 private: 39 CMyComPtr<IInArchive> _archiveHandler; 40 UString _directoryPath; 41 42 UString _filePath; 43 44 UString _diskFilePath; 45 46 bool _extractMode; 47 struct CProcessedFileInfo 48 { 49 FILETIME UTCLastWriteTime; 50 bool IsDirectory; 51 UInt32 Attributes; 52 } _processedFileInfo; 53 54 COutFileStream *_outFileStreamSpec; 55 CMyComPtr<ISequentialOutStream> _outFileStream; 56 57 UString _itemDefaultName; 58 FILETIME _utcLastWriteTimeDefault; 59 UInt32 _attributesDefault; 60 61 void CreateComplexDirectory(const UStringVector &dirPathParts); 62 public: 63 #ifndef _NO_PROGRESS 64 CProgressDialog ProgressDialog; 65 #endif 66 67 bool _isCorrupt; 68 UString _message; 69 70 void Init(IInArchive *archiveHandler, 71 const UString &directoryPath, 72 const UString &itemDefaultName, 73 const FILETIME &utcLastWriteTimeDefault, 74 UInt32 attributesDefault); 75 76 #ifndef _NO_PROGRESS StartProgressDialog(const UString & title)77 HRESULT StartProgressDialog(const UString &title) 78 { 79 ProgressDialog.Create(title, 0); 80 { 81 #ifdef LANG 82 ProgressDialog.SetText(LangLoadString(IDS_PROGRESS_EXTRACTING, 0x02000890)); 83 #else 84 ProgressDialog.SetText(NWindows::MyLoadStringW(IDS_PROGRESS_EXTRACTING)); 85 #endif 86 } 87 88 ProgressDialog.Show(SW_SHOWNORMAL); 89 return S_OK; 90 } ~CExtractCallbackImp()91 virtual ~CExtractCallbackImp() { ProgressDialog.Destroy(); } 92 #endif 93 94 }; 95 96 #endif 97