1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// ArchiveExtractCallback.h
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef __ARCHIVE_EXTRACT_CALLBACK_H
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define __ARCHIVE_EXTRACT_CALLBACK_H
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Common/MyCom.h"
7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Common/Wildcard.h"
8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../IPassword.h"
10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../Common/FileStreams.h"
12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../Common/ProgressUtils.h"
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../Archive/IArchive.h"
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "ExtractMode.h"
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "IFileExtractCallback.h"
18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "OpenArchive.h"
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "HashCalc.h"
21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _SFX
23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyclass COutStreamWithHash:
25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  public ISequentialOutStream,
26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  public CMyUnknownImp
27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CMyComPtr<ISequentialOutStream> _stream;
29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 _size;
30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool _calculate;
31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckypublic:
32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  IHashCalc *_hash;
33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  MY_UNKNOWN_IMP
35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);
36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void SetStream(ISequentialOutStream *stream) { _stream = stream; }
37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void ReleaseStream() { _stream.Release(); }
38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Init(bool calculate = true)
39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    InitCRC();
41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _size = 0;
42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _calculate = calculate;
43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void EnableCalc(bool calculate) { _calculate = calculate; }
45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void InitCRC() { _hash->InitForNewFile(); }
46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 GetSize() const { return _size; }
47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystruct CExtractNtOptions
52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CBoolPair NtSecurity;
54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CBoolPair SymLinks;
55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CBoolPair HardLinks;
56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CBoolPair AltStreams;
57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool ReplaceColonForAltStream;
58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool WriteToAltStreamIfColon;
59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CExtractNtOptions():
61cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      ReplaceColonForAltStream(false),
62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      WriteToAltStreamIfColon(false)
63cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    SymLinks.Val = true;
65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    HardLinks.Val = true;
66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    AltStreams.Val = true;
67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
69cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
70cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _SFX
71cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
72cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyclass CGetProp:
73cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  public IGetProp,
74cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  public CMyUnknownImp
75cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
76cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckypublic:
77cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  const CArc *Arc;
78cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt32 IndexInArc;
79f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  // UString Name; // relative path
80cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
81cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  MY_UNKNOWN_IMP1(IGetProp)
82cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  INTERFACE_IGetProp(;)
83cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
84cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
85cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
86cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
87cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _SFX
88cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef UNDER_CE
89cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
90cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define SUPPORT_LINKS
91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
92cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
93cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
94cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
95cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
96cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifdef SUPPORT_LINKS
97cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
98cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystruct CHardLinkNode
99cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
100cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 StreamId;
101cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 INode;
102cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
103cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  int Compare(const CHardLinkNode &a) const;
104cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
105cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyclass CHardLinks
107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckypublic:
109cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CRecordVector<CHardLinkNode> IDs;
110cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CObjectVector<FString> Links;
111cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
112cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Clear()
113cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
114cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    IDs.Clear();
115cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    Links.Clear();
116cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
117cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
118cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void PrepareLinks()
119cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
120cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    while (Links.Size() < IDs.Size())
121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      Links.AddNew();
122cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
123cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
124cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
125cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
126cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
127f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#ifdef SUPPORT_ALT_STREAMS
128f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
129f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastruct CIndexToPathPair
130f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
131f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  UInt32 Index;
132f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  FString Path;
133f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
134f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  CIndexToPathPair(UInt32 index): Index(index) {}
135f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  CIndexToPathPair(UInt32 index, const FString &path): Index(index), Path(path) {}
136f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
137f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  int Compare(const CIndexToPathPair &pair) const
138f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
139f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    return MyCompare(Index, pair.Index);
140f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
141f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka};
142f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
143f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#endif
144f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
145baa3858d3f5d128a5c8466b700098109edcad5f2repo syncclass CArchiveExtractCallback:
146baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  public IArchiveExtractCallback,
147f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  public IArchiveExtractCallbackMessage,
148baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  public ICryptoGetTextPassword,
149baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  public ICompressProgressInfo,
150baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  public CMyUnknownImp
151baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
152baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  const CArc *_arc;
153cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CExtractNtOptions _ntOptions;
154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
155f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  const NWildcard::CCensorNode *_wildcardCensor; // we need wildcard for single pass mode (stdin)
156baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CMyComPtr<IFolderArchiveExtractCallback> _extractCallback2;
157baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CMyComPtr<ICompressProgressInfo> _compressProgress;
158baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CMyComPtr<ICryptoGetTextPassword> _cryptoGetTextPassword;
159f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  CMyComPtr<IArchiveExtractCallbackMessage> _callbackMessage;
160f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  CMyComPtr<IFolderArchiveExtractCallback2> _folderArchiveExtractCallback2;
161f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
162f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  FString _dirPathPrefix;
163f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  FString _dirPathPrefix_Full;
164baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  NExtract::NPathMode::EEnum _pathMode;
165baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  NExtract::NOverwriteMode::EEnum _overwriteMode;
166baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
167cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #ifndef _SFX
168cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
169cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CMyComPtr<IFolderExtractToStreamCallback> ExtractToStreamCallback;
170cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CGetProp *GetProp_Spec;
171cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CMyComPtr<IGetProp> GetProp;
172cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
173cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
174cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
175f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  CReadArcItem _item;
176cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  FString _diskFilePath;
177baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt64 _position;
178baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool _isSplit;
179baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
180baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool _extractMode;
181baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
182baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool WriteCTime;
183baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool WriteATime;
184baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool WriteMTime;
185baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
186baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool _encrypted;
187baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
188baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  struct CProcessedFileInfo
189baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
190baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    FILETIME CTime;
191baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    FILETIME ATime;
192baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    FILETIME MTime;
193baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    UInt32 Attrib;
194baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
195baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    bool CTimeDefined;
196baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    bool ATimeDefined;
197baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    bool MTimeDefined;
198baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    bool AttribDefined;
199baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  } _fi;
200baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
201baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt32 _index;
202baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt64 _curSize;
203baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool _curSizeDefined;
204baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  COutFileStream *_outFileStreamSpec;
205baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CMyComPtr<ISequentialOutStream> _outFileStream;
206baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
207cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #ifndef _SFX
208cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
209cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  COutStreamWithHash *_hashStreamSpec;
210cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CMyComPtr<ISequentialOutStream> _hashStream;
211cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool _hashStreamWasUsed;
212cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
213cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
214baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
215f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  bool _removePartsForAltStreams;
216baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UStringVector _removePathParts;
217f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
218f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  #ifndef _SFX
219cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool _use_baseParentFolder_mode;
220cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt32 _baseParentFolder;
221f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  #endif
222baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
223baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool _stdOutMode;
224baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool _testMode;
225baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bool _multiArchives;
226baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
227baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CMyComPtr<ICompressProgressInfo> _localProgress;
228baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt64 _packTotal;
229f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
230f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  UInt64 _progressTotal;
231f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  bool _progressTotal_Defined;
232baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
233cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  FStringVector _extractedFolderPaths;
234cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CRecordVector<UInt32> _extractedFolderIndices;
235cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
236cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #if defined(_WIN32) && !defined(UNDER_CE) && !defined(_SFX)
237cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool _saclEnabled;
238cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
239cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
240cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void CreateComplexDirectory(const UStringVector &dirPathParts, FString &fullPath);
241baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  HRESULT GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined);
242baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  HRESULT GetUnpackSize();
243baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
244cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  HRESULT SendMessageError(const char *message, const FString &path);
245f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  HRESULT SendMessageError_with_LastError(const char *message, const FString &path);
246cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  HRESULT SendMessageError2(const char *message, const FString &path1, const FString &path2);
247cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
248baa3858d3f5d128a5c8466b700098109edcad5f2repo syncpublic:
249baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
250baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  CLocalProgress *LocalProgressSpec;
251baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
252baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt64 NumFolders;
253baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt64 NumFiles;
254cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 NumAltStreams;
255baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt64 UnpackSize;
256cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 AltStreams_UnpackSize;
257baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
258f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  MY_UNKNOWN_IMP3(IArchiveExtractCallbackMessage, ICryptoGetTextPassword, ICompressProgressInfo)
259baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
260baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  INTERFACE_IArchiveExtractCallback(;)
261f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  INTERFACE_IArchiveExtractCallbackMessage(;)
262baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
263baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
264baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
265baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  STDMETHOD(CryptoGetTextPassword)(BSTR *password);
266baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
267cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CArchiveExtractCallback();
268baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
269baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  void InitForMulti(bool multiArchives,
270baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      NExtract::NPathMode::EEnum pathMode,
271baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      NExtract::NOverwriteMode::EEnum overwriteMode)
272baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
273baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _multiArchives = multiArchives;
274baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _pathMode = pathMode;
275baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _overwriteMode = overwriteMode;
276cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    NumFolders = NumFiles = NumAltStreams = UnpackSize = AltStreams_UnpackSize = 0;
277cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
278cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
279cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #ifndef _SFX
280cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
281cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void SetHashMethods(IHashCalc *hash)
282cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
283cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (!hash)
284cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return;
285cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _hashStreamSpec = new COutStreamWithHash;
286cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _hashStream = _hashStreamSpec;
287cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _hashStreamSpec->_hash = hash;
288baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
289baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
290cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
291cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
292baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  void Init(
293cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      const CExtractNtOptions &ntOptions,
294baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      const NWildcard::CCensorNode *wildcardCensor,
295baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      const CArc *arc,
296baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      IFolderArchiveExtractCallback *extractCallback2,
297cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      bool stdOutMode, bool testMode,
298cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      const FString &directoryPath,
299f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      const UStringVector &removePathParts, bool removePartsForAltStreams,
300baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      UInt64 packSize);
301baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
302f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
303cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #ifdef SUPPORT_LINKS
304f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
305cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyprivate:
306cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CHardLinks _hardLinks;
307f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  UString linkPath;
308f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
309f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  // FString _CopyFile_Path;
310f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  // HRESULT MyCopyFile(ISequentialOutStream *outStream);
311f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
312cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckypublic:
313cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // call PrepareHardLinks() after Init()
314cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  HRESULT PrepareHardLinks(const CRecordVector<UInt32> *realIndices);  // NULL means all items
315f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
316f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  #endif
317f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
318f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
319f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  #ifdef SUPPORT_ALT_STREAMS
320f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  CObjectVector<CIndexToPathPair> _renamedFiles;
321cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
322cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
323cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // call it after Init()
324cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
325f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  #ifndef _SFX
326cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void SetBaseParentFolderIndex(UInt32 indexInArc)
327cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
328cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    _baseParentFolder = indexInArc;
329f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _use_baseParentFolder_mode = true;
330cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
331f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  #endif
332cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
333cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  HRESULT SetDirsTimes();
334baa3858d3f5d128a5c8466b700098109edcad5f2repo sync};
335baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
336f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakabool CensorNode_CheckPath(const NWildcard::CCensorNode &node, const CReadArcItem &item);
337f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
338baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif
339