xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/HashCalc.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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