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