1// ExtractCallbackSfx.h
2
3#ifndef __EXTRACT_CALLBACK_SFX_H
4#define __EXTRACT_CALLBACK_SFX_H
5
6#include "resource.h"
7
8#include "../../../Windows/ResourceString.h"
9
10#include "../../Archive/IArchive.h"
11
12#include "../../Common/FileStreams.h"
13#include "../../ICoder.h"
14
15#include "../../UI/FileManager/LangUtils.h"
16
17#ifndef _NO_PROGRESS
18#include "../../UI/FileManager/ProgressDialog.h"
19#endif
20#include "../../UI/Common/ArchiveOpenCallback.h"
21
22class CExtractCallbackImp:
23  public IArchiveExtractCallback,
24  public IOpenCallbackUI,
25  public CMyUnknownImp
26{
27public:
28
29  MY_UNKNOWN_IMP
30
31  INTERFACE_IArchiveExtractCallback(;)
32  INTERFACE_IOpenCallbackUI(;)
33
34private:
35  CMyComPtr<IInArchive> _archiveHandler;
36  FString _directoryPath;
37  UString _filePath;
38  FString _diskFilePath;
39
40  bool _extractMode;
41  struct CProcessedFileInfo
42  {
43    FILETIME MTime;
44    bool IsDir;
45    UInt32 Attributes;
46  } _processedFileInfo;
47
48  COutFileStream *_outFileStreamSpec;
49  CMyComPtr<ISequentialOutStream> _outFileStream;
50
51  UString _itemDefaultName;
52  FILETIME _defaultMTime;
53  UInt32 _defaultAttributes;
54
55  void CreateComplexDirectory(const UStringVector &dirPathParts);
56public:
57  #ifndef _NO_PROGRESS
58  CProgressDialog ProgressDialog;
59  #endif
60
61  bool _isCorrupt;
62  UString _message;
63
64  void Init(IInArchive *archiveHandler,
65    const FString &directoryPath,
66    const UString &itemDefaultName,
67    const FILETIME &defaultMTime,
68    UInt32 defaultAttributes);
69
70  #ifndef _NO_PROGRESS
71  HRESULT StartProgressDialog(const UString &title, NWindows::CThread &thread)
72  {
73    ProgressDialog.Create(title, thread, 0);
74    {
75      ProgressDialog.SetText(LangString(IDS_PROGRESS_EXTRACTING));
76    }
77
78    ProgressDialog.Show(SW_SHOWNORMAL);
79    return S_OK;
80  }
81  virtual ~CExtractCallbackImp() { ProgressDialog.Destroy(); }
82  #endif
83
84};
85
86#endif
87