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