rlm@1
|
1 // IArchive.h
|
rlm@1
|
2
|
rlm@1
|
3 #ifndef __IARCHIVE_H
|
rlm@1
|
4 #define __IARCHIVE_H
|
rlm@1
|
5
|
rlm@1
|
6 #include "../IStream.h"
|
rlm@1
|
7 #include "../IProgress.h"
|
rlm@1
|
8 #include "../PropID.h"
|
rlm@1
|
9
|
rlm@1
|
10 #define ARCHIVE_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 6, x)
|
rlm@1
|
11 #define ARCHIVE_INTERFACE(i, x) ARCHIVE_INTERFACE_SUB(i, IUnknown, x)
|
rlm@1
|
12
|
rlm@1
|
13 namespace NFileTimeType
|
rlm@1
|
14 {
|
rlm@1
|
15 enum EEnum
|
rlm@1
|
16 {
|
rlm@1
|
17 kWindows,
|
rlm@1
|
18 kUnix,
|
rlm@1
|
19 kDOS
|
rlm@1
|
20 };
|
rlm@1
|
21 }
|
rlm@1
|
22
|
rlm@1
|
23 namespace NArchive
|
rlm@1
|
24 {
|
rlm@1
|
25 enum
|
rlm@1
|
26 {
|
rlm@1
|
27 kName = 0,
|
rlm@1
|
28 kClassID,
|
rlm@1
|
29 kExtension,
|
rlm@1
|
30 kAddExtension,
|
rlm@1
|
31 kUpdate,
|
rlm@1
|
32 kKeepName,
|
rlm@1
|
33 kStartSignature,
|
rlm@1
|
34 kFinishSignature,
|
rlm@1
|
35 kAssociate
|
rlm@1
|
36 };
|
rlm@1
|
37
|
rlm@1
|
38 namespace NExtract
|
rlm@1
|
39 {
|
rlm@1
|
40 namespace NAskMode
|
rlm@1
|
41 {
|
rlm@1
|
42 enum
|
rlm@1
|
43 {
|
rlm@1
|
44 kExtract = 0,
|
rlm@1
|
45 kTest,
|
rlm@1
|
46 kSkip
|
rlm@1
|
47 };
|
rlm@1
|
48 }
|
rlm@1
|
49 namespace NOperationResult
|
rlm@1
|
50 {
|
rlm@1
|
51 enum
|
rlm@1
|
52 {
|
rlm@1
|
53 kOK = 0,
|
rlm@1
|
54 kUnSupportedMethod,
|
rlm@1
|
55 kDataError,
|
rlm@1
|
56 kCRCError
|
rlm@1
|
57 };
|
rlm@1
|
58 }
|
rlm@1
|
59 }
|
rlm@1
|
60 namespace NUpdate
|
rlm@1
|
61 {
|
rlm@1
|
62 namespace NOperationResult
|
rlm@1
|
63 {
|
rlm@1
|
64 enum
|
rlm@1
|
65 {
|
rlm@1
|
66 kOK = 0,
|
rlm@1
|
67 kError
|
rlm@1
|
68 };
|
rlm@1
|
69 }
|
rlm@1
|
70 }
|
rlm@1
|
71 }
|
rlm@1
|
72
|
rlm@1
|
73 #define INTERFACE_IArchiveOpenCallback(x) \
|
rlm@1
|
74 STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes) x; \
|
rlm@1
|
75 STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes) x; \
|
rlm@1
|
76
|
rlm@1
|
77 ARCHIVE_INTERFACE(IArchiveOpenCallback, 0x10)
|
rlm@1
|
78 {
|
rlm@1
|
79 INTERFACE_IArchiveOpenCallback(PURE);
|
rlm@1
|
80 };
|
rlm@1
|
81
|
rlm@1
|
82
|
rlm@1
|
83 #define INTERFACE_IArchiveExtractCallback(x) \
|
rlm@1
|
84 INTERFACE_IProgress(x) \
|
rlm@1
|
85 /* GetStream OUT: S_OK - OK, S_FALSE - skeep this file */ \
|
rlm@1
|
86 STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode) x; \
|
rlm@1
|
87 STDMETHOD(PrepareOperation)(Int32 askExtractMode) x; \
|
rlm@1
|
88 STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) x; \
|
rlm@1
|
89
|
rlm@1
|
90 ARCHIVE_INTERFACE_SUB(IArchiveExtractCallback, IProgress, 0x20)
|
rlm@1
|
91 {
|
rlm@1
|
92 INTERFACE_IArchiveExtractCallback(PURE)
|
rlm@1
|
93 };
|
rlm@1
|
94
|
rlm@1
|
95
|
rlm@1
|
96 #define INTERFACE_IArchiveOpenVolumeCallback(x) \
|
rlm@1
|
97 STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value) x; \
|
rlm@1
|
98 STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream) x; \
|
rlm@1
|
99
|
rlm@1
|
100 ARCHIVE_INTERFACE(IArchiveOpenVolumeCallback, 0x30)
|
rlm@1
|
101 {
|
rlm@1
|
102 INTERFACE_IArchiveOpenVolumeCallback(PURE);
|
rlm@1
|
103 };
|
rlm@1
|
104
|
rlm@1
|
105
|
rlm@1
|
106 ARCHIVE_INTERFACE(IInArchiveGetStream, 0x40)
|
rlm@1
|
107 {
|
rlm@1
|
108 STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream) PURE;
|
rlm@1
|
109 };
|
rlm@1
|
110
|
rlm@1
|
111
|
rlm@1
|
112 ARCHIVE_INTERFACE(IArchiveOpenSetSubArchiveName, 0x50)
|
rlm@1
|
113 {
|
rlm@1
|
114 STDMETHOD(SetSubArchiveName)(const wchar_t *name) PURE;
|
rlm@1
|
115 };
|
rlm@1
|
116
|
rlm@1
|
117
|
rlm@1
|
118 /*
|
rlm@1
|
119 IInArchive::Extract:
|
rlm@1
|
120 indices must be sorted
|
rlm@1
|
121 numItems = 0xFFFFFFFF means "all files"
|
rlm@1
|
122 testMode != 0 means "test files without writing to outStream"
|
rlm@1
|
123 */
|
rlm@1
|
124
|
rlm@1
|
125 #define INTERFACE_IInArchive(x) \
|
rlm@1
|
126 STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openArchiveCallback) x; \
|
rlm@1
|
127 STDMETHOD(Close)() x; \
|
rlm@1
|
128 STDMETHOD(GetNumberOfItems)(UInt32 *numItems) x; \
|
rlm@1
|
129 STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \
|
rlm@1
|
130 STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback) x; \
|
rlm@1
|
131 STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value) x; \
|
rlm@1
|
132 STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties) x; \
|
rlm@1
|
133 STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; \
|
rlm@1
|
134 STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProperties) x; \
|
rlm@1
|
135 STDMETHOD(GetArchivePropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x;
|
rlm@1
|
136
|
rlm@1
|
137 ARCHIVE_INTERFACE(IInArchive, 0x60)
|
rlm@1
|
138 {
|
rlm@1
|
139 INTERFACE_IInArchive(PURE)
|
rlm@1
|
140 virtual ~IInArchive() {}
|
rlm@1
|
141 };
|
rlm@1
|
142
|
rlm@1
|
143
|
rlm@1
|
144 #define INTERFACE_IArchiveUpdateCallback(x) \
|
rlm@1
|
145 INTERFACE_IProgress(x); \
|
rlm@1
|
146 STDMETHOD(GetUpdateItemInfo)(UInt32 index, \
|
rlm@1
|
147 Int32 *newData, /*1 - new data, 0 - old data */ \
|
rlm@1
|
148 Int32 *newProperties, /* 1 - new properties, 0 - old properties */ \
|
rlm@1
|
149 UInt32 *indexInArchive /* -1 if there is no in archive, or if doesn't matter */ \
|
rlm@1
|
150 ) x; \
|
rlm@1
|
151 STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \
|
rlm@1
|
152 STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream) x; \
|
rlm@1
|
153 STDMETHOD(SetOperationResult)(Int32 operationResult) x; \
|
rlm@1
|
154
|
rlm@1
|
155 ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback, IProgress, 0x80)
|
rlm@1
|
156 {
|
rlm@1
|
157 INTERFACE_IArchiveUpdateCallback(PURE);
|
rlm@1
|
158 };
|
rlm@1
|
159
|
rlm@1
|
160 #define INTERFACE_IArchiveUpdateCallback2(x) \
|
rlm@1
|
161 INTERFACE_IArchiveUpdateCallback(x) \
|
rlm@1
|
162 STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size) x; \
|
rlm@1
|
163 STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream) x; \
|
rlm@1
|
164
|
rlm@1
|
165 ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82)
|
rlm@1
|
166 {
|
rlm@1
|
167 INTERFACE_IArchiveUpdateCallback2(PURE);
|
rlm@1
|
168 };
|
rlm@1
|
169
|
rlm@1
|
170
|
rlm@1
|
171 #ifndef EXTRACT_ONLY
|
rlm@1
|
172 #define INTERFACE_IOutArchive(x) \
|
rlm@1
|
173 STDMETHOD(UpdateItems)(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback) x; \
|
rlm@1
|
174 STDMETHOD(GetFileTimeType)(UInt32 *type) x;
|
rlm@1
|
175 #else
|
rlm@1
|
176 #define INTERFACE_IOutArchive(x)
|
rlm@1
|
177 #endif
|
rlm@1
|
178
|
rlm@1
|
179 ARCHIVE_INTERFACE(IOutArchive, 0xA0)
|
rlm@1
|
180 {
|
rlm@1
|
181 #ifndef EXTRACT_ONLY
|
rlm@1
|
182 INTERFACE_IOutArchive(PURE)
|
rlm@1
|
183 #endif
|
rlm@1
|
184 };
|
rlm@1
|
185
|
rlm@1
|
186
|
rlm@1
|
187 ARCHIVE_INTERFACE(ISetProperties, 0x03)
|
rlm@1
|
188 {
|
rlm@1
|
189 #ifndef EXTRACT_ONLY
|
rlm@1
|
190 STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) PURE;
|
rlm@1
|
191 #endif
|
rlm@1
|
192 };
|
rlm@1
|
193
|
rlm@1
|
194
|
rlm@1
|
195 #define IMP_IInArchive_GetProp(k) \
|
rlm@1
|
196 (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \
|
rlm@1
|
197 { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \
|
rlm@1
|
198 const STATPROPSTG &srcItem = k[index]; \
|
rlm@1
|
199 *propID = srcItem.propid; *varType = srcItem.vt; *name = 0; return S_OK; } \
|
rlm@1
|
200
|
rlm@1
|
201 #define IMP_IInArchive_GetProp_WITH_NAME(k) \
|
rlm@1
|
202 (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \
|
rlm@1
|
203 { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \
|
rlm@1
|
204 const STATPROPSTG &srcItem = k[index]; \
|
rlm@1
|
205 *propID = srcItem.propid; *varType = srcItem.vt; \
|
rlm@1
|
206 if (srcItem.lpwstrName == 0) *name = 0; else *name = ::SysAllocString(srcItem.lpwstrName); return S_OK; } \
|
rlm@1
|
207
|
rlm@1
|
208 #define IMP_IInArchive_Props \
|
rlm@1
|
209 STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \
|
rlm@1
|
210 { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \
|
rlm@1
|
211 STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp(kProps)
|
rlm@1
|
212
|
rlm@1
|
213 #define IMP_IInArchive_Props_WITH_NAME \
|
rlm@1
|
214 STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \
|
rlm@1
|
215 { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \
|
rlm@1
|
216 STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kProps)
|
rlm@1
|
217
|
rlm@1
|
218
|
rlm@1
|
219 #define IMP_IInArchive_ArcProps \
|
rlm@1
|
220 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \
|
rlm@1
|
221 { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \
|
rlm@1
|
222 STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp(kArcProps)
|
rlm@1
|
223
|
rlm@1
|
224 #define IMP_IInArchive_ArcProps_WITH_NAME \
|
rlm@1
|
225 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \
|
rlm@1
|
226 { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \
|
rlm@1
|
227 STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kArcProps)
|
rlm@1
|
228
|
rlm@1
|
229 #define IMP_IInArchive_ArcProps_NO \
|
rlm@1
|
230 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \
|
rlm@1
|
231 { *numProperties = 0; return S_OK; } \
|
rlm@1
|
232 STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32, BSTR *, PROPID *, VARTYPE *) \
|
rlm@1
|
233 { return E_NOTIMPL; } \
|
rlm@1
|
234 STDMETHODIMP CHandler::GetArchiveProperty(PROPID, PROPVARIANT *value) \
|
rlm@1
|
235 { value->vt = VT_EMPTY; return S_OK; }
|
rlm@1
|
236
|
rlm@1
|
237 #endif
|