1*f6dc9357SAndroid Build Coastguard Worker // ICoder.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ICODER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ICODER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "IStream.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_BEGIN 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACE_CONSTR_CODER(i, n) \ 11*f6dc9357SAndroid Build Coastguard Worker Z7_DECL_IFACE_7ZIP(i, 4, n) \ 12*f6dc9357SAndroid Build Coastguard Worker { Z7_IFACE_COM7_PURE(i) }; 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressProgressInfo(x) \ 15*f6dc9357SAndroid Build Coastguard Worker x(SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)) 16*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressProgressInfo, 0x04) 17*f6dc9357SAndroid Build Coastguard Worker /* 18*f6dc9357SAndroid Build Coastguard Worker SetRatioInfo() 19*f6dc9357SAndroid Build Coastguard Worker (inSize) can be NULL, if unknown 20*f6dc9357SAndroid Build Coastguard Worker (outSize) can be NULL, if unknown 21*f6dc9357SAndroid Build Coastguard Worker returns: 22*f6dc9357SAndroid Build Coastguard Worker S_OK 23*f6dc9357SAndroid Build Coastguard Worker E_ABORT : Break by user 24*f6dc9357SAndroid Build Coastguard Worker another error codes 25*f6dc9357SAndroid Build Coastguard Worker */ 26*f6dc9357SAndroid Build Coastguard Worker 27*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressCoder(x) \ 28*f6dc9357SAndroid Build Coastguard Worker x(Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, \ 29*f6dc9357SAndroid Build Coastguard Worker const UInt64 *inSize, const UInt64 *outSize, \ 30*f6dc9357SAndroid Build Coastguard Worker ICompressProgressInfo *progress)) 31*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressCoder, 0x05) 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressCoder2(x) \ 34*f6dc9357SAndroid Build Coastguard Worker x(Code(ISequentialInStream * const *inStreams, const UInt64 *const *inSizes, UInt32 numInStreams, \ 35*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream *const *outStreams, const UInt64 *const *outSizes, UInt32 numOutStreams, \ 36*f6dc9357SAndroid Build Coastguard Worker ICompressProgressInfo *progress)) 37*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressCoder2, 0x18) 38*f6dc9357SAndroid Build Coastguard Worker 39*f6dc9357SAndroid Build Coastguard Worker /* 40*f6dc9357SAndroid Build Coastguard Worker ICompressCoder::Code 41*f6dc9357SAndroid Build Coastguard Worker ICompressCoder2::Code 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker returns: 44*f6dc9357SAndroid Build Coastguard Worker S_OK : OK 45*f6dc9357SAndroid Build Coastguard Worker S_FALSE : data error (for decoders) 46*f6dc9357SAndroid Build Coastguard Worker E_OUTOFMEMORY : memory allocation error 47*f6dc9357SAndroid Build Coastguard Worker E_NOTIMPL : unsupported encoding method (for decoders) 48*f6dc9357SAndroid Build Coastguard Worker another error code : some error. For example, it can be error code received from inStream or outStream function. 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker Parameters: 51*f6dc9357SAndroid Build Coastguard Worker (inStream != NULL) 52*f6dc9357SAndroid Build Coastguard Worker (outStream != NULL) 53*f6dc9357SAndroid Build Coastguard Worker 54*f6dc9357SAndroid Build Coastguard Worker if (inSize != NULL) 55*f6dc9357SAndroid Build Coastguard Worker { 56*f6dc9357SAndroid Build Coastguard Worker Encoders in 7-Zip ignore (inSize). 57*f6dc9357SAndroid Build Coastguard Worker Decoder can use (*inSize) to check that stream was decoded correctly. 58*f6dc9357SAndroid Build Coastguard Worker Some decoders in 7-Zip check it, if (full_decoding mode was set via ICompressSetFinishMode) 59*f6dc9357SAndroid Build Coastguard Worker } 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker If it's required to limit the reading from input stream (inStream), it can 62*f6dc9357SAndroid Build Coastguard Worker be done with ISequentialInStream implementation. 63*f6dc9357SAndroid Build Coastguard Worker 64*f6dc9357SAndroid Build Coastguard Worker if (outSize != NULL) 65*f6dc9357SAndroid Build Coastguard Worker { 66*f6dc9357SAndroid Build Coastguard Worker Encoders in 7-Zip ignore (outSize). 67*f6dc9357SAndroid Build Coastguard Worker Decoder unpacks no more than (*outSize) bytes. 68*f6dc9357SAndroid Build Coastguard Worker } 69*f6dc9357SAndroid Build Coastguard Worker 70*f6dc9357SAndroid Build Coastguard Worker (progress == NULL) is allowed. 71*f6dc9357SAndroid Build Coastguard Worker 72*f6dc9357SAndroid Build Coastguard Worker 73*f6dc9357SAndroid Build Coastguard Worker Decoding with Code() function 74*f6dc9357SAndroid Build Coastguard Worker ----------------------------- 75*f6dc9357SAndroid Build Coastguard Worker 76*f6dc9357SAndroid Build Coastguard Worker You can request some interfaces before decoding 77*f6dc9357SAndroid Build Coastguard Worker - ICompressSetDecoderProperties2 78*f6dc9357SAndroid Build Coastguard Worker - ICompressSetFinishMode 79*f6dc9357SAndroid Build Coastguard Worker 80*f6dc9357SAndroid Build Coastguard Worker If you need to decode full stream: 81*f6dc9357SAndroid Build Coastguard Worker { 82*f6dc9357SAndroid Build Coastguard Worker 1) try to set full_decoding mode with ICompressSetFinishMode::SetFinishMode(1); 83*f6dc9357SAndroid Build Coastguard Worker 2) call the Code() function with specified (inSize) and (outSize), if these sizes are known. 84*f6dc9357SAndroid Build Coastguard Worker } 85*f6dc9357SAndroid Build Coastguard Worker 86*f6dc9357SAndroid Build Coastguard Worker If you need to decode only part of stream: 87*f6dc9357SAndroid Build Coastguard Worker { 88*f6dc9357SAndroid Build Coastguard Worker 1) try to set partial_decoding mode with ICompressSetFinishMode::SetFinishMode(0); 89*f6dc9357SAndroid Build Coastguard Worker 2) Call the Code() function with specified (inSize = NULL) and specified (outSize). 90*f6dc9357SAndroid Build Coastguard Worker } 91*f6dc9357SAndroid Build Coastguard Worker 92*f6dc9357SAndroid Build Coastguard Worker Encoding with Code() function 93*f6dc9357SAndroid Build Coastguard Worker ----------------------------- 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker You can request some interfaces : 96*f6dc9357SAndroid Build Coastguard Worker - ICompressSetCoderProperties - use it before encoding to set properties 97*f6dc9357SAndroid Build Coastguard Worker - ICompressWriteCoderProperties - use it before or after encoding to request encoded properties. 98*f6dc9357SAndroid Build Coastguard Worker 99*f6dc9357SAndroid Build Coastguard Worker ICompressCoder2 is used when (numInStreams != 1 || numOutStreams != 1) 100*f6dc9357SAndroid Build Coastguard Worker The rules are similar to ICompressCoder rules 101*f6dc9357SAndroid Build Coastguard Worker */ 102*f6dc9357SAndroid Build Coastguard Worker 103*f6dc9357SAndroid Build Coastguard Worker 104*f6dc9357SAndroid Build Coastguard Worker namespace NCoderPropID 105*f6dc9357SAndroid Build Coastguard Worker { 106*f6dc9357SAndroid Build Coastguard Worker enum EEnum 107*f6dc9357SAndroid Build Coastguard Worker { 108*f6dc9357SAndroid Build Coastguard Worker kDefaultProp = 0, 109*f6dc9357SAndroid Build Coastguard Worker kDictionarySize, // VT_UI4 110*f6dc9357SAndroid Build Coastguard Worker kUsedMemorySize, // VT_UI4 111*f6dc9357SAndroid Build Coastguard Worker kOrder, // VT_UI4 112*f6dc9357SAndroid Build Coastguard Worker kBlockSize, // VT_UI4 or VT_UI8 113*f6dc9357SAndroid Build Coastguard Worker kPosStateBits, // VT_UI4 114*f6dc9357SAndroid Build Coastguard Worker kLitContextBits, // VT_UI4 115*f6dc9357SAndroid Build Coastguard Worker kLitPosBits, // VT_UI4 116*f6dc9357SAndroid Build Coastguard Worker kNumFastBytes, // VT_UI4 117*f6dc9357SAndroid Build Coastguard Worker kMatchFinder, // VT_BSTR 118*f6dc9357SAndroid Build Coastguard Worker kMatchFinderCycles, // VT_UI4 119*f6dc9357SAndroid Build Coastguard Worker kNumPasses, // VT_UI4 120*f6dc9357SAndroid Build Coastguard Worker kAlgorithm, // VT_UI4 121*f6dc9357SAndroid Build Coastguard Worker kNumThreads, // VT_UI4 122*f6dc9357SAndroid Build Coastguard Worker kEndMarker, // VT_BOOL 123*f6dc9357SAndroid Build Coastguard Worker kLevel, // VT_UI4 124*f6dc9357SAndroid Build Coastguard Worker kReduceSize, // VT_UI8 : it's estimated size of largest data stream that will be compressed 125*f6dc9357SAndroid Build Coastguard Worker // encoder can use this value to reduce dictionary size and allocate data buffers 126*f6dc9357SAndroid Build Coastguard Worker 127*f6dc9357SAndroid Build Coastguard Worker kExpectedDataSize, // VT_UI8 : for ICompressSetCoderPropertiesOpt : 128*f6dc9357SAndroid Build Coastguard Worker // it's estimated size of current data stream 129*f6dc9357SAndroid Build Coastguard Worker // real data size can differ from that size 130*f6dc9357SAndroid Build Coastguard Worker // encoder can use this value to optimize encoder initialization 131*f6dc9357SAndroid Build Coastguard Worker 132*f6dc9357SAndroid Build Coastguard Worker kBlockSize2, // VT_UI4 or VT_UI8 133*f6dc9357SAndroid Build Coastguard Worker kCheckSize, // VT_UI4 : size of digest in bytes 134*f6dc9357SAndroid Build Coastguard Worker kFilter, // VT_BSTR 135*f6dc9357SAndroid Build Coastguard Worker kMemUse, // VT_UI8 136*f6dc9357SAndroid Build Coastguard Worker kAffinity, // VT_UI8 137*f6dc9357SAndroid Build Coastguard Worker kBranchOffset, // VT_UI4 138*f6dc9357SAndroid Build Coastguard Worker kHashBits, // VT_UI4 139*f6dc9357SAndroid Build Coastguard Worker /* 140*f6dc9357SAndroid Build Coastguard Worker // kHash3Bits, // VT_UI4 141*f6dc9357SAndroid Build Coastguard Worker // kHash2Bits, // VT_UI4 142*f6dc9357SAndroid Build Coastguard Worker // kChainBits, // VT_UI4 143*f6dc9357SAndroid Build Coastguard Worker kChainSize, // VT_UI4 144*f6dc9357SAndroid Build Coastguard Worker kNativeLevel, // VT_UI4 145*f6dc9357SAndroid Build Coastguard Worker kFast, // VT_UI4 146*f6dc9357SAndroid Build Coastguard Worker kMinMatch, // VT_UI4 The minimum slen is 3 and the maximum is 7. 147*f6dc9357SAndroid Build Coastguard Worker kOverlapLog, // VT_UI4 The minimum ovlog is 0 and the maximum is 9. (default: 6) 148*f6dc9357SAndroid Build Coastguard Worker kRowMatchFinder, // VT_BOOL 149*f6dc9357SAndroid Build Coastguard Worker kLdmEnable, // VT_BOOL 150*f6dc9357SAndroid Build Coastguard Worker // kLdmWindowSizeLog, // VT_UI4 151*f6dc9357SAndroid Build Coastguard Worker kLdmWindowSize, // VT_UI4 152*f6dc9357SAndroid Build Coastguard Worker kLdmHashLog, // VT_UI4 The minimum ldmhlog is 6 and the maximum is 26 (default: 20). 153*f6dc9357SAndroid Build Coastguard Worker kLdmMinMatchLength, // VT_UI4 The minimum ldmslen is 4 and the maximum is 4096 (default: 64). 154*f6dc9357SAndroid Build Coastguard Worker kLdmBucketSizeLog, // VT_UI4 The minimum ldmblog is 0 and the maximum is 8 (default: 3). 155*f6dc9357SAndroid Build Coastguard Worker kLdmHashRateLog, // VT_UI4 The default value is wlog - ldmhlog. 156*f6dc9357SAndroid Build Coastguard Worker kWriteUnpackSizeFlag, // VT_BOOL 157*f6dc9357SAndroid Build Coastguard Worker kUsePledged, // VT_BOOL 158*f6dc9357SAndroid Build Coastguard Worker kUseSizeHintPledgedForSmall, // VT_BOOL 159*f6dc9357SAndroid Build Coastguard Worker kUseSizeHintForEach, // VT_BOOL 160*f6dc9357SAndroid Build Coastguard Worker kUseSizeHintGlobal, // VT_BOOL 161*f6dc9357SAndroid Build Coastguard Worker kParamSelectMode, // VT_UI4 162*f6dc9357SAndroid Build Coastguard Worker // kSearchLog, // VT_UI4 The minimum slog is 1 and the maximum is 26 163*f6dc9357SAndroid Build Coastguard Worker // kTargetLen, // VT_UI4 The minimum tlen is 0 and the maximum is 999. 164*f6dc9357SAndroid Build Coastguard Worker */ 165*f6dc9357SAndroid Build Coastguard Worker k_NUM_DEFINED 166*f6dc9357SAndroid Build Coastguard Worker }; 167*f6dc9357SAndroid Build Coastguard Worker } 168*f6dc9357SAndroid Build Coastguard Worker 169*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetCoderPropertiesOpt(x) \ 170*f6dc9357SAndroid Build Coastguard Worker x(SetCoderPropertiesOpt(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)) 171*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetCoderPropertiesOpt, 0x1F) 172*f6dc9357SAndroid Build Coastguard Worker 173*f6dc9357SAndroid Build Coastguard Worker 174*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetCoderProperties(x) \ 175*f6dc9357SAndroid Build Coastguard Worker x(SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)) 176*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetCoderProperties, 0x20) 177*f6dc9357SAndroid Build Coastguard Worker 178*f6dc9357SAndroid Build Coastguard Worker /* 179*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetDecoderProperties(x) \ 180*f6dc9357SAndroid Build Coastguard Worker x(SetDecoderProperties(ISequentialInStream *inStream)) 181*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetDecoderProperties, 0x21) 182*f6dc9357SAndroid Build Coastguard Worker */ 183*f6dc9357SAndroid Build Coastguard Worker 184*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetDecoderProperties2(x) \ 185*f6dc9357SAndroid Build Coastguard Worker x(SetDecoderProperties2(const Byte *data, UInt32 size)) 186*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetDecoderProperties2, 0x22) 187*f6dc9357SAndroid Build Coastguard Worker /* returns: 188*f6dc9357SAndroid Build Coastguard Worker S_OK 189*f6dc9357SAndroid Build Coastguard Worker E_NOTIMP : unsupported properties 190*f6dc9357SAndroid Build Coastguard Worker E_INVALIDARG : incorrect (or unsupported) properties 191*f6dc9357SAndroid Build Coastguard Worker E_OUTOFMEMORY : memory allocation error 192*f6dc9357SAndroid Build Coastguard Worker */ 193*f6dc9357SAndroid Build Coastguard Worker 194*f6dc9357SAndroid Build Coastguard Worker 195*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressWriteCoderProperties(x) \ 196*f6dc9357SAndroid Build Coastguard Worker x(WriteCoderProperties(ISequentialOutStream *outStream)) 197*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressWriteCoderProperties, 0x23) 198*f6dc9357SAndroid Build Coastguard Worker 199*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressGetInStreamProcessedSize(x) \ 200*f6dc9357SAndroid Build Coastguard Worker x(GetInStreamProcessedSize(UInt64 *value)) 201*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressGetInStreamProcessedSize, 0x24) 202*f6dc9357SAndroid Build Coastguard Worker 203*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetCoderMt(x) \ 204*f6dc9357SAndroid Build Coastguard Worker x(SetNumberOfThreads(UInt32 numThreads)) 205*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetCoderMt, 0x25) 206*f6dc9357SAndroid Build Coastguard Worker 207*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetFinishMode(x) \ 208*f6dc9357SAndroid Build Coastguard Worker x(SetFinishMode(UInt32 finishMode)) 209*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetFinishMode, 0x26) 210*f6dc9357SAndroid Build Coastguard Worker /* finishMode: 211*f6dc9357SAndroid Build Coastguard Worker 0 : partial decoding is allowed. It's default mode for ICompressCoder::Code(), if (outSize) is defined. 212*f6dc9357SAndroid Build Coastguard Worker 1 : full decoding. The stream must be finished at the end of decoding. */ 213*f6dc9357SAndroid Build Coastguard Worker 214*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressGetInStreamProcessedSize2(x) \ 215*f6dc9357SAndroid Build Coastguard Worker x(GetInStreamProcessedSize2(UInt32 streamIndex, UInt64 *value)) 216*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressGetInStreamProcessedSize2, 0x27) 217*f6dc9357SAndroid Build Coastguard Worker 218*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetMemLimit(x) \ 219*f6dc9357SAndroid Build Coastguard Worker x(SetMemLimit(UInt64 memUsage)) 220*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetMemLimit, 0x28) 221*f6dc9357SAndroid Build Coastguard Worker 222*f6dc9357SAndroid Build Coastguard Worker 223*f6dc9357SAndroid Build Coastguard Worker /* 224*f6dc9357SAndroid Build Coastguard Worker ICompressReadUnusedFromInBuf is supported by ICoder object 225*f6dc9357SAndroid Build Coastguard Worker call ReadUnusedFromInBuf() after ICoder::Code(inStream, ...). 226*f6dc9357SAndroid Build Coastguard Worker ICoder::Code(inStream, ...) decodes data, and the ICoder object is allowed 227*f6dc9357SAndroid Build Coastguard Worker to read from inStream to internal buffers more data than minimal data required for decoding. 228*f6dc9357SAndroid Build Coastguard Worker So we can call ReadUnusedFromInBuf() from same ICoder object to read unused input 229*f6dc9357SAndroid Build Coastguard Worker data from the internal buffer. 230*f6dc9357SAndroid Build Coastguard Worker in ReadUnusedFromInBuf(): the Coder is not allowed to use (ISequentialInStream *inStream) object, that was sent to ICoder::Code(). 231*f6dc9357SAndroid Build Coastguard Worker */ 232*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressReadUnusedFromInBuf(x) \ 233*f6dc9357SAndroid Build Coastguard Worker x(ReadUnusedFromInBuf(void *data, UInt32 size, UInt32 *processedSize)) 234*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressReadUnusedFromInBuf, 0x29) 235*f6dc9357SAndroid Build Coastguard Worker 236*f6dc9357SAndroid Build Coastguard Worker 237*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressGetSubStreamSize(x) \ 238*f6dc9357SAndroid Build Coastguard Worker x(GetSubStreamSize(UInt64 subStream, UInt64 *value)) 239*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressGetSubStreamSize, 0x30) 240*f6dc9357SAndroid Build Coastguard Worker /* returns: 241*f6dc9357SAndroid Build Coastguard Worker S_OK : (*value) contains the size or estimated size (can be incorrect size) 242*f6dc9357SAndroid Build Coastguard Worker S_FALSE : size is undefined 243*f6dc9357SAndroid Build Coastguard Worker E_NOTIMP : the feature is not implemented 244*f6dc9357SAndroid Build Coastguard Worker Let's (read_size) is size of data that was already read by ISequentialInStream::Read(). 245*f6dc9357SAndroid Build Coastguard Worker The caller should call GetSubStreamSize() after each Read() and check sizes: 246*f6dc9357SAndroid Build Coastguard Worker if (start_of_subStream + *value < read_size) 247*f6dc9357SAndroid Build Coastguard Worker { 248*f6dc9357SAndroid Build Coastguard Worker // (*value) is correct, and it's allowed to call GetSubStreamSize() for next subStream: 249*f6dc9357SAndroid Build Coastguard Worker start_of_subStream += *value; 250*f6dc9357SAndroid Build Coastguard Worker subStream++; 251*f6dc9357SAndroid Build Coastguard Worker } 252*f6dc9357SAndroid Build Coastguard Worker */ 253*f6dc9357SAndroid Build Coastguard Worker 254*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetInStream(x) \ 255*f6dc9357SAndroid Build Coastguard Worker x(SetInStream(ISequentialInStream *inStream)) \ 256*f6dc9357SAndroid Build Coastguard Worker x(ReleaseInStream()) 257*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetInStream, 0x31) 258*f6dc9357SAndroid Build Coastguard Worker 259*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetOutStream(x) \ 260*f6dc9357SAndroid Build Coastguard Worker x(SetOutStream(ISequentialOutStream *outStream)) \ 261*f6dc9357SAndroid Build Coastguard Worker x(ReleaseOutStream()) 262*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetOutStream, 0x32) 263*f6dc9357SAndroid Build Coastguard Worker 264*f6dc9357SAndroid Build Coastguard Worker /* 265*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetInStreamSize(x) \ 266*f6dc9357SAndroid Build Coastguard Worker x(SetInStreamSize(const UInt64 *inSize)) \ 267*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetInStreamSize, 0x33) 268*f6dc9357SAndroid Build Coastguard Worker */ 269*f6dc9357SAndroid Build Coastguard Worker 270*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetOutStreamSize(x) \ 271*f6dc9357SAndroid Build Coastguard Worker x(SetOutStreamSize(const UInt64 *outSize)) 272*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetOutStreamSize, 0x34) 273*f6dc9357SAndroid Build Coastguard Worker /* That function initializes decoder structures. 274*f6dc9357SAndroid Build Coastguard Worker Call this function only for stream version of decoder. 275*f6dc9357SAndroid Build Coastguard Worker if (outSize == NULL), then output size is unknown 276*f6dc9357SAndroid Build Coastguard Worker if (outSize != NULL), then the decoder must stop decoding after (*outSize) bytes. */ 277*f6dc9357SAndroid Build Coastguard Worker 278*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetBufSize(x) \ 279*f6dc9357SAndroid Build Coastguard Worker x(SetInBufSize(UInt32 streamIndex, UInt32 size)) \ 280*f6dc9357SAndroid Build Coastguard Worker x(SetOutBufSize(UInt32 streamIndex, UInt32 size)) 281*f6dc9357SAndroid Build Coastguard Worker 282*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetBufSize, 0x35) 283*f6dc9357SAndroid Build Coastguard Worker 284*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressInitEncoder(x) \ 285*f6dc9357SAndroid Build Coastguard Worker x(InitEncoder()) 286*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressInitEncoder, 0x36) 287*f6dc9357SAndroid Build Coastguard Worker /* That function initializes encoder structures. 288*f6dc9357SAndroid Build Coastguard Worker Call this function only for stream version of encoder. */ 289*f6dc9357SAndroid Build Coastguard Worker 290*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetInStream2(x) \ 291*f6dc9357SAndroid Build Coastguard Worker x(SetInStream2(UInt32 streamIndex, ISequentialInStream *inStream)) \ 292*f6dc9357SAndroid Build Coastguard Worker x(ReleaseInStream2(UInt32 streamIndex)) 293*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetInStream2, 0x37) 294*f6dc9357SAndroid Build Coastguard Worker 295*f6dc9357SAndroid Build Coastguard Worker /* 296*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetOutStream2(x) \ 297*f6dc9357SAndroid Build Coastguard Worker x(SetOutStream2(UInt32 streamIndex, ISequentialOutStream *outStream)) 298*f6dc9357SAndroid Build Coastguard Worker x(ReleaseOutStream2(UInt32 streamIndex)) 299*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetOutStream2, 0x38) 300*f6dc9357SAndroid Build Coastguard Worker 301*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressSetInStreamSize2(x) \ 302*f6dc9357SAndroid Build Coastguard Worker x(SetInStreamSize2(UInt32 streamIndex, const UInt64 *inSize)) 303*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressSetInStreamSize2, 0x39) 304*f6dc9357SAndroid Build Coastguard Worker */ 305*f6dc9357SAndroid Build Coastguard Worker 306*f6dc9357SAndroid Build Coastguard Worker /* 307*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressInSubStreams(x) \ 308*f6dc9357SAndroid Build Coastguard Worker x(GetNextInSubStream(UInt64 *streamIndexRes, ISequentialInStream **stream)) 309*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressInSubStreams, 0x3A) 310*f6dc9357SAndroid Build Coastguard Worker 311*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressOutSubStreams(x) \ 312*f6dc9357SAndroid Build Coastguard Worker x(GetNextOutSubStream(UInt64 *streamIndexRes, ISequentialOutStream **stream)) 313*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressOutSubStreams, 0x3B) 314*f6dc9357SAndroid Build Coastguard Worker */ 315*f6dc9357SAndroid Build Coastguard Worker 316*f6dc9357SAndroid Build Coastguard Worker /* 317*f6dc9357SAndroid Build Coastguard Worker ICompressFilter 318*f6dc9357SAndroid Build Coastguard Worker Filter(Byte *data, UInt32 size) 319*f6dc9357SAndroid Build Coastguard Worker (size) 320*f6dc9357SAndroid Build Coastguard Worker converts as most as possible bytes required for fast processing. 321*f6dc9357SAndroid Build Coastguard Worker Some filters have (smallest_fast_block). 322*f6dc9357SAndroid Build Coastguard Worker For example, (smallest_fast_block == 16) for AES CBC/CTR filters. 323*f6dc9357SAndroid Build Coastguard Worker If data stream is not finished, caller must call Filter() for larger block: 324*f6dc9357SAndroid Build Coastguard Worker where (size >= smallest_fast_block). 325*f6dc9357SAndroid Build Coastguard Worker if (size >= smallest_fast_block) 326*f6dc9357SAndroid Build Coastguard Worker { 327*f6dc9357SAndroid Build Coastguard Worker The filter can leave some bytes at the end of data without conversion: 328*f6dc9357SAndroid Build Coastguard Worker if there are data alignment reasons or speed reasons. 329*f6dc9357SAndroid Build Coastguard Worker The caller can read additional data from stream and call Filter() again. 330*f6dc9357SAndroid Build Coastguard Worker } 331*f6dc9357SAndroid Build Coastguard Worker If data stream was finished, caller can call Filter() for (size < smallest_fast_block) 332*f6dc9357SAndroid Build Coastguard Worker 333*f6dc9357SAndroid Build Coastguard Worker (data) parameter: 334*f6dc9357SAndroid Build Coastguard Worker Some filters require alignment for any Filter() call: 335*f6dc9357SAndroid Build Coastguard Worker 1) (stream_offset % alignment_size) == (data % alignment_size) 336*f6dc9357SAndroid Build Coastguard Worker 2) (alignment_size == 2^N) 337*f6dc9357SAndroid Build Coastguard Worker where (stream_offset) - is the number of bytes that were already filtered before. 338*f6dc9357SAndroid Build Coastguard Worker The callers of Filter() are required to meet these requirements. 339*f6dc9357SAndroid Build Coastguard Worker (alignment_size) can be different: 340*f6dc9357SAndroid Build Coastguard Worker 16 : for AES filters 341*f6dc9357SAndroid Build Coastguard Worker 4 or 2 : for some branch convert filters 342*f6dc9357SAndroid Build Coastguard Worker 1 : for another filters 343*f6dc9357SAndroid Build Coastguard Worker (alignment_size >= 16) is enough for all current filters of 7-Zip. 344*f6dc9357SAndroid Build Coastguard Worker But the caller can use larger (alignment_size). 345*f6dc9357SAndroid Build Coastguard Worker Recommended alignment for (data) of Filter() call is (alignment_size == 64). 346*f6dc9357SAndroid Build Coastguard Worker Also it's recommended to use aligned value for (size): 347*f6dc9357SAndroid Build Coastguard Worker (size % alignment_size == 0), 348*f6dc9357SAndroid Build Coastguard Worker if it's not last call of Filter() for current stream. 349*f6dc9357SAndroid Build Coastguard Worker 350*f6dc9357SAndroid Build Coastguard Worker returns: (outSize): 351*f6dc9357SAndroid Build Coastguard Worker if (outSize == 0) : Filter have not converted anything. 352*f6dc9357SAndroid Build Coastguard Worker So the caller can stop processing, if data stream was finished. 353*f6dc9357SAndroid Build Coastguard Worker if (outSize <= size) : Filter have converted outSize bytes 354*f6dc9357SAndroid Build Coastguard Worker if (outSize > size) : Filter have not converted anything. 355*f6dc9357SAndroid Build Coastguard Worker and it needs at least outSize bytes to convert one block 356*f6dc9357SAndroid Build Coastguard Worker (it's for crypto block algorithms). 357*f6dc9357SAndroid Build Coastguard Worker */ 358*f6dc9357SAndroid Build Coastguard Worker 359*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressFilter(x) \ 360*f6dc9357SAndroid Build Coastguard Worker x(Init()) \ 361*f6dc9357SAndroid Build Coastguard Worker x##2(UInt32, Filter(Byte *data, UInt32 size)) 362*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressFilter, 0x40) 363*f6dc9357SAndroid Build Coastguard Worker 364*f6dc9357SAndroid Build Coastguard Worker 365*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICompressCodecsInfo(x) \ 366*f6dc9357SAndroid Build Coastguard Worker x(GetNumMethods(UInt32 *numMethods)) \ 367*f6dc9357SAndroid Build Coastguard Worker x(GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)) \ 368*f6dc9357SAndroid Build Coastguard Worker x(CreateDecoder(UInt32 index, const GUID *iid, void* *coder)) \ 369*f6dc9357SAndroid Build Coastguard Worker x(CreateEncoder(UInt32 index, const GUID *iid, void* *coder)) 370*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICompressCodecsInfo, 0x60) 371*f6dc9357SAndroid Build Coastguard Worker 372*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ISetCompressCodecsInfo(x) \ 373*f6dc9357SAndroid Build Coastguard Worker x(SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo)) 374*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ISetCompressCodecsInfo, 0x61) 375*f6dc9357SAndroid Build Coastguard Worker 376*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICryptoProperties(x) \ 377*f6dc9357SAndroid Build Coastguard Worker x(SetKey(const Byte *data, UInt32 size)) \ 378*f6dc9357SAndroid Build Coastguard Worker x(SetInitVector(const Byte *data, UInt32 size)) 379*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICryptoProperties, 0x80) 380*f6dc9357SAndroid Build Coastguard Worker 381*f6dc9357SAndroid Build Coastguard Worker /* 382*f6dc9357SAndroid Build Coastguard Worker x(ResetSalt()) 383*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICryptoResetSalt, 0x88) 384*f6dc9357SAndroid Build Coastguard Worker */ 385*f6dc9357SAndroid Build Coastguard Worker 386*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICryptoResetInitVector(x) \ 387*f6dc9357SAndroid Build Coastguard Worker x(ResetInitVector()) 388*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICryptoResetInitVector, 0x8C) 389*f6dc9357SAndroid Build Coastguard Worker /* Call ResetInitVector() only for encoding. 390*f6dc9357SAndroid Build Coastguard Worker Call ResetInitVector() before encoding and before WriteCoderProperties(). 391*f6dc9357SAndroid Build Coastguard Worker Crypto encoder can create random IV in that function. */ 392*f6dc9357SAndroid Build Coastguard Worker 393*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICryptoSetPassword(x) \ 394*f6dc9357SAndroid Build Coastguard Worker x(CryptoSetPassword(const Byte *data, UInt32 size)) 395*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICryptoSetPassword, 0x90) 396*f6dc9357SAndroid Build Coastguard Worker 397*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_ICryptoSetCRC(x) \ 398*f6dc9357SAndroid Build Coastguard Worker x(CryptoSetCRC(UInt32 crc)) 399*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(ICryptoSetCRC, 0xA0) 400*f6dc9357SAndroid Build Coastguard Worker 401*f6dc9357SAndroid Build Coastguard Worker 402*f6dc9357SAndroid Build Coastguard Worker namespace NMethodPropID 403*f6dc9357SAndroid Build Coastguard Worker { 404*f6dc9357SAndroid Build Coastguard Worker enum EEnum 405*f6dc9357SAndroid Build Coastguard Worker { 406*f6dc9357SAndroid Build Coastguard Worker kID, 407*f6dc9357SAndroid Build Coastguard Worker kName, 408*f6dc9357SAndroid Build Coastguard Worker kDecoder, 409*f6dc9357SAndroid Build Coastguard Worker kEncoder, 410*f6dc9357SAndroid Build Coastguard Worker kPackStreams, 411*f6dc9357SAndroid Build Coastguard Worker kUnpackStreams, 412*f6dc9357SAndroid Build Coastguard Worker kDescription, 413*f6dc9357SAndroid Build Coastguard Worker kDecoderIsAssigned, 414*f6dc9357SAndroid Build Coastguard Worker kEncoderIsAssigned, 415*f6dc9357SAndroid Build Coastguard Worker kDigestSize, 416*f6dc9357SAndroid Build Coastguard Worker kIsFilter 417*f6dc9357SAndroid Build Coastguard Worker }; 418*f6dc9357SAndroid Build Coastguard Worker } 419*f6dc9357SAndroid Build Coastguard Worker 420*f6dc9357SAndroid Build Coastguard Worker namespace NModuleInterfaceType 421*f6dc9357SAndroid Build Coastguard Worker { 422*f6dc9357SAndroid Build Coastguard Worker /* 423*f6dc9357SAndroid Build Coastguard Worker virtual destructor in IUnknown: 424*f6dc9357SAndroid Build Coastguard Worker - no : 7-Zip (Windows) 425*f6dc9357SAndroid Build Coastguard Worker - no : 7-Zip (Linux) (v23) in default mode 426*f6dc9357SAndroid Build Coastguard Worker - yes : p7zip 427*f6dc9357SAndroid Build Coastguard Worker - yes : 7-Zip (Linux) before v23 428*f6dc9357SAndroid Build Coastguard Worker - yes : 7-Zip (Linux) (v23), if Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN is defined 429*f6dc9357SAndroid Build Coastguard Worker */ 430*f6dc9357SAndroid Build Coastguard Worker const UInt32 k_IUnknown_VirtDestructor_No = 0; 431*f6dc9357SAndroid Build Coastguard Worker const UInt32 k_IUnknown_VirtDestructor_Yes = 1; 432*f6dc9357SAndroid Build Coastguard Worker const UInt32 k_IUnknown_VirtDestructor_ThisModule = 433*f6dc9357SAndroid Build Coastguard Worker #if !defined(_WIN32) && defined(Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN) 434*f6dc9357SAndroid Build Coastguard Worker k_IUnknown_VirtDestructor_Yes; 435*f6dc9357SAndroid Build Coastguard Worker #else 436*f6dc9357SAndroid Build Coastguard Worker k_IUnknown_VirtDestructor_No; 437*f6dc9357SAndroid Build Coastguard Worker #endif 438*f6dc9357SAndroid Build Coastguard Worker } 439*f6dc9357SAndroid Build Coastguard Worker 440*f6dc9357SAndroid Build Coastguard Worker namespace NModulePropID 441*f6dc9357SAndroid Build Coastguard Worker { 442*f6dc9357SAndroid Build Coastguard Worker enum EEnum 443*f6dc9357SAndroid Build Coastguard Worker { 444*f6dc9357SAndroid Build Coastguard Worker kInterfaceType, // VT_UI4 445*f6dc9357SAndroid Build Coastguard Worker kVersion // VT_UI4 446*f6dc9357SAndroid Build Coastguard Worker }; 447*f6dc9357SAndroid Build Coastguard Worker } 448*f6dc9357SAndroid Build Coastguard Worker 449*f6dc9357SAndroid Build Coastguard Worker 450*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IHasher(x) \ 451*f6dc9357SAndroid Build Coastguard Worker x##2(void, Init()) \ 452*f6dc9357SAndroid Build Coastguard Worker x##2(void, Update(const void *data, UInt32 size)) \ 453*f6dc9357SAndroid Build Coastguard Worker x##2(void, Final(Byte *digest)) \ 454*f6dc9357SAndroid Build Coastguard Worker x##2(UInt32, GetDigestSize()) 455*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(IHasher, 0xC0) 456*f6dc9357SAndroid Build Coastguard Worker 457*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IHashers(x) \ 458*f6dc9357SAndroid Build Coastguard Worker x##2(UInt32, GetNumHashers()) \ 459*f6dc9357SAndroid Build Coastguard Worker x(GetHasherProp(UInt32 index, PROPID propID, PROPVARIANT *value)) \ 460*f6dc9357SAndroid Build Coastguard Worker x(CreateHasher(UInt32 index, IHasher **hasher)) 461*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_CONSTR_CODER(IHashers, 0xC1) 462*f6dc9357SAndroid Build Coastguard Worker 463*f6dc9357SAndroid Build Coastguard Worker extern "C" 464*f6dc9357SAndroid Build Coastguard Worker { 465*f6dc9357SAndroid Build Coastguard Worker typedef HRESULT (WINAPI *Func_GetNumberOfMethods)(UInt32 *numMethods); 466*f6dc9357SAndroid Build Coastguard Worker typedef HRESULT (WINAPI *Func_GetMethodProperty)(UInt32 index, PROPID propID, PROPVARIANT *value); 467*f6dc9357SAndroid Build Coastguard Worker typedef HRESULT (WINAPI *Func_CreateDecoder)(UInt32 index, const GUID *iid, void **outObject); 468*f6dc9357SAndroid Build Coastguard Worker typedef HRESULT (WINAPI *Func_CreateEncoder)(UInt32 index, const GUID *iid, void **outObject); 469*f6dc9357SAndroid Build Coastguard Worker 470*f6dc9357SAndroid Build Coastguard Worker typedef HRESULT (WINAPI *Func_GetHashers)(IHashers **hashers); 471*f6dc9357SAndroid Build Coastguard Worker 472*f6dc9357SAndroid Build Coastguard Worker typedef HRESULT (WINAPI *Func_SetCodecs)(ICompressCodecsInfo *compressCodecsInfo); 473*f6dc9357SAndroid Build Coastguard Worker typedef HRESULT (WINAPI *Func_GetModuleProp)(PROPID propID, PROPVARIANT *value); 474*f6dc9357SAndroid Build Coastguard Worker } 475*f6dc9357SAndroid Build Coastguard Worker 476*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_END 477*f6dc9357SAndroid Build Coastguard Worker #endif 478