xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ExtractCallbackConsole.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 #include "../../../Common/Wildcard.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/TimeUtils.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariantConv.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
15*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
16*f6dc9357SAndroid Build Coastguard Worker #endif
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/FilePathAutoRename.h"
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ExtractingFilePath.h"
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker #include "ConsoleClose.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "ExtractCallbackConsole.h"
24*f6dc9357SAndroid Build Coastguard Worker #include "UserInputUtils.h"
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
27*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
28*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
29*f6dc9357SAndroid Build Coastguard Worker 
CheckBreak2()30*f6dc9357SAndroid Build Coastguard Worker static HRESULT CheckBreak2()
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker   return NConsoleClose::TestBreakSignal() ? E_ABORT : S_OK;
33*f6dc9357SAndroid Build Coastguard Worker }
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker static const char * const kError = "ERROR: ";
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker 
StartScanning()38*f6dc9357SAndroid Build Coastguard Worker void CExtractScanConsole::StartScanning()
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
41*f6dc9357SAndroid Build Coastguard Worker     _percent.Command = "Scan";
42*f6dc9357SAndroid Build Coastguard Worker }
43*f6dc9357SAndroid Build Coastguard Worker 
ScanProgress(const CDirItemsStat & st,const FString & path,bool)44*f6dc9357SAndroid Build Coastguard Worker HRESULT CExtractScanConsole::ScanProgress(const CDirItemsStat &st, const FString &path, bool /* isDir */)
45*f6dc9357SAndroid Build Coastguard Worker {
46*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
47*f6dc9357SAndroid Build Coastguard Worker   {
48*f6dc9357SAndroid Build Coastguard Worker     _percent.Files = st.NumDirs + st.NumFiles;
49*f6dc9357SAndroid Build Coastguard Worker     _percent.Completed = st.GetTotalBytes();
50*f6dc9357SAndroid Build Coastguard Worker     _percent.FileName = fs2us(path);
51*f6dc9357SAndroid Build Coastguard Worker     _percent.Print();
52*f6dc9357SAndroid Build Coastguard Worker   }
53*f6dc9357SAndroid Build Coastguard Worker 
54*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
55*f6dc9357SAndroid Build Coastguard Worker }
56*f6dc9357SAndroid Build Coastguard Worker 
ScanError(const FString & path,DWORD systemError)57*f6dc9357SAndroid Build Coastguard Worker HRESULT CExtractScanConsole::ScanError(const FString &path, DWORD systemError)
58*f6dc9357SAndroid Build Coastguard Worker {
59*f6dc9357SAndroid Build Coastguard Worker   // 22.00:
60*f6dc9357SAndroid Build Coastguard Worker   // ScanErrors.AddError(path, systemError);
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker   ClosePercentsAndFlush();
63*f6dc9357SAndroid Build Coastguard Worker 
64*f6dc9357SAndroid Build Coastguard Worker   if (_se)
65*f6dc9357SAndroid Build Coastguard Worker   {
66*f6dc9357SAndroid Build Coastguard Worker     *_se << endl << kError << NError::MyFormatMessage(systemError) << endl;
67*f6dc9357SAndroid Build Coastguard Worker     _se->NormalizePrint_UString_Path(fs2us(path));
68*f6dc9357SAndroid Build Coastguard Worker     *_se << endl << endl;
69*f6dc9357SAndroid Build Coastguard Worker     _se->Flush();
70*f6dc9357SAndroid Build Coastguard Worker   }
71*f6dc9357SAndroid Build Coastguard Worker   return HRESULT_FROM_WIN32(systemError);
72*f6dc9357SAndroid Build Coastguard Worker 
73*f6dc9357SAndroid Build Coastguard Worker   // 22.00: commented
74*f6dc9357SAndroid Build Coastguard Worker   // CommonError(path, systemError, true);
75*f6dc9357SAndroid Build Coastguard Worker   // return S_OK;
76*f6dc9357SAndroid Build Coastguard Worker }
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker void Print_UInt64_and_String(AString &s, UInt64 val, const char *name);
Print_UInt64_and_String(AString & s,UInt64 val,const char * name)80*f6dc9357SAndroid Build Coastguard Worker void Print_UInt64_and_String(AString &s, UInt64 val, const char *name)
81*f6dc9357SAndroid Build Coastguard Worker {
82*f6dc9357SAndroid Build Coastguard Worker   char temp[32];
83*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString(val, temp);
84*f6dc9357SAndroid Build Coastguard Worker   s += temp;
85*f6dc9357SAndroid Build Coastguard Worker   s.Add_Space();
86*f6dc9357SAndroid Build Coastguard Worker   s += name;
87*f6dc9357SAndroid Build Coastguard Worker }
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker void PrintSize_bytes_Smart(AString &s, UInt64 val);
PrintSize_bytes_Smart(AString & s,UInt64 val)90*f6dc9357SAndroid Build Coastguard Worker void PrintSize_bytes_Smart(AString &s, UInt64 val)
91*f6dc9357SAndroid Build Coastguard Worker {
92*f6dc9357SAndroid Build Coastguard Worker   Print_UInt64_and_String(s, val, "bytes");
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker   if (val == 0)
95*f6dc9357SAndroid Build Coastguard Worker     return;
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker   unsigned numBits = 10;
98*f6dc9357SAndroid Build Coastguard Worker   char c = 'K';
99*f6dc9357SAndroid Build Coastguard Worker   char temp[4] = { 'K', 'i', 'B', 0 };
100*f6dc9357SAndroid Build Coastguard Worker        if (val >= ((UInt64)10 << 30)) { numBits = 30; c = 'G'; }
101*f6dc9357SAndroid Build Coastguard Worker   else if (val >= ((UInt64)10 << 20)) { numBits = 20; c = 'M'; }
102*f6dc9357SAndroid Build Coastguard Worker   temp[0] = c;
103*f6dc9357SAndroid Build Coastguard Worker   s += " (";
104*f6dc9357SAndroid Build Coastguard Worker   Print_UInt64_and_String(s, ((val + ((UInt64)1 << numBits) - 1) >> numBits), temp);
105*f6dc9357SAndroid Build Coastguard Worker   s.Add_Char(')');
106*f6dc9357SAndroid Build Coastguard Worker }
107*f6dc9357SAndroid Build Coastguard Worker 
PrintSize_bytes_Smart_comma(AString & s,UInt64 val)108*f6dc9357SAndroid Build Coastguard Worker static void PrintSize_bytes_Smart_comma(AString &s, UInt64 val)
109*f6dc9357SAndroid Build Coastguard Worker {
110*f6dc9357SAndroid Build Coastguard Worker   if (val == (UInt64)(Int64)-1)
111*f6dc9357SAndroid Build Coastguard Worker     return;
112*f6dc9357SAndroid Build Coastguard Worker   s += ", ";
113*f6dc9357SAndroid Build Coastguard Worker   PrintSize_bytes_Smart(s, val);
114*f6dc9357SAndroid Build Coastguard Worker }
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker 
117*f6dc9357SAndroid Build Coastguard Worker 
118*f6dc9357SAndroid Build Coastguard Worker void Print_DirItemsStat(AString &s, const CDirItemsStat &st);
Print_DirItemsStat(AString & s,const CDirItemsStat & st)119*f6dc9357SAndroid Build Coastguard Worker void Print_DirItemsStat(AString &s, const CDirItemsStat &st)
120*f6dc9357SAndroid Build Coastguard Worker {
121*f6dc9357SAndroid Build Coastguard Worker   if (st.NumDirs != 0)
122*f6dc9357SAndroid Build Coastguard Worker   {
123*f6dc9357SAndroid Build Coastguard Worker     Print_UInt64_and_String(s, st.NumDirs, st.NumDirs == 1 ? "folder" : "folders");
124*f6dc9357SAndroid Build Coastguard Worker     s += ", ";
125*f6dc9357SAndroid Build Coastguard Worker   }
126*f6dc9357SAndroid Build Coastguard Worker   Print_UInt64_and_String(s, st.NumFiles, st.NumFiles == 1 ? "file" : "files");
127*f6dc9357SAndroid Build Coastguard Worker   PrintSize_bytes_Smart_comma(s, st.FilesSize);
128*f6dc9357SAndroid Build Coastguard Worker   if (st.NumAltStreams != 0)
129*f6dc9357SAndroid Build Coastguard Worker   {
130*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
131*f6dc9357SAndroid Build Coastguard Worker     Print_UInt64_and_String(s, st.NumAltStreams, "alternate streams");
132*f6dc9357SAndroid Build Coastguard Worker     PrintSize_bytes_Smart_comma(s, st.AltStreamsSize);
133*f6dc9357SAndroid Build Coastguard Worker   }
134*f6dc9357SAndroid Build Coastguard Worker }
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker 
137*f6dc9357SAndroid Build Coastguard Worker void Print_DirItemsStat2(AString &s, const CDirItemsStat2 &st);
Print_DirItemsStat2(AString & s,const CDirItemsStat2 & st)138*f6dc9357SAndroid Build Coastguard Worker void Print_DirItemsStat2(AString &s, const CDirItemsStat2 &st)
139*f6dc9357SAndroid Build Coastguard Worker {
140*f6dc9357SAndroid Build Coastguard Worker   Print_DirItemsStat(s, (CDirItemsStat &)st);
141*f6dc9357SAndroid Build Coastguard Worker   bool needLF = true;
142*f6dc9357SAndroid Build Coastguard Worker   if (st.Anti_NumDirs != 0)
143*f6dc9357SAndroid Build Coastguard Worker   {
144*f6dc9357SAndroid Build Coastguard Worker     if (needLF)
145*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
146*f6dc9357SAndroid Build Coastguard Worker     needLF = false;
147*f6dc9357SAndroid Build Coastguard Worker     Print_UInt64_and_String(s, st.Anti_NumDirs, st.Anti_NumDirs == 1 ? "anti-folder" : "anti-folders");
148*f6dc9357SAndroid Build Coastguard Worker   }
149*f6dc9357SAndroid Build Coastguard Worker   if (st.Anti_NumFiles != 0)
150*f6dc9357SAndroid Build Coastguard Worker   {
151*f6dc9357SAndroid Build Coastguard Worker     if (needLF)
152*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
153*f6dc9357SAndroid Build Coastguard Worker     else
154*f6dc9357SAndroid Build Coastguard Worker       s += ", ";
155*f6dc9357SAndroid Build Coastguard Worker     needLF = false;
156*f6dc9357SAndroid Build Coastguard Worker     Print_UInt64_and_String(s, st.Anti_NumFiles, st.Anti_NumFiles == 1 ? "anti-file" : "anti-files");
157*f6dc9357SAndroid Build Coastguard Worker   }
158*f6dc9357SAndroid Build Coastguard Worker   if (st.Anti_NumAltStreams != 0)
159*f6dc9357SAndroid Build Coastguard Worker   {
160*f6dc9357SAndroid Build Coastguard Worker     if (needLF)
161*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
162*f6dc9357SAndroid Build Coastguard Worker     else
163*f6dc9357SAndroid Build Coastguard Worker       s += ", ";
164*f6dc9357SAndroid Build Coastguard Worker     needLF = false;
165*f6dc9357SAndroid Build Coastguard Worker     Print_UInt64_and_String(s, st.Anti_NumAltStreams, "anti-alternate-streams");
166*f6dc9357SAndroid Build Coastguard Worker   }
167*f6dc9357SAndroid Build Coastguard Worker }
168*f6dc9357SAndroid Build Coastguard Worker 
169*f6dc9357SAndroid Build Coastguard Worker 
PrintStat(const CDirItemsStat & st)170*f6dc9357SAndroid Build Coastguard Worker void CExtractScanConsole::PrintStat(const CDirItemsStat &st)
171*f6dc9357SAndroid Build Coastguard Worker {
172*f6dc9357SAndroid Build Coastguard Worker   if (_so)
173*f6dc9357SAndroid Build Coastguard Worker   {
174*f6dc9357SAndroid Build Coastguard Worker     AString s;
175*f6dc9357SAndroid Build Coastguard Worker     Print_DirItemsStat(s, st);
176*f6dc9357SAndroid Build Coastguard Worker     *_so << s << endl;
177*f6dc9357SAndroid Build Coastguard Worker   }
178*f6dc9357SAndroid Build Coastguard Worker }
179*f6dc9357SAndroid Build Coastguard Worker 
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker 
182*f6dc9357SAndroid Build Coastguard Worker 
183*f6dc9357SAndroid Build Coastguard Worker 
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker 
186*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
187*f6dc9357SAndroid Build Coastguard Worker static NSynchronization::CCriticalSection g_CriticalSection;
188*f6dc9357SAndroid Build Coastguard Worker #define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
189*f6dc9357SAndroid Build Coastguard Worker #else
190*f6dc9357SAndroid Build Coastguard Worker #define MT_LOCK
191*f6dc9357SAndroid Build Coastguard Worker #endif
192*f6dc9357SAndroid Build Coastguard Worker 
193*f6dc9357SAndroid Build Coastguard Worker 
194*f6dc9357SAndroid Build Coastguard Worker static const char * const kTestString    =  "T";
195*f6dc9357SAndroid Build Coastguard Worker static const char * const kExtractString =  "-";
196*f6dc9357SAndroid Build Coastguard Worker static const char * const kSkipString    =  ".";
197*f6dc9357SAndroid Build Coastguard Worker static const char * const kReadString    =  "H";
198*f6dc9357SAndroid Build Coastguard Worker 
199*f6dc9357SAndroid Build Coastguard Worker // static const char * const kCantAutoRename = "cannot create file with auto name\n";
200*f6dc9357SAndroid Build Coastguard Worker // static const char * const kCantRenameFile = "cannot rename existing file\n";
201*f6dc9357SAndroid Build Coastguard Worker // static const char * const kCantDeleteOutputFile = "cannot delete output file ";
202*f6dc9357SAndroid Build Coastguard Worker 
203*f6dc9357SAndroid Build Coastguard Worker static const char * const kMemoryExceptionMessage = "Can't allocate required memory!";
204*f6dc9357SAndroid Build Coastguard Worker 
205*f6dc9357SAndroid Build Coastguard Worker static const char * const kExtracting = "Extracting archive: ";
206*f6dc9357SAndroid Build Coastguard Worker static const char * const kTesting = "Testing archive: ";
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker static const char * const kEverythingIsOk = "Everything is Ok";
209*f6dc9357SAndroid Build Coastguard Worker static const char * const kNoFiles = "No files to process";
210*f6dc9357SAndroid Build Coastguard Worker 
211*f6dc9357SAndroid Build Coastguard Worker static const char * const kUnsupportedMethod = "Unsupported Method";
212*f6dc9357SAndroid Build Coastguard Worker static const char * const kCrcFailed = "CRC Failed";
213*f6dc9357SAndroid Build Coastguard Worker static const char * const kCrcFailedEncrypted = "CRC Failed in encrypted file. Wrong password?";
214*f6dc9357SAndroid Build Coastguard Worker static const char * const kDataError = "Data Error";
215*f6dc9357SAndroid Build Coastguard Worker static const char * const kDataErrorEncrypted = "Data Error in encrypted file. Wrong password?";
216*f6dc9357SAndroid Build Coastguard Worker static const char * const kUnavailableData = "Unavailable data";
217*f6dc9357SAndroid Build Coastguard Worker static const char * const kUnexpectedEnd = "Unexpected end of data";
218*f6dc9357SAndroid Build Coastguard Worker static const char * const kDataAfterEnd = "There are some data after the end of the payload data";
219*f6dc9357SAndroid Build Coastguard Worker static const char * const kIsNotArc = "Is not archive";
220*f6dc9357SAndroid Build Coastguard Worker static const char * const kHeadersError = "Headers Error";
221*f6dc9357SAndroid Build Coastguard Worker static const char * const kWrongPassword = "Wrong password";
222*f6dc9357SAndroid Build Coastguard Worker 
223*f6dc9357SAndroid Build Coastguard Worker static const char * const k_ErrorFlagsMessages[] =
224*f6dc9357SAndroid Build Coastguard Worker {
225*f6dc9357SAndroid Build Coastguard Worker     "Is not archive"
226*f6dc9357SAndroid Build Coastguard Worker   , "Headers Error"
227*f6dc9357SAndroid Build Coastguard Worker   , "Headers Error in encrypted archive. Wrong password?"
228*f6dc9357SAndroid Build Coastguard Worker   , "Unavailable start of archive"
229*f6dc9357SAndroid Build Coastguard Worker   , "Unconfirmed start of archive"
230*f6dc9357SAndroid Build Coastguard Worker   , "Unexpected end of archive"
231*f6dc9357SAndroid Build Coastguard Worker   , "There are data after the end of archive"
232*f6dc9357SAndroid Build Coastguard Worker   , "Unsupported method"
233*f6dc9357SAndroid Build Coastguard Worker   , "Unsupported feature"
234*f6dc9357SAndroid Build Coastguard Worker   , "Data Error"
235*f6dc9357SAndroid Build Coastguard Worker   , "CRC Error"
236*f6dc9357SAndroid Build Coastguard Worker };
237*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackConsole::SetTotal (UInt64 size))238*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackConsole::SetTotal(UInt64 size))
239*f6dc9357SAndroid Build Coastguard Worker {
240*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
243*f6dc9357SAndroid Build Coastguard Worker   {
244*f6dc9357SAndroid Build Coastguard Worker     _percent.Total = size;
245*f6dc9357SAndroid Build Coastguard Worker     _percent.Print();
246*f6dc9357SAndroid Build Coastguard Worker   }
247*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
248*f6dc9357SAndroid Build Coastguard Worker }
249*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackConsole::SetCompleted (const UInt64 * completeValue))250*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackConsole::SetCompleted(const UInt64 *completeValue))
251*f6dc9357SAndroid Build Coastguard Worker {
252*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
253*f6dc9357SAndroid Build Coastguard Worker 
254*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
255*f6dc9357SAndroid Build Coastguard Worker   {
256*f6dc9357SAndroid Build Coastguard Worker     if (completeValue)
257*f6dc9357SAndroid Build Coastguard Worker       _percent.Completed = *completeValue;
258*f6dc9357SAndroid Build Coastguard Worker     _percent.Print();
259*f6dc9357SAndroid Build Coastguard Worker   }
260*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
261*f6dc9357SAndroid Build Coastguard Worker }
262*f6dc9357SAndroid Build Coastguard Worker 
263*f6dc9357SAndroid Build Coastguard Worker static const char * const kTab = "  ";
264*f6dc9357SAndroid Build Coastguard Worker 
PrintFileInfo(CStdOutStream * _so,const wchar_t * path,const FILETIME * ft,const UInt64 * size)265*f6dc9357SAndroid Build Coastguard Worker static void PrintFileInfo(CStdOutStream *_so, const wchar_t *path, const FILETIME *ft, const UInt64 *size)
266*f6dc9357SAndroid Build Coastguard Worker {
267*f6dc9357SAndroid Build Coastguard Worker   *_so << kTab << "Path:     ";
268*f6dc9357SAndroid Build Coastguard Worker   _so->NormalizePrint_wstr_Path(path);
269*f6dc9357SAndroid Build Coastguard Worker   *_so << endl;
270*f6dc9357SAndroid Build Coastguard Worker   if (size && *size != (UInt64)(Int64)-1)
271*f6dc9357SAndroid Build Coastguard Worker   {
272*f6dc9357SAndroid Build Coastguard Worker     AString s;
273*f6dc9357SAndroid Build Coastguard Worker     PrintSize_bytes_Smart(s, *size);
274*f6dc9357SAndroid Build Coastguard Worker     *_so << kTab << "Size:     " << s << endl;
275*f6dc9357SAndroid Build Coastguard Worker   }
276*f6dc9357SAndroid Build Coastguard Worker   if (ft)
277*f6dc9357SAndroid Build Coastguard Worker   {
278*f6dc9357SAndroid Build Coastguard Worker     char temp[64];
279*f6dc9357SAndroid Build Coastguard Worker     if (ConvertUtcFileTimeToString(*ft, temp, kTimestampPrintLevel_SEC))
280*f6dc9357SAndroid Build Coastguard Worker       *_so << kTab << "Modified: " << temp << endl;
281*f6dc9357SAndroid Build Coastguard Worker   }
282*f6dc9357SAndroid Build Coastguard Worker }
283*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackConsole::AskOverwrite (const wchar_t * existName,const FILETIME * existTime,const UInt64 * existSize,const wchar_t * newName,const FILETIME * newTime,const UInt64 * newSize,Int32 * answer))284*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackConsole::AskOverwrite(
285*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize,
286*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize,
287*f6dc9357SAndroid Build Coastguard Worker     Int32 *answer))
288*f6dc9357SAndroid Build Coastguard Worker {
289*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker   RINOK(CheckBreak2())
292*f6dc9357SAndroid Build Coastguard Worker 
293*f6dc9357SAndroid Build Coastguard Worker   ClosePercentsAndFlush();
294*f6dc9357SAndroid Build Coastguard Worker 
295*f6dc9357SAndroid Build Coastguard Worker   if (_so)
296*f6dc9357SAndroid Build Coastguard Worker   {
297*f6dc9357SAndroid Build Coastguard Worker     *_so << endl << "Would you like to replace the existing file:\n";
298*f6dc9357SAndroid Build Coastguard Worker     PrintFileInfo(_so, existName, existTime, existSize);
299*f6dc9357SAndroid Build Coastguard Worker     *_so << "with the file from archive:\n";
300*f6dc9357SAndroid Build Coastguard Worker     PrintFileInfo(_so, newName, newTime, newSize);
301*f6dc9357SAndroid Build Coastguard Worker   }
302*f6dc9357SAndroid Build Coastguard Worker 
303*f6dc9357SAndroid Build Coastguard Worker   NUserAnswerMode::EEnum overwriteAnswer = ScanUserYesNoAllQuit(_so);
304*f6dc9357SAndroid Build Coastguard Worker 
305*f6dc9357SAndroid Build Coastguard Worker   switch ((int)overwriteAnswer)
306*f6dc9357SAndroid Build Coastguard Worker   {
307*f6dc9357SAndroid Build Coastguard Worker     case NUserAnswerMode::kQuit:  return E_ABORT;
308*f6dc9357SAndroid Build Coastguard Worker     case NUserAnswerMode::kNo:     *answer = NOverwriteAnswer::kNo; break;
309*f6dc9357SAndroid Build Coastguard Worker     case NUserAnswerMode::kNoAll:  *answer = NOverwriteAnswer::kNoToAll; break;
310*f6dc9357SAndroid Build Coastguard Worker     case NUserAnswerMode::kYesAll: *answer = NOverwriteAnswer::kYesToAll; break;
311*f6dc9357SAndroid Build Coastguard Worker     case NUserAnswerMode::kYes:    *answer = NOverwriteAnswer::kYes; break;
312*f6dc9357SAndroid Build Coastguard Worker     case NUserAnswerMode::kAutoRenameAll: *answer = NOverwriteAnswer::kAutoRename; break;
313*f6dc9357SAndroid Build Coastguard Worker     case NUserAnswerMode::kEof:  return E_ABORT;
314*f6dc9357SAndroid Build Coastguard Worker     case NUserAnswerMode::kError:  return E_FAIL;
315*f6dc9357SAndroid Build Coastguard Worker     default: return E_FAIL;
316*f6dc9357SAndroid Build Coastguard Worker   }
317*f6dc9357SAndroid Build Coastguard Worker 
318*f6dc9357SAndroid Build Coastguard Worker   if (_so)
319*f6dc9357SAndroid Build Coastguard Worker   {
320*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
321*f6dc9357SAndroid Build Coastguard Worker     if (NeedFlush)
322*f6dc9357SAndroid Build Coastguard Worker       _so->Flush();
323*f6dc9357SAndroid Build Coastguard Worker   }
324*f6dc9357SAndroid Build Coastguard Worker 
325*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
326*f6dc9357SAndroid Build Coastguard Worker }
327*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackConsole::PrepareOperation (const wchar_t * name,Int32 isFolder,Int32 askExtractMode,const UInt64 * position))328*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackConsole::PrepareOperation(const wchar_t *name, Int32 isFolder, Int32 askExtractMode, const UInt64 *position))
329*f6dc9357SAndroid Build Coastguard Worker {
330*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
331*f6dc9357SAndroid Build Coastguard Worker 
332*f6dc9357SAndroid Build Coastguard Worker   _currentName = name;
333*f6dc9357SAndroid Build Coastguard Worker 
334*f6dc9357SAndroid Build Coastguard Worker   const char *s;
335*f6dc9357SAndroid Build Coastguard Worker   unsigned requiredLevel = 1;
336*f6dc9357SAndroid Build Coastguard Worker 
337*f6dc9357SAndroid Build Coastguard Worker   switch (askExtractMode)
338*f6dc9357SAndroid Build Coastguard Worker   {
339*f6dc9357SAndroid Build Coastguard Worker     case NArchive::NExtract::NAskMode::kExtract: s = kExtractString; break;
340*f6dc9357SAndroid Build Coastguard Worker     case NArchive::NExtract::NAskMode::kTest:    s = kTestString; break;
341*f6dc9357SAndroid Build Coastguard Worker     case NArchive::NExtract::NAskMode::kSkip:    s = kSkipString; requiredLevel = 2; break;
342*f6dc9357SAndroid Build Coastguard Worker     case NArchive::NExtract::NAskMode::kReadExternal: s = kReadString; requiredLevel = 0; break;
343*f6dc9357SAndroid Build Coastguard Worker     default: s = "???"; requiredLevel = 2;
344*f6dc9357SAndroid Build Coastguard Worker   }
345*f6dc9357SAndroid Build Coastguard Worker 
346*f6dc9357SAndroid Build Coastguard Worker   const bool show2 = (LogLevel >= requiredLevel && _so);
347*f6dc9357SAndroid Build Coastguard Worker 
348*f6dc9357SAndroid Build Coastguard Worker   if (show2)
349*f6dc9357SAndroid Build Coastguard Worker   {
350*f6dc9357SAndroid Build Coastguard Worker     ClosePercents_for_so();
351*f6dc9357SAndroid Build Coastguard Worker 
352*f6dc9357SAndroid Build Coastguard Worker     _tempA = s;
353*f6dc9357SAndroid Build Coastguard Worker     if (name)
354*f6dc9357SAndroid Build Coastguard Worker       _tempA.Add_Space();
355*f6dc9357SAndroid Build Coastguard Worker     *_so << _tempA;
356*f6dc9357SAndroid Build Coastguard Worker 
357*f6dc9357SAndroid Build Coastguard Worker     _tempU.Empty();
358*f6dc9357SAndroid Build Coastguard Worker     if (name)
359*f6dc9357SAndroid Build Coastguard Worker     {
360*f6dc9357SAndroid Build Coastguard Worker       _tempU = name;
361*f6dc9357SAndroid Build Coastguard Worker       _so->Normalize_UString_Path(_tempU);
362*f6dc9357SAndroid Build Coastguard Worker       // 21.04
363*f6dc9357SAndroid Build Coastguard Worker       if (isFolder)
364*f6dc9357SAndroid Build Coastguard Worker       {
365*f6dc9357SAndroid Build Coastguard Worker         if (!_tempU.IsEmpty() && _tempU.Back() != WCHAR_PATH_SEPARATOR)
366*f6dc9357SAndroid Build Coastguard Worker           _tempU.Add_PathSepar();
367*f6dc9357SAndroid Build Coastguard Worker       }
368*f6dc9357SAndroid Build Coastguard Worker     }
369*f6dc9357SAndroid Build Coastguard Worker     _so->PrintUString(_tempU, _tempA);
370*f6dc9357SAndroid Build Coastguard Worker     if (position)
371*f6dc9357SAndroid Build Coastguard Worker       *_so << " <" << *position << ">";
372*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
373*f6dc9357SAndroid Build Coastguard Worker 
374*f6dc9357SAndroid Build Coastguard Worker     if (NeedFlush)
375*f6dc9357SAndroid Build Coastguard Worker       _so->Flush();
376*f6dc9357SAndroid Build Coastguard Worker     // _so->Flush();  // for debug only
377*f6dc9357SAndroid Build Coastguard Worker   }
378*f6dc9357SAndroid Build Coastguard Worker 
379*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
380*f6dc9357SAndroid Build Coastguard Worker   {
381*f6dc9357SAndroid Build Coastguard Worker     if (PercentsNameLevel >= 1)
382*f6dc9357SAndroid Build Coastguard Worker     {
383*f6dc9357SAndroid Build Coastguard Worker       _percent.FileName.Empty();
384*f6dc9357SAndroid Build Coastguard Worker       _percent.Command.Empty();
385*f6dc9357SAndroid Build Coastguard Worker       if (PercentsNameLevel > 1 || !show2)
386*f6dc9357SAndroid Build Coastguard Worker       {
387*f6dc9357SAndroid Build Coastguard Worker         _percent.Command = s;
388*f6dc9357SAndroid Build Coastguard Worker         if (name)
389*f6dc9357SAndroid Build Coastguard Worker           _percent.FileName = name;
390*f6dc9357SAndroid Build Coastguard Worker       }
391*f6dc9357SAndroid Build Coastguard Worker     }
392*f6dc9357SAndroid Build Coastguard Worker     _percent.Print();
393*f6dc9357SAndroid Build Coastguard Worker   }
394*f6dc9357SAndroid Build Coastguard Worker 
395*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
396*f6dc9357SAndroid Build Coastguard Worker }
397*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackConsole::MessageError (const wchar_t * message))398*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackConsole::MessageError(const wchar_t *message))
399*f6dc9357SAndroid Build Coastguard Worker {
400*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
401*f6dc9357SAndroid Build Coastguard Worker 
402*f6dc9357SAndroid Build Coastguard Worker   RINOK(CheckBreak2())
403*f6dc9357SAndroid Build Coastguard Worker 
404*f6dc9357SAndroid Build Coastguard Worker   NumFileErrors_in_Current++;
405*f6dc9357SAndroid Build Coastguard Worker   NumFileErrors++;
406*f6dc9357SAndroid Build Coastguard Worker 
407*f6dc9357SAndroid Build Coastguard Worker   ClosePercentsAndFlush();
408*f6dc9357SAndroid Build Coastguard Worker   if (_se)
409*f6dc9357SAndroid Build Coastguard Worker   {
410*f6dc9357SAndroid Build Coastguard Worker     *_se << kError << message << endl;
411*f6dc9357SAndroid Build Coastguard Worker     _se->Flush();
412*f6dc9357SAndroid Build Coastguard Worker   }
413*f6dc9357SAndroid Build Coastguard Worker 
414*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
415*f6dc9357SAndroid Build Coastguard Worker }
416*f6dc9357SAndroid Build Coastguard Worker 
417*f6dc9357SAndroid Build Coastguard Worker void SetExtractErrorMessage(Int32 opRes, Int32 encrypted, AString &dest);
SetExtractErrorMessage(Int32 opRes,Int32 encrypted,AString & dest)418*f6dc9357SAndroid Build Coastguard Worker void SetExtractErrorMessage(Int32 opRes, Int32 encrypted, AString &dest)
419*f6dc9357SAndroid Build Coastguard Worker {
420*f6dc9357SAndroid Build Coastguard Worker   dest.Empty();
421*f6dc9357SAndroid Build Coastguard Worker     const char *s = NULL;
422*f6dc9357SAndroid Build Coastguard Worker 
423*f6dc9357SAndroid Build Coastguard Worker     switch (opRes)
424*f6dc9357SAndroid Build Coastguard Worker     {
425*f6dc9357SAndroid Build Coastguard Worker       case NArchive::NExtract::NOperationResult::kUnsupportedMethod:
426*f6dc9357SAndroid Build Coastguard Worker         s = kUnsupportedMethod;
427*f6dc9357SAndroid Build Coastguard Worker         break;
428*f6dc9357SAndroid Build Coastguard Worker       case NArchive::NExtract::NOperationResult::kCRCError:
429*f6dc9357SAndroid Build Coastguard Worker         s = (encrypted ? kCrcFailedEncrypted : kCrcFailed);
430*f6dc9357SAndroid Build Coastguard Worker         break;
431*f6dc9357SAndroid Build Coastguard Worker       case NArchive::NExtract::NOperationResult::kDataError:
432*f6dc9357SAndroid Build Coastguard Worker         s = (encrypted ? kDataErrorEncrypted : kDataError);
433*f6dc9357SAndroid Build Coastguard Worker         break;
434*f6dc9357SAndroid Build Coastguard Worker       case NArchive::NExtract::NOperationResult::kUnavailable:
435*f6dc9357SAndroid Build Coastguard Worker         s = kUnavailableData;
436*f6dc9357SAndroid Build Coastguard Worker         break;
437*f6dc9357SAndroid Build Coastguard Worker       case NArchive::NExtract::NOperationResult::kUnexpectedEnd:
438*f6dc9357SAndroid Build Coastguard Worker         s = kUnexpectedEnd;
439*f6dc9357SAndroid Build Coastguard Worker         break;
440*f6dc9357SAndroid Build Coastguard Worker       case NArchive::NExtract::NOperationResult::kDataAfterEnd:
441*f6dc9357SAndroid Build Coastguard Worker         s = kDataAfterEnd;
442*f6dc9357SAndroid Build Coastguard Worker         break;
443*f6dc9357SAndroid Build Coastguard Worker       case NArchive::NExtract::NOperationResult::kIsNotArc:
444*f6dc9357SAndroid Build Coastguard Worker         s = kIsNotArc;
445*f6dc9357SAndroid Build Coastguard Worker         break;
446*f6dc9357SAndroid Build Coastguard Worker       case NArchive::NExtract::NOperationResult::kHeadersError:
447*f6dc9357SAndroid Build Coastguard Worker         s = kHeadersError;
448*f6dc9357SAndroid Build Coastguard Worker         break;
449*f6dc9357SAndroid Build Coastguard Worker       case NArchive::NExtract::NOperationResult::kWrongPassword:
450*f6dc9357SAndroid Build Coastguard Worker         s = kWrongPassword;
451*f6dc9357SAndroid Build Coastguard Worker         break;
452*f6dc9357SAndroid Build Coastguard Worker       default: break;
453*f6dc9357SAndroid Build Coastguard Worker     }
454*f6dc9357SAndroid Build Coastguard Worker 
455*f6dc9357SAndroid Build Coastguard Worker     dest += kError;
456*f6dc9357SAndroid Build Coastguard Worker     if (s)
457*f6dc9357SAndroid Build Coastguard Worker       dest += s;
458*f6dc9357SAndroid Build Coastguard Worker     else
459*f6dc9357SAndroid Build Coastguard Worker     {
460*f6dc9357SAndroid Build Coastguard Worker       dest += "Error #";
461*f6dc9357SAndroid Build Coastguard Worker       dest.Add_UInt32((UInt32)opRes);
462*f6dc9357SAndroid Build Coastguard Worker     }
463*f6dc9357SAndroid Build Coastguard Worker }
464*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackConsole::SetOperationResult (Int32 opRes,Int32 encrypted))465*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackConsole::SetOperationResult(Int32 opRes, Int32 encrypted))
466*f6dc9357SAndroid Build Coastguard Worker {
467*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
468*f6dc9357SAndroid Build Coastguard Worker 
469*f6dc9357SAndroid Build Coastguard Worker   if (opRes == NArchive::NExtract::NOperationResult::kOK)
470*f6dc9357SAndroid Build Coastguard Worker   {
471*f6dc9357SAndroid Build Coastguard Worker     if (NeedPercents())
472*f6dc9357SAndroid Build Coastguard Worker     {
473*f6dc9357SAndroid Build Coastguard Worker       _percent.Command.Empty();
474*f6dc9357SAndroid Build Coastguard Worker       _percent.FileName.Empty();
475*f6dc9357SAndroid Build Coastguard Worker       _percent.Files++;
476*f6dc9357SAndroid Build Coastguard Worker     }
477*f6dc9357SAndroid Build Coastguard Worker   }
478*f6dc9357SAndroid Build Coastguard Worker   else
479*f6dc9357SAndroid Build Coastguard Worker   {
480*f6dc9357SAndroid Build Coastguard Worker     NumFileErrors_in_Current++;
481*f6dc9357SAndroid Build Coastguard Worker     NumFileErrors++;
482*f6dc9357SAndroid Build Coastguard Worker 
483*f6dc9357SAndroid Build Coastguard Worker     if (_se)
484*f6dc9357SAndroid Build Coastguard Worker     {
485*f6dc9357SAndroid Build Coastguard Worker       ClosePercentsAndFlush();
486*f6dc9357SAndroid Build Coastguard Worker 
487*f6dc9357SAndroid Build Coastguard Worker       AString s;
488*f6dc9357SAndroid Build Coastguard Worker       SetExtractErrorMessage(opRes, encrypted, s);
489*f6dc9357SAndroid Build Coastguard Worker 
490*f6dc9357SAndroid Build Coastguard Worker       *_se << s;
491*f6dc9357SAndroid Build Coastguard Worker       if (!_currentName.IsEmpty())
492*f6dc9357SAndroid Build Coastguard Worker       {
493*f6dc9357SAndroid Build Coastguard Worker         *_se << " : ";
494*f6dc9357SAndroid Build Coastguard Worker         _se->NormalizePrint_UString_Path(_currentName);
495*f6dc9357SAndroid Build Coastguard Worker       }
496*f6dc9357SAndroid Build Coastguard Worker       *_se << endl;
497*f6dc9357SAndroid Build Coastguard Worker       _se->Flush();
498*f6dc9357SAndroid Build Coastguard Worker     }
499*f6dc9357SAndroid Build Coastguard Worker   }
500*f6dc9357SAndroid Build Coastguard Worker 
501*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
502*f6dc9357SAndroid Build Coastguard Worker }
503*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackConsole::ReportExtractResult (Int32 opRes,Int32 encrypted,const wchar_t * name))504*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackConsole::ReportExtractResult(Int32 opRes, Int32 encrypted, const wchar_t *name))
505*f6dc9357SAndroid Build Coastguard Worker {
506*f6dc9357SAndroid Build Coastguard Worker   if (opRes != NArchive::NExtract::NOperationResult::kOK)
507*f6dc9357SAndroid Build Coastguard Worker   {
508*f6dc9357SAndroid Build Coastguard Worker     _currentName = name;
509*f6dc9357SAndroid Build Coastguard Worker     return SetOperationResult(opRes, encrypted);
510*f6dc9357SAndroid Build Coastguard Worker   }
511*f6dc9357SAndroid Build Coastguard Worker 
512*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
513*f6dc9357SAndroid Build Coastguard Worker }
514*f6dc9357SAndroid Build Coastguard Worker 
515*f6dc9357SAndroid Build Coastguard Worker 
516*f6dc9357SAndroid Build Coastguard Worker 
517*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
518*f6dc9357SAndroid Build Coastguard Worker 
SetPassword(const UString & password)519*f6dc9357SAndroid Build Coastguard Worker HRESULT CExtractCallbackConsole::SetPassword(const UString &password)
520*f6dc9357SAndroid Build Coastguard Worker {
521*f6dc9357SAndroid Build Coastguard Worker   PasswordIsDefined = true;
522*f6dc9357SAndroid Build Coastguard Worker   Password = password;
523*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
524*f6dc9357SAndroid Build Coastguard Worker }
525*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackConsole::CryptoGetTextPassword (BSTR * password))526*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackConsole::CryptoGetTextPassword(BSTR *password))
527*f6dc9357SAndroid Build Coastguard Worker {
528*f6dc9357SAndroid Build Coastguard Worker   COM_TRY_BEGIN
529*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
530*f6dc9357SAndroid Build Coastguard Worker   return Open_CryptoGetTextPassword(password);
531*f6dc9357SAndroid Build Coastguard Worker   COM_TRY_END
532*f6dc9357SAndroid Build Coastguard Worker }
533*f6dc9357SAndroid Build Coastguard Worker 
534*f6dc9357SAndroid Build Coastguard Worker #endif
535*f6dc9357SAndroid Build Coastguard Worker 
536*f6dc9357SAndroid Build Coastguard Worker 
537*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
538*f6dc9357SAndroid Build Coastguard Worker 
PrintTo_se_Path_WithTitle(const UString & path,const char * title)539*f6dc9357SAndroid Build Coastguard Worker void CExtractCallbackConsole::PrintTo_se_Path_WithTitle(const UString &path, const char *title)
540*f6dc9357SAndroid Build Coastguard Worker {
541*f6dc9357SAndroid Build Coastguard Worker   *_se << title;
542*f6dc9357SAndroid Build Coastguard Worker   _se->NormalizePrint_UString_Path(path);
543*f6dc9357SAndroid Build Coastguard Worker   *_se << endl;
544*f6dc9357SAndroid Build Coastguard Worker }
545*f6dc9357SAndroid Build Coastguard Worker 
Add_ArchiveName_Error()546*f6dc9357SAndroid Build Coastguard Worker void CExtractCallbackConsole::Add_ArchiveName_Error()
547*f6dc9357SAndroid Build Coastguard Worker {
548*f6dc9357SAndroid Build Coastguard Worker   if (_needWriteArchivePath)
549*f6dc9357SAndroid Build Coastguard Worker   {
550*f6dc9357SAndroid Build Coastguard Worker     PrintTo_se_Path_WithTitle(_currentArchivePath, "Archive: ");
551*f6dc9357SAndroid Build Coastguard Worker     _needWriteArchivePath = false;
552*f6dc9357SAndroid Build Coastguard Worker   }
553*f6dc9357SAndroid Build Coastguard Worker }
554*f6dc9357SAndroid Build Coastguard Worker 
555*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CExtractCallbackConsole::RequestMemoryUse (UInt32 flags,UInt32,UInt32,const wchar_t * path,UInt64 requiredSize,UInt64 * allowedSize,UInt32 * answerFlags))556*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CExtractCallbackConsole::RequestMemoryUse(
557*f6dc9357SAndroid Build Coastguard Worker     UInt32 flags, UInt32 /* indexType */, UInt32 /* index */, const wchar_t *path,
558*f6dc9357SAndroid Build Coastguard Worker     UInt64 requiredSize, UInt64 *allowedSize, UInt32 *answerFlags))
559*f6dc9357SAndroid Build Coastguard Worker {
560*f6dc9357SAndroid Build Coastguard Worker   if ((flags & NRequestMemoryUseFlags::k_IsReport) == 0
561*f6dc9357SAndroid Build Coastguard Worker       && requiredSize <= *allowedSize)
562*f6dc9357SAndroid Build Coastguard Worker   {
563*f6dc9357SAndroid Build Coastguard Worker #if 0
564*f6dc9357SAndroid Build Coastguard Worker     // it's expected, that *answerFlags was set to NRequestMemoryAnswerFlags::k_Allow already,
565*f6dc9357SAndroid Build Coastguard Worker     // because it's default answer for (requiredSize <= *allowedSize) case.
566*f6dc9357SAndroid Build Coastguard Worker     // optional code:
567*f6dc9357SAndroid Build Coastguard Worker     *answerFlags = NRequestMemoryAnswerFlags::k_Allow;
568*f6dc9357SAndroid Build Coastguard Worker #endif
569*f6dc9357SAndroid Build Coastguard Worker   }
570*f6dc9357SAndroid Build Coastguard Worker   else
571*f6dc9357SAndroid Build Coastguard Worker   {
572*f6dc9357SAndroid Build Coastguard Worker     if ((flags & NRequestMemoryUseFlags::k_NoErrorMessage) == 0)
573*f6dc9357SAndroid Build Coastguard Worker     if (_se)
574*f6dc9357SAndroid Build Coastguard Worker     {
575*f6dc9357SAndroid Build Coastguard Worker       const UInt64 num_GB_allowed  = (*allowedSize + ((1u << 30) - 1)) >> 30;
576*f6dc9357SAndroid Build Coastguard Worker       const UInt64 num_GB_required = (requiredSize + ((1u << 30) - 1)) >> 30;
577*f6dc9357SAndroid Build Coastguard Worker       ClosePercentsAndFlush();
578*f6dc9357SAndroid Build Coastguard Worker       Add_ArchiveName_Error();
579*f6dc9357SAndroid Build Coastguard Worker       if (path)
580*f6dc9357SAndroid Build Coastguard Worker         PrintTo_se_Path_WithTitle(path, "File: ");
581*f6dc9357SAndroid Build Coastguard Worker       *_se << "The extraction operation requires big amount memory (RAM):" << endl
582*f6dc9357SAndroid Build Coastguard Worker         << "  " << num_GB_required  << " GB : required memory usage size" << endl
583*f6dc9357SAndroid Build Coastguard Worker         << "  " << num_GB_allowed   << " GB : allowed memory usage limit" << endl
584*f6dc9357SAndroid Build Coastguard Worker         << "  Use -smemx{size}g switch to set allowed memory usage limit for extraction." << endl;
585*f6dc9357SAndroid Build Coastguard Worker       *_se << "ERROR: Memory usage limit was exceeded." << endl;
586*f6dc9357SAndroid Build Coastguard Worker       const char *m = NULL;
587*f6dc9357SAndroid Build Coastguard Worker       // if (indexType == NArchive::NEventIndexType::kNoIndex)
588*f6dc9357SAndroid Build Coastguard Worker            if ((flags & NRequestMemoryUseFlags::k_SkipArc_IsExpected) ||
589*f6dc9357SAndroid Build Coastguard Worker                (flags & NRequestMemoryUseFlags::k_Report_SkipArc))
590*f6dc9357SAndroid Build Coastguard Worker           m = "Archive unpacking was skipped.";
591*f6dc9357SAndroid Build Coastguard Worker /*
592*f6dc9357SAndroid Build Coastguard Worker       else if ((flags & NRequestMemoryUseFlags::k_SkipBigFiles_IsExpected) ||
593*f6dc9357SAndroid Build Coastguard Worker                (flags & NRequestMemoryUseFlags::k_Report_SkipBigFiles))
594*f6dc9357SAndroid Build Coastguard Worker           m = "Extraction for some files will be skipped.";
595*f6dc9357SAndroid Build Coastguard Worker       else if ((flags & NRequestMemoryUseFlags::k_SkipBigFile_IsExpected) ||
596*f6dc9357SAndroid Build Coastguard Worker                (flags & NRequestMemoryUseFlags::k_Report_SkipBigFile))
597*f6dc9357SAndroid Build Coastguard Worker           m = "File extraction was skipped.";
598*f6dc9357SAndroid Build Coastguard Worker */
599*f6dc9357SAndroid Build Coastguard Worker       if (m)
600*f6dc9357SAndroid Build Coastguard Worker         *_se << m;
601*f6dc9357SAndroid Build Coastguard Worker       _se->Flush();
602*f6dc9357SAndroid Build Coastguard Worker     }
603*f6dc9357SAndroid Build Coastguard Worker 
604*f6dc9357SAndroid Build Coastguard Worker     if ((flags & NRequestMemoryUseFlags::k_IsReport) == 0)
605*f6dc9357SAndroid Build Coastguard Worker     {
606*f6dc9357SAndroid Build Coastguard Worker       // default answer can be k_Allow, if limit was not forced,
607*f6dc9357SAndroid Build Coastguard Worker       // so we change answer to non-allowed here.
608*f6dc9357SAndroid Build Coastguard Worker       *answerFlags = NRequestMemoryAnswerFlags::k_Limit_Exceeded;
609*f6dc9357SAndroid Build Coastguard Worker            if (flags & NRequestMemoryUseFlags::k_SkipArc_IsExpected)
610*f6dc9357SAndroid Build Coastguard Worker         *answerFlags |= NRequestMemoryAnswerFlags::k_SkipArc;
611*f6dc9357SAndroid Build Coastguard Worker /*
612*f6dc9357SAndroid Build Coastguard Worker       else if (flags & NRequestMemoryUseFlags::k_SkipBigFile_IsExpected)
613*f6dc9357SAndroid Build Coastguard Worker         *answerFlags |= NRequestMemoryAnswerFlags::k_SkipBigFile;
614*f6dc9357SAndroid Build Coastguard Worker       else if (flags & NRequestMemoryUseFlags::k_SkipBigFiles_IsExpected)
615*f6dc9357SAndroid Build Coastguard Worker         *answerFlags |= NRequestMemoryAnswerFlags::k_SkipBigFiles;
616*f6dc9357SAndroid Build Coastguard Worker */
617*f6dc9357SAndroid Build Coastguard Worker     }
618*f6dc9357SAndroid Build Coastguard Worker   }
619*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
620*f6dc9357SAndroid Build Coastguard Worker }
621*f6dc9357SAndroid Build Coastguard Worker 
622*f6dc9357SAndroid Build Coastguard Worker #endif
623*f6dc9357SAndroid Build Coastguard Worker 
624*f6dc9357SAndroid Build Coastguard Worker 
BeforeOpen(const wchar_t * name,bool testMode)625*f6dc9357SAndroid Build Coastguard Worker HRESULT CExtractCallbackConsole::BeforeOpen(const wchar_t *name, bool testMode)
626*f6dc9357SAndroid Build Coastguard Worker {
627*f6dc9357SAndroid Build Coastguard Worker   _currentArchivePath = name;
628*f6dc9357SAndroid Build Coastguard Worker   _needWriteArchivePath = true;
629*f6dc9357SAndroid Build Coastguard Worker 
630*f6dc9357SAndroid Build Coastguard Worker   RINOK(CheckBreak2())
631*f6dc9357SAndroid Build Coastguard Worker 
632*f6dc9357SAndroid Build Coastguard Worker   NumTryArcs++;
633*f6dc9357SAndroid Build Coastguard Worker   ThereIsError_in_Current = false;
634*f6dc9357SAndroid Build Coastguard Worker   ThereIsWarning_in_Current = false;
635*f6dc9357SAndroid Build Coastguard Worker   NumFileErrors_in_Current = 0;
636*f6dc9357SAndroid Build Coastguard Worker 
637*f6dc9357SAndroid Build Coastguard Worker   ClosePercents_for_so();
638*f6dc9357SAndroid Build Coastguard Worker   if (_so)
639*f6dc9357SAndroid Build Coastguard Worker   {
640*f6dc9357SAndroid Build Coastguard Worker     *_so << endl << (testMode ? kTesting : kExtracting);
641*f6dc9357SAndroid Build Coastguard Worker     _so->NormalizePrint_wstr_Path(name);
642*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
643*f6dc9357SAndroid Build Coastguard Worker   }
644*f6dc9357SAndroid Build Coastguard Worker 
645*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
646*f6dc9357SAndroid Build Coastguard Worker     _percent.Command = "Open";
647*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
648*f6dc9357SAndroid Build Coastguard Worker }
649*f6dc9357SAndroid Build Coastguard Worker 
650*f6dc9357SAndroid Build Coastguard Worker HRESULT Print_OpenArchive_Props(CStdOutStream &so, const CCodecs *codecs, const CArchiveLink &arcLink);
651*f6dc9357SAndroid Build Coastguard Worker HRESULT Print_OpenArchive_Error(CStdOutStream &so, const CCodecs *codecs, const CArchiveLink &arcLink);
652*f6dc9357SAndroid Build Coastguard Worker 
GetOpenArcErrorMessage(UInt32 errorFlags)653*f6dc9357SAndroid Build Coastguard Worker static AString GetOpenArcErrorMessage(UInt32 errorFlags)
654*f6dc9357SAndroid Build Coastguard Worker {
655*f6dc9357SAndroid Build Coastguard Worker   AString s;
656*f6dc9357SAndroid Build Coastguard Worker 
657*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < Z7_ARRAY_SIZE(k_ErrorFlagsMessages); i++)
658*f6dc9357SAndroid Build Coastguard Worker   {
659*f6dc9357SAndroid Build Coastguard Worker     UInt32 f = (1 << i);
660*f6dc9357SAndroid Build Coastguard Worker     if ((errorFlags & f) == 0)
661*f6dc9357SAndroid Build Coastguard Worker       continue;
662*f6dc9357SAndroid Build Coastguard Worker     const char *m = k_ErrorFlagsMessages[i];
663*f6dc9357SAndroid Build Coastguard Worker     if (!s.IsEmpty())
664*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
665*f6dc9357SAndroid Build Coastguard Worker     s += m;
666*f6dc9357SAndroid Build Coastguard Worker     errorFlags &= ~f;
667*f6dc9357SAndroid Build Coastguard Worker   }
668*f6dc9357SAndroid Build Coastguard Worker 
669*f6dc9357SAndroid Build Coastguard Worker   if (errorFlags != 0)
670*f6dc9357SAndroid Build Coastguard Worker   {
671*f6dc9357SAndroid Build Coastguard Worker     char sz[16];
672*f6dc9357SAndroid Build Coastguard Worker     sz[0] = '0';
673*f6dc9357SAndroid Build Coastguard Worker     sz[1] = 'x';
674*f6dc9357SAndroid Build Coastguard Worker     ConvertUInt32ToHex(errorFlags, sz + 2);
675*f6dc9357SAndroid Build Coastguard Worker     if (!s.IsEmpty())
676*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
677*f6dc9357SAndroid Build Coastguard Worker     s += sz;
678*f6dc9357SAndroid Build Coastguard Worker   }
679*f6dc9357SAndroid Build Coastguard Worker 
680*f6dc9357SAndroid Build Coastguard Worker   return s;
681*f6dc9357SAndroid Build Coastguard Worker }
682*f6dc9357SAndroid Build Coastguard Worker 
683*f6dc9357SAndroid Build Coastguard Worker void PrintErrorFlags(CStdOutStream &so, const char *s, UInt32 errorFlags);
PrintErrorFlags(CStdOutStream & so,const char * s,UInt32 errorFlags)684*f6dc9357SAndroid Build Coastguard Worker void PrintErrorFlags(CStdOutStream &so, const char *s, UInt32 errorFlags)
685*f6dc9357SAndroid Build Coastguard Worker {
686*f6dc9357SAndroid Build Coastguard Worker   if (errorFlags == 0)
687*f6dc9357SAndroid Build Coastguard Worker     return;
688*f6dc9357SAndroid Build Coastguard Worker   so << s << endl << GetOpenArcErrorMessage(errorFlags) << endl;
689*f6dc9357SAndroid Build Coastguard Worker }
690*f6dc9357SAndroid Build Coastguard Worker 
Add_Messsage_Pre_ArcType(UString & s,const char * pre,const wchar_t * arcType)691*f6dc9357SAndroid Build Coastguard Worker static void Add_Messsage_Pre_ArcType(UString &s, const char *pre, const wchar_t *arcType)
692*f6dc9357SAndroid Build Coastguard Worker {
693*f6dc9357SAndroid Build Coastguard Worker   s.Add_LF();
694*f6dc9357SAndroid Build Coastguard Worker   s += pre;
695*f6dc9357SAndroid Build Coastguard Worker   s += " as [";
696*f6dc9357SAndroid Build Coastguard Worker   s += arcType;
697*f6dc9357SAndroid Build Coastguard Worker   s += "] archive";
698*f6dc9357SAndroid Build Coastguard Worker }
699*f6dc9357SAndroid Build Coastguard Worker 
700*f6dc9357SAndroid Build Coastguard Worker void Print_ErrorFormatIndex_Warning(CStdOutStream *_so, const CCodecs *codecs, const CArc &arc);
Print_ErrorFormatIndex_Warning(CStdOutStream * _so,const CCodecs * codecs,const CArc & arc)701*f6dc9357SAndroid Build Coastguard Worker void Print_ErrorFormatIndex_Warning(CStdOutStream *_so, const CCodecs *codecs, const CArc &arc)
702*f6dc9357SAndroid Build Coastguard Worker {
703*f6dc9357SAndroid Build Coastguard Worker   const CArcErrorInfo &er = arc.ErrorInfo;
704*f6dc9357SAndroid Build Coastguard Worker 
705*f6dc9357SAndroid Build Coastguard Worker   *_so << "WARNING:\n";
706*f6dc9357SAndroid Build Coastguard Worker   _so->NormalizePrint_UString_Path(arc.Path);
707*f6dc9357SAndroid Build Coastguard Worker   UString s;
708*f6dc9357SAndroid Build Coastguard Worker   if (arc.FormatIndex == er.ErrorFormatIndex)
709*f6dc9357SAndroid Build Coastguard Worker   {
710*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
711*f6dc9357SAndroid Build Coastguard Worker     s += "The archive is open with offset";
712*f6dc9357SAndroid Build Coastguard Worker   }
713*f6dc9357SAndroid Build Coastguard Worker   else
714*f6dc9357SAndroid Build Coastguard Worker   {
715*f6dc9357SAndroid Build Coastguard Worker     Add_Messsage_Pre_ArcType(s, "Cannot open the file", codecs->GetFormatNamePtr(er.ErrorFormatIndex));
716*f6dc9357SAndroid Build Coastguard Worker     Add_Messsage_Pre_ArcType(s, "The file is open", codecs->GetFormatNamePtr(arc.FormatIndex));
717*f6dc9357SAndroid Build Coastguard Worker   }
718*f6dc9357SAndroid Build Coastguard Worker 
719*f6dc9357SAndroid Build Coastguard Worker   *_so << s << endl << endl;
720*f6dc9357SAndroid Build Coastguard Worker }
721*f6dc9357SAndroid Build Coastguard Worker 
722*f6dc9357SAndroid Build Coastguard Worker 
OpenResult(const CCodecs * codecs,const CArchiveLink & arcLink,const wchar_t * name,HRESULT result)723*f6dc9357SAndroid Build Coastguard Worker HRESULT CExtractCallbackConsole::OpenResult(
724*f6dc9357SAndroid Build Coastguard Worker     const CCodecs *codecs, const CArchiveLink &arcLink,
725*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *name, HRESULT result)
726*f6dc9357SAndroid Build Coastguard Worker {
727*f6dc9357SAndroid Build Coastguard Worker   _currentArchivePath = name;
728*f6dc9357SAndroid Build Coastguard Worker   _needWriteArchivePath = true;
729*f6dc9357SAndroid Build Coastguard Worker 
730*f6dc9357SAndroid Build Coastguard Worker   ClosePercents();
731*f6dc9357SAndroid Build Coastguard Worker 
732*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
733*f6dc9357SAndroid Build Coastguard Worker   {
734*f6dc9357SAndroid Build Coastguard Worker     _percent.Files = 0;
735*f6dc9357SAndroid Build Coastguard Worker     _percent.Command.Empty();
736*f6dc9357SAndroid Build Coastguard Worker     _percent.FileName.Empty();
737*f6dc9357SAndroid Build Coastguard Worker   }
738*f6dc9357SAndroid Build Coastguard Worker 
739*f6dc9357SAndroid Build Coastguard Worker 
740*f6dc9357SAndroid Build Coastguard Worker   ClosePercentsAndFlush();
741*f6dc9357SAndroid Build Coastguard Worker 
742*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (level, arcLink.Arcs)
743*f6dc9357SAndroid Build Coastguard Worker   {
744*f6dc9357SAndroid Build Coastguard Worker     const CArc &arc = arcLink.Arcs[level];
745*f6dc9357SAndroid Build Coastguard Worker     const CArcErrorInfo &er = arc.ErrorInfo;
746*f6dc9357SAndroid Build Coastguard Worker 
747*f6dc9357SAndroid Build Coastguard Worker     UInt32 errorFlags = er.GetErrorFlags();
748*f6dc9357SAndroid Build Coastguard Worker 
749*f6dc9357SAndroid Build Coastguard Worker     if (errorFlags != 0 || !er.ErrorMessage.IsEmpty())
750*f6dc9357SAndroid Build Coastguard Worker     {
751*f6dc9357SAndroid Build Coastguard Worker       if (_se)
752*f6dc9357SAndroid Build Coastguard Worker       {
753*f6dc9357SAndroid Build Coastguard Worker         *_se << endl;
754*f6dc9357SAndroid Build Coastguard Worker         if (level != 0)
755*f6dc9357SAndroid Build Coastguard Worker         {
756*f6dc9357SAndroid Build Coastguard Worker           _se->NormalizePrint_UString_Path(arc.Path);
757*f6dc9357SAndroid Build Coastguard Worker           *_se << endl;
758*f6dc9357SAndroid Build Coastguard Worker         }
759*f6dc9357SAndroid Build Coastguard Worker       }
760*f6dc9357SAndroid Build Coastguard Worker 
761*f6dc9357SAndroid Build Coastguard Worker       if (errorFlags != 0)
762*f6dc9357SAndroid Build Coastguard Worker       {
763*f6dc9357SAndroid Build Coastguard Worker         if (_se)
764*f6dc9357SAndroid Build Coastguard Worker           PrintErrorFlags(*_se, "ERRORS:", errorFlags);
765*f6dc9357SAndroid Build Coastguard Worker         NumOpenArcErrors++;
766*f6dc9357SAndroid Build Coastguard Worker         ThereIsError_in_Current = true;
767*f6dc9357SAndroid Build Coastguard Worker       }
768*f6dc9357SAndroid Build Coastguard Worker 
769*f6dc9357SAndroid Build Coastguard Worker       if (!er.ErrorMessage.IsEmpty())
770*f6dc9357SAndroid Build Coastguard Worker       {
771*f6dc9357SAndroid Build Coastguard Worker         if (_se)
772*f6dc9357SAndroid Build Coastguard Worker           *_se << "ERRORS:" << endl << er.ErrorMessage << endl;
773*f6dc9357SAndroid Build Coastguard Worker         NumOpenArcErrors++;
774*f6dc9357SAndroid Build Coastguard Worker         ThereIsError_in_Current = true;
775*f6dc9357SAndroid Build Coastguard Worker       }
776*f6dc9357SAndroid Build Coastguard Worker 
777*f6dc9357SAndroid Build Coastguard Worker       if (_se)
778*f6dc9357SAndroid Build Coastguard Worker       {
779*f6dc9357SAndroid Build Coastguard Worker         *_se << endl;
780*f6dc9357SAndroid Build Coastguard Worker         _se->Flush();
781*f6dc9357SAndroid Build Coastguard Worker       }
782*f6dc9357SAndroid Build Coastguard Worker     }
783*f6dc9357SAndroid Build Coastguard Worker 
784*f6dc9357SAndroid Build Coastguard Worker     UInt32 warningFlags = er.GetWarningFlags();
785*f6dc9357SAndroid Build Coastguard Worker 
786*f6dc9357SAndroid Build Coastguard Worker     if (warningFlags != 0 || !er.WarningMessage.IsEmpty())
787*f6dc9357SAndroid Build Coastguard Worker     {
788*f6dc9357SAndroid Build Coastguard Worker       if (_so)
789*f6dc9357SAndroid Build Coastguard Worker       {
790*f6dc9357SAndroid Build Coastguard Worker         *_so << endl;
791*f6dc9357SAndroid Build Coastguard Worker         if (level != 0)
792*f6dc9357SAndroid Build Coastguard Worker         {
793*f6dc9357SAndroid Build Coastguard Worker           _so->NormalizePrint_UString_Path(arc.Path);
794*f6dc9357SAndroid Build Coastguard Worker           *_so << endl;
795*f6dc9357SAndroid Build Coastguard Worker         }
796*f6dc9357SAndroid Build Coastguard Worker       }
797*f6dc9357SAndroid Build Coastguard Worker 
798*f6dc9357SAndroid Build Coastguard Worker       if (warningFlags != 0)
799*f6dc9357SAndroid Build Coastguard Worker       {
800*f6dc9357SAndroid Build Coastguard Worker         if (_so)
801*f6dc9357SAndroid Build Coastguard Worker           PrintErrorFlags(*_so, "WARNINGS:", warningFlags);
802*f6dc9357SAndroid Build Coastguard Worker         NumOpenArcWarnings++;
803*f6dc9357SAndroid Build Coastguard Worker         ThereIsWarning_in_Current = true;
804*f6dc9357SAndroid Build Coastguard Worker       }
805*f6dc9357SAndroid Build Coastguard Worker 
806*f6dc9357SAndroid Build Coastguard Worker       if (!er.WarningMessage.IsEmpty())
807*f6dc9357SAndroid Build Coastguard Worker       {
808*f6dc9357SAndroid Build Coastguard Worker         if (_so)
809*f6dc9357SAndroid Build Coastguard Worker           *_so << "WARNINGS:" << endl << er.WarningMessage << endl;
810*f6dc9357SAndroid Build Coastguard Worker         NumOpenArcWarnings++;
811*f6dc9357SAndroid Build Coastguard Worker         ThereIsWarning_in_Current = true;
812*f6dc9357SAndroid Build Coastguard Worker       }
813*f6dc9357SAndroid Build Coastguard Worker 
814*f6dc9357SAndroid Build Coastguard Worker       if (_so)
815*f6dc9357SAndroid Build Coastguard Worker       {
816*f6dc9357SAndroid Build Coastguard Worker         *_so << endl;
817*f6dc9357SAndroid Build Coastguard Worker         if (NeedFlush)
818*f6dc9357SAndroid Build Coastguard Worker           _so->Flush();
819*f6dc9357SAndroid Build Coastguard Worker       }
820*f6dc9357SAndroid Build Coastguard Worker     }
821*f6dc9357SAndroid Build Coastguard Worker 
822*f6dc9357SAndroid Build Coastguard Worker 
823*f6dc9357SAndroid Build Coastguard Worker     if (er.ErrorFormatIndex >= 0)
824*f6dc9357SAndroid Build Coastguard Worker     {
825*f6dc9357SAndroid Build Coastguard Worker       if (_so)
826*f6dc9357SAndroid Build Coastguard Worker       {
827*f6dc9357SAndroid Build Coastguard Worker         Print_ErrorFormatIndex_Warning(_so, codecs, arc);
828*f6dc9357SAndroid Build Coastguard Worker         if (NeedFlush)
829*f6dc9357SAndroid Build Coastguard Worker           _so->Flush();
830*f6dc9357SAndroid Build Coastguard Worker       }
831*f6dc9357SAndroid Build Coastguard Worker       ThereIsWarning_in_Current = true;
832*f6dc9357SAndroid Build Coastguard Worker     }
833*f6dc9357SAndroid Build Coastguard Worker   }
834*f6dc9357SAndroid Build Coastguard Worker 
835*f6dc9357SAndroid Build Coastguard Worker   if (result == S_OK)
836*f6dc9357SAndroid Build Coastguard Worker   {
837*f6dc9357SAndroid Build Coastguard Worker     if (_so)
838*f6dc9357SAndroid Build Coastguard Worker     {
839*f6dc9357SAndroid Build Coastguard Worker       RINOK(Print_OpenArchive_Props(*_so, codecs, arcLink))
840*f6dc9357SAndroid Build Coastguard Worker       *_so << endl;
841*f6dc9357SAndroid Build Coastguard Worker     }
842*f6dc9357SAndroid Build Coastguard Worker   }
843*f6dc9357SAndroid Build Coastguard Worker   else
844*f6dc9357SAndroid Build Coastguard Worker   {
845*f6dc9357SAndroid Build Coastguard Worker     NumCantOpenArcs++;
846*f6dc9357SAndroid Build Coastguard Worker     if (_so)
847*f6dc9357SAndroid Build Coastguard Worker       _so->Flush();
848*f6dc9357SAndroid Build Coastguard Worker     if (_se)
849*f6dc9357SAndroid Build Coastguard Worker     {
850*f6dc9357SAndroid Build Coastguard Worker       *_se << kError;
851*f6dc9357SAndroid Build Coastguard Worker       _se->NormalizePrint_wstr_Path(name);
852*f6dc9357SAndroid Build Coastguard Worker       *_se << endl;
853*f6dc9357SAndroid Build Coastguard Worker       const HRESULT res = Print_OpenArchive_Error(*_se, codecs, arcLink);
854*f6dc9357SAndroid Build Coastguard Worker       RINOK(res)
855*f6dc9357SAndroid Build Coastguard Worker       if (result == S_FALSE)
856*f6dc9357SAndroid Build Coastguard Worker       {
857*f6dc9357SAndroid Build Coastguard Worker       }
858*f6dc9357SAndroid Build Coastguard Worker       else
859*f6dc9357SAndroid Build Coastguard Worker       {
860*f6dc9357SAndroid Build Coastguard Worker         if (result == E_OUTOFMEMORY)
861*f6dc9357SAndroid Build Coastguard Worker           *_se << "Can't allocate required memory";
862*f6dc9357SAndroid Build Coastguard Worker         else
863*f6dc9357SAndroid Build Coastguard Worker           *_se << NError::MyFormatMessage(result);
864*f6dc9357SAndroid Build Coastguard Worker         *_se << endl;
865*f6dc9357SAndroid Build Coastguard Worker       }
866*f6dc9357SAndroid Build Coastguard Worker       _se->Flush();
867*f6dc9357SAndroid Build Coastguard Worker     }
868*f6dc9357SAndroid Build Coastguard Worker   }
869*f6dc9357SAndroid Build Coastguard Worker 
870*f6dc9357SAndroid Build Coastguard Worker 
871*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
872*f6dc9357SAndroid Build Coastguard Worker }
873*f6dc9357SAndroid Build Coastguard Worker 
ThereAreNoFiles()874*f6dc9357SAndroid Build Coastguard Worker HRESULT CExtractCallbackConsole::ThereAreNoFiles()
875*f6dc9357SAndroid Build Coastguard Worker {
876*f6dc9357SAndroid Build Coastguard Worker   ClosePercents_for_so();
877*f6dc9357SAndroid Build Coastguard Worker 
878*f6dc9357SAndroid Build Coastguard Worker   if (_so)
879*f6dc9357SAndroid Build Coastguard Worker   {
880*f6dc9357SAndroid Build Coastguard Worker     *_so << endl << kNoFiles << endl;
881*f6dc9357SAndroid Build Coastguard Worker     if (NeedFlush)
882*f6dc9357SAndroid Build Coastguard Worker       _so->Flush();
883*f6dc9357SAndroid Build Coastguard Worker   }
884*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
885*f6dc9357SAndroid Build Coastguard Worker }
886*f6dc9357SAndroid Build Coastguard Worker 
ExtractResult(HRESULT result)887*f6dc9357SAndroid Build Coastguard Worker HRESULT CExtractCallbackConsole::ExtractResult(HRESULT result)
888*f6dc9357SAndroid Build Coastguard Worker {
889*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
890*f6dc9357SAndroid Build Coastguard Worker 
891*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
892*f6dc9357SAndroid Build Coastguard Worker   {
893*f6dc9357SAndroid Build Coastguard Worker     _percent.ClosePrint(true);
894*f6dc9357SAndroid Build Coastguard Worker     _percent.Command.Empty();
895*f6dc9357SAndroid Build Coastguard Worker     _percent.FileName.Empty();
896*f6dc9357SAndroid Build Coastguard Worker   }
897*f6dc9357SAndroid Build Coastguard Worker 
898*f6dc9357SAndroid Build Coastguard Worker   if (_so)
899*f6dc9357SAndroid Build Coastguard Worker     _so->Flush();
900*f6dc9357SAndroid Build Coastguard Worker 
901*f6dc9357SAndroid Build Coastguard Worker   if (result == S_OK)
902*f6dc9357SAndroid Build Coastguard Worker   {
903*f6dc9357SAndroid Build Coastguard Worker     if (NumFileErrors_in_Current == 0 && !ThereIsError_in_Current)
904*f6dc9357SAndroid Build Coastguard Worker     {
905*f6dc9357SAndroid Build Coastguard Worker       if (ThereIsWarning_in_Current)
906*f6dc9357SAndroid Build Coastguard Worker         NumArcsWithWarnings++;
907*f6dc9357SAndroid Build Coastguard Worker       else
908*f6dc9357SAndroid Build Coastguard Worker         NumOkArcs++;
909*f6dc9357SAndroid Build Coastguard Worker       if (_so)
910*f6dc9357SAndroid Build Coastguard Worker         *_so << kEverythingIsOk << endl;
911*f6dc9357SAndroid Build Coastguard Worker     }
912*f6dc9357SAndroid Build Coastguard Worker     else
913*f6dc9357SAndroid Build Coastguard Worker     {
914*f6dc9357SAndroid Build Coastguard Worker       NumArcsWithError++;
915*f6dc9357SAndroid Build Coastguard Worker       if (_so)
916*f6dc9357SAndroid Build Coastguard Worker       {
917*f6dc9357SAndroid Build Coastguard Worker         *_so << endl;
918*f6dc9357SAndroid Build Coastguard Worker         if (NumFileErrors_in_Current != 0)
919*f6dc9357SAndroid Build Coastguard Worker           *_so << "Sub items Errors: " << NumFileErrors_in_Current << endl;
920*f6dc9357SAndroid Build Coastguard Worker       }
921*f6dc9357SAndroid Build Coastguard Worker     }
922*f6dc9357SAndroid Build Coastguard Worker     if (_so && NeedFlush)
923*f6dc9357SAndroid Build Coastguard Worker       _so->Flush();
924*f6dc9357SAndroid Build Coastguard Worker   }
925*f6dc9357SAndroid Build Coastguard Worker   else
926*f6dc9357SAndroid Build Coastguard Worker   {
927*f6dc9357SAndroid Build Coastguard Worker     // we don't update NumArcsWithError, if error is not related to archive data.
928*f6dc9357SAndroid Build Coastguard Worker     if (result == E_ABORT
929*f6dc9357SAndroid Build Coastguard Worker         || result == HRESULT_FROM_WIN32(ERROR_DISK_FULL))
930*f6dc9357SAndroid Build Coastguard Worker       return result;
931*f6dc9357SAndroid Build Coastguard Worker     NumArcsWithError++;
932*f6dc9357SAndroid Build Coastguard Worker 
933*f6dc9357SAndroid Build Coastguard Worker     if (_se)
934*f6dc9357SAndroid Build Coastguard Worker     {
935*f6dc9357SAndroid Build Coastguard Worker       *_se << endl << kError;
936*f6dc9357SAndroid Build Coastguard Worker       if (result == E_OUTOFMEMORY)
937*f6dc9357SAndroid Build Coastguard Worker         *_se << kMemoryExceptionMessage;
938*f6dc9357SAndroid Build Coastguard Worker       else
939*f6dc9357SAndroid Build Coastguard Worker         *_se << NError::MyFormatMessage(result);
940*f6dc9357SAndroid Build Coastguard Worker       *_se << endl;
941*f6dc9357SAndroid Build Coastguard Worker       _se->Flush();
942*f6dc9357SAndroid Build Coastguard Worker     }
943*f6dc9357SAndroid Build Coastguard Worker   }
944*f6dc9357SAndroid Build Coastguard Worker 
945*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
946*f6dc9357SAndroid Build Coastguard Worker }
947