IArchive.h 6.0 KB

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