1// ICoder.h
2
3#ifndef __ICODER_H
4#define __ICODER_H
5
6#include "IStream.h"
7
8#define CODER_INTERFACE(i, x) DECL_INTERFACE(i, 4, x)
9
10CODER_INTERFACE(ICompressProgressInfo, 0x04)
11{
12  STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) PURE;
13};
14
15CODER_INTERFACE(ICompressCoder, 0x05)
16{
17  STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
18      const UInt64 *inSize, const UInt64 *outSize,
19      ICompressProgressInfo *progress) PURE;
20};
21
22CODER_INTERFACE(ICompressCoder2, 0x18)
23{
24  STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams,
25      ISequentialOutStream **outStreams, const UInt64 **outSizes, UInt32 numOutStreams,
26      ICompressProgressInfo *progress) PURE;
27};
28
29namespace NCoderPropID
30{
31  enum EEnum
32  {
33    kDefaultProp = 0,
34    kDictionarySize,
35    kUsedMemorySize,
36    kOrder,
37    kBlockSize,
38    kPosStateBits,
39    kLitContextBits,
40    kLitPosBits,
41    kNumFastBytes,
42    kMatchFinder,
43    kMatchFinderCycles,
44    kNumPasses,
45    kAlgorithm,
46    kNumThreads,
47    kEndMarker,
48    kLevel,
49    kReduceSize // estimated size of data that will be compressed. Encoder can use this value to reduce dictionary size.
50  };
51}
52
53CODER_INTERFACE(ICompressSetCoderProperties, 0x20)
54{
55  STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps) PURE;
56};
57
58/*
59CODER_INTERFACE(ICompressSetCoderProperties, 0x21)
60{
61  STDMETHOD(SetDecoderProperties)(ISequentialInStream *inStream) PURE;
62};
63*/
64
65CODER_INTERFACE(ICompressSetDecoderProperties2, 0x22)
66{
67  STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size) PURE;
68};
69
70CODER_INTERFACE(ICompressWriteCoderProperties, 0x23)
71{
72  STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream) PURE;
73};
74
75CODER_INTERFACE(ICompressGetInStreamProcessedSize, 0x24)
76{
77  STDMETHOD(GetInStreamProcessedSize)(UInt64 *value) PURE;
78};
79
80CODER_INTERFACE(ICompressSetCoderMt, 0x25)
81{
82  STDMETHOD(SetNumberOfThreads)(UInt32 numThreads) PURE;
83};
84
85CODER_INTERFACE(ICompressGetSubStreamSize, 0x30)
86{
87  STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value) PURE;
88};
89
90CODER_INTERFACE(ICompressSetInStream, 0x31)
91{
92  STDMETHOD(SetInStream)(ISequentialInStream *inStream) PURE;
93  STDMETHOD(ReleaseInStream)() PURE;
94};
95
96CODER_INTERFACE(ICompressSetOutStream, 0x32)
97{
98  STDMETHOD(SetOutStream)(ISequentialOutStream *outStream) PURE;
99  STDMETHOD(ReleaseOutStream)() PURE;
100};
101
102CODER_INTERFACE(ICompressSetInStreamSize, 0x33)
103{
104  STDMETHOD(SetInStreamSize)(const UInt64 *inSize) PURE;
105};
106
107CODER_INTERFACE(ICompressSetOutStreamSize, 0x34)
108{
109  STDMETHOD(SetOutStreamSize)(const UInt64 *outSize) PURE;
110};
111
112CODER_INTERFACE(ICompressSetBufSize, 0x35)
113{
114  STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size) PURE;
115  STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size) PURE;
116};
117
118CODER_INTERFACE(ICompressFilter, 0x40)
119{
120  STDMETHOD(Init)() PURE;
121  STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) PURE;
122  // Filter converts as most as possible bytes
123  // Filter return outSize (UInt32)
124  // if (outSize <= size): Filter have converted outSize bytes
125  // if (outSize > size): Filter have not converted anything.
126  //      and it needs at least outSize bytes to convert one block
127  //      (it's for crypto block algorithms).
128};
129
130CODER_INTERFACE(ICompressCodecsInfo, 0x60)
131{
132  STDMETHOD(GetNumberOfMethods)(UInt32 *numMethods) PURE;
133  STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE;
134  STDMETHOD(CreateDecoder)(UInt32 index, const GUID *iid, void **coder) PURE;
135  STDMETHOD(CreateEncoder)(UInt32 index, const GUID *iid, void **coder) PURE;
136};
137CODER_INTERFACE(ISetCompressCodecsInfo, 0x61)
138{
139  STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo) PURE;
140};
141
142CODER_INTERFACE(ICryptoProperties, 0x80)
143{
144  STDMETHOD(SetKey)(const Byte *data, UInt32 size) PURE;
145  STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE;
146};
147
148/*
149CODER_INTERFACE(ICryptoResetSalt, 0x88)
150{
151  STDMETHOD(ResetSalt)() PURE;
152};
153*/
154
155CODER_INTERFACE(ICryptoResetInitVector, 0x8C)
156{
157  STDMETHOD(ResetInitVector)() PURE;
158};
159
160CODER_INTERFACE(ICryptoSetPassword, 0x90)
161{
162  STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE;
163};
164
165CODER_INTERFACE(ICryptoSetCRC, 0xA0)
166{
167  STDMETHOD(CryptoSetCRC)(UInt32 crc) PURE;
168};
169
170//////////////////////
171// It's for DLL file
172namespace NMethodPropID
173{
174  enum EEnum
175  {
176    kID,
177    kName,
178    kDecoder,
179    kEncoder,
180    kInStreams,
181    kOutStreams,
182    kDescription,
183    kDecoderIsAssigned,
184    kEncoderIsAssigned,
185    kDigestSize
186  };
187}
188
189CODER_INTERFACE(IHasher, 0xC0)
190{
191  STDMETHOD_(void, Init)() PURE;
192  STDMETHOD_(void, Update)(const void *data, UInt32 size) PURE;
193  STDMETHOD_(void, Final)(Byte *digest) PURE;
194  STDMETHOD_(UInt32, GetDigestSize)() PURE;
195};
196
197CODER_INTERFACE(IHashers, 0xC1)
198{
199  STDMETHOD_(UInt32, GetNumHashers)() PURE;
200  STDMETHOD(GetHasherProp)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE;
201  STDMETHOD(CreateHasher)(UInt32 index, IHasher **hasher) PURE;
202};
203
204extern "C"
205{
206  typedef HRESULT (WINAPI *Func_GetNumberOfMethods)(UInt32 *numMethods);
207  typedef HRESULT (WINAPI *Func_GetMethodProperty)(UInt32 index, PROPID propID, PROPVARIANT *value);
208  typedef HRESULT (WINAPI *Func_GetHashers)(IHashers **hashers);
209}
210
211#endif
212