annotate 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
rev   line source
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