// HashCalc.h | |
#ifndef __HASH_CALC_H | |
#define __HASH_CALC_H | |
#include "../../../Common/Wildcard.h" | |
#include "../../Common/CreateCoder.h" | |
#include "../../Common/MethodProps.h" | |
#include "Property.h" | |
const unsigned k_HashCalc_DigestSize_Max = 64; | |
const unsigned k_HashCalc_NumGroups = 4; | |
enum | |
{ | |
k_HashCalc_Index_Current, | |
k_HashCalc_Index_DataSum, | |
k_HashCalc_Index_NamesSum, | |
k_HashCalc_Index_StreamsSum | |
}; | |
struct CHasherState | |
{ | |
CMyComPtr<IHasher> Hasher; | |
UString Name; | |
UInt32 DigestSize; | |
Byte Digests[k_HashCalc_NumGroups][k_HashCalc_DigestSize_Max]; | |
}; | |
struct IHashCalc | |
{ | |
virtual void InitForNewFile() = 0; | |
virtual void Update(const void *data, UInt32 size) = 0; | |
virtual void SetSize(UInt64 size) = 0; | |
virtual void Final(bool isDir, bool isAltStream, const UString &path) = 0; | |
}; | |
struct CHashBundle: public IHashCalc | |
{ | |
CObjectVector<CHasherState> Hashers; | |
UInt64 NumFiles; | |
UInt64 NumDirs; | |
UInt64 NumAltStreams; | |
UInt64 FilesSize; | |
UInt64 AltStreamsSize; | |
UInt64 NumErrors; | |
UInt64 CurSize; | |
HRESULT SetMethods(DECL_EXTERNAL_CODECS_LOC_VARS const UStringVector &methods); | |
void Init() | |
{ | |
NumFiles = NumDirs = NumAltStreams = FilesSize = AltStreamsSize = NumErrors = 0; | |
} | |
void InitForNewFile(); | |
void Update(const void *data, UInt32 size); | |
void SetSize(UInt64 size); | |
void Final(bool isDir, bool isAltStream, const UString &path); | |
}; | |
#define INTERFACE_IHashCallbackUI(x) \ | |
virtual HRESULT StartScanning() x; \ | |
virtual HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, UInt64 totalSize, const wchar_t *path, bool isDir) x; \ | |
virtual HRESULT CanNotFindError(const wchar_t *name, DWORD systemError) x; \ | |
virtual HRESULT FinishScanning() x; \ | |
virtual HRESULT SetNumFiles(UInt64 numFiles) x; \ | |
virtual HRESULT SetTotal(UInt64 size) x; \ | |
virtual HRESULT SetCompleted(const UInt64 *completeValue) x; \ | |
virtual HRESULT CheckBreak() x; \ | |
virtual HRESULT BeforeFirstFile(const CHashBundle &hb) x; \ | |
virtual HRESULT GetStream(const wchar_t *name, bool isFolder) x; \ | |
virtual HRESULT OpenFileError(const wchar_t *name, DWORD systemError) x; \ | |
virtual HRESULT SetOperationResult(UInt64 fileSize, const CHashBundle &hb, bool showHash) x; \ | |
virtual HRESULT AfterLastFile(const CHashBundle &hb) x; \ | |
struct IHashCallbackUI | |
{ | |
INTERFACE_IHashCallbackUI(=0) | |
}; | |
struct CHashOptions | |
{ | |
UStringVector Methods; | |
bool OpenShareForWrite; | |
bool StdInMode; | |
bool AltStreamsMode; | |
NWildcard::ECensorPathMode PathMode; | |
CHashOptions(): StdInMode(false), OpenShareForWrite(false), AltStreamsMode(false), PathMode(NWildcard::k_RelatPath) {}; | |
}; | |
HRESULT HashCalc( | |
DECL_EXTERNAL_CODECS_LOC_VARS | |
const NWildcard::CCensor &censor, | |
const CHashOptions &options, | |
UString &errorInfo, | |
IHashCallbackUI *callback); | |
void AddHashHexToString(char *dest, const Byte *data, UInt32 size); | |
#endif |