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