6 #include "../IStream.h"
7 #include "../IProgress.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
49 namespace NOperationResult
62 namespace NOperationResult
73 ARCHIVE_INTERFACE(IArchiveOpenCallback, 0x10)
75 STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes) PURE;
76 STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes) PURE;
80 ARCHIVE_INTERFACE_SUB(IArchiveExtractCallback, IProgress, 0x20)
82 STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream,
83 Int32 askExtractMode) PURE;
84 // GetStream OUT: S_OK - OK, S_FALSE - skeep this file
85 STDMETHOD(PrepareOperation)(Int32 askExtractMode) PURE;
86 STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) PURE;
90 ARCHIVE_INTERFACE(IArchiveOpenVolumeCallback, 0x30)
92 STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value) PURE;
93 STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream) PURE;
97 ARCHIVE_INTERFACE(IInArchiveGetStream, 0x40)
99 STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream) PURE;
103 ARCHIVE_INTERFACE(IArchiveOpenSetSubArchiveName, 0x50)
105 STDMETHOD(SetSubArchiveName)(const wchar_t *name) PURE;
111 indices must be sorted
112 numItems = 0xFFFFFFFF means "all files"
113 testMode != 0 means "test files without writing to outStream"
116 #define INTERFACE_IInArchive(x) \
117 STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openArchiveCallback) x; \
118 STDMETHOD(Close)() x; \
119 STDMETHOD(GetNumberOfItems)(UInt32 *numItems) x; \
120 STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \
121 STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback) x; \
122 STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value) x; \
123 STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties) x; \
124 STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; \
125 STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProperties) x; \
126 STDMETHOD(GetArchivePropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x;
128 ARCHIVE_INTERFACE(IInArchive, 0x60)
130 INTERFACE_IInArchive(PURE)
134 ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback, IProgress, 0x80)
136 STDMETHOD(GetUpdateItemInfo)(UInt32 index,
137 Int32 *newData, // 1 - new data, 0 - old data
138 Int32 *newProperties, // 1 - new properties, 0 - old properties
139 UInt32 *indexInArchive // -1 if there is no in archive, or if doesn't matter
141 STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE;
142 STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream) PURE;
143 STDMETHOD(SetOperationResult)(Int32 operationResult) PURE;
147 ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82)
149 STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size) PURE;
150 STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream) PURE;
154 #define INTERFACE_IOutArchive(x) \
155 STDMETHOD(UpdateItems)(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback) x; \
156 STDMETHOD(GetFileTimeType)(UInt32 *type) x;
158 ARCHIVE_INTERFACE(IOutArchive, 0xA0)
160 INTERFACE_IOutArchive(PURE)
164 ARCHIVE_INTERFACE(ISetProperties, 0x03)
166 STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) PURE;
170 #define IMP_IInArchive_GetProp(k) \
171 (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \
172 { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \
173 const STATPROPSTG &srcItem = k[index]; \
174 *propID = srcItem.propid; *varType = srcItem.vt; *name = 0; return S_OK; } \
176 #define IMP_IInArchive_GetProp_WITH_NAME(k) \
177 (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \
178 { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \
179 const STATPROPSTG &srcItem = k[index]; \
180 *propID = srcItem.propid; *varType = srcItem.vt; \
181 if (srcItem.lpwstrName == 0) *name = 0; else *name = ::SysAllocString(srcItem.lpwstrName); return S_OK; } \
183 #define IMP_IInArchive_Props \
184 STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \
185 { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \
186 STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp(kProps)
188 #define IMP_IInArchive_Props_WITH_NAME \
189 STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \
190 { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \
191 STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kProps)
194 #define IMP_IInArchive_ArcProps \
195 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \
196 { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \
197 STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp(kArcProps)
199 #define IMP_IInArchive_ArcProps_NO \
200 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \
201 { *numProperties = 0; return S_OK; } \
202 STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32, BSTR *, PROPID *, VARTYPE *) \
203 { return E_NOTIMPL; } \
204 STDMETHODIMP CHandler::GetArchiveProperty(PROPID, PROPVARIANT *value) \
205 { value->vt = VT_EMPTY; return S_OK; }