1// ArchiveExtractCallback.h
2
3#ifndef __ARCHIVE_EXTRACT_CALLBACK_H
4#define __ARCHIVE_EXTRACT_CALLBACK_H
5
6#include "Common/MyCom.h"
7#include "Common/Wildcard.h"
8
9#include "../../IPassword.h"
10
11#include "../../Common/FileStreams.h"
12#include "../../Common/ProgressUtils.h"
13
14#include "../../Archive/IArchive.h"
15
16#include "../../Archive/Common/OutStreamWithCRC.h"
17
18#include "ExtractMode.h"
19#include "IFileExtractCallback.h"
20#include "OpenArchive.h"
21
22class CArchiveExtractCallback:
23  public IArchiveExtractCallback,
24  // public IArchiveVolumeExtractCallback,
25  public ICryptoGetTextPassword,
26  public ICompressProgressInfo,
27  public CMyUnknownImp
28{
29  const CArc *_arc;
30  const NWildcard::CCensorNode *_wildcardCensor;
31  CMyComPtr<IFolderArchiveExtractCallback> _extractCallback2;
32  CMyComPtr<ICompressProgressInfo> _compressProgress;
33  CMyComPtr<ICryptoGetTextPassword> _cryptoGetTextPassword;
34  UString _directoryPath;
35  NExtract::NPathMode::EEnum _pathMode;
36  NExtract::NOverwriteMode::EEnum _overwriteMode;
37
38  UString _diskFilePath;
39  UString _filePath;
40  UInt64 _position;
41  bool _isSplit;
42
43  bool _extractMode;
44
45  bool WriteCTime;
46  bool WriteATime;
47  bool WriteMTime;
48
49  bool _encrypted;
50
51  struct CProcessedFileInfo
52  {
53    FILETIME CTime;
54    FILETIME ATime;
55    FILETIME MTime;
56    UInt32 Attrib;
57
58    bool CTimeDefined;
59    bool ATimeDefined;
60    bool MTimeDefined;
61    bool AttribDefined;
62
63    bool IsDir;
64  } _fi;
65
66  UInt32 _index;
67  UInt64 _curSize;
68  bool _curSizeDefined;
69  COutFileStream *_outFileStreamSpec;
70  CMyComPtr<ISequentialOutStream> _outFileStream;
71
72  COutStreamWithCRC *_crcStreamSpec;
73  CMyComPtr<ISequentialOutStream> _crcStream;
74
75  UStringVector _removePathParts;
76
77  bool _stdOutMode;
78  bool _testMode;
79  bool _crcMode;
80  bool _multiArchives;
81
82  CMyComPtr<ICompressProgressInfo> _localProgress;
83  UInt64 _packTotal;
84  UInt64 _unpTotal;
85
86  void CreateComplexDirectory(const UStringVector &dirPathParts, UString &fullPath);
87  HRESULT GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined);
88  HRESULT GetUnpackSize();
89
90public:
91
92  CLocalProgress *LocalProgressSpec;
93
94  UInt64 NumFolders;
95  UInt64 NumFiles;
96  UInt64 UnpackSize;
97  UInt32 CrcSum;
98
99  MY_UNKNOWN_IMP2(ICryptoGetTextPassword, ICompressProgressInfo)
100  // COM_INTERFACE_ENTRY(IArchiveVolumeExtractCallback)
101
102  INTERFACE_IArchiveExtractCallback(;)
103
104  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
105
106  // IArchiveVolumeExtractCallback
107  // STDMETHOD(GetInStream)(const wchar_t *name, ISequentialInStream **inStream);
108
109  STDMETHOD(CryptoGetTextPassword)(BSTR *password);
110
111  CArchiveExtractCallback():
112      WriteCTime(true),
113      WriteATime(true),
114      WriteMTime(true),
115      _multiArchives(false)
116  {
117    LocalProgressSpec = new CLocalProgress();
118    _localProgress = LocalProgressSpec;
119  }
120
121  void InitForMulti(bool multiArchives,
122      NExtract::NPathMode::EEnum pathMode,
123      NExtract::NOverwriteMode::EEnum overwriteMode)
124  {
125    _multiArchives = multiArchives;
126    _pathMode = pathMode;
127    _overwriteMode = overwriteMode;
128    NumFolders = NumFiles = UnpackSize = 0;
129    CrcSum = 0;
130  }
131
132  void Init(
133      const NWildcard::CCensorNode *wildcardCensor,
134      const CArc *arc,
135      IFolderArchiveExtractCallback *extractCallback2,
136      bool stdOutMode, bool testMode, bool crcMode,
137      const UString &directoryPath,
138      const UStringVector &removePathParts,
139      UInt64 packSize);
140
141};
142
143#endif
144