Upload 2.0.2
[physicsfs] / lzma / CPP / 7zip / UI / Common / ArchiveExtractCallback.h
1 // ArchiveExtractCallback.h
2
3 #ifndef __ARCHIVEEXTRACTCALLBACK_H
4 #define __ARCHIVEEXTRACTCALLBACK_H
5
6 #include "../../Archive/IArchive.h"
7 #include "IFileExtractCallback.h"
8
9 #include "Common/MyString.h"
10 #include "Common/MyCom.h"
11
12 #include "../../Common/FileStreams.h"
13 #include "../../Common/ProgressUtils.h"
14 #include "../../IPassword.h"
15
16 #include "ExtractMode.h"
17
18 class CArchiveExtractCallback: 
19   public IArchiveExtractCallback,
20   // public IArchiveVolumeExtractCallback,
21   public ICryptoGetTextPassword,
22   public ICompressProgressInfo,
23   public CMyUnknownImp
24 {
25 public:
26   MY_UNKNOWN_IMP2(ICryptoGetTextPassword, ICompressProgressInfo)
27   // COM_INTERFACE_ENTRY(IArchiveVolumeExtractCallback)
28
29   // IProgress
30   STDMETHOD(SetTotal)(UInt64 size);
31   STDMETHOD(SetCompleted)(const UInt64 *completeValue);
32   STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
33
34   // IExtractCallBack
35   STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode);
36   STDMETHOD(PrepareOperation)(Int32 askExtractMode);
37   STDMETHOD(SetOperationResult)(Int32 resultEOperationResult);
38
39   // IArchiveVolumeExtractCallback
40   // STDMETHOD(GetInStream)(const wchar_t *name, ISequentialInStream **inStream);
41
42   // ICryptoGetTextPassword
43   STDMETHOD(CryptoGetTextPassword)(BSTR *aPassword);
44
45 private:
46   CMyComPtr<IInArchive> _archiveHandler;
47   CMyComPtr<IFolderArchiveExtractCallback> _extractCallback2;
48   CMyComPtr<ICompressProgressInfo> _compressProgress;
49   CMyComPtr<ICryptoGetTextPassword> _cryptoGetTextPassword;
50   UString _directoryPath;
51   NExtract::NPathMode::EEnum _pathMode;
52   NExtract::NOverwriteMode::EEnum _overwriteMode;
53
54   UString _filePath;
55   UInt64 _position;
56   bool _isSplit;
57
58   UString _diskFilePath;
59
60   bool _extractMode;
61
62   bool WriteModified;
63   bool WriteCreated;
64   bool WriteAccessed;
65
66   bool _encrypted;
67
68   struct CProcessedFileInfo
69   {
70     FILETIME CreationTime;
71     FILETIME LastWriteTime;
72     FILETIME LastAccessTime;
73     UInt32 Attributes;
74   
75     bool IsCreationTimeDefined;
76     bool IsLastWriteTimeDefined;
77     bool IsLastAccessTimeDefined;
78
79     bool IsDirectory;
80     bool AttributesAreDefined;
81   } _processedFileInfo;
82
83   UInt64 _curSize;
84   COutFileStream *_outFileStreamSpec;
85   CMyComPtr<ISequentialOutStream> _outFileStream;
86   UStringVector _removePathParts;
87
88   UString _itemDefaultName;
89   FILETIME _utcLastWriteTimeDefault;
90   UInt32 _attributesDefault;
91   bool _stdOutMode;
92
93   void CreateComplexDirectory(const UStringVector &dirPathParts, UString &fullPath);
94   HRESULT GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined);
95 public:
96   CArchiveExtractCallback():
97       WriteModified(true),
98       WriteCreated(false),
99       WriteAccessed(false),
100       _multiArchives(false)
101   {
102     LocalProgressSpec = new CLocalProgress();
103     _localProgress = LocalProgressSpec;
104   }
105
106   CLocalProgress *LocalProgressSpec;
107   CMyComPtr<ICompressProgressInfo> _localProgress;
108   UInt64 _packTotal;
109   UInt64 _unpTotal;
110
111   bool _multiArchives;
112   UInt64 NumFolders;
113   UInt64 NumFiles;
114   UInt64 UnpackSize;
115   
116   void InitForMulti(bool multiArchives, 
117       NExtract::NPathMode::EEnum pathMode,
118       NExtract::NOverwriteMode::EEnum overwriteMode) 
119   { 
120     _multiArchives = multiArchives; NumFolders = NumFiles = UnpackSize = 0; 
121     _pathMode = pathMode;
122     _overwriteMode = overwriteMode;
123   }
124
125   void Init(
126       IInArchive *archiveHandler, 
127       IFolderArchiveExtractCallback *extractCallback2,
128       bool stdOutMode,
129       const UString &directoryPath,
130       const UStringVector &removePathParts,
131       const UString &itemDefaultName,
132       const FILETIME &utcLastWriteTimeDefault, 
133       UInt32 attributesDefault,
134       UInt64 packSize);
135
136   UInt64 _numErrors;
137 };
138
139 #endif