1*f6dc9357SAndroid Build Coastguard Worker // HashCalc.h
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_HASH_CALC_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_HASH_CALC_H
5*f6dc9357SAndroid Build Coastguard Worker
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/UTFConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Wildcard.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/CreateCoder.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MethodProps.h"
11*f6dc9357SAndroid Build Coastguard Worker
12*f6dc9357SAndroid Build Coastguard Worker #include "DirItem.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "IFileExtractCallback.h"
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker const unsigned k_HashCalc_DigestSize_Max = 64;
16*f6dc9357SAndroid Build Coastguard Worker const unsigned k_HashCalc_ExtraSize = 8;
17*f6dc9357SAndroid Build Coastguard Worker const unsigned k_HashCalc_NumGroups = 4;
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker /*
20*f6dc9357SAndroid Build Coastguard Worker if (size <= 8) : upper case : reversed byte order : it shows 32-bit/64-bit number, if data contains little-endian number
21*f6dc9357SAndroid Build Coastguard Worker if (size > 8) : lower case : original byte order (as big-endian byte sequence)
22*f6dc9357SAndroid Build Coastguard Worker */
23*f6dc9357SAndroid Build Coastguard Worker void HashHexToString(char *dest, const Byte *data, size_t size);
24*f6dc9357SAndroid Build Coastguard Worker
25*f6dc9357SAndroid Build Coastguard Worker enum
26*f6dc9357SAndroid Build Coastguard Worker {
27*f6dc9357SAndroid Build Coastguard Worker k_HashCalc_Index_Current,
28*f6dc9357SAndroid Build Coastguard Worker k_HashCalc_Index_DataSum,
29*f6dc9357SAndroid Build Coastguard Worker k_HashCalc_Index_NamesSum,
30*f6dc9357SAndroid Build Coastguard Worker k_HashCalc_Index_StreamsSum
31*f6dc9357SAndroid Build Coastguard Worker };
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Worker struct CHasherState
34*f6dc9357SAndroid Build Coastguard Worker {
35*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IHasher> Hasher;
36*f6dc9357SAndroid Build Coastguard Worker AString Name;
37*f6dc9357SAndroid Build Coastguard Worker UInt32 DigestSize;
38*f6dc9357SAndroid Build Coastguard Worker UInt64 NumSums[k_HashCalc_NumGroups];
39*f6dc9357SAndroid Build Coastguard Worker Byte Digests[k_HashCalc_NumGroups][k_HashCalc_DigestSize_Max + k_HashCalc_ExtraSize];
40*f6dc9357SAndroid Build Coastguard Worker
InitDigestGroupCHasherState41*f6dc9357SAndroid Build Coastguard Worker void InitDigestGroup(unsigned groupIndex)
42*f6dc9357SAndroid Build Coastguard Worker {
43*f6dc9357SAndroid Build Coastguard Worker NumSums[groupIndex] = 0;
44*f6dc9357SAndroid Build Coastguard Worker memset(Digests[groupIndex], 0, sizeof(Digests[groupIndex]));
45*f6dc9357SAndroid Build Coastguard Worker }
46*f6dc9357SAndroid Build Coastguard Worker
GetExtraData_for_GroupCHasherState47*f6dc9357SAndroid Build Coastguard Worker const Byte *GetExtraData_for_Group(unsigned groupIndex) const
48*f6dc9357SAndroid Build Coastguard Worker {
49*f6dc9357SAndroid Build Coastguard Worker return Digests[groupIndex] + k_HashCalc_DigestSize_Max;
50*f6dc9357SAndroid Build Coastguard Worker }
51*f6dc9357SAndroid Build Coastguard Worker
GetNumExtraBytes_for_GroupCHasherState52*f6dc9357SAndroid Build Coastguard Worker unsigned GetNumExtraBytes_for_Group(unsigned groupIndex) const
53*f6dc9357SAndroid Build Coastguard Worker {
54*f6dc9357SAndroid Build Coastguard Worker const Byte *p = GetExtraData_for_Group(groupIndex);
55*f6dc9357SAndroid Build Coastguard Worker // we use little-endian to read extra bytes
56*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = k_HashCalc_ExtraSize; i != 0; i--)
57*f6dc9357SAndroid Build Coastguard Worker if (p[i - 1] != 0)
58*f6dc9357SAndroid Build Coastguard Worker return i;
59*f6dc9357SAndroid Build Coastguard Worker return 0;
60*f6dc9357SAndroid Build Coastguard Worker }
61*f6dc9357SAndroid Build Coastguard Worker
62*f6dc9357SAndroid Build Coastguard Worker void AddDigest(unsigned groupIndex, const Byte *data);
63*f6dc9357SAndroid Build Coastguard Worker
64*f6dc9357SAndroid Build Coastguard Worker void WriteToString(unsigned digestIndex, char *s) const;
65*f6dc9357SAndroid Build Coastguard Worker };
66*f6dc9357SAndroid Build Coastguard Worker
67*f6dc9357SAndroid Build Coastguard Worker
68*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_BEGIN
69*f6dc9357SAndroid Build Coastguard Worker
70*f6dc9357SAndroid Build Coastguard Worker
DECLARE_INTERFACE(IHashCalc)71*f6dc9357SAndroid Build Coastguard Worker DECLARE_INTERFACE(IHashCalc)
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker virtual void InitForNewFile() = 0;
74*f6dc9357SAndroid Build Coastguard Worker virtual void Update(const void *data, UInt32 size) = 0;
75*f6dc9357SAndroid Build Coastguard Worker virtual void SetSize(UInt64 size) = 0;
76*f6dc9357SAndroid Build Coastguard Worker virtual void Final(bool isDir, bool isAltStream, const UString &path) = 0;
77*f6dc9357SAndroid Build Coastguard Worker };
78*f6dc9357SAndroid Build Coastguard Worker
79*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_END
80*f6dc9357SAndroid Build Coastguard Worker
81*f6dc9357SAndroid Build Coastguard Worker struct CHashBundle Z7_final: public IHashCalc
82*f6dc9357SAndroid Build Coastguard Worker {
83*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CHasherState> Hashers;
84*f6dc9357SAndroid Build Coastguard Worker
85*f6dc9357SAndroid Build Coastguard Worker UInt64 NumDirs;
86*f6dc9357SAndroid Build Coastguard Worker UInt64 NumFiles;
87*f6dc9357SAndroid Build Coastguard Worker UInt64 NumAltStreams;
88*f6dc9357SAndroid Build Coastguard Worker UInt64 FilesSize;
89*f6dc9357SAndroid Build Coastguard Worker UInt64 AltStreamsSize;
90*f6dc9357SAndroid Build Coastguard Worker UInt64 NumErrors;
91*f6dc9357SAndroid Build Coastguard Worker
92*f6dc9357SAndroid Build Coastguard Worker UInt64 CurSize;
93*f6dc9357SAndroid Build Coastguard Worker
94*f6dc9357SAndroid Build Coastguard Worker UString MainName;
95*f6dc9357SAndroid Build Coastguard Worker UString FirstFileName;
96*f6dc9357SAndroid Build Coastguard Worker
97*f6dc9357SAndroid Build Coastguard Worker HRESULT SetMethods(DECL_EXTERNAL_CODECS_LOC_VARS const UStringVector &methods);
98*f6dc9357SAndroid Build Coastguard Worker
99*f6dc9357SAndroid Build Coastguard Worker // void Init() {}
CHashBundleZ7_final100*f6dc9357SAndroid Build Coastguard Worker CHashBundle()
101*f6dc9357SAndroid Build Coastguard Worker {
102*f6dc9357SAndroid Build Coastguard Worker NumDirs = NumFiles = NumAltStreams = FilesSize = AltStreamsSize = NumErrors = 0;
103*f6dc9357SAndroid Build Coastguard Worker }
104*f6dc9357SAndroid Build Coastguard Worker
105*f6dc9357SAndroid Build Coastguard Worker void InitForNewFile() Z7_override;
106*f6dc9357SAndroid Build Coastguard Worker void Update(const void *data, UInt32 size) Z7_override;
107*f6dc9357SAndroid Build Coastguard Worker void SetSize(UInt64 size) Z7_override;
108*f6dc9357SAndroid Build Coastguard Worker void Final(bool isDir, bool isAltStream, const UString &path) Z7_override;
109*f6dc9357SAndroid Build Coastguard Worker };
110*f6dc9357SAndroid Build Coastguard Worker
111*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_BEGIN
112*f6dc9357SAndroid Build Coastguard Worker
113*f6dc9357SAndroid Build Coastguard Worker // INTERFACE_IDirItemsCallback(x)
114*f6dc9357SAndroid Build Coastguard Worker
115*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEN_IHashCallbackUI(x) \
116*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT StartScanning() x \
117*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT FinishScanning(const CDirItemsStat &st) x \
118*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT SetNumFiles(UInt64 numFiles) x \
119*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT SetTotal(UInt64 size) x \
120*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT SetCompleted(const UInt64 *completeValue) x \
121*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT CheckBreak() x \
122*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT BeforeFirstFile(const CHashBundle &hb) x \
123*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT GetStream(const wchar_t *name, bool isFolder) x \
124*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT OpenFileError(const FString &path, DWORD systemError) x \
125*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT SetOperationResult(UInt64 fileSize, const CHashBundle &hb, bool showHash) x \
126*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT AfterLastFile(CHashBundle &hb) x \
127*f6dc9357SAndroid Build Coastguard Worker
128*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_DECL_PURE_(IHashCallbackUI, IDirItemsCallback)
129*f6dc9357SAndroid Build Coastguard Worker
130*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_END
131*f6dc9357SAndroid Build Coastguard Worker
132*f6dc9357SAndroid Build Coastguard Worker
133*f6dc9357SAndroid Build Coastguard Worker struct CHashOptionsLocal
134*f6dc9357SAndroid Build Coastguard Worker {
135*f6dc9357SAndroid Build Coastguard Worker CBoolPair HashMode_Zero;
136*f6dc9357SAndroid Build Coastguard Worker CBoolPair HashMode_Tag;
137*f6dc9357SAndroid Build Coastguard Worker CBoolPair HashMode_Dirs;
138*f6dc9357SAndroid Build Coastguard Worker CBoolPair HashMode_OnlyHash;
139*f6dc9357SAndroid Build Coastguard Worker
Init_HashOptionsLocalCHashOptionsLocal140*f6dc9357SAndroid Build Coastguard Worker void Init_HashOptionsLocal()
141*f6dc9357SAndroid Build Coastguard Worker {
142*f6dc9357SAndroid Build Coastguard Worker HashMode_Zero.Init();
143*f6dc9357SAndroid Build Coastguard Worker HashMode_Tag.Init();
144*f6dc9357SAndroid Build Coastguard Worker HashMode_Dirs.Init();
145*f6dc9357SAndroid Build Coastguard Worker HashMode_OnlyHash.Init();
146*f6dc9357SAndroid Build Coastguard Worker // HashMode_Dirs = true; // for debug
147*f6dc9357SAndroid Build Coastguard Worker }
148*f6dc9357SAndroid Build Coastguard Worker
CHashOptionsLocalCHashOptionsLocal149*f6dc9357SAndroid Build Coastguard Worker CHashOptionsLocal()
150*f6dc9357SAndroid Build Coastguard Worker {
151*f6dc9357SAndroid Build Coastguard Worker Init_HashOptionsLocal();
152*f6dc9357SAndroid Build Coastguard Worker }
153*f6dc9357SAndroid Build Coastguard Worker
ParseFlagCharOptionCHashOptionsLocal154*f6dc9357SAndroid Build Coastguard Worker bool ParseFlagCharOption(wchar_t c, bool val)
155*f6dc9357SAndroid Build Coastguard Worker {
156*f6dc9357SAndroid Build Coastguard Worker c = MyCharLower_Ascii(c);
157*f6dc9357SAndroid Build Coastguard Worker if (c == 'z') HashMode_Zero.SetVal_as_Defined(val);
158*f6dc9357SAndroid Build Coastguard Worker else if (c == 't') HashMode_Tag.SetVal_as_Defined(val);
159*f6dc9357SAndroid Build Coastguard Worker else if (c == 'd') HashMode_Dirs.SetVal_as_Defined(val);
160*f6dc9357SAndroid Build Coastguard Worker else if (c == 'h') HashMode_OnlyHash.SetVal_as_Defined(val);
161*f6dc9357SAndroid Build Coastguard Worker else return false;
162*f6dc9357SAndroid Build Coastguard Worker return true;
163*f6dc9357SAndroid Build Coastguard Worker }
164*f6dc9357SAndroid Build Coastguard Worker
ParseStringCHashOptionsLocal165*f6dc9357SAndroid Build Coastguard Worker bool ParseString(const UString &s)
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < s.Len();)
168*f6dc9357SAndroid Build Coastguard Worker {
169*f6dc9357SAndroid Build Coastguard Worker const wchar_t c = s[i++];
170*f6dc9357SAndroid Build Coastguard Worker bool val = true;
171*f6dc9357SAndroid Build Coastguard Worker if (i < s.Len())
172*f6dc9357SAndroid Build Coastguard Worker {
173*f6dc9357SAndroid Build Coastguard Worker const wchar_t next = s[i];
174*f6dc9357SAndroid Build Coastguard Worker if (next == '-')
175*f6dc9357SAndroid Build Coastguard Worker {
176*f6dc9357SAndroid Build Coastguard Worker val = false;
177*f6dc9357SAndroid Build Coastguard Worker i++;
178*f6dc9357SAndroid Build Coastguard Worker }
179*f6dc9357SAndroid Build Coastguard Worker }
180*f6dc9357SAndroid Build Coastguard Worker if (!ParseFlagCharOption(c, val))
181*f6dc9357SAndroid Build Coastguard Worker return false;
182*f6dc9357SAndroid Build Coastguard Worker }
183*f6dc9357SAndroid Build Coastguard Worker return true;
184*f6dc9357SAndroid Build Coastguard Worker }
185*f6dc9357SAndroid Build Coastguard Worker };
186*f6dc9357SAndroid Build Coastguard Worker
187*f6dc9357SAndroid Build Coastguard Worker
188*f6dc9357SAndroid Build Coastguard Worker struct CHashOptions
189*f6dc9357SAndroid Build Coastguard Worker // : public CHashOptionsLocal
190*f6dc9357SAndroid Build Coastguard Worker {
191*f6dc9357SAndroid Build Coastguard Worker UStringVector Methods;
192*f6dc9357SAndroid Build Coastguard Worker // UString HashFilePath;
193*f6dc9357SAndroid Build Coastguard Worker
194*f6dc9357SAndroid Build Coastguard Worker bool PreserveATime;
195*f6dc9357SAndroid Build Coastguard Worker bool OpenShareForWrite;
196*f6dc9357SAndroid Build Coastguard Worker bool StdInMode;
197*f6dc9357SAndroid Build Coastguard Worker bool AltStreamsMode;
198*f6dc9357SAndroid Build Coastguard Worker CBoolPair SymLinks;
199*f6dc9357SAndroid Build Coastguard Worker
200*f6dc9357SAndroid Build Coastguard Worker NWildcard::ECensorPathMode PathMode;
201*f6dc9357SAndroid Build Coastguard Worker
CHashOptionsCHashOptions202*f6dc9357SAndroid Build Coastguard Worker CHashOptions():
203*f6dc9357SAndroid Build Coastguard Worker PreserveATime(false),
204*f6dc9357SAndroid Build Coastguard Worker OpenShareForWrite(false),
205*f6dc9357SAndroid Build Coastguard Worker StdInMode(false),
206*f6dc9357SAndroid Build Coastguard Worker AltStreamsMode(false),
207*f6dc9357SAndroid Build Coastguard Worker PathMode(NWildcard::k_RelatPath) {}
208*f6dc9357SAndroid Build Coastguard Worker };
209*f6dc9357SAndroid Build Coastguard Worker
210*f6dc9357SAndroid Build Coastguard Worker
211*f6dc9357SAndroid Build Coastguard Worker HRESULT HashCalc(
212*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS
213*f6dc9357SAndroid Build Coastguard Worker const NWildcard::CCensor &censor,
214*f6dc9357SAndroid Build Coastguard Worker const CHashOptions &options,
215*f6dc9357SAndroid Build Coastguard Worker AString &errorInfo,
216*f6dc9357SAndroid Build Coastguard Worker IHashCallbackUI *callback);
217*f6dc9357SAndroid Build Coastguard Worker
218*f6dc9357SAndroid Build Coastguard Worker
219*f6dc9357SAndroid Build Coastguard Worker
220*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
221*f6dc9357SAndroid Build Coastguard Worker
222*f6dc9357SAndroid Build Coastguard Worker namespace NHash {
223*f6dc9357SAndroid Build Coastguard Worker
224*f6dc9357SAndroid Build Coastguard Worker struct CHashPair
225*f6dc9357SAndroid Build Coastguard Worker {
226*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Hash;
227*f6dc9357SAndroid Build Coastguard Worker char Mode;
228*f6dc9357SAndroid Build Coastguard Worker bool IsBSD;
229*f6dc9357SAndroid Build Coastguard Worker bool Escape;
230*f6dc9357SAndroid Build Coastguard Worker bool Size_from_Arc_Defined;
231*f6dc9357SAndroid Build Coastguard Worker bool Size_from_Disk_Defined;
232*f6dc9357SAndroid Build Coastguard Worker AString Method;
233*f6dc9357SAndroid Build Coastguard Worker AString Name;
234*f6dc9357SAndroid Build Coastguard Worker
235*f6dc9357SAndroid Build Coastguard Worker AString FullLine;
236*f6dc9357SAndroid Build Coastguard Worker AString HashString;
237*f6dc9357SAndroid Build Coastguard Worker // unsigned HashLengthInBits;
238*f6dc9357SAndroid Build Coastguard Worker
239*f6dc9357SAndroid Build Coastguard Worker // AString MethodName;
240*f6dc9357SAndroid Build Coastguard Worker UInt64 Size_from_Arc;
241*f6dc9357SAndroid Build Coastguard Worker UInt64 Size_from_Disk;
242*f6dc9357SAndroid Build Coastguard Worker
243*f6dc9357SAndroid Build Coastguard Worker bool IsDir() const;
244*f6dc9357SAndroid Build Coastguard Worker
Get_UString_PathCHashPair245*f6dc9357SAndroid Build Coastguard Worker void Get_UString_Path(UString &path) const
246*f6dc9357SAndroid Build Coastguard Worker {
247*f6dc9357SAndroid Build Coastguard Worker path.Empty();
248*f6dc9357SAndroid Build Coastguard Worker if (!ConvertUTF8ToUnicode(Name, path))
249*f6dc9357SAndroid Build Coastguard Worker return;
250*f6dc9357SAndroid Build Coastguard Worker }
251*f6dc9357SAndroid Build Coastguard Worker
252*f6dc9357SAndroid Build Coastguard Worker bool ParseCksum(const char *s);
253*f6dc9357SAndroid Build Coastguard Worker bool Parse(const char *s);
254*f6dc9357SAndroid Build Coastguard Worker
IsSupportedModeCHashPair255*f6dc9357SAndroid Build Coastguard Worker bool IsSupportedMode() const
256*f6dc9357SAndroid Build Coastguard Worker {
257*f6dc9357SAndroid Build Coastguard Worker return Mode != 'U' && Mode != '^';
258*f6dc9357SAndroid Build Coastguard Worker }
259*f6dc9357SAndroid Build Coastguard Worker
CHashPairCHashPair260*f6dc9357SAndroid Build Coastguard Worker CHashPair():
261*f6dc9357SAndroid Build Coastguard Worker Mode(0)
262*f6dc9357SAndroid Build Coastguard Worker , IsBSD(false)
263*f6dc9357SAndroid Build Coastguard Worker , Escape(false)
264*f6dc9357SAndroid Build Coastguard Worker , Size_from_Arc_Defined(false)
265*f6dc9357SAndroid Build Coastguard Worker , Size_from_Disk_Defined(false)
266*f6dc9357SAndroid Build Coastguard Worker // , HashLengthInBits(0)
267*f6dc9357SAndroid Build Coastguard Worker , Size_from_Arc(0)
268*f6dc9357SAndroid Build Coastguard Worker , Size_from_Disk(0)
269*f6dc9357SAndroid Build Coastguard Worker {}
270*f6dc9357SAndroid Build Coastguard Worker };
271*f6dc9357SAndroid Build Coastguard Worker
272*f6dc9357SAndroid Build Coastguard Worker
273*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_CHandler_IInArchive_3(
274*f6dc9357SAndroid Build Coastguard Worker IArchiveGetRawProps,
275*f6dc9357SAndroid Build Coastguard Worker /* public IGetArchiveHashHandler, */
276*f6dc9357SAndroid Build Coastguard Worker IOutArchive,
277*f6dc9357SAndroid Build Coastguard Worker ISetProperties
278*f6dc9357SAndroid Build Coastguard Worker )
279*f6dc9357SAndroid Build Coastguard Worker bool _isArc;
280*f6dc9357SAndroid Build Coastguard Worker bool _supportWindowsBackslash;
281*f6dc9357SAndroid Build Coastguard Worker bool _crcSize_WasSet;
282*f6dc9357SAndroid Build Coastguard Worker UInt64 _phySize;
283*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CHashPair> HashPairs;
284*f6dc9357SAndroid Build Coastguard Worker UString _nameExtenstion;
285*f6dc9357SAndroid Build Coastguard Worker // UString _method_fromName;
286*f6dc9357SAndroid Build Coastguard Worker AString _pgpMethod;
287*f6dc9357SAndroid Build Coastguard Worker bool _is_CksumMode;
288*f6dc9357SAndroid Build Coastguard Worker bool _is_PgpMethod;
289*f6dc9357SAndroid Build Coastguard Worker bool _is_ZeroMode;
290*f6dc9357SAndroid Build Coastguard Worker bool _are_there_Tags;
291*f6dc9357SAndroid Build Coastguard Worker bool _are_there_Dirs;
292*f6dc9357SAndroid Build Coastguard Worker bool _hashSize_Defined;
293*f6dc9357SAndroid Build Coastguard Worker unsigned _hashSize;
294*f6dc9357SAndroid Build Coastguard Worker UInt32 _crcSize;
295*f6dc9357SAndroid Build Coastguard Worker UStringVector _methods;
296*f6dc9357SAndroid Build Coastguard Worker CHashOptionsLocal _options;
297*f6dc9357SAndroid Build Coastguard Worker
298*f6dc9357SAndroid Build Coastguard Worker void ClearVars();
299*f6dc9357SAndroid Build Coastguard Worker
InitProps()300*f6dc9357SAndroid Build Coastguard Worker void InitProps()
301*f6dc9357SAndroid Build Coastguard Worker {
302*f6dc9357SAndroid Build Coastguard Worker _supportWindowsBackslash = true;
303*f6dc9357SAndroid Build Coastguard Worker _crcSize_WasSet = false;
304*f6dc9357SAndroid Build Coastguard Worker _crcSize = 4;
305*f6dc9357SAndroid Build Coastguard Worker _methods.Clear();
306*f6dc9357SAndroid Build Coastguard Worker _options.Init_HashOptionsLocal();
307*f6dc9357SAndroid Build Coastguard Worker }
308*f6dc9357SAndroid Build Coastguard Worker
CanUpdate()309*f6dc9357SAndroid Build Coastguard Worker bool CanUpdate() const
310*f6dc9357SAndroid Build Coastguard Worker {
311*f6dc9357SAndroid Build Coastguard Worker if (!_isArc || _is_PgpMethod || _is_CksumMode)
312*f6dc9357SAndroid Build Coastguard Worker return false;
313*f6dc9357SAndroid Build Coastguard Worker return true;
314*f6dc9357SAndroid Build Coastguard Worker }
315*f6dc9357SAndroid Build Coastguard Worker
316*f6dc9357SAndroid Build Coastguard Worker HRESULT SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value);
317*f6dc9357SAndroid Build Coastguard Worker
318*f6dc9357SAndroid Build Coastguard Worker public:
319*f6dc9357SAndroid Build Coastguard Worker CHandler();
320*f6dc9357SAndroid Build Coastguard Worker };
321*f6dc9357SAndroid Build Coastguard Worker
322*f6dc9357SAndroid Build Coastguard Worker }
323*f6dc9357SAndroid Build Coastguard Worker
324*f6dc9357SAndroid Build Coastguard Worker void Codecs_AddHashArcHandler(CCodecs *codecs);
325*f6dc9357SAndroid Build Coastguard Worker
326*f6dc9357SAndroid Build Coastguard Worker #endif
327*f6dc9357SAndroid Build Coastguard Worker
328*f6dc9357SAndroid Build Coastguard Worker
329*f6dc9357SAndroid Build Coastguard Worker #endif
330