1*f6dc9357SAndroid Build Coastguard Worker // PanelCrc.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/MyException.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileIO.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "../Common/LoadCodecs.h"
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker #include "../GUI/HashGUI.h"
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker #include "App.h"
16*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard Worker #include "resource.h"
19*f6dc9357SAndroid Build Coastguard Worker
20*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
21*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
22*f6dc9357SAndroid Build Coastguard Worker
23*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
24*f6dc9357SAndroid Build Coastguard Worker extern CExternalCodecs g_ExternalCodecs;
25*f6dc9357SAndroid Build Coastguard Worker HRESULT LoadGlobalCodecs();
26*f6dc9357SAndroid Build Coastguard Worker #endif
27*f6dc9357SAndroid Build Coastguard Worker
28*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kBufSize = (1 << 15);
29*f6dc9357SAndroid Build Coastguard Worker
30*f6dc9357SAndroid Build Coastguard Worker struct CDirEnumerator
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker bool EnterToDirs;
33*f6dc9357SAndroid Build Coastguard Worker FString BasePrefix;
34*f6dc9357SAndroid Build Coastguard Worker FString BasePrefix_for_Open;
35*f6dc9357SAndroid Build Coastguard Worker FStringVector FilePaths;
36*f6dc9357SAndroid Build Coastguard Worker
37*f6dc9357SAndroid Build Coastguard Worker CObjectVector<NFind::CEnumerator> Enumerators;
38*f6dc9357SAndroid Build Coastguard Worker FStringVector Prefixes;
39*f6dc9357SAndroid Build Coastguard Worker unsigned Index;
40*f6dc9357SAndroid Build Coastguard Worker
CDirEnumeratorCDirEnumerator41*f6dc9357SAndroid Build Coastguard Worker CDirEnumerator(): EnterToDirs(false), Index(0) {}
42*f6dc9357SAndroid Build Coastguard Worker
43*f6dc9357SAndroid Build Coastguard Worker void Init();
44*f6dc9357SAndroid Build Coastguard Worker DWORD GetNextFile(NFind::CFileInfo &fi, bool &filled, FString &resPath);
45*f6dc9357SAndroid Build Coastguard Worker };
46*f6dc9357SAndroid Build Coastguard Worker
Init()47*f6dc9357SAndroid Build Coastguard Worker void CDirEnumerator::Init()
48*f6dc9357SAndroid Build Coastguard Worker {
49*f6dc9357SAndroid Build Coastguard Worker Enumerators.Clear();
50*f6dc9357SAndroid Build Coastguard Worker Prefixes.Clear();
51*f6dc9357SAndroid Build Coastguard Worker Index = 0;
52*f6dc9357SAndroid Build Coastguard Worker }
53*f6dc9357SAndroid Build Coastguard Worker
GetNormalizedError()54*f6dc9357SAndroid Build Coastguard Worker static DWORD GetNormalizedError()
55*f6dc9357SAndroid Build Coastguard Worker {
56*f6dc9357SAndroid Build Coastguard Worker const DWORD error = GetLastError();
57*f6dc9357SAndroid Build Coastguard Worker return (error == 0) ? (DWORD)E_FAIL : error;
58*f6dc9357SAndroid Build Coastguard Worker }
59*f6dc9357SAndroid Build Coastguard Worker
GetNextFile(NFind::CFileInfo & fi,bool & filled,FString & resPath)60*f6dc9357SAndroid Build Coastguard Worker DWORD CDirEnumerator::GetNextFile(NFind::CFileInfo &fi, bool &filled, FString &resPath)
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker filled = false;
63*f6dc9357SAndroid Build Coastguard Worker resPath.Empty();
64*f6dc9357SAndroid Build Coastguard Worker
65*f6dc9357SAndroid Build Coastguard Worker for (;;)
66*f6dc9357SAndroid Build Coastguard Worker {
67*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE)
68*f6dc9357SAndroid Build Coastguard Worker bool isRootPrefix = (BasePrefix.IsEmpty() || (NName::IsSuperPath(BasePrefix) && BasePrefix[NName::kSuperPathPrefixSize] == 0));
69*f6dc9357SAndroid Build Coastguard Worker #endif
70*f6dc9357SAndroid Build Coastguard Worker
71*f6dc9357SAndroid Build Coastguard Worker if (Enumerators.IsEmpty())
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker if (Index >= FilePaths.Size())
74*f6dc9357SAndroid Build Coastguard Worker return S_OK;
75*f6dc9357SAndroid Build Coastguard Worker const FString &path = FilePaths[Index++];
76*f6dc9357SAndroid Build Coastguard Worker const int pos = path.ReverseFind_PathSepar();
77*f6dc9357SAndroid Build Coastguard Worker if (pos >= 0)
78*f6dc9357SAndroid Build Coastguard Worker resPath.SetFrom(path, (unsigned)pos + 1);
79*f6dc9357SAndroid Build Coastguard Worker
80*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32) && !defined(UNDER_CE)
81*f6dc9357SAndroid Build Coastguard Worker if (isRootPrefix && path.Len() == 2 && NName::IsDrivePath2(path))
82*f6dc9357SAndroid Build Coastguard Worker {
83*f6dc9357SAndroid Build Coastguard Worker // we use "c:" item as directory item
84*f6dc9357SAndroid Build Coastguard Worker fi.ClearBase();
85*f6dc9357SAndroid Build Coastguard Worker fi.Name = path;
86*f6dc9357SAndroid Build Coastguard Worker fi.SetAsDir();
87*f6dc9357SAndroid Build Coastguard Worker fi.Size = 0;
88*f6dc9357SAndroid Build Coastguard Worker }
89*f6dc9357SAndroid Build Coastguard Worker else
90*f6dc9357SAndroid Build Coastguard Worker #endif
91*f6dc9357SAndroid Build Coastguard Worker if (!fi.Find(BasePrefix + path))
92*f6dc9357SAndroid Build Coastguard Worker {
93*f6dc9357SAndroid Build Coastguard Worker const DWORD error = GetNormalizedError();
94*f6dc9357SAndroid Build Coastguard Worker resPath = path;
95*f6dc9357SAndroid Build Coastguard Worker return error;
96*f6dc9357SAndroid Build Coastguard Worker }
97*f6dc9357SAndroid Build Coastguard Worker
98*f6dc9357SAndroid Build Coastguard Worker break;
99*f6dc9357SAndroid Build Coastguard Worker }
100*f6dc9357SAndroid Build Coastguard Worker
101*f6dc9357SAndroid Build Coastguard Worker bool found;
102*f6dc9357SAndroid Build Coastguard Worker
103*f6dc9357SAndroid Build Coastguard Worker if (Enumerators.Back().Next(fi, found))
104*f6dc9357SAndroid Build Coastguard Worker {
105*f6dc9357SAndroid Build Coastguard Worker if (found)
106*f6dc9357SAndroid Build Coastguard Worker {
107*f6dc9357SAndroid Build Coastguard Worker resPath = Prefixes.Back();
108*f6dc9357SAndroid Build Coastguard Worker break;
109*f6dc9357SAndroid Build Coastguard Worker }
110*f6dc9357SAndroid Build Coastguard Worker }
111*f6dc9357SAndroid Build Coastguard Worker else
112*f6dc9357SAndroid Build Coastguard Worker {
113*f6dc9357SAndroid Build Coastguard Worker const DWORD error = GetNormalizedError();
114*f6dc9357SAndroid Build Coastguard Worker resPath = Prefixes.Back();
115*f6dc9357SAndroid Build Coastguard Worker Enumerators.DeleteBack();
116*f6dc9357SAndroid Build Coastguard Worker Prefixes.DeleteBack();
117*f6dc9357SAndroid Build Coastguard Worker return error;
118*f6dc9357SAndroid Build Coastguard Worker }
119*f6dc9357SAndroid Build Coastguard Worker
120*f6dc9357SAndroid Build Coastguard Worker Enumerators.DeleteBack();
121*f6dc9357SAndroid Build Coastguard Worker Prefixes.DeleteBack();
122*f6dc9357SAndroid Build Coastguard Worker }
123*f6dc9357SAndroid Build Coastguard Worker
124*f6dc9357SAndroid Build Coastguard Worker resPath += fi.Name;
125*f6dc9357SAndroid Build Coastguard Worker
126*f6dc9357SAndroid Build Coastguard Worker if (EnterToDirs && fi.IsDir())
127*f6dc9357SAndroid Build Coastguard Worker {
128*f6dc9357SAndroid Build Coastguard Worker FString s = resPath;
129*f6dc9357SAndroid Build Coastguard Worker s.Add_PathSepar();
130*f6dc9357SAndroid Build Coastguard Worker Prefixes.Add(s);
131*f6dc9357SAndroid Build Coastguard Worker Enumerators.AddNew().SetDirPrefix(BasePrefix + s);
132*f6dc9357SAndroid Build Coastguard Worker }
133*f6dc9357SAndroid Build Coastguard Worker
134*f6dc9357SAndroid Build Coastguard Worker filled = true;
135*f6dc9357SAndroid Build Coastguard Worker return S_OK;
136*f6dc9357SAndroid Build Coastguard Worker }
137*f6dc9357SAndroid Build Coastguard Worker
138*f6dc9357SAndroid Build Coastguard Worker
139*f6dc9357SAndroid Build Coastguard Worker
140*f6dc9357SAndroid Build Coastguard Worker class CThreadCrc: public CProgressThreadVirt
141*f6dc9357SAndroid Build Coastguard Worker {
142*f6dc9357SAndroid Build Coastguard Worker bool ResultsWereShown;
143*f6dc9357SAndroid Build Coastguard Worker bool WasFinished;
144*f6dc9357SAndroid Build Coastguard Worker
145*f6dc9357SAndroid Build Coastguard Worker HRESULT ProcessVirt() Z7_override;
146*f6dc9357SAndroid Build Coastguard Worker virtual void ProcessWasFinished_GuiVirt() Z7_override;
147*f6dc9357SAndroid Build Coastguard Worker public:
148*f6dc9357SAndroid Build Coastguard Worker CDirEnumerator Enumerator;
149*f6dc9357SAndroid Build Coastguard Worker CHashBundle Hash;
150*f6dc9357SAndroid Build Coastguard Worker // FString FirstFilePath;
151*f6dc9357SAndroid Build Coastguard Worker
152*f6dc9357SAndroid Build Coastguard Worker void SetStatus(const UString &s);
153*f6dc9357SAndroid Build Coastguard Worker void AddErrorMessage(DWORD systemError, const FChar *name);
154*f6dc9357SAndroid Build Coastguard Worker void ShowFinalResults(HWND hwnd);
155*f6dc9357SAndroid Build Coastguard Worker
CThreadCrc()156*f6dc9357SAndroid Build Coastguard Worker CThreadCrc():
157*f6dc9357SAndroid Build Coastguard Worker ResultsWereShown(false),
158*f6dc9357SAndroid Build Coastguard Worker WasFinished(false)
159*f6dc9357SAndroid Build Coastguard Worker {}
160*f6dc9357SAndroid Build Coastguard Worker };
161*f6dc9357SAndroid Build Coastguard Worker
ShowFinalResults(HWND hwnd)162*f6dc9357SAndroid Build Coastguard Worker void CThreadCrc::ShowFinalResults(HWND hwnd)
163*f6dc9357SAndroid Build Coastguard Worker {
164*f6dc9357SAndroid Build Coastguard Worker if (WasFinished)
165*f6dc9357SAndroid Build Coastguard Worker if (!ResultsWereShown)
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker ResultsWereShown = true;
168*f6dc9357SAndroid Build Coastguard Worker ShowHashResults(Hash, hwnd);
169*f6dc9357SAndroid Build Coastguard Worker }
170*f6dc9357SAndroid Build Coastguard Worker }
171*f6dc9357SAndroid Build Coastguard Worker
ProcessWasFinished_GuiVirt()172*f6dc9357SAndroid Build Coastguard Worker void CThreadCrc::ProcessWasFinished_GuiVirt()
173*f6dc9357SAndroid Build Coastguard Worker {
174*f6dc9357SAndroid Build Coastguard Worker ShowFinalResults(*this);
175*f6dc9357SAndroid Build Coastguard Worker }
176*f6dc9357SAndroid Build Coastguard Worker
AddErrorMessage(DWORD systemError,const FChar * name)177*f6dc9357SAndroid Build Coastguard Worker void CThreadCrc::AddErrorMessage(DWORD systemError, const FChar *name)
178*f6dc9357SAndroid Build Coastguard Worker {
179*f6dc9357SAndroid Build Coastguard Worker Sync.AddError_Code_Name(HRESULT_FROM_WIN32(systemError), fs2us(Enumerator.BasePrefix + name));
180*f6dc9357SAndroid Build Coastguard Worker Hash.NumErrors++;
181*f6dc9357SAndroid Build Coastguard Worker }
182*f6dc9357SAndroid Build Coastguard Worker
SetStatus(const UString & s2)183*f6dc9357SAndroid Build Coastguard Worker void CThreadCrc::SetStatus(const UString &s2)
184*f6dc9357SAndroid Build Coastguard Worker {
185*f6dc9357SAndroid Build Coastguard Worker UString s = s2;
186*f6dc9357SAndroid Build Coastguard Worker if (!Enumerator.BasePrefix.IsEmpty())
187*f6dc9357SAndroid Build Coastguard Worker {
188*f6dc9357SAndroid Build Coastguard Worker s.Add_Space_if_NotEmpty();
189*f6dc9357SAndroid Build Coastguard Worker s += fs2us(Enumerator.BasePrefix);
190*f6dc9357SAndroid Build Coastguard Worker }
191*f6dc9357SAndroid Build Coastguard Worker Sync.Set_Status(s);
192*f6dc9357SAndroid Build Coastguard Worker }
193*f6dc9357SAndroid Build Coastguard Worker
ProcessVirt()194*f6dc9357SAndroid Build Coastguard Worker HRESULT CThreadCrc::ProcessVirt()
195*f6dc9357SAndroid Build Coastguard Worker {
196*f6dc9357SAndroid Build Coastguard Worker // Hash.Init();
197*f6dc9357SAndroid Build Coastguard Worker
198*f6dc9357SAndroid Build Coastguard Worker CMyBuffer buf;
199*f6dc9357SAndroid Build Coastguard Worker if (!buf.Allocate(kBufSize))
200*f6dc9357SAndroid Build Coastguard Worker return E_OUTOFMEMORY;
201*f6dc9357SAndroid Build Coastguard Worker
202*f6dc9357SAndroid Build Coastguard Worker CProgressSync &sync = Sync;
203*f6dc9357SAndroid Build Coastguard Worker
204*f6dc9357SAndroid Build Coastguard Worker SetStatus(LangString(IDS_SCANNING));
205*f6dc9357SAndroid Build Coastguard Worker
206*f6dc9357SAndroid Build Coastguard Worker Enumerator.Init();
207*f6dc9357SAndroid Build Coastguard Worker
208*f6dc9357SAndroid Build Coastguard Worker FString path;
209*f6dc9357SAndroid Build Coastguard Worker NFind::CFileInfo fi;
210*f6dc9357SAndroid Build Coastguard Worker UInt64 numFiles = 0;
211*f6dc9357SAndroid Build Coastguard Worker UInt64 numItems = 0, numItems_Prev = 0;
212*f6dc9357SAndroid Build Coastguard Worker UInt64 totalSize = 0;
213*f6dc9357SAndroid Build Coastguard Worker
214*f6dc9357SAndroid Build Coastguard Worker for (;;)
215*f6dc9357SAndroid Build Coastguard Worker {
216*f6dc9357SAndroid Build Coastguard Worker bool filled;
217*f6dc9357SAndroid Build Coastguard Worker const DWORD error = Enumerator.GetNextFile(fi, filled, path);
218*f6dc9357SAndroid Build Coastguard Worker if (error != 0)
219*f6dc9357SAndroid Build Coastguard Worker {
220*f6dc9357SAndroid Build Coastguard Worker AddErrorMessage(error, path);
221*f6dc9357SAndroid Build Coastguard Worker continue;
222*f6dc9357SAndroid Build Coastguard Worker }
223*f6dc9357SAndroid Build Coastguard Worker if (!filled)
224*f6dc9357SAndroid Build Coastguard Worker break;
225*f6dc9357SAndroid Build Coastguard Worker if (!fi.IsDir())
226*f6dc9357SAndroid Build Coastguard Worker {
227*f6dc9357SAndroid Build Coastguard Worker totalSize += fi.Size;
228*f6dc9357SAndroid Build Coastguard Worker numFiles++;
229*f6dc9357SAndroid Build Coastguard Worker }
230*f6dc9357SAndroid Build Coastguard Worker numItems++;
231*f6dc9357SAndroid Build Coastguard Worker bool needPrint = false;
232*f6dc9357SAndroid Build Coastguard Worker // if (fi.IsDir())
233*f6dc9357SAndroid Build Coastguard Worker {
234*f6dc9357SAndroid Build Coastguard Worker if (numItems - numItems_Prev >= 100)
235*f6dc9357SAndroid Build Coastguard Worker {
236*f6dc9357SAndroid Build Coastguard Worker needPrint = true;
237*f6dc9357SAndroid Build Coastguard Worker numItems_Prev = numItems;
238*f6dc9357SAndroid Build Coastguard Worker }
239*f6dc9357SAndroid Build Coastguard Worker }
240*f6dc9357SAndroid Build Coastguard Worker /*
241*f6dc9357SAndroid Build Coastguard Worker else if (numFiles - numFiles_Prev >= 200)
242*f6dc9357SAndroid Build Coastguard Worker {
243*f6dc9357SAndroid Build Coastguard Worker needPrint = true;
244*f6dc9357SAndroid Build Coastguard Worker numFiles_Prev = numFiles;
245*f6dc9357SAndroid Build Coastguard Worker }
246*f6dc9357SAndroid Build Coastguard Worker */
247*f6dc9357SAndroid Build Coastguard Worker if (needPrint)
248*f6dc9357SAndroid Build Coastguard Worker {
249*f6dc9357SAndroid Build Coastguard Worker RINOK(sync.ScanProgress(numFiles, totalSize, path, fi.IsDir()))
250*f6dc9357SAndroid Build Coastguard Worker }
251*f6dc9357SAndroid Build Coastguard Worker }
252*f6dc9357SAndroid Build Coastguard Worker RINOK(sync.ScanProgress(numFiles, totalSize, FString(), false))
253*f6dc9357SAndroid Build Coastguard Worker // sync.SetNumFilesTotal(numFiles);
254*f6dc9357SAndroid Build Coastguard Worker // sync.SetProgress(totalSize, 0);
255*f6dc9357SAndroid Build Coastguard Worker // SetStatus(LangString(IDS_CHECKSUM_CALCULATING));
256*f6dc9357SAndroid Build Coastguard Worker // sync.SetCurFilePath(L"");
257*f6dc9357SAndroid Build Coastguard Worker SetStatus(L"");
258*f6dc9357SAndroid Build Coastguard Worker
259*f6dc9357SAndroid Build Coastguard Worker Enumerator.Init();
260*f6dc9357SAndroid Build Coastguard Worker
261*f6dc9357SAndroid Build Coastguard Worker FString tempPath;
262*f6dc9357SAndroid Build Coastguard Worker bool isFirstFile = true;
263*f6dc9357SAndroid Build Coastguard Worker UInt64 errorsFilesSize = 0;
264*f6dc9357SAndroid Build Coastguard Worker
265*f6dc9357SAndroid Build Coastguard Worker for (;;)
266*f6dc9357SAndroid Build Coastguard Worker {
267*f6dc9357SAndroid Build Coastguard Worker bool filled;
268*f6dc9357SAndroid Build Coastguard Worker DWORD error = Enumerator.GetNextFile(fi, filled, path);
269*f6dc9357SAndroid Build Coastguard Worker if (error != 0)
270*f6dc9357SAndroid Build Coastguard Worker {
271*f6dc9357SAndroid Build Coastguard Worker AddErrorMessage(error, path);
272*f6dc9357SAndroid Build Coastguard Worker continue;
273*f6dc9357SAndroid Build Coastguard Worker }
274*f6dc9357SAndroid Build Coastguard Worker if (!filled)
275*f6dc9357SAndroid Build Coastguard Worker break;
276*f6dc9357SAndroid Build Coastguard Worker
277*f6dc9357SAndroid Build Coastguard Worker error = 0;
278*f6dc9357SAndroid Build Coastguard Worker Hash.InitForNewFile();
279*f6dc9357SAndroid Build Coastguard Worker if (!fi.IsDir())
280*f6dc9357SAndroid Build Coastguard Worker {
281*f6dc9357SAndroid Build Coastguard Worker NIO::CInFile inFile;
282*f6dc9357SAndroid Build Coastguard Worker tempPath = Enumerator.BasePrefix_for_Open;
283*f6dc9357SAndroid Build Coastguard Worker tempPath += path;
284*f6dc9357SAndroid Build Coastguard Worker if (!inFile.Open(tempPath))
285*f6dc9357SAndroid Build Coastguard Worker {
286*f6dc9357SAndroid Build Coastguard Worker error = GetNormalizedError();
287*f6dc9357SAndroid Build Coastguard Worker AddErrorMessage(error, path);
288*f6dc9357SAndroid Build Coastguard Worker continue;
289*f6dc9357SAndroid Build Coastguard Worker }
290*f6dc9357SAndroid Build Coastguard Worker if (isFirstFile)
291*f6dc9357SAndroid Build Coastguard Worker {
292*f6dc9357SAndroid Build Coastguard Worker Hash.FirstFileName = fs2us(path);
293*f6dc9357SAndroid Build Coastguard Worker isFirstFile = false;
294*f6dc9357SAndroid Build Coastguard Worker }
295*f6dc9357SAndroid Build Coastguard Worker sync.Set_FilePath(fs2us(path));
296*f6dc9357SAndroid Build Coastguard Worker sync.Set_NumFilesCur(Hash.NumFiles);
297*f6dc9357SAndroid Build Coastguard Worker UInt64 progress_Prev = 0;
298*f6dc9357SAndroid Build Coastguard Worker for (;;)
299*f6dc9357SAndroid Build Coastguard Worker {
300*f6dc9357SAndroid Build Coastguard Worker UInt32 size;
301*f6dc9357SAndroid Build Coastguard Worker if (!inFile.Read(buf, kBufSize, size))
302*f6dc9357SAndroid Build Coastguard Worker {
303*f6dc9357SAndroid Build Coastguard Worker error = GetNormalizedError();
304*f6dc9357SAndroid Build Coastguard Worker AddErrorMessage(error, path);
305*f6dc9357SAndroid Build Coastguard Worker UInt64 errorSize = 0;
306*f6dc9357SAndroid Build Coastguard Worker if (inFile.GetLength(errorSize))
307*f6dc9357SAndroid Build Coastguard Worker errorsFilesSize += errorSize;
308*f6dc9357SAndroid Build Coastguard Worker break;
309*f6dc9357SAndroid Build Coastguard Worker }
310*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
311*f6dc9357SAndroid Build Coastguard Worker break;
312*f6dc9357SAndroid Build Coastguard Worker Hash.Update(buf, size);
313*f6dc9357SAndroid Build Coastguard Worker if (Hash.CurSize - progress_Prev >= ((UInt32)1 << 21))
314*f6dc9357SAndroid Build Coastguard Worker {
315*f6dc9357SAndroid Build Coastguard Worker RINOK(sync.Set_NumBytesCur(errorsFilesSize + Hash.FilesSize + Hash.CurSize))
316*f6dc9357SAndroid Build Coastguard Worker progress_Prev = Hash.CurSize;
317*f6dc9357SAndroid Build Coastguard Worker }
318*f6dc9357SAndroid Build Coastguard Worker }
319*f6dc9357SAndroid Build Coastguard Worker }
320*f6dc9357SAndroid Build Coastguard Worker if (error == 0)
321*f6dc9357SAndroid Build Coastguard Worker Hash.Final(fi.IsDir(), false, fs2us(path));
322*f6dc9357SAndroid Build Coastguard Worker RINOK(sync.Set_NumBytesCur(errorsFilesSize + Hash.FilesSize))
323*f6dc9357SAndroid Build Coastguard Worker }
324*f6dc9357SAndroid Build Coastguard Worker RINOK(sync.Set_NumBytesCur(errorsFilesSize + Hash.FilesSize))
325*f6dc9357SAndroid Build Coastguard Worker sync.Set_NumFilesCur(Hash.NumFiles);
326*f6dc9357SAndroid Build Coastguard Worker if (Hash.NumFiles != 1)
327*f6dc9357SAndroid Build Coastguard Worker sync.Set_FilePath(L"");
328*f6dc9357SAndroid Build Coastguard Worker SetStatus(L"");
329*f6dc9357SAndroid Build Coastguard Worker
330*f6dc9357SAndroid Build Coastguard Worker CProgressMessageBoxPair &pair = GetMessagePair(Hash.NumErrors != 0);
331*f6dc9357SAndroid Build Coastguard Worker WasFinished = true;
332*f6dc9357SAndroid Build Coastguard Worker LangString(IDS_CHECKSUM_INFORMATION, pair.Title);
333*f6dc9357SAndroid Build Coastguard Worker return S_OK;
334*f6dc9357SAndroid Build Coastguard Worker }
335*f6dc9357SAndroid Build Coastguard Worker
336*f6dc9357SAndroid Build Coastguard Worker
337*f6dc9357SAndroid Build Coastguard Worker
CalculateCrc2(const UString & methodName)338*f6dc9357SAndroid Build Coastguard Worker HRESULT CApp::CalculateCrc2(const UString &methodName)
339*f6dc9357SAndroid Build Coastguard Worker {
340*f6dc9357SAndroid Build Coastguard Worker unsigned srcPanelIndex = GetFocusedPanelIndex();
341*f6dc9357SAndroid Build Coastguard Worker CPanel &srcPanel = Panels[srcPanelIndex];
342*f6dc9357SAndroid Build Coastguard Worker
343*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> indices;
344*f6dc9357SAndroid Build Coastguard Worker srcPanel.Get_ItemIndices_OperSmart(indices);
345*f6dc9357SAndroid Build Coastguard Worker if (indices.IsEmpty())
346*f6dc9357SAndroid Build Coastguard Worker return S_OK;
347*f6dc9357SAndroid Build Coastguard Worker
348*f6dc9357SAndroid Build Coastguard Worker if (!srcPanel.Is_IO_FS_Folder())
349*f6dc9357SAndroid Build Coastguard Worker {
350*f6dc9357SAndroid Build Coastguard Worker CCopyToOptions options;
351*f6dc9357SAndroid Build Coastguard Worker options.streamMode = true;
352*f6dc9357SAndroid Build Coastguard Worker options.showErrorMessages = true;
353*f6dc9357SAndroid Build Coastguard Worker options.hashMethods.Add(methodName);
354*f6dc9357SAndroid Build Coastguard Worker options.NeedRegistryZone = false;
355*f6dc9357SAndroid Build Coastguard Worker
356*f6dc9357SAndroid Build Coastguard Worker UStringVector messages;
357*f6dc9357SAndroid Build Coastguard Worker return srcPanel.CopyTo(options, indices, &messages);
358*f6dc9357SAndroid Build Coastguard Worker }
359*f6dc9357SAndroid Build Coastguard Worker
360*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
361*f6dc9357SAndroid Build Coastguard Worker
362*f6dc9357SAndroid Build Coastguard Worker LoadGlobalCodecs();
363*f6dc9357SAndroid Build Coastguard Worker
364*f6dc9357SAndroid Build Coastguard Worker #endif
365*f6dc9357SAndroid Build Coastguard Worker
366*f6dc9357SAndroid Build Coastguard Worker {
367*f6dc9357SAndroid Build Coastguard Worker CThreadCrc t;
368*f6dc9357SAndroid Build Coastguard Worker
369*f6dc9357SAndroid Build Coastguard Worker {
370*f6dc9357SAndroid Build Coastguard Worker UStringVector methods;
371*f6dc9357SAndroid Build Coastguard Worker methods.Add(methodName);
372*f6dc9357SAndroid Build Coastguard Worker RINOK(t.Hash.SetMethods(EXTERNAL_CODECS_VARS_G methods))
373*f6dc9357SAndroid Build Coastguard Worker }
374*f6dc9357SAndroid Build Coastguard Worker
375*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, indices)
376*f6dc9357SAndroid Build Coastguard Worker t.Enumerator.FilePaths.Add(us2fs(srcPanel.GetItemRelPath(indices[i])));
377*f6dc9357SAndroid Build Coastguard Worker
378*f6dc9357SAndroid Build Coastguard Worker if (t.Enumerator.FilePaths.Size() == 1)
379*f6dc9357SAndroid Build Coastguard Worker t.Hash.MainName = fs2us(t.Enumerator.FilePaths[0]);
380*f6dc9357SAndroid Build Coastguard Worker
381*f6dc9357SAndroid Build Coastguard Worker UString basePrefix = srcPanel.GetFsPath();
382*f6dc9357SAndroid Build Coastguard Worker UString basePrefix2 = basePrefix;
383*f6dc9357SAndroid Build Coastguard Worker if (basePrefix2.Back() == ':')
384*f6dc9357SAndroid Build Coastguard Worker {
385*f6dc9357SAndroid Build Coastguard Worker const int pos = basePrefix2.ReverseFind_PathSepar();
386*f6dc9357SAndroid Build Coastguard Worker if (pos >= 0)
387*f6dc9357SAndroid Build Coastguard Worker basePrefix2.DeleteFrom((unsigned)(pos + 1));
388*f6dc9357SAndroid Build Coastguard Worker }
389*f6dc9357SAndroid Build Coastguard Worker
390*f6dc9357SAndroid Build Coastguard Worker t.Enumerator.BasePrefix = us2fs(basePrefix);
391*f6dc9357SAndroid Build Coastguard Worker t.Enumerator.BasePrefix_for_Open = us2fs(basePrefix2);
392*f6dc9357SAndroid Build Coastguard Worker
393*f6dc9357SAndroid Build Coastguard Worker t.Enumerator.EnterToDirs = !GetFlatMode();
394*f6dc9357SAndroid Build Coastguard Worker
395*f6dc9357SAndroid Build Coastguard Worker t.ShowCompressionInfo = false;
396*f6dc9357SAndroid Build Coastguard Worker
397*f6dc9357SAndroid Build Coastguard Worker const UString title = LangString(IDS_CHECKSUM_CALCULATING);
398*f6dc9357SAndroid Build Coastguard Worker
399*f6dc9357SAndroid Build Coastguard Worker t.MainWindow = _window;
400*f6dc9357SAndroid Build Coastguard Worker t.MainTitle = "7-Zip"; // LangString(IDS_APP_TITLE);
401*f6dc9357SAndroid Build Coastguard Worker t.MainAddTitle = title;
402*f6dc9357SAndroid Build Coastguard Worker t.MainAddTitle.Add_Space();
403*f6dc9357SAndroid Build Coastguard Worker
404*f6dc9357SAndroid Build Coastguard Worker RINOK(t.Create(title, _window))
405*f6dc9357SAndroid Build Coastguard Worker
406*f6dc9357SAndroid Build Coastguard Worker t.ShowFinalResults(_window);
407*f6dc9357SAndroid Build Coastguard Worker }
408*f6dc9357SAndroid Build Coastguard Worker
409*f6dc9357SAndroid Build Coastguard Worker RefreshTitleAlways();
410*f6dc9357SAndroid Build Coastguard Worker return S_OK;
411*f6dc9357SAndroid Build Coastguard Worker }
412*f6dc9357SAndroid Build Coastguard Worker
CalculateCrc(const char * methodName)413*f6dc9357SAndroid Build Coastguard Worker void CApp::CalculateCrc(const char *methodName)
414*f6dc9357SAndroid Build Coastguard Worker {
415*f6dc9357SAndroid Build Coastguard Worker HRESULT res = CalculateCrc2(UString(methodName));
416*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK && res != E_ABORT)
417*f6dc9357SAndroid Build Coastguard Worker {
418*f6dc9357SAndroid Build Coastguard Worker unsigned srcPanelIndex = GetFocusedPanelIndex();
419*f6dc9357SAndroid Build Coastguard Worker CPanel &srcPanel = Panels[srcPanelIndex];
420*f6dc9357SAndroid Build Coastguard Worker srcPanel.MessageBox_Error_HRESULT(res);
421*f6dc9357SAndroid Build Coastguard Worker }
422*f6dc9357SAndroid Build Coastguard Worker }
423