1*f6dc9357SAndroid Build Coastguard Worker // CrcReg.cpp 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h" 4*f6dc9357SAndroid Build Coastguard Worker 5*f6dc9357SAndroid Build Coastguard Worker #include "../../C/7zCrc.h" 6*f6dc9357SAndroid Build Coastguard Worker #include "../../C/CpuArch.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyCom.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker #include "../7zip/Common/RegisterCodec.h" 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_2( 17*f6dc9357SAndroid Build Coastguard Worker CCrcHasher 18*f6dc9357SAndroid Build Coastguard Worker , IHasher 19*f6dc9357SAndroid Build Coastguard Worker , ICompressSetCoderProperties 20*f6dc9357SAndroid Build Coastguard Worker ) 21*f6dc9357SAndroid Build Coastguard Worker UInt32 _crc; 22*f6dc9357SAndroid Build Coastguard Worker Z7_CRC_UPDATE_FUNC _updateFunc; 23*f6dc9357SAndroid Build Coastguard Worker 24*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CCrcHasher) 25*f6dc9357SAndroid Build Coastguard Worker 26*f6dc9357SAndroid Build Coastguard Worker bool SetFunctions(UInt32 tSize); 27*f6dc9357SAndroid Build Coastguard Worker public: 28*f6dc9357SAndroid Build Coastguard Worker Byte _mtDummy[1 << 7]; // it's public to eliminate clang warning: unused private field 29*f6dc9357SAndroid Build Coastguard Worker 30*f6dc9357SAndroid Build Coastguard Worker CCrcHasher(): _crc(CRC_INIT_VAL) { SetFunctions(0); } 31*f6dc9357SAndroid Build Coastguard Worker }; 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker bool CCrcHasher::SetFunctions(UInt32 tSize) 34*f6dc9357SAndroid Build Coastguard Worker { 35*f6dc9357SAndroid Build Coastguard Worker const Z7_CRC_UPDATE_FUNC f = z7_GetFunc_CrcUpdate(tSize); 36*f6dc9357SAndroid Build Coastguard Worker if (!f) 37*f6dc9357SAndroid Build Coastguard Worker { 38*f6dc9357SAndroid Build Coastguard Worker _updateFunc = CrcUpdate; 39*f6dc9357SAndroid Build Coastguard Worker return false; 40*f6dc9357SAndroid Build Coastguard Worker } 41*f6dc9357SAndroid Build Coastguard Worker _updateFunc = f; 42*f6dc9357SAndroid Build Coastguard Worker return true; 43*f6dc9357SAndroid Build Coastguard Worker } 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CCrcHasher::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *coderProps, UInt32 numProps)) 46*f6dc9357SAndroid Build Coastguard Worker { 47*f6dc9357SAndroid Build Coastguard Worker for (UInt32 i = 0; i < numProps; i++) 48*f6dc9357SAndroid Build Coastguard Worker { 49*f6dc9357SAndroid Build Coastguard Worker if (propIDs[i] == NCoderPropID::kDefaultProp) 50*f6dc9357SAndroid Build Coastguard Worker { 51*f6dc9357SAndroid Build Coastguard Worker const PROPVARIANT &prop = coderProps[i]; 52*f6dc9357SAndroid Build Coastguard Worker if (prop.vt != VT_UI4) 53*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG; 54*f6dc9357SAndroid Build Coastguard Worker if (!SetFunctions(prop.ulVal)) 55*f6dc9357SAndroid Build Coastguard Worker return E_NOTIMPL; 56*f6dc9357SAndroid Build Coastguard Worker } 57*f6dc9357SAndroid Build Coastguard Worker } 58*f6dc9357SAndroid Build Coastguard Worker return S_OK; 59*f6dc9357SAndroid Build Coastguard Worker } 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CCrcHasher::Init()) 62*f6dc9357SAndroid Build Coastguard Worker { 63*f6dc9357SAndroid Build Coastguard Worker _crc = CRC_INIT_VAL; 64*f6dc9357SAndroid Build Coastguard Worker } 65*f6dc9357SAndroid Build Coastguard Worker 66*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CCrcHasher::Update(const void *data, UInt32 size)) 67*f6dc9357SAndroid Build Coastguard Worker { 68*f6dc9357SAndroid Build Coastguard Worker _crc = _updateFunc(_crc, data, size); 69*f6dc9357SAndroid Build Coastguard Worker } 70*f6dc9357SAndroid Build Coastguard Worker 71*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CCrcHasher::Final(Byte *digest)) 72*f6dc9357SAndroid Build Coastguard Worker { 73*f6dc9357SAndroid Build Coastguard Worker const UInt32 val = CRC_GET_DIGEST(_crc); 74*f6dc9357SAndroid Build Coastguard Worker SetUi32(digest, val) 75*f6dc9357SAndroid Build Coastguard Worker } 76*f6dc9357SAndroid Build Coastguard Worker 77*f6dc9357SAndroid Build Coastguard Worker REGISTER_HASHER(CCrcHasher, 0x1, "CRC32", 4) 78