xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/PanelCrc.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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