1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// HashCalc.h
2cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
3cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef __HASH_CALC_H
4cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define __HASH_CALC_H
5cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Common/Wildcard.h"
7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../Common/CreateCoder.h"
9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../Common/MethodProps.h"
10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "Property.h"
12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyconst unsigned k_HashCalc_DigestSize_Max = 64;
14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyconst unsigned k_HashCalc_NumGroups = 4;
16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyenum
18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  k_HashCalc_Index_Current,
20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  k_HashCalc_Index_DataSum,
21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  k_HashCalc_Index_NamesSum,
22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  k_HashCalc_Index_StreamsSum
23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystruct CHasherState
26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CMyComPtr<IHasher> Hasher;
28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UString Name;
29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt32 DigestSize;
30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  Byte Digests[k_HashCalc_NumGroups][k_HashCalc_DigestSize_Max];
31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystruct IHashCalc
34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual void InitForNewFile() = 0;
36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual void Update(const void *data, UInt32 size) = 0;
37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual void SetSize(UInt64 size) = 0;
38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual void Final(bool isDir, bool isAltStream, const UString &path) = 0;
39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystruct CHashBundle: public IHashCalc
42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CObjectVector<CHasherState> Hashers;
44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 NumFiles;
46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 NumDirs;
47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 NumAltStreams;
48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 FilesSize;
49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 AltStreamsSize;
50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 NumErrors;
51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UInt64 CurSize;
53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  HRESULT SetMethods(DECL_EXTERNAL_CODECS_LOC_VARS const UStringVector &methods);
55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Init()
57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    NumFiles = NumDirs = NumAltStreams = FilesSize = AltStreamsSize = NumErrors = 0;
59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
61cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void InitForNewFile();
62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Update(const void *data, UInt32 size);
63cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void SetSize(UInt64 size);
64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  void Final(bool isDir, bool isAltStream, const UString &path);
65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define INTERFACE_IHashCallbackUI(x) \
68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT StartScanning() x; \
69cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, UInt64 totalSize, const wchar_t *path, bool isDir) x; \
70cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT CanNotFindError(const wchar_t *name, DWORD systemError) x; \
71cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT FinishScanning() x; \
72cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT SetNumFiles(UInt64 numFiles) x; \
73cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT SetTotal(UInt64 size) x; \
74cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT SetCompleted(const UInt64 *completeValue) x; \
75cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT CheckBreak() x; \
76cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT BeforeFirstFile(const CHashBundle &hb) x; \
77cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT GetStream(const wchar_t *name, bool isFolder) x; \
78cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT OpenFileError(const wchar_t *name, DWORD systemError) x; \
79cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT SetOperationResult(UInt64 fileSize, const CHashBundle &hb, bool showHash) x; \
80cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  virtual HRESULT AfterLastFile(const CHashBundle &hb) x; \
81cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
82cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystruct IHashCallbackUI
83cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
84cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  INTERFACE_IHashCallbackUI(=0)
85cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
86cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
87cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystruct CHashOptions
88cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
89cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UStringVector Methods;
90cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool OpenShareForWrite;
91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool StdInMode;
92cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bool AltStreamsMode;
93cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  NWildcard::ECensorPathMode PathMode;
94cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
95cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CHashOptions(): StdInMode(false), OpenShareForWrite(false), AltStreamsMode(false), PathMode(NWildcard::k_RelatPath) {};
96cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky};
97cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
98cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT HashCalc(
99cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    DECL_EXTERNAL_CODECS_LOC_VARS
100cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    const NWildcard::CCensor &censor,
101cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    const CHashOptions &options,
102cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    UString &errorInfo,
103cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    IHashCallbackUI *callback);
104cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
105cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyvoid AddHashHexToString(char *dest, const Byte *data, UInt32 size);
106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
108