1*f6dc9357SAndroid Build Coastguard Worker // HashCon.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 "../../../Common/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "ConsoleClose.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "HashCon.h"
11*f6dc9357SAndroid Build Coastguard Worker
12*f6dc9357SAndroid Build Coastguard Worker static const char * const kEmptyFileAlias = "[Content]";
13*f6dc9357SAndroid Build Coastguard Worker
14*f6dc9357SAndroid Build Coastguard Worker static const char * const kScanningMessage = "Scanning";
15*f6dc9357SAndroid Build Coastguard Worker
CheckBreak2()16*f6dc9357SAndroid Build Coastguard Worker static HRESULT CheckBreak2()
17*f6dc9357SAndroid Build Coastguard Worker {
18*f6dc9357SAndroid Build Coastguard Worker return NConsoleClose::TestBreakSignal() ? E_ABORT : S_OK;
19*f6dc9357SAndroid Build Coastguard Worker }
20*f6dc9357SAndroid Build Coastguard Worker
CheckBreak()21*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::CheckBreak()
22*f6dc9357SAndroid Build Coastguard Worker {
23*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
24*f6dc9357SAndroid Build Coastguard Worker }
25*f6dc9357SAndroid Build Coastguard Worker
StartScanning()26*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::StartScanning()
27*f6dc9357SAndroid Build Coastguard Worker {
28*f6dc9357SAndroid Build Coastguard Worker if (PrintHeaders && _so)
29*f6dc9357SAndroid Build Coastguard Worker *_so << kScanningMessage << endl;
30*f6dc9357SAndroid Build Coastguard Worker if (NeedPercents())
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker _percent.ClearCurState();
33*f6dc9357SAndroid Build Coastguard Worker _percent.Command = "Scan";
34*f6dc9357SAndroid Build Coastguard Worker }
35*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
36*f6dc9357SAndroid Build Coastguard Worker }
37*f6dc9357SAndroid Build Coastguard Worker
ScanProgress(const CDirItemsStat & st,const FString & path,bool isDir)38*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::ScanProgress(const CDirItemsStat &st, const FString &path, bool isDir)
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker if (NeedPercents())
41*f6dc9357SAndroid Build Coastguard Worker {
42*f6dc9357SAndroid Build Coastguard Worker _percent.Files = st.NumDirs + st.NumFiles + st.NumAltStreams;
43*f6dc9357SAndroid Build Coastguard Worker _percent.Completed = st.GetTotalBytes();
44*f6dc9357SAndroid Build Coastguard Worker _percent.FileName = fs2us(path);
45*f6dc9357SAndroid Build Coastguard Worker if (isDir)
46*f6dc9357SAndroid Build Coastguard Worker NWindows::NFile::NName::NormalizeDirPathPrefix(_percent.FileName);
47*f6dc9357SAndroid Build Coastguard Worker _percent.Print();
48*f6dc9357SAndroid Build Coastguard Worker }
49*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
50*f6dc9357SAndroid Build Coastguard Worker }
51*f6dc9357SAndroid Build Coastguard Worker
ScanError(const FString & path,DWORD systemError)52*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::ScanError(const FString &path, DWORD systemError)
53*f6dc9357SAndroid Build Coastguard Worker {
54*f6dc9357SAndroid Build Coastguard Worker return ScanError_Base(path, systemError);
55*f6dc9357SAndroid Build Coastguard Worker }
56*f6dc9357SAndroid Build Coastguard Worker
57*f6dc9357SAndroid Build Coastguard Worker void Print_DirItemsStat(AString &s, const CDirItemsStat &st);
58*f6dc9357SAndroid Build Coastguard Worker
FinishScanning(const CDirItemsStat & st)59*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::FinishScanning(const CDirItemsStat &st)
60*f6dc9357SAndroid Build Coastguard Worker {
61*f6dc9357SAndroid Build Coastguard Worker if (NeedPercents())
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker _percent.ClosePrint(true);
64*f6dc9357SAndroid Build Coastguard Worker _percent.ClearCurState();
65*f6dc9357SAndroid Build Coastguard Worker }
66*f6dc9357SAndroid Build Coastguard Worker if (PrintHeaders && _so)
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker Print_DirItemsStat(_s, st);
69*f6dc9357SAndroid Build Coastguard Worker *_so << _s << endl << endl;
70*f6dc9357SAndroid Build Coastguard Worker }
71*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
72*f6dc9357SAndroid Build Coastguard Worker }
73*f6dc9357SAndroid Build Coastguard Worker
SetNumFiles(UInt64)74*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::SetNumFiles(UInt64 /* numFiles */)
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
77*f6dc9357SAndroid Build Coastguard Worker }
78*f6dc9357SAndroid Build Coastguard Worker
SetTotal(UInt64 size)79*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::SetTotal(UInt64 size)
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker if (NeedPercents())
82*f6dc9357SAndroid Build Coastguard Worker {
83*f6dc9357SAndroid Build Coastguard Worker _percent.Total = size;
84*f6dc9357SAndroid Build Coastguard Worker _percent.Print();
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
87*f6dc9357SAndroid Build Coastguard Worker }
88*f6dc9357SAndroid Build Coastguard Worker
SetCompleted(const UInt64 * completeValue)89*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::SetCompleted(const UInt64 *completeValue)
90*f6dc9357SAndroid Build Coastguard Worker {
91*f6dc9357SAndroid Build Coastguard Worker if (completeValue && NeedPercents())
92*f6dc9357SAndroid Build Coastguard Worker {
93*f6dc9357SAndroid Build Coastguard Worker _percent.Completed = *completeValue;
94*f6dc9357SAndroid Build Coastguard Worker _percent.Print();
95*f6dc9357SAndroid Build Coastguard Worker }
96*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
97*f6dc9357SAndroid Build Coastguard Worker }
98*f6dc9357SAndroid Build Coastguard Worker
AddMinuses(AString & s,unsigned num)99*f6dc9357SAndroid Build Coastguard Worker static void AddMinuses(AString &s, unsigned num)
100*f6dc9357SAndroid Build Coastguard Worker {
101*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < num; i++)
102*f6dc9357SAndroid Build Coastguard Worker s.Add_Minus();
103*f6dc9357SAndroid Build Coastguard Worker }
104*f6dc9357SAndroid Build Coastguard Worker
AddSpaces_if_Positive(AString & s,int num)105*f6dc9357SAndroid Build Coastguard Worker static void AddSpaces_if_Positive(AString &s, int num)
106*f6dc9357SAndroid Build Coastguard Worker {
107*f6dc9357SAndroid Build Coastguard Worker for (int i = 0; i < num; i++)
108*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
109*f6dc9357SAndroid Build Coastguard Worker }
110*f6dc9357SAndroid Build Coastguard Worker
SetSpacesAndNul(char * s,unsigned num)111*f6dc9357SAndroid Build Coastguard Worker static void SetSpacesAndNul(char *s, unsigned num)
112*f6dc9357SAndroid Build Coastguard Worker {
113*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < num; i++)
114*f6dc9357SAndroid Build Coastguard Worker s[i] = ' ';
115*f6dc9357SAndroid Build Coastguard Worker s[num] = 0;
116*f6dc9357SAndroid Build Coastguard Worker }
117*f6dc9357SAndroid Build Coastguard Worker
SetSpacesAndNul_if_Positive(char * s,int num)118*f6dc9357SAndroid Build Coastguard Worker static void SetSpacesAndNul_if_Positive(char *s, int num)
119*f6dc9357SAndroid Build Coastguard Worker {
120*f6dc9357SAndroid Build Coastguard Worker if (num < 0)
121*f6dc9357SAndroid Build Coastguard Worker return;
122*f6dc9357SAndroid Build Coastguard Worker for (int i = 0; i < num; i++)
123*f6dc9357SAndroid Build Coastguard Worker s[i] = ' ';
124*f6dc9357SAndroid Build Coastguard Worker s[num] = 0;
125*f6dc9357SAndroid Build Coastguard Worker }
126*f6dc9357SAndroid Build Coastguard Worker
127*f6dc9357SAndroid Build Coastguard Worker static const unsigned kSizeField_Len = 13;
128*f6dc9357SAndroid Build Coastguard Worker static const unsigned kNameField_Len = 12;
129*f6dc9357SAndroid Build Coastguard Worker
130*f6dc9357SAndroid Build Coastguard Worker static const unsigned kHashColumnWidth_Min = 4 * 2;
131*f6dc9357SAndroid Build Coastguard Worker
GetColumnWidth(unsigned digestSize)132*f6dc9357SAndroid Build Coastguard Worker static unsigned GetColumnWidth(unsigned digestSize)
133*f6dc9357SAndroid Build Coastguard Worker {
134*f6dc9357SAndroid Build Coastguard Worker unsigned width = digestSize * 2;
135*f6dc9357SAndroid Build Coastguard Worker return width < kHashColumnWidth_Min ? kHashColumnWidth_Min: width;
136*f6dc9357SAndroid Build Coastguard Worker }
137*f6dc9357SAndroid Build Coastguard Worker
138*f6dc9357SAndroid Build Coastguard Worker
GetFields() const139*f6dc9357SAndroid Build Coastguard Worker AString CHashCallbackConsole::GetFields() const
140*f6dc9357SAndroid Build Coastguard Worker {
141*f6dc9357SAndroid Build Coastguard Worker AString s (PrintFields);
142*f6dc9357SAndroid Build Coastguard Worker if (s.IsEmpty())
143*f6dc9357SAndroid Build Coastguard Worker s = "hsn";
144*f6dc9357SAndroid Build Coastguard Worker s.MakeLower_Ascii();
145*f6dc9357SAndroid Build Coastguard Worker return s;
146*f6dc9357SAndroid Build Coastguard Worker }
147*f6dc9357SAndroid Build Coastguard Worker
148*f6dc9357SAndroid Build Coastguard Worker
PrintSeparatorLine(const CObjectVector<CHasherState> & hashers)149*f6dc9357SAndroid Build Coastguard Worker void CHashCallbackConsole::PrintSeparatorLine(const CObjectVector<CHasherState> &hashers)
150*f6dc9357SAndroid Build Coastguard Worker {
151*f6dc9357SAndroid Build Coastguard Worker _s.Empty();
152*f6dc9357SAndroid Build Coastguard Worker const AString fields = GetFields();
153*f6dc9357SAndroid Build Coastguard Worker for (unsigned pos = 0; pos < fields.Len(); pos++)
154*f6dc9357SAndroid Build Coastguard Worker {
155*f6dc9357SAndroid Build Coastguard Worker const char c = fields[pos];
156*f6dc9357SAndroid Build Coastguard Worker if (c == 'h')
157*f6dc9357SAndroid Build Coastguard Worker {
158*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < hashers.Size(); i++)
159*f6dc9357SAndroid Build Coastguard Worker {
160*f6dc9357SAndroid Build Coastguard Worker AddSpace();
161*f6dc9357SAndroid Build Coastguard Worker const CHasherState &h = hashers[i];
162*f6dc9357SAndroid Build Coastguard Worker AddMinuses(_s, GetColumnWidth(h.DigestSize));
163*f6dc9357SAndroid Build Coastguard Worker }
164*f6dc9357SAndroid Build Coastguard Worker }
165*f6dc9357SAndroid Build Coastguard Worker else if (c == 's')
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker AddSpace();
168*f6dc9357SAndroid Build Coastguard Worker AddMinuses(_s, kSizeField_Len);
169*f6dc9357SAndroid Build Coastguard Worker }
170*f6dc9357SAndroid Build Coastguard Worker else if (c == 'n')
171*f6dc9357SAndroid Build Coastguard Worker {
172*f6dc9357SAndroid Build Coastguard Worker AddSpacesBeforeName();
173*f6dc9357SAndroid Build Coastguard Worker AddMinuses(_s, kNameField_Len);
174*f6dc9357SAndroid Build Coastguard Worker }
175*f6dc9357SAndroid Build Coastguard Worker }
176*f6dc9357SAndroid Build Coastguard Worker
177*f6dc9357SAndroid Build Coastguard Worker *_so << _s << endl;
178*f6dc9357SAndroid Build Coastguard Worker }
179*f6dc9357SAndroid Build Coastguard Worker
180*f6dc9357SAndroid Build Coastguard Worker
BeforeFirstFile(const CHashBundle & hb)181*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::BeforeFirstFile(const CHashBundle &hb)
182*f6dc9357SAndroid Build Coastguard Worker {
183*f6dc9357SAndroid Build Coastguard Worker if (PrintHeaders && _so)
184*f6dc9357SAndroid Build Coastguard Worker {
185*f6dc9357SAndroid Build Coastguard Worker _s.Empty();
186*f6dc9357SAndroid Build Coastguard Worker ClosePercents_for_so();
187*f6dc9357SAndroid Build Coastguard Worker
188*f6dc9357SAndroid Build Coastguard Worker const AString fields = GetFields();
189*f6dc9357SAndroid Build Coastguard Worker for (unsigned pos = 0; pos < fields.Len(); pos++)
190*f6dc9357SAndroid Build Coastguard Worker {
191*f6dc9357SAndroid Build Coastguard Worker const char c = fields[pos];
192*f6dc9357SAndroid Build Coastguard Worker if (c == 'h')
193*f6dc9357SAndroid Build Coastguard Worker {
194*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, hb.Hashers)
195*f6dc9357SAndroid Build Coastguard Worker {
196*f6dc9357SAndroid Build Coastguard Worker AddSpace();
197*f6dc9357SAndroid Build Coastguard Worker const CHasherState &h = hb.Hashers[i];
198*f6dc9357SAndroid Build Coastguard Worker _s += h.Name;
199*f6dc9357SAndroid Build Coastguard Worker AddSpaces_if_Positive(_s, (int)GetColumnWidth(h.DigestSize) - (int)h.Name.Len());
200*f6dc9357SAndroid Build Coastguard Worker }
201*f6dc9357SAndroid Build Coastguard Worker }
202*f6dc9357SAndroid Build Coastguard Worker
203*f6dc9357SAndroid Build Coastguard Worker else if (c == 's')
204*f6dc9357SAndroid Build Coastguard Worker {
205*f6dc9357SAndroid Build Coastguard Worker AddSpace();
206*f6dc9357SAndroid Build Coastguard Worker const AString s2 ("Size");
207*f6dc9357SAndroid Build Coastguard Worker AddSpaces_if_Positive(_s, (int)kSizeField_Len - (int)s2.Len());
208*f6dc9357SAndroid Build Coastguard Worker _s += s2;
209*f6dc9357SAndroid Build Coastguard Worker }
210*f6dc9357SAndroid Build Coastguard Worker else if (c == 'n')
211*f6dc9357SAndroid Build Coastguard Worker {
212*f6dc9357SAndroid Build Coastguard Worker AddSpacesBeforeName();
213*f6dc9357SAndroid Build Coastguard Worker _s += "Name";
214*f6dc9357SAndroid Build Coastguard Worker }
215*f6dc9357SAndroid Build Coastguard Worker }
216*f6dc9357SAndroid Build Coastguard Worker
217*f6dc9357SAndroid Build Coastguard Worker *_so << _s << endl;
218*f6dc9357SAndroid Build Coastguard Worker PrintSeparatorLine(hb.Hashers);
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker
221*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
222*f6dc9357SAndroid Build Coastguard Worker }
223*f6dc9357SAndroid Build Coastguard Worker
OpenFileError(const FString & path,DWORD systemError)224*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::OpenFileError(const FString &path, DWORD systemError)
225*f6dc9357SAndroid Build Coastguard Worker {
226*f6dc9357SAndroid Build Coastguard Worker return OpenFileError_Base(path, systemError);
227*f6dc9357SAndroid Build Coastguard Worker }
228*f6dc9357SAndroid Build Coastguard Worker
GetStream(const wchar_t * name,bool isDir)229*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::GetStream(const wchar_t *name, bool isDir)
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker _fileName = name;
232*f6dc9357SAndroid Build Coastguard Worker if (isDir)
233*f6dc9357SAndroid Build Coastguard Worker NWindows::NFile::NName::NormalizeDirPathPrefix(_fileName);
234*f6dc9357SAndroid Build Coastguard Worker
235*f6dc9357SAndroid Build Coastguard Worker if (NeedPercents())
236*f6dc9357SAndroid Build Coastguard Worker {
237*f6dc9357SAndroid Build Coastguard Worker if (PrintNameInPercents)
238*f6dc9357SAndroid Build Coastguard Worker {
239*f6dc9357SAndroid Build Coastguard Worker _percent.FileName.Empty();
240*f6dc9357SAndroid Build Coastguard Worker if (name)
241*f6dc9357SAndroid Build Coastguard Worker _percent.FileName = name;
242*f6dc9357SAndroid Build Coastguard Worker }
243*f6dc9357SAndroid Build Coastguard Worker _percent.Print();
244*f6dc9357SAndroid Build Coastguard Worker }
245*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
246*f6dc9357SAndroid Build Coastguard Worker }
247*f6dc9357SAndroid Build Coastguard Worker
248*f6dc9357SAndroid Build Coastguard Worker
249*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_DigestStringSize = k_HashCalc_DigestSize_Max * 2 + k_HashCalc_ExtraSize * 2 + 16;
250*f6dc9357SAndroid Build Coastguard Worker
251*f6dc9357SAndroid Build Coastguard Worker
252*f6dc9357SAndroid Build Coastguard Worker
PrintResultLine(UInt64 fileSize,const CObjectVector<CHasherState> & hashers,unsigned digestIndex,bool showHash,const AString & path)253*f6dc9357SAndroid Build Coastguard Worker void CHashCallbackConsole::PrintResultLine(UInt64 fileSize,
254*f6dc9357SAndroid Build Coastguard Worker const CObjectVector<CHasherState> &hashers, unsigned digestIndex, bool showHash,
255*f6dc9357SAndroid Build Coastguard Worker const AString &path)
256*f6dc9357SAndroid Build Coastguard Worker {
257*f6dc9357SAndroid Build Coastguard Worker ClosePercents_for_so();
258*f6dc9357SAndroid Build Coastguard Worker
259*f6dc9357SAndroid Build Coastguard Worker _s.Empty();
260*f6dc9357SAndroid Build Coastguard Worker const AString fields = GetFields();
261*f6dc9357SAndroid Build Coastguard Worker
262*f6dc9357SAndroid Build Coastguard Worker for (unsigned pos = 0; pos < fields.Len(); pos++)
263*f6dc9357SAndroid Build Coastguard Worker {
264*f6dc9357SAndroid Build Coastguard Worker const char c = fields[pos];
265*f6dc9357SAndroid Build Coastguard Worker if (c == 'h')
266*f6dc9357SAndroid Build Coastguard Worker {
267*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, hashers)
268*f6dc9357SAndroid Build Coastguard Worker {
269*f6dc9357SAndroid Build Coastguard Worker AddSpace();
270*f6dc9357SAndroid Build Coastguard Worker const CHasherState &h = hashers[i];
271*f6dc9357SAndroid Build Coastguard Worker char s[k_DigestStringSize];
272*f6dc9357SAndroid Build Coastguard Worker s[0] = 0;
273*f6dc9357SAndroid Build Coastguard Worker if (showHash)
274*f6dc9357SAndroid Build Coastguard Worker h.WriteToString(digestIndex, s);
275*f6dc9357SAndroid Build Coastguard Worker const unsigned len = (unsigned)strlen(s);
276*f6dc9357SAndroid Build Coastguard Worker SetSpacesAndNul_if_Positive(s + len, (int)GetColumnWidth(h.DigestSize) - (int)len);
277*f6dc9357SAndroid Build Coastguard Worker _s += s;
278*f6dc9357SAndroid Build Coastguard Worker }
279*f6dc9357SAndroid Build Coastguard Worker }
280*f6dc9357SAndroid Build Coastguard Worker else if (c == 's')
281*f6dc9357SAndroid Build Coastguard Worker {
282*f6dc9357SAndroid Build Coastguard Worker AddSpace();
283*f6dc9357SAndroid Build Coastguard Worker char s[kSizeField_Len + 32];
284*f6dc9357SAndroid Build Coastguard Worker char *p = s;
285*f6dc9357SAndroid Build Coastguard Worker SetSpacesAndNul(s, kSizeField_Len);
286*f6dc9357SAndroid Build Coastguard Worker if (showHash)
287*f6dc9357SAndroid Build Coastguard Worker {
288*f6dc9357SAndroid Build Coastguard Worker p = s + kSizeField_Len;
289*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(fileSize, p);
290*f6dc9357SAndroid Build Coastguard Worker const int numSpaces = (int)kSizeField_Len - (int)strlen(p);
291*f6dc9357SAndroid Build Coastguard Worker if (numSpaces > 0)
292*f6dc9357SAndroid Build Coastguard Worker p -= (unsigned)numSpaces;
293*f6dc9357SAndroid Build Coastguard Worker }
294*f6dc9357SAndroid Build Coastguard Worker _s += p;
295*f6dc9357SAndroid Build Coastguard Worker }
296*f6dc9357SAndroid Build Coastguard Worker else if (c == 'n')
297*f6dc9357SAndroid Build Coastguard Worker {
298*f6dc9357SAndroid Build Coastguard Worker AddSpacesBeforeName();
299*f6dc9357SAndroid Build Coastguard Worker _s += path;
300*f6dc9357SAndroid Build Coastguard Worker }
301*f6dc9357SAndroid Build Coastguard Worker }
302*f6dc9357SAndroid Build Coastguard Worker
303*f6dc9357SAndroid Build Coastguard Worker *_so << _s;
304*f6dc9357SAndroid Build Coastguard Worker }
305*f6dc9357SAndroid Build Coastguard Worker
306*f6dc9357SAndroid Build Coastguard Worker
SetOperationResult(UInt64 fileSize,const CHashBundle & hb,bool showHash)307*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::SetOperationResult(UInt64 fileSize, const CHashBundle &hb, bool showHash)
308*f6dc9357SAndroid Build Coastguard Worker {
309*f6dc9357SAndroid Build Coastguard Worker if (_so)
310*f6dc9357SAndroid Build Coastguard Worker {
311*f6dc9357SAndroid Build Coastguard Worker AString s;
312*f6dc9357SAndroid Build Coastguard Worker if (_fileName.IsEmpty())
313*f6dc9357SAndroid Build Coastguard Worker s = kEmptyFileAlias;
314*f6dc9357SAndroid Build Coastguard Worker else
315*f6dc9357SAndroid Build Coastguard Worker {
316*f6dc9357SAndroid Build Coastguard Worker UString temp (_fileName);
317*f6dc9357SAndroid Build Coastguard Worker _so->Normalize_UString_Path(temp);
318*f6dc9357SAndroid Build Coastguard Worker _so->Convert_UString_to_AString(temp, s);
319*f6dc9357SAndroid Build Coastguard Worker }
320*f6dc9357SAndroid Build Coastguard Worker PrintResultLine(fileSize, hb.Hashers, k_HashCalc_Index_Current, showHash, s);
321*f6dc9357SAndroid Build Coastguard Worker
322*f6dc9357SAndroid Build Coastguard Worker /*
323*f6dc9357SAndroid Build Coastguard Worker PrintResultLine(fileSize, hb.Hashers, k_HashCalc_Index_Current, showHash);
324*f6dc9357SAndroid Build Coastguard Worker if (PrintName)
325*f6dc9357SAndroid Build Coastguard Worker {
326*f6dc9357SAndroid Build Coastguard Worker if (_fileName.IsEmpty())
327*f6dc9357SAndroid Build Coastguard Worker *_so << kEmptyFileAlias;
328*f6dc9357SAndroid Build Coastguard Worker else
329*f6dc9357SAndroid Build Coastguard Worker _so->NormalizePrint_UString(_fileName);
330*f6dc9357SAndroid Build Coastguard Worker }
331*f6dc9357SAndroid Build Coastguard Worker */
332*f6dc9357SAndroid Build Coastguard Worker // if (PrintNewLine)
333*f6dc9357SAndroid Build Coastguard Worker *_so << endl;
334*f6dc9357SAndroid Build Coastguard Worker }
335*f6dc9357SAndroid Build Coastguard Worker
336*f6dc9357SAndroid Build Coastguard Worker if (NeedPercents())
337*f6dc9357SAndroid Build Coastguard Worker {
338*f6dc9357SAndroid Build Coastguard Worker _percent.Files++;
339*f6dc9357SAndroid Build Coastguard Worker _percent.Print();
340*f6dc9357SAndroid Build Coastguard Worker }
341*f6dc9357SAndroid Build Coastguard Worker
342*f6dc9357SAndroid Build Coastguard Worker return CheckBreak2();
343*f6dc9357SAndroid Build Coastguard Worker }
344*f6dc9357SAndroid Build Coastguard Worker
345*f6dc9357SAndroid Build Coastguard Worker static const char * const k_DigestTitles[] =
346*f6dc9357SAndroid Build Coastguard Worker {
347*f6dc9357SAndroid Build Coastguard Worker " : "
348*f6dc9357SAndroid Build Coastguard Worker , " for data: "
349*f6dc9357SAndroid Build Coastguard Worker , " for data and names: "
350*f6dc9357SAndroid Build Coastguard Worker , " for streams and names: "
351*f6dc9357SAndroid Build Coastguard Worker };
352*f6dc9357SAndroid Build Coastguard Worker
PrintSum(CStdOutStream & so,const CHasherState & h,unsigned digestIndex)353*f6dc9357SAndroid Build Coastguard Worker static void PrintSum(CStdOutStream &so, const CHasherState &h, unsigned digestIndex)
354*f6dc9357SAndroid Build Coastguard Worker {
355*f6dc9357SAndroid Build Coastguard Worker so << h.Name;
356*f6dc9357SAndroid Build Coastguard Worker
357*f6dc9357SAndroid Build Coastguard Worker {
358*f6dc9357SAndroid Build Coastguard Worker AString temp;
359*f6dc9357SAndroid Build Coastguard Worker AddSpaces_if_Positive(temp, 6 - (int)h.Name.Len());
360*f6dc9357SAndroid Build Coastguard Worker so << temp;
361*f6dc9357SAndroid Build Coastguard Worker }
362*f6dc9357SAndroid Build Coastguard Worker
363*f6dc9357SAndroid Build Coastguard Worker so << k_DigestTitles[digestIndex];
364*f6dc9357SAndroid Build Coastguard Worker
365*f6dc9357SAndroid Build Coastguard Worker char s[k_DigestStringSize];
366*f6dc9357SAndroid Build Coastguard Worker // s[0] = 0;
367*f6dc9357SAndroid Build Coastguard Worker h.WriteToString(digestIndex, s);
368*f6dc9357SAndroid Build Coastguard Worker so << s << endl;
369*f6dc9357SAndroid Build Coastguard Worker }
370*f6dc9357SAndroid Build Coastguard Worker
PrintHashStat(CStdOutStream & so,const CHashBundle & hb)371*f6dc9357SAndroid Build Coastguard Worker void PrintHashStat(CStdOutStream &so, const CHashBundle &hb)
372*f6dc9357SAndroid Build Coastguard Worker {
373*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, hb.Hashers)
374*f6dc9357SAndroid Build Coastguard Worker {
375*f6dc9357SAndroid Build Coastguard Worker const CHasherState &h = hb.Hashers[i];
376*f6dc9357SAndroid Build Coastguard Worker PrintSum(so, h, k_HashCalc_Index_DataSum);
377*f6dc9357SAndroid Build Coastguard Worker if (hb.NumFiles != 1 || hb.NumDirs != 0)
378*f6dc9357SAndroid Build Coastguard Worker PrintSum(so, h, k_HashCalc_Index_NamesSum);
379*f6dc9357SAndroid Build Coastguard Worker if (hb.NumAltStreams != 0)
380*f6dc9357SAndroid Build Coastguard Worker PrintSum(so, h, k_HashCalc_Index_StreamsSum);
381*f6dc9357SAndroid Build Coastguard Worker so << endl;
382*f6dc9357SAndroid Build Coastguard Worker }
383*f6dc9357SAndroid Build Coastguard Worker }
384*f6dc9357SAndroid Build Coastguard Worker
PrintProperty(const char * name,UInt64 value)385*f6dc9357SAndroid Build Coastguard Worker void CHashCallbackConsole::PrintProperty(const char *name, UInt64 value)
386*f6dc9357SAndroid Build Coastguard Worker {
387*f6dc9357SAndroid Build Coastguard Worker char s[32];
388*f6dc9357SAndroid Build Coastguard Worker s[0] = ':';
389*f6dc9357SAndroid Build Coastguard Worker s[1] = ' ';
390*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(value, s + 2);
391*f6dc9357SAndroid Build Coastguard Worker *_so << name << s << endl;
392*f6dc9357SAndroid Build Coastguard Worker }
393*f6dc9357SAndroid Build Coastguard Worker
AfterLastFile(CHashBundle & hb)394*f6dc9357SAndroid Build Coastguard Worker HRESULT CHashCallbackConsole::AfterLastFile(CHashBundle &hb)
395*f6dc9357SAndroid Build Coastguard Worker {
396*f6dc9357SAndroid Build Coastguard Worker ClosePercents2();
397*f6dc9357SAndroid Build Coastguard Worker
398*f6dc9357SAndroid Build Coastguard Worker if (PrintHeaders && _so)
399*f6dc9357SAndroid Build Coastguard Worker {
400*f6dc9357SAndroid Build Coastguard Worker PrintSeparatorLine(hb.Hashers);
401*f6dc9357SAndroid Build Coastguard Worker
402*f6dc9357SAndroid Build Coastguard Worker PrintResultLine(hb.FilesSize, hb.Hashers, k_HashCalc_Index_DataSum, true, AString());
403*f6dc9357SAndroid Build Coastguard Worker
404*f6dc9357SAndroid Build Coastguard Worker *_so << endl << endl;
405*f6dc9357SAndroid Build Coastguard Worker
406*f6dc9357SAndroid Build Coastguard Worker if (hb.NumFiles != 1 || hb.NumDirs != 0)
407*f6dc9357SAndroid Build Coastguard Worker {
408*f6dc9357SAndroid Build Coastguard Worker if (hb.NumDirs != 0)
409*f6dc9357SAndroid Build Coastguard Worker PrintProperty("Folders", hb.NumDirs);
410*f6dc9357SAndroid Build Coastguard Worker PrintProperty("Files", hb.NumFiles);
411*f6dc9357SAndroid Build Coastguard Worker }
412*f6dc9357SAndroid Build Coastguard Worker
413*f6dc9357SAndroid Build Coastguard Worker PrintProperty("Size", hb.FilesSize);
414*f6dc9357SAndroid Build Coastguard Worker
415*f6dc9357SAndroid Build Coastguard Worker if (hb.NumAltStreams != 0)
416*f6dc9357SAndroid Build Coastguard Worker {
417*f6dc9357SAndroid Build Coastguard Worker PrintProperty("Alternate streams", hb.NumAltStreams);
418*f6dc9357SAndroid Build Coastguard Worker PrintProperty("Alternate streams size", hb.AltStreamsSize);
419*f6dc9357SAndroid Build Coastguard Worker }
420*f6dc9357SAndroid Build Coastguard Worker
421*f6dc9357SAndroid Build Coastguard Worker *_so << endl;
422*f6dc9357SAndroid Build Coastguard Worker PrintHashStat(*_so, hb);
423*f6dc9357SAndroid Build Coastguard Worker }
424*f6dc9357SAndroid Build Coastguard Worker
425*f6dc9357SAndroid Build Coastguard Worker return S_OK;
426*f6dc9357SAndroid Build Coastguard Worker }
427