view src/win32/7zip/7z/CPP/7zip/Archive/IArchive.h @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
line wrap: on
line source
1 // IArchive.h
3 #ifndef __IARCHIVE_H
4 #define __IARCHIVE_H
6 #include "../IStream.h"
7 #include "../IProgress.h"
8 #include "../PropID.h"
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)
13 namespace NFileTimeType
14 {
15 enum EEnum
16 {
17 kWindows,
18 kUnix,
19 kDOS
20 };
21 }
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 };
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 }
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; \
77 ARCHIVE_INTERFACE(IArchiveOpenCallback, 0x10)
78 {
79 INTERFACE_IArchiveOpenCallback(PURE);
80 };
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 askExtractMode) x; \
87 STDMETHOD(PrepareOperation)(Int32 askExtractMode) x; \
88 STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) x; \
90 ARCHIVE_INTERFACE_SUB(IArchiveExtractCallback, IProgress, 0x20)
91 {
92 INTERFACE_IArchiveExtractCallback(PURE)
93 };
96 #define INTERFACE_IArchiveOpenVolumeCallback(x) \
97 STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value) x; \
98 STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream) x; \
100 ARCHIVE_INTERFACE(IArchiveOpenVolumeCallback, 0x30)
101 {
102 INTERFACE_IArchiveOpenVolumeCallback(PURE);
103 };
106 ARCHIVE_INTERFACE(IInArchiveGetStream, 0x40)
107 {
108 STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream) PURE;
109 };
112 ARCHIVE_INTERFACE(IArchiveOpenSetSubArchiveName, 0x50)
113 {
114 STDMETHOD(SetSubArchiveName)(const wchar_t *name) PURE;
115 };
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 */
125 #define INTERFACE_IInArchive(x) \
126 STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *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, IArchiveExtractCallback *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, VARTYPE *varType) x;
137 ARCHIVE_INTERFACE(IInArchive, 0x60)
138 {
139 INTERFACE_IInArchive(PURE)
140 virtual ~IInArchive() {}
141 };
144 #define INTERFACE_IArchiveUpdateCallback(x) \
145 INTERFACE_IProgress(x); \
146 STDMETHOD(GetUpdateItemInfo)(UInt32 index, \
147 Int32 *newData, /*1 - new data, 0 - old data */ \
148 Int32 *newProperties, /* 1 - new properties, 0 - old properties */ \
149 UInt32 *indexInArchive /* -1 if there is no in archive, or if doesn't matter */ \
150 ) x; \
151 STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \
152 STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream) x; \
153 STDMETHOD(SetOperationResult)(Int32 operationResult) x; \
155 ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback, IProgress, 0x80)
156 {
157 INTERFACE_IArchiveUpdateCallback(PURE);
158 };
160 #define INTERFACE_IArchiveUpdateCallback2(x) \
161 INTERFACE_IArchiveUpdateCallback(x) \
162 STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size) x; \
163 STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream) x; \
165 ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82)
166 {
167 INTERFACE_IArchiveUpdateCallback2(PURE);
168 };
171 #ifndef EXTRACT_ONLY
172 #define INTERFACE_IOutArchive(x) \
173 STDMETHOD(UpdateItems)(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback) x; \
174 STDMETHOD(GetFileTimeType)(UInt32 *type) x;
175 #else
176 #define INTERFACE_IOutArchive(x)
177 #endif
179 ARCHIVE_INTERFACE(IOutArchive, 0xA0)
180 {
181 #ifndef EXTRACT_ONLY
182 INTERFACE_IOutArchive(PURE)
183 #endif
184 };
187 ARCHIVE_INTERFACE(ISetProperties, 0x03)
188 {
189 #ifndef EXTRACT_ONLY
190 STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) PURE;
191 #endif
192 };
195 #define IMP_IInArchive_GetProp(k) \
196 (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \
197 { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \
198 const STATPROPSTG &srcItem = k[index]; \
199 *propID = srcItem.propid; *varType = srcItem.vt; *name = 0; return S_OK; } \
201 #define IMP_IInArchive_GetProp_WITH_NAME(k) \
202 (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \
203 { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \
204 const STATPROPSTG &srcItem = k[index]; \
205 *propID = srcItem.propid; *varType = srcItem.vt; \
206 if (srcItem.lpwstrName == 0) *name = 0; else *name = ::SysAllocString(srcItem.lpwstrName); return S_OK; } \
208 #define IMP_IInArchive_Props \
209 STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \
210 { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \
211 STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp(kProps)
213 #define IMP_IInArchive_Props_WITH_NAME \
214 STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \
215 { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \
216 STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kProps)
219 #define IMP_IInArchive_ArcProps \
220 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \
221 { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \
222 STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp(kArcProps)
224 #define IMP_IInArchive_ArcProps_WITH_NAME \
225 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \
226 { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \
227 STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kArcProps)
229 #define IMP_IInArchive_ArcProps_NO \
230 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \
231 { *numProperties = 0; return S_OK; } \
232 STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32, BSTR *, PROPID *, VARTYPE *) \
233 { return E_NOTIMPL; } \
234 STDMETHODIMP CHandler::GetArchiveProperty(PROPID, PROPVARIANT *value) \
235 { value->vt = VT_EMPTY; return S_OK; }
237 #endif