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