1// IArchive.h 2 3#ifndef __IARCHIVE_H 4#define __IARCHIVE_H 5 6#include "../IProgress.h" 7#include "../IStream.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 13namespace NFileTimeType 14{ 15 enum EEnum 16 { 17 kWindows, 18 kUnix, 19 kDOS 20 }; 21} 22 23namespace 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 77ARCHIVE_INTERFACE(IArchiveOpenCallback, 0x10) 78{ 79 INTERFACE_IArchiveOpenCallback(PURE); 80}; 81 82 83#define INTERFACE_IArchiveExtractCallback(x) \ 84 INTERFACE_IProgress(x) \ 85 STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode) x; \ 86 STDMETHOD(PrepareOperation)(Int32 askExtractMode) x; \ 87 STDMETHOD(SetOperationResult)(Int32 resultEOperationResult) x; \ 88 89ARCHIVE_INTERFACE_SUB(IArchiveExtractCallback, IProgress, 0x20) 90{ 91 INTERFACE_IArchiveExtractCallback(PURE) 92}; 93 94 95#define INTERFACE_IArchiveOpenVolumeCallback(x) \ 96 STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value) x; \ 97 STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream) x; \ 98 99ARCHIVE_INTERFACE(IArchiveOpenVolumeCallback, 0x30) 100{ 101 INTERFACE_IArchiveOpenVolumeCallback(PURE); 102}; 103 104 105ARCHIVE_INTERFACE(IInArchiveGetStream, 0x40) 106{ 107 STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream) PURE; 108}; 109 110 111ARCHIVE_INTERFACE(IArchiveOpenSetSubArchiveName, 0x50) 112{ 113 STDMETHOD(SetSubArchiveName)(const wchar_t *name) PURE; 114}; 115 116 117/* 118IInArchive::Extract: 119 indices must be sorted 120 numItems = 0xFFFFFFFF means "all files" 121 testMode != 0 means "test files without writing to outStream" 122*/ 123 124#define INTERFACE_IInArchive(x) \ 125 STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openArchiveCallback) x; \ 126 STDMETHOD(Close)() x; \ 127 STDMETHOD(GetNumberOfItems)(UInt32 *numItems) x; \ 128 STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \ 129 STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback) x; \ 130 STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value) x; \ 131 STDMETHOD(GetNumberOfProperties)(UInt32 *numProperties) x; \ 132 STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; \ 133 STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProperties) x; \ 134 STDMETHOD(GetArchivePropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) x; 135 136ARCHIVE_INTERFACE(IInArchive, 0x60) 137{ 138 INTERFACE_IInArchive(PURE) 139}; 140 141ARCHIVE_INTERFACE(IArchiveOpenSeq, 0x61) 142{ 143 STDMETHOD(OpenSeq)(ISequentialInStream *stream) PURE; 144}; 145 146#define INTERFACE_IArchiveUpdateCallback(x) \ 147 INTERFACE_IProgress(x); \ 148 STDMETHOD(GetUpdateItemInfo)(UInt32 index, \ 149 Int32 *newData, /*1 - new data, 0 - old data */ \ 150 Int32 *newProperties, /* 1 - new properties, 0 - old properties */ \ 151 UInt32 *indexInArchive /* -1 if there is no in archive, or if doesn't matter */ \ 152 ) x; \ 153 STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \ 154 STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream) x; \ 155 STDMETHOD(SetOperationResult)(Int32 operationResult) x; \ 156 157ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback, IProgress, 0x80) 158{ 159 INTERFACE_IArchiveUpdateCallback(PURE); 160}; 161 162#define INTERFACE_IArchiveUpdateCallback2(x) \ 163 INTERFACE_IArchiveUpdateCallback(x) \ 164 STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size) x; \ 165 STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream) x; \ 166 167ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82) 168{ 169 INTERFACE_IArchiveUpdateCallback2(PURE); 170}; 171 172 173#define INTERFACE_IOutArchive(x) \ 174 STDMETHOD(UpdateItems)(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback) x; \ 175 STDMETHOD(GetFileTimeType)(UInt32 *type) x; 176 177ARCHIVE_INTERFACE(IOutArchive, 0xA0) 178{ 179 INTERFACE_IOutArchive(PURE) 180}; 181 182 183ARCHIVE_INTERFACE(ISetProperties, 0x03) 184{ 185 STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) PURE; 186}; 187 188 189#define IMP_IInArchive_GetProp(k) \ 190 (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \ 191 { if(index >= sizeof(k) / sizeof(k[0])) return E_INVALIDARG; \ 192 const STATPROPSTG &srcItem = k[index]; \ 193 *propID = srcItem.propid; *varType = srcItem.vt; *name = 0; return S_OK; } \ 194 195#define IMP_IInArchive_GetProp_WITH_NAME(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; \ 200 if (srcItem.lpwstrName == 0) *name = 0; else *name = ::SysAllocString(srcItem.lpwstrName); return S_OK; } \ 201 202#define IMP_IInArchive_Props \ 203 STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \ 204 { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \ 205 STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp(kProps) 206 207#define IMP_IInArchive_Props_WITH_NAME \ 208 STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProperties) \ 209 { *numProperties = sizeof(kProps) / sizeof(kProps[0]); return S_OK; } \ 210 STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kProps) 211 212 213#define IMP_IInArchive_ArcProps \ 214 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \ 215 { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \ 216 STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp(kArcProps) 217 218#define IMP_IInArchive_ArcProps_WITH_NAME \ 219 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \ 220 { *numProperties = sizeof(kArcProps) / sizeof(kArcProps[0]); return S_OK; } \ 221 STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kArcProps) 222 223#define IMP_IInArchive_ArcProps_NO_Table \ 224 STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProperties) \ 225 { *numProperties = 0; return S_OK; } \ 226 STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32, BSTR *, PROPID *, VARTYPE *) \ 227 { return E_NOTIMPL; } \ 228 229#define IMP_IInArchive_ArcProps_NO \ 230 IMP_IInArchive_ArcProps_NO_Table \ 231 STDMETHODIMP CHandler::GetArchiveProperty(PROPID, PROPVARIANT *value) \ 232 { value->vt = VT_EMPTY; return S_OK; } 233 234#endif 235