xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Console/UpdateCallbackConsole.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // UpdateCallbackConsole.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
12*f6dc9357SAndroid Build Coastguard Worker #endif
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker // #include "../Common/PropIDUtils.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include "ConsoleClose.h"
17*f6dc9357SAndroid Build Coastguard Worker #include "UserInputUtils.h"
18*f6dc9357SAndroid Build Coastguard Worker #include "UpdateCallbackConsole.h"
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
23*f6dc9357SAndroid Build Coastguard Worker static NSynchronization::CCriticalSection g_CriticalSection;
24*f6dc9357SAndroid Build Coastguard Worker #define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
25*f6dc9357SAndroid Build Coastguard Worker #else
26*f6dc9357SAndroid Build Coastguard Worker #define MT_LOCK
27*f6dc9357SAndroid Build Coastguard Worker #endif
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker static const wchar_t * const kEmptyFileAlias = L"[Content]";
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker static const char * const kOpenArchiveMessage = "Open archive: ";
32*f6dc9357SAndroid Build Coastguard Worker static const char * const kCreatingArchiveMessage = "Creating archive: ";
33*f6dc9357SAndroid Build Coastguard Worker static const char * const kUpdatingArchiveMessage = "Updating archive: ";
34*f6dc9357SAndroid Build Coastguard Worker static const char * const kScanningMessage = "Scanning the drive:";
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker static const char * const kError = "ERROR: ";
37*f6dc9357SAndroid Build Coastguard Worker static const char * const kWarning = "WARNING: ";
38*f6dc9357SAndroid Build Coastguard Worker 
CheckBreak2()39*f6dc9357SAndroid Build Coastguard Worker static HRESULT CheckBreak2()
40*f6dc9357SAndroid Build Coastguard Worker {
41*f6dc9357SAndroid Build Coastguard Worker   return NConsoleClose::TestBreakSignal() ? E_ABORT : S_OK;
42*f6dc9357SAndroid Build Coastguard Worker }
43*f6dc9357SAndroid Build Coastguard Worker 
44*f6dc9357SAndroid Build Coastguard Worker HRESULT Print_OpenArchive_Props(CStdOutStream &so, const CCodecs *codecs, const CArchiveLink &arcLink);
45*f6dc9357SAndroid Build Coastguard Worker HRESULT Print_OpenArchive_Error(CStdOutStream &so, const CCodecs *codecs, const CArchiveLink &arcLink);
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker void PrintErrorFlags(CStdOutStream &so, const char *s, UInt32 errorFlags);
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker void Print_ErrorFormatIndex_Warning(CStdOutStream *_so, const CCodecs *codecs, const CArc &arc);
50*f6dc9357SAndroid Build Coastguard Worker 
OpenResult(const CCodecs * codecs,const CArchiveLink & arcLink,const wchar_t * name,HRESULT result)51*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::OpenResult(
52*f6dc9357SAndroid Build Coastguard Worker     const CCodecs *codecs, const CArchiveLink &arcLink,
53*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *name, HRESULT result)
54*f6dc9357SAndroid Build Coastguard Worker {
55*f6dc9357SAndroid Build Coastguard Worker   ClosePercents2();
56*f6dc9357SAndroid Build Coastguard Worker 
57*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (level, arcLink.Arcs)
58*f6dc9357SAndroid Build Coastguard Worker   {
59*f6dc9357SAndroid Build Coastguard Worker     const CArc &arc = arcLink.Arcs[level];
60*f6dc9357SAndroid Build Coastguard Worker     const CArcErrorInfo &er = arc.ErrorInfo;
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker     UInt32 errorFlags = er.GetErrorFlags();
63*f6dc9357SAndroid Build Coastguard Worker 
64*f6dc9357SAndroid Build Coastguard Worker     if (errorFlags != 0 || !er.ErrorMessage.IsEmpty())
65*f6dc9357SAndroid Build Coastguard Worker     {
66*f6dc9357SAndroid Build Coastguard Worker       if (_se)
67*f6dc9357SAndroid Build Coastguard Worker       {
68*f6dc9357SAndroid Build Coastguard Worker         *_se << endl;
69*f6dc9357SAndroid Build Coastguard Worker         if (level != 0)
70*f6dc9357SAndroid Build Coastguard Worker           *_se << arc.Path << endl;
71*f6dc9357SAndroid Build Coastguard Worker       }
72*f6dc9357SAndroid Build Coastguard Worker 
73*f6dc9357SAndroid Build Coastguard Worker       if (errorFlags != 0)
74*f6dc9357SAndroid Build Coastguard Worker       {
75*f6dc9357SAndroid Build Coastguard Worker         if (_se)
76*f6dc9357SAndroid Build Coastguard Worker           PrintErrorFlags(*_se, "ERRORS:", errorFlags);
77*f6dc9357SAndroid Build Coastguard Worker       }
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker       if (!er.ErrorMessage.IsEmpty())
80*f6dc9357SAndroid Build Coastguard Worker       {
81*f6dc9357SAndroid Build Coastguard Worker         if (_se)
82*f6dc9357SAndroid Build Coastguard Worker           *_se << "ERRORS:" << endl << er.ErrorMessage << endl;
83*f6dc9357SAndroid Build Coastguard Worker       }
84*f6dc9357SAndroid Build Coastguard Worker 
85*f6dc9357SAndroid Build Coastguard Worker       if (_se)
86*f6dc9357SAndroid Build Coastguard Worker       {
87*f6dc9357SAndroid Build Coastguard Worker         *_se << endl;
88*f6dc9357SAndroid Build Coastguard Worker         _se->Flush();
89*f6dc9357SAndroid Build Coastguard Worker       }
90*f6dc9357SAndroid Build Coastguard Worker     }
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker     UInt32 warningFlags = er.GetWarningFlags();
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker     if (warningFlags != 0 || !er.WarningMessage.IsEmpty())
95*f6dc9357SAndroid Build Coastguard Worker     {
96*f6dc9357SAndroid Build Coastguard Worker       if (_so)
97*f6dc9357SAndroid Build Coastguard Worker       {
98*f6dc9357SAndroid Build Coastguard Worker         *_so << endl;
99*f6dc9357SAndroid Build Coastguard Worker         if (level != 0)
100*f6dc9357SAndroid Build Coastguard Worker           *_so << arc.Path << endl;
101*f6dc9357SAndroid Build Coastguard Worker       }
102*f6dc9357SAndroid Build Coastguard Worker 
103*f6dc9357SAndroid Build Coastguard Worker       if (warningFlags != 0)
104*f6dc9357SAndroid Build Coastguard Worker       {
105*f6dc9357SAndroid Build Coastguard Worker         if (_so)
106*f6dc9357SAndroid Build Coastguard Worker           PrintErrorFlags(*_so, "WARNINGS:", warningFlags);
107*f6dc9357SAndroid Build Coastguard Worker       }
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker       if (!er.WarningMessage.IsEmpty())
110*f6dc9357SAndroid Build Coastguard Worker       {
111*f6dc9357SAndroid Build Coastguard Worker         if (_so)
112*f6dc9357SAndroid Build Coastguard Worker           *_so << "WARNINGS:" << endl << er.WarningMessage << endl;
113*f6dc9357SAndroid Build Coastguard Worker       }
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker       if (_so)
116*f6dc9357SAndroid Build Coastguard Worker       {
117*f6dc9357SAndroid Build Coastguard Worker         *_so << endl;
118*f6dc9357SAndroid Build Coastguard Worker         if (NeedFlush)
119*f6dc9357SAndroid Build Coastguard Worker           _so->Flush();
120*f6dc9357SAndroid Build Coastguard Worker       }
121*f6dc9357SAndroid Build Coastguard Worker     }
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker     if (er.ErrorFormatIndex >= 0)
125*f6dc9357SAndroid Build Coastguard Worker     {
126*f6dc9357SAndroid Build Coastguard Worker       if (_so)
127*f6dc9357SAndroid Build Coastguard Worker       {
128*f6dc9357SAndroid Build Coastguard Worker         Print_ErrorFormatIndex_Warning(_so, codecs, arc);
129*f6dc9357SAndroid Build Coastguard Worker         if (NeedFlush)
130*f6dc9357SAndroid Build Coastguard Worker           _so->Flush();
131*f6dc9357SAndroid Build Coastguard Worker       }
132*f6dc9357SAndroid Build Coastguard Worker     }
133*f6dc9357SAndroid Build Coastguard Worker   }
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker   if (result == S_OK)
136*f6dc9357SAndroid Build Coastguard Worker   {
137*f6dc9357SAndroid Build Coastguard Worker     if (_so)
138*f6dc9357SAndroid Build Coastguard Worker     {
139*f6dc9357SAndroid Build Coastguard Worker       RINOK(Print_OpenArchive_Props(*_so, codecs, arcLink))
140*f6dc9357SAndroid Build Coastguard Worker       *_so << endl;
141*f6dc9357SAndroid Build Coastguard Worker     }
142*f6dc9357SAndroid Build Coastguard Worker   }
143*f6dc9357SAndroid Build Coastguard Worker   else
144*f6dc9357SAndroid Build Coastguard Worker   {
145*f6dc9357SAndroid Build Coastguard Worker     if (_so)
146*f6dc9357SAndroid Build Coastguard Worker       _so->Flush();
147*f6dc9357SAndroid Build Coastguard Worker     if (_se)
148*f6dc9357SAndroid Build Coastguard Worker     {
149*f6dc9357SAndroid Build Coastguard Worker       *_se << kError;
150*f6dc9357SAndroid Build Coastguard Worker       _se->NormalizePrint_wstr_Path(name);
151*f6dc9357SAndroid Build Coastguard Worker       *_se << endl;
152*f6dc9357SAndroid Build Coastguard Worker       HRESULT res = Print_OpenArchive_Error(*_se, codecs, arcLink);
153*f6dc9357SAndroid Build Coastguard Worker       RINOK(res)
154*f6dc9357SAndroid Build Coastguard Worker       _se->Flush();
155*f6dc9357SAndroid Build Coastguard Worker     }
156*f6dc9357SAndroid Build Coastguard Worker   }
157*f6dc9357SAndroid Build Coastguard Worker 
158*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
159*f6dc9357SAndroid Build Coastguard Worker }
160*f6dc9357SAndroid Build Coastguard Worker 
StartScanning()161*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::StartScanning()
162*f6dc9357SAndroid Build Coastguard Worker {
163*f6dc9357SAndroid Build Coastguard Worker   if (_so)
164*f6dc9357SAndroid Build Coastguard Worker     *_so << kScanningMessage << endl;
165*f6dc9357SAndroid Build Coastguard Worker   _percent.Command = "Scan ";
166*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
167*f6dc9357SAndroid Build Coastguard Worker }
168*f6dc9357SAndroid Build Coastguard Worker 
ScanProgress(const CDirItemsStat & st,const FString & path,bool)169*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::ScanProgress(const CDirItemsStat &st, const FString &path, bool /* isDir */)
170*f6dc9357SAndroid Build Coastguard Worker {
171*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
172*f6dc9357SAndroid Build Coastguard Worker   {
173*f6dc9357SAndroid Build Coastguard Worker     _percent.Files = st.NumDirs + st.NumFiles + st.NumAltStreams;
174*f6dc9357SAndroid Build Coastguard Worker     _percent.Completed = st.GetTotalBytes();
175*f6dc9357SAndroid Build Coastguard Worker     _percent.FileName = fs2us(path);
176*f6dc9357SAndroid Build Coastguard Worker     _percent.Print();
177*f6dc9357SAndroid Build Coastguard Worker   }
178*f6dc9357SAndroid Build Coastguard Worker 
179*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak();
180*f6dc9357SAndroid Build Coastguard Worker }
181*f6dc9357SAndroid Build Coastguard Worker 
CommonError(const FString & path,DWORD systemError,bool isWarning)182*f6dc9357SAndroid Build Coastguard Worker void CCallbackConsoleBase::CommonError(const FString &path, DWORD systemError, bool isWarning)
183*f6dc9357SAndroid Build Coastguard Worker {
184*f6dc9357SAndroid Build Coastguard Worker   ClosePercents2();
185*f6dc9357SAndroid Build Coastguard Worker 
186*f6dc9357SAndroid Build Coastguard Worker   if (_se)
187*f6dc9357SAndroid Build Coastguard Worker   {
188*f6dc9357SAndroid Build Coastguard Worker     if (_so)
189*f6dc9357SAndroid Build Coastguard Worker       _so->Flush();
190*f6dc9357SAndroid Build Coastguard Worker 
191*f6dc9357SAndroid Build Coastguard Worker     *_se << endl << (isWarning ? kWarning : kError)
192*f6dc9357SAndroid Build Coastguard Worker         << NError::MyFormatMessage(systemError)
193*f6dc9357SAndroid Build Coastguard Worker         << endl;
194*f6dc9357SAndroid Build Coastguard Worker     _se->NormalizePrint_UString_Path(fs2us(path));
195*f6dc9357SAndroid Build Coastguard Worker     *_se << endl << endl;
196*f6dc9357SAndroid Build Coastguard Worker     _se->Flush();
197*f6dc9357SAndroid Build Coastguard Worker   }
198*f6dc9357SAndroid Build Coastguard Worker }
199*f6dc9357SAndroid Build Coastguard Worker 
200*f6dc9357SAndroid Build Coastguard Worker /*
201*f6dc9357SAndroid Build Coastguard Worker void CCallbackConsoleBase::CommonError(const char *message)
202*f6dc9357SAndroid Build Coastguard Worker {
203*f6dc9357SAndroid Build Coastguard Worker   ClosePercents2();
204*f6dc9357SAndroid Build Coastguard Worker 
205*f6dc9357SAndroid Build Coastguard Worker   if (_se)
206*f6dc9357SAndroid Build Coastguard Worker   {
207*f6dc9357SAndroid Build Coastguard Worker     if (_so)
208*f6dc9357SAndroid Build Coastguard Worker       _so->Flush();
209*f6dc9357SAndroid Build Coastguard Worker 
210*f6dc9357SAndroid Build Coastguard Worker     *_se << endl << kError << message << endl;
211*f6dc9357SAndroid Build Coastguard Worker     _se->Flush();
212*f6dc9357SAndroid Build Coastguard Worker   }
213*f6dc9357SAndroid Build Coastguard Worker }
214*f6dc9357SAndroid Build Coastguard Worker */
215*f6dc9357SAndroid Build Coastguard Worker 
216*f6dc9357SAndroid Build Coastguard Worker 
ScanError_Base(const FString & path,DWORD systemError)217*f6dc9357SAndroid Build Coastguard Worker HRESULT CCallbackConsoleBase::ScanError_Base(const FString &path, DWORD systemError)
218*f6dc9357SAndroid Build Coastguard Worker {
219*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
220*f6dc9357SAndroid Build Coastguard Worker 
221*f6dc9357SAndroid Build Coastguard Worker   ScanErrors.AddError(path, systemError);
222*f6dc9357SAndroid Build Coastguard Worker   CommonError(path, systemError, true);
223*f6dc9357SAndroid Build Coastguard Worker 
224*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
225*f6dc9357SAndroid Build Coastguard Worker }
226*f6dc9357SAndroid Build Coastguard Worker 
OpenFileError_Base(const FString & path,DWORD systemError)227*f6dc9357SAndroid Build Coastguard Worker HRESULT CCallbackConsoleBase::OpenFileError_Base(const FString &path, DWORD systemError)
228*f6dc9357SAndroid Build Coastguard Worker {
229*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
230*f6dc9357SAndroid Build Coastguard Worker   FailedFiles.AddError(path, systemError);
231*f6dc9357SAndroid Build Coastguard Worker   NumNonOpenFiles++;
232*f6dc9357SAndroid Build Coastguard Worker   /*
233*f6dc9357SAndroid Build Coastguard Worker   if (systemError == ERROR_SHARING_VIOLATION)
234*f6dc9357SAndroid Build Coastguard Worker   {
235*f6dc9357SAndroid Build Coastguard Worker   */
236*f6dc9357SAndroid Build Coastguard Worker     CommonError(path, systemError, true);
237*f6dc9357SAndroid Build Coastguard Worker     return S_FALSE;
238*f6dc9357SAndroid Build Coastguard Worker   /*
239*f6dc9357SAndroid Build Coastguard Worker   }
240*f6dc9357SAndroid Build Coastguard Worker   return systemError;
241*f6dc9357SAndroid Build Coastguard Worker   */
242*f6dc9357SAndroid Build Coastguard Worker }
243*f6dc9357SAndroid Build Coastguard Worker 
ReadingFileError_Base(const FString & path,DWORD systemError)244*f6dc9357SAndroid Build Coastguard Worker HRESULT CCallbackConsoleBase::ReadingFileError_Base(const FString &path, DWORD systemError)
245*f6dc9357SAndroid Build Coastguard Worker {
246*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
247*f6dc9357SAndroid Build Coastguard Worker   CommonError(path, systemError, false);
248*f6dc9357SAndroid Build Coastguard Worker   return HRESULT_FROM_WIN32(systemError);
249*f6dc9357SAndroid Build Coastguard Worker }
250*f6dc9357SAndroid Build Coastguard Worker 
ScanError(const FString & path,DWORD systemError)251*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::ScanError(const FString &path, DWORD systemError)
252*f6dc9357SAndroid Build Coastguard Worker {
253*f6dc9357SAndroid Build Coastguard Worker   return ScanError_Base(path, systemError);
254*f6dc9357SAndroid Build Coastguard Worker }
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker 
PrintPropPair(AString & s,const char * name,UInt64 val)257*f6dc9357SAndroid Build Coastguard Worker static void PrintPropPair(AString &s, const char *name, UInt64 val)
258*f6dc9357SAndroid Build Coastguard Worker {
259*f6dc9357SAndroid Build Coastguard Worker   char temp[32];
260*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString(val, temp);
261*f6dc9357SAndroid Build Coastguard Worker   s += name;
262*f6dc9357SAndroid Build Coastguard Worker   s += ": ";
263*f6dc9357SAndroid Build Coastguard Worker   s += temp;
264*f6dc9357SAndroid Build Coastguard Worker }
265*f6dc9357SAndroid Build Coastguard Worker 
266*f6dc9357SAndroid Build Coastguard Worker void PrintSize_bytes_Smart(AString &s, UInt64 val);
267*f6dc9357SAndroid Build Coastguard Worker void Print_DirItemsStat(AString &s, const CDirItemsStat &st);
268*f6dc9357SAndroid Build Coastguard Worker void Print_DirItemsStat2(AString &s, const CDirItemsStat2 &st);
269*f6dc9357SAndroid Build Coastguard Worker 
FinishScanning(const CDirItemsStat & st)270*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::FinishScanning(const CDirItemsStat &st)
271*f6dc9357SAndroid Build Coastguard Worker {
272*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
273*f6dc9357SAndroid Build Coastguard Worker   {
274*f6dc9357SAndroid Build Coastguard Worker     _percent.ClosePrint(true);
275*f6dc9357SAndroid Build Coastguard Worker     _percent.ClearCurState();
276*f6dc9357SAndroid Build Coastguard Worker   }
277*f6dc9357SAndroid Build Coastguard Worker 
278*f6dc9357SAndroid Build Coastguard Worker   if (_so)
279*f6dc9357SAndroid Build Coastguard Worker   {
280*f6dc9357SAndroid Build Coastguard Worker     AString s;
281*f6dc9357SAndroid Build Coastguard Worker     Print_DirItemsStat(s, st);
282*f6dc9357SAndroid Build Coastguard Worker     *_so << s << endl << endl;
283*f6dc9357SAndroid Build Coastguard Worker   }
284*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
285*f6dc9357SAndroid Build Coastguard Worker }
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker static const char * const k_StdOut_ArcName = "StdOut";
288*f6dc9357SAndroid Build Coastguard Worker 
StartOpenArchive(const wchar_t * name)289*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::StartOpenArchive(const wchar_t *name)
290*f6dc9357SAndroid Build Coastguard Worker {
291*f6dc9357SAndroid Build Coastguard Worker   if (_so)
292*f6dc9357SAndroid Build Coastguard Worker   {
293*f6dc9357SAndroid Build Coastguard Worker     *_so << kOpenArchiveMessage;
294*f6dc9357SAndroid Build Coastguard Worker     if (name)
295*f6dc9357SAndroid Build Coastguard Worker       *_so << name;
296*f6dc9357SAndroid Build Coastguard Worker     else
297*f6dc9357SAndroid Build Coastguard Worker       *_so << k_StdOut_ArcName;
298*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
299*f6dc9357SAndroid Build Coastguard Worker   }
300*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
301*f6dc9357SAndroid Build Coastguard Worker }
302*f6dc9357SAndroid Build Coastguard Worker 
StartArchive(const wchar_t * name,bool updating)303*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::StartArchive(const wchar_t *name, bool updating)
304*f6dc9357SAndroid Build Coastguard Worker {
305*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
306*f6dc9357SAndroid Build Coastguard Worker     _percent.ClosePrint(true);
307*f6dc9357SAndroid Build Coastguard Worker 
308*f6dc9357SAndroid Build Coastguard Worker   _percent.ClearCurState();
309*f6dc9357SAndroid Build Coastguard Worker   NumNonOpenFiles = 0;
310*f6dc9357SAndroid Build Coastguard Worker 
311*f6dc9357SAndroid Build Coastguard Worker   if (_so)
312*f6dc9357SAndroid Build Coastguard Worker   {
313*f6dc9357SAndroid Build Coastguard Worker     *_so << (updating ? kUpdatingArchiveMessage : kCreatingArchiveMessage);
314*f6dc9357SAndroid Build Coastguard Worker     if (name)
315*f6dc9357SAndroid Build Coastguard Worker       _so->NormalizePrint_wstr_Path(name);
316*f6dc9357SAndroid Build Coastguard Worker     else
317*f6dc9357SAndroid Build Coastguard Worker       *_so << k_StdOut_ArcName;
318*f6dc9357SAndroid Build Coastguard Worker    *_so << endl << endl;
319*f6dc9357SAndroid Build Coastguard Worker   }
320*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
321*f6dc9357SAndroid Build Coastguard Worker }
322*f6dc9357SAndroid Build Coastguard Worker 
FinishArchive(const CFinishArchiveStat & st)323*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::FinishArchive(const CFinishArchiveStat &st)
324*f6dc9357SAndroid Build Coastguard Worker {
325*f6dc9357SAndroid Build Coastguard Worker   ClosePercents2();
326*f6dc9357SAndroid Build Coastguard Worker 
327*f6dc9357SAndroid Build Coastguard Worker   if (_so)
328*f6dc9357SAndroid Build Coastguard Worker   {
329*f6dc9357SAndroid Build Coastguard Worker     AString s;
330*f6dc9357SAndroid Build Coastguard Worker     // Print_UInt64_and_String(s, _percent.Files == 1 ? "file" : "files", _percent.Files);
331*f6dc9357SAndroid Build Coastguard Worker     PrintPropPair(s, "Files read from disk", _percent.Files - NumNonOpenFiles);
332*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
333*f6dc9357SAndroid Build Coastguard Worker     s += "Archive size: ";
334*f6dc9357SAndroid Build Coastguard Worker     PrintSize_bytes_Smart(s, st.OutArcFileSize);
335*f6dc9357SAndroid Build Coastguard Worker     s.Add_LF();
336*f6dc9357SAndroid Build Coastguard Worker     if (st.IsMultiVolMode)
337*f6dc9357SAndroid Build Coastguard Worker     {
338*f6dc9357SAndroid Build Coastguard Worker       s += "Volumes: ";
339*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(st.NumVolumes);
340*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
341*f6dc9357SAndroid Build Coastguard Worker     }
342*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
343*f6dc9357SAndroid Build Coastguard Worker     *_so << s;
344*f6dc9357SAndroid Build Coastguard Worker     // *_so << endl;
345*f6dc9357SAndroid Build Coastguard Worker   }
346*f6dc9357SAndroid Build Coastguard Worker 
347*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
348*f6dc9357SAndroid Build Coastguard Worker }
349*f6dc9357SAndroid Build Coastguard Worker 
WriteSfx(const wchar_t * name,UInt64 size)350*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::WriteSfx(const wchar_t *name, UInt64 size)
351*f6dc9357SAndroid Build Coastguard Worker {
352*f6dc9357SAndroid Build Coastguard Worker   if (_so)
353*f6dc9357SAndroid Build Coastguard Worker   {
354*f6dc9357SAndroid Build Coastguard Worker     *_so << "Write SFX: ";
355*f6dc9357SAndroid Build Coastguard Worker     *_so << name;
356*f6dc9357SAndroid Build Coastguard Worker     AString s (" : ");
357*f6dc9357SAndroid Build Coastguard Worker     PrintSize_bytes_Smart(s, size);
358*f6dc9357SAndroid Build Coastguard Worker     *_so << s << endl;
359*f6dc9357SAndroid Build Coastguard Worker   }
360*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
361*f6dc9357SAndroid Build Coastguard Worker }
362*f6dc9357SAndroid Build Coastguard Worker 
363*f6dc9357SAndroid Build Coastguard Worker 
364*f6dc9357SAndroid Build Coastguard Worker 
MoveArc_UpdateStatus()365*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::MoveArc_UpdateStatus()
366*f6dc9357SAndroid Build Coastguard Worker {
367*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
368*f6dc9357SAndroid Build Coastguard Worker   {
369*f6dc9357SAndroid Build Coastguard Worker     AString &s = _percent.Command;
370*f6dc9357SAndroid Build Coastguard Worker     s = " : ";
371*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt64(_arcMoving_percents);
372*f6dc9357SAndroid Build Coastguard Worker     s.Add_Char('%');
373*f6dc9357SAndroid Build Coastguard Worker     const bool totalDefined = (_arcMoving_total != 0 && _arcMoving_total != (UInt64)(Int64)-1);
374*f6dc9357SAndroid Build Coastguard Worker     if (_arcMoving_current != 0 || totalDefined)
375*f6dc9357SAndroid Build Coastguard Worker     {
376*f6dc9357SAndroid Build Coastguard Worker       s += " : ";
377*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt64(_arcMoving_current >> 20);
378*f6dc9357SAndroid Build Coastguard Worker       s += " MiB";
379*f6dc9357SAndroid Build Coastguard Worker     }
380*f6dc9357SAndroid Build Coastguard Worker     if (totalDefined)
381*f6dc9357SAndroid Build Coastguard Worker     {
382*f6dc9357SAndroid Build Coastguard Worker       s += " / ";
383*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt64((_arcMoving_total + ((1 << 20) - 1)) >> 20);
384*f6dc9357SAndroid Build Coastguard Worker       s += " MiB";
385*f6dc9357SAndroid Build Coastguard Worker     }
386*f6dc9357SAndroid Build Coastguard Worker     s += " : temporary archive moving ...";
387*f6dc9357SAndroid Build Coastguard Worker     _percent.Print();
388*f6dc9357SAndroid Build Coastguard Worker   }
389*f6dc9357SAndroid Build Coastguard Worker 
390*f6dc9357SAndroid Build Coastguard Worker   // we ignore single Ctrl-C, if (_arcMoving_updateMode) mode
391*f6dc9357SAndroid Build Coastguard Worker   // because we want to get good final archive instead of temp archive.
392*f6dc9357SAndroid Build Coastguard Worker   if (NConsoleClose::g_BreakCounter == 1 && _arcMoving_updateMode)
393*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
394*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak();
395*f6dc9357SAndroid Build Coastguard Worker }
396*f6dc9357SAndroid Build Coastguard Worker 
397*f6dc9357SAndroid Build Coastguard Worker 
MoveArc_Start(const wchar_t * srcTempPath,const wchar_t * destFinalPath,UInt64 size,Int32 updateMode)398*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::MoveArc_Start(
399*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *srcTempPath, const wchar_t *destFinalPath,
400*f6dc9357SAndroid Build Coastguard Worker     UInt64 size, Int32 updateMode)
401*f6dc9357SAndroid Build Coastguard Worker {
402*f6dc9357SAndroid Build Coastguard Worker #if 0 // 1 : for debug
403*f6dc9357SAndroid Build Coastguard Worker   if (LogLevel > 0 && _so)
404*f6dc9357SAndroid Build Coastguard Worker   {
405*f6dc9357SAndroid Build Coastguard Worker     ClosePercents_for_so();
406*f6dc9357SAndroid Build Coastguard Worker     *_so << "Temporary archive moving:" << endl;
407*f6dc9357SAndroid Build Coastguard Worker     _tempU = srcTempPath;
408*f6dc9357SAndroid Build Coastguard Worker     _so->Normalize_UString_Path(_tempU);
409*f6dc9357SAndroid Build Coastguard Worker     _so->PrintUString(_tempU, _tempA);
410*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
411*f6dc9357SAndroid Build Coastguard Worker     _tempU = destFinalPath;
412*f6dc9357SAndroid Build Coastguard Worker     _so->Normalize_UString_Path(_tempU);
413*f6dc9357SAndroid Build Coastguard Worker     _so->PrintUString(_tempU, _tempA);
414*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
415*f6dc9357SAndroid Build Coastguard Worker   }
416*f6dc9357SAndroid Build Coastguard Worker #else
417*f6dc9357SAndroid Build Coastguard Worker   UNUSED_VAR(srcTempPath)
418*f6dc9357SAndroid Build Coastguard Worker   UNUSED_VAR(destFinalPath)
419*f6dc9357SAndroid Build Coastguard Worker #endif
420*f6dc9357SAndroid Build Coastguard Worker 
421*f6dc9357SAndroid Build Coastguard Worker   _arcMoving_updateMode = updateMode;
422*f6dc9357SAndroid Build Coastguard Worker   _arcMoving_total = size;
423*f6dc9357SAndroid Build Coastguard Worker   _arcMoving_current = 0;
424*f6dc9357SAndroid Build Coastguard Worker   _arcMoving_percents = 0;
425*f6dc9357SAndroid Build Coastguard Worker   return MoveArc_UpdateStatus();
426*f6dc9357SAndroid Build Coastguard Worker }
427*f6dc9357SAndroid Build Coastguard Worker 
428*f6dc9357SAndroid Build Coastguard Worker 
MoveArc_Progress(UInt64 totalSize,UInt64 currentSize)429*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::MoveArc_Progress(UInt64 totalSize, UInt64 currentSize)
430*f6dc9357SAndroid Build Coastguard Worker {
431*f6dc9357SAndroid Build Coastguard Worker #if 0 // 1 : for debug
432*f6dc9357SAndroid Build Coastguard Worker   if (_so)
433*f6dc9357SAndroid Build Coastguard Worker   {
434*f6dc9357SAndroid Build Coastguard Worker     ClosePercents_for_so();
435*f6dc9357SAndroid Build Coastguard Worker     *_so << totalSize << " : " << currentSize << endl;
436*f6dc9357SAndroid Build Coastguard Worker   }
437*f6dc9357SAndroid Build Coastguard Worker #endif
438*f6dc9357SAndroid Build Coastguard Worker 
439*f6dc9357SAndroid Build Coastguard Worker   UInt64 percents = 0;
440*f6dc9357SAndroid Build Coastguard Worker   if (totalSize != 0)
441*f6dc9357SAndroid Build Coastguard Worker   {
442*f6dc9357SAndroid Build Coastguard Worker     if (totalSize < ((UInt64)1 << 57))
443*f6dc9357SAndroid Build Coastguard Worker       percents = currentSize * 100 / totalSize;
444*f6dc9357SAndroid Build Coastguard Worker     else
445*f6dc9357SAndroid Build Coastguard Worker       percents = currentSize / (totalSize / 100);
446*f6dc9357SAndroid Build Coastguard Worker   }
447*f6dc9357SAndroid Build Coastguard Worker 
448*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
449*f6dc9357SAndroid Build Coastguard Worker   // Sleep(300); // for debug
450*f6dc9357SAndroid Build Coastguard Worker #endif
451*f6dc9357SAndroid Build Coastguard Worker   // totalSize = (UInt64)(Int64)-1; // for debug
452*f6dc9357SAndroid Build Coastguard Worker 
453*f6dc9357SAndroid Build Coastguard Worker   if (percents == _arcMoving_percents)
454*f6dc9357SAndroid Build Coastguard Worker     return CheckBreak();
455*f6dc9357SAndroid Build Coastguard Worker   _arcMoving_current = currentSize;
456*f6dc9357SAndroid Build Coastguard Worker   _arcMoving_total = totalSize;
457*f6dc9357SAndroid Build Coastguard Worker   _arcMoving_percents = percents;
458*f6dc9357SAndroid Build Coastguard Worker   return MoveArc_UpdateStatus();
459*f6dc9357SAndroid Build Coastguard Worker }
460*f6dc9357SAndroid Build Coastguard Worker 
461*f6dc9357SAndroid Build Coastguard Worker 
MoveArc_Finish()462*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::MoveArc_Finish()
463*f6dc9357SAndroid Build Coastguard Worker {
464*f6dc9357SAndroid Build Coastguard Worker   // _arcMoving_percents = 0;
465*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
466*f6dc9357SAndroid Build Coastguard Worker   {
467*f6dc9357SAndroid Build Coastguard Worker     _percent.Command.Empty();
468*f6dc9357SAndroid Build Coastguard Worker     _percent.Print();
469*f6dc9357SAndroid Build Coastguard Worker   }
470*f6dc9357SAndroid Build Coastguard Worker   // it can return delayed user break (E_ABORT) status,
471*f6dc9357SAndroid Build Coastguard Worker   // if it ignored single CTRL+C in MoveArc_Progress().
472*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak();
473*f6dc9357SAndroid Build Coastguard Worker }
474*f6dc9357SAndroid Build Coastguard Worker 
475*f6dc9357SAndroid Build Coastguard Worker 
476*f6dc9357SAndroid Build Coastguard Worker 
DeletingAfterArchiving(const FString & path,bool)477*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::DeletingAfterArchiving(const FString &path, bool /* isDir */)
478*f6dc9357SAndroid Build Coastguard Worker {
479*f6dc9357SAndroid Build Coastguard Worker   if (LogLevel > 0 && _so)
480*f6dc9357SAndroid Build Coastguard Worker   {
481*f6dc9357SAndroid Build Coastguard Worker     ClosePercents_for_so();
482*f6dc9357SAndroid Build Coastguard Worker 
483*f6dc9357SAndroid Build Coastguard Worker     if (!DeleteMessageWasShown)
484*f6dc9357SAndroid Build Coastguard Worker     {
485*f6dc9357SAndroid Build Coastguard Worker       if (_so)
486*f6dc9357SAndroid Build Coastguard Worker         *_so << endl << ": Removing files after including to archive" << endl;
487*f6dc9357SAndroid Build Coastguard Worker     }
488*f6dc9357SAndroid Build Coastguard Worker 
489*f6dc9357SAndroid Build Coastguard Worker     {
490*f6dc9357SAndroid Build Coastguard Worker       {
491*f6dc9357SAndroid Build Coastguard Worker         _tempA = "Removing";
492*f6dc9357SAndroid Build Coastguard Worker         _tempA.Add_Space();
493*f6dc9357SAndroid Build Coastguard Worker         *_so << _tempA;
494*f6dc9357SAndroid Build Coastguard Worker         _tempU = fs2us(path);
495*f6dc9357SAndroid Build Coastguard Worker         _so->Normalize_UString_Path(_tempU);
496*f6dc9357SAndroid Build Coastguard Worker         _so->PrintUString(_tempU, _tempA);
497*f6dc9357SAndroid Build Coastguard Worker         *_so << endl;
498*f6dc9357SAndroid Build Coastguard Worker         if (NeedFlush)
499*f6dc9357SAndroid Build Coastguard Worker           _so->Flush();
500*f6dc9357SAndroid Build Coastguard Worker       }
501*f6dc9357SAndroid Build Coastguard Worker     }
502*f6dc9357SAndroid Build Coastguard Worker   }
503*f6dc9357SAndroid Build Coastguard Worker 
504*f6dc9357SAndroid Build Coastguard Worker   if (!DeleteMessageWasShown)
505*f6dc9357SAndroid Build Coastguard Worker   {
506*f6dc9357SAndroid Build Coastguard Worker     if (NeedPercents())
507*f6dc9357SAndroid Build Coastguard Worker     {
508*f6dc9357SAndroid Build Coastguard Worker       _percent.ClearCurState();
509*f6dc9357SAndroid Build Coastguard Worker     }
510*f6dc9357SAndroid Build Coastguard Worker     DeleteMessageWasShown = true;
511*f6dc9357SAndroid Build Coastguard Worker   }
512*f6dc9357SAndroid Build Coastguard Worker   else
513*f6dc9357SAndroid Build Coastguard Worker   {
514*f6dc9357SAndroid Build Coastguard Worker     _percent.Files++;
515*f6dc9357SAndroid Build Coastguard Worker   }
516*f6dc9357SAndroid Build Coastguard Worker 
517*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
518*f6dc9357SAndroid Build Coastguard Worker   {
519*f6dc9357SAndroid Build Coastguard Worker     // if (!FullLog)
520*f6dc9357SAndroid Build Coastguard Worker     {
521*f6dc9357SAndroid Build Coastguard Worker       _percent.Command = "Removing";
522*f6dc9357SAndroid Build Coastguard Worker       _percent.FileName = fs2us(path);
523*f6dc9357SAndroid Build Coastguard Worker     }
524*f6dc9357SAndroid Build Coastguard Worker     _percent.Print();
525*f6dc9357SAndroid Build Coastguard Worker   }
526*f6dc9357SAndroid Build Coastguard Worker 
527*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
528*f6dc9357SAndroid Build Coastguard Worker }
529*f6dc9357SAndroid Build Coastguard Worker 
530*f6dc9357SAndroid Build Coastguard Worker 
FinishDeletingAfterArchiving()531*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::FinishDeletingAfterArchiving()
532*f6dc9357SAndroid Build Coastguard Worker {
533*f6dc9357SAndroid Build Coastguard Worker   ClosePercents2();
534*f6dc9357SAndroid Build Coastguard Worker   if (_so && DeleteMessageWasShown)
535*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
536*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
537*f6dc9357SAndroid Build Coastguard Worker }
538*f6dc9357SAndroid Build Coastguard Worker 
CheckBreak()539*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::CheckBreak()
540*f6dc9357SAndroid Build Coastguard Worker {
541*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
542*f6dc9357SAndroid Build Coastguard Worker }
543*f6dc9357SAndroid Build Coastguard Worker 
544*f6dc9357SAndroid Build Coastguard Worker /*
545*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::Finalize()
546*f6dc9357SAndroid Build Coastguard Worker {
547*f6dc9357SAndroid Build Coastguard Worker   // MT_LOCK
548*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
549*f6dc9357SAndroid Build Coastguard Worker }
550*f6dc9357SAndroid Build Coastguard Worker */
551*f6dc9357SAndroid Build Coastguard Worker 
552*f6dc9357SAndroid Build Coastguard Worker 
PrintToDoStat(CStdOutStream * _so,const CDirItemsStat2 & stat,const char * name)553*f6dc9357SAndroid Build Coastguard Worker void static PrintToDoStat(CStdOutStream *_so, const CDirItemsStat2 &stat, const char *name)
554*f6dc9357SAndroid Build Coastguard Worker {
555*f6dc9357SAndroid Build Coastguard Worker   AString s;
556*f6dc9357SAndroid Build Coastguard Worker   Print_DirItemsStat2(s, stat);
557*f6dc9357SAndroid Build Coastguard Worker   *_so << name << ": " << s << endl;
558*f6dc9357SAndroid Build Coastguard Worker }
559*f6dc9357SAndroid Build Coastguard Worker 
SetNumItems(const CArcToDoStat & stat)560*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::SetNumItems(const CArcToDoStat &stat)
561*f6dc9357SAndroid Build Coastguard Worker {
562*f6dc9357SAndroid Build Coastguard Worker   if (_so)
563*f6dc9357SAndroid Build Coastguard Worker   {
564*f6dc9357SAndroid Build Coastguard Worker     ClosePercents_for_so();
565*f6dc9357SAndroid Build Coastguard Worker     if (!stat.DeleteData.IsEmpty())
566*f6dc9357SAndroid Build Coastguard Worker     {
567*f6dc9357SAndroid Build Coastguard Worker       *_so << endl;
568*f6dc9357SAndroid Build Coastguard Worker       PrintToDoStat(_so, stat.DeleteData, "Delete data from archive");
569*f6dc9357SAndroid Build Coastguard Worker     }
570*f6dc9357SAndroid Build Coastguard Worker     if (!stat.OldData.IsEmpty())
571*f6dc9357SAndroid Build Coastguard Worker       PrintToDoStat(_so, stat.OldData, "Keep old data in archive");
572*f6dc9357SAndroid Build Coastguard Worker     // if (!stat.NewData.IsEmpty())
573*f6dc9357SAndroid Build Coastguard Worker     {
574*f6dc9357SAndroid Build Coastguard Worker       PrintToDoStat(_so, stat.NewData, "Add new data to archive");
575*f6dc9357SAndroid Build Coastguard Worker     }
576*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
577*f6dc9357SAndroid Build Coastguard Worker   }
578*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
579*f6dc9357SAndroid Build Coastguard Worker }
580*f6dc9357SAndroid Build Coastguard Worker 
SetTotal(UInt64 size)581*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::SetTotal(UInt64 size)
582*f6dc9357SAndroid Build Coastguard Worker {
583*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
584*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
585*f6dc9357SAndroid Build Coastguard Worker   {
586*f6dc9357SAndroid Build Coastguard Worker     _percent.Total = size;
587*f6dc9357SAndroid Build Coastguard Worker     _percent.Print();
588*f6dc9357SAndroid Build Coastguard Worker   }
589*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
590*f6dc9357SAndroid Build Coastguard Worker }
591*f6dc9357SAndroid Build Coastguard Worker 
SetCompleted(const UInt64 * completeValue)592*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::SetCompleted(const UInt64 *completeValue)
593*f6dc9357SAndroid Build Coastguard Worker {
594*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
595*f6dc9357SAndroid Build Coastguard Worker   if (completeValue)
596*f6dc9357SAndroid Build Coastguard Worker   {
597*f6dc9357SAndroid Build Coastguard Worker     if (NeedPercents())
598*f6dc9357SAndroid Build Coastguard Worker     {
599*f6dc9357SAndroid Build Coastguard Worker       _percent.Completed = *completeValue;
600*f6dc9357SAndroid Build Coastguard Worker       _percent.Print();
601*f6dc9357SAndroid Build Coastguard Worker     }
602*f6dc9357SAndroid Build Coastguard Worker   }
603*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
604*f6dc9357SAndroid Build Coastguard Worker }
605*f6dc9357SAndroid Build Coastguard Worker 
SetRatioInfo(const UInt64 *,const UInt64 *)606*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::SetRatioInfo(const UInt64 * /* inSize */, const UInt64 * /* outSize */)
607*f6dc9357SAndroid Build Coastguard Worker {
608*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
609*f6dc9357SAndroid Build Coastguard Worker }
610*f6dc9357SAndroid Build Coastguard Worker 
PrintProgress(const wchar_t * name,bool isDir,const char * command,bool showInLog)611*f6dc9357SAndroid Build Coastguard Worker HRESULT CCallbackConsoleBase::PrintProgress(const wchar_t *name, bool isDir, const char *command, bool showInLog)
612*f6dc9357SAndroid Build Coastguard Worker {
613*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
614*f6dc9357SAndroid Build Coastguard Worker 
615*f6dc9357SAndroid Build Coastguard Worker   bool show2 = (showInLog && _so);
616*f6dc9357SAndroid Build Coastguard Worker 
617*f6dc9357SAndroid Build Coastguard Worker   if (show2)
618*f6dc9357SAndroid Build Coastguard Worker   {
619*f6dc9357SAndroid Build Coastguard Worker     ClosePercents_for_so();
620*f6dc9357SAndroid Build Coastguard Worker 
621*f6dc9357SAndroid Build Coastguard Worker     _tempA = command;
622*f6dc9357SAndroid Build Coastguard Worker     if (name)
623*f6dc9357SAndroid Build Coastguard Worker       _tempA.Add_Space();
624*f6dc9357SAndroid Build Coastguard Worker     *_so << _tempA;
625*f6dc9357SAndroid Build Coastguard Worker 
626*f6dc9357SAndroid Build Coastguard Worker     _tempU.Empty();
627*f6dc9357SAndroid Build Coastguard Worker     if (name)
628*f6dc9357SAndroid Build Coastguard Worker     {
629*f6dc9357SAndroid Build Coastguard Worker       _tempU = name;
630*f6dc9357SAndroid Build Coastguard Worker       if (isDir)
631*f6dc9357SAndroid Build Coastguard Worker         NWindows::NFile::NName::NormalizeDirPathPrefix(_tempU);
632*f6dc9357SAndroid Build Coastguard Worker       _so->Normalize_UString_Path(_tempU);
633*f6dc9357SAndroid Build Coastguard Worker     }
634*f6dc9357SAndroid Build Coastguard Worker     _so->PrintUString(_tempU, _tempA);
635*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
636*f6dc9357SAndroid Build Coastguard Worker     if (NeedFlush)
637*f6dc9357SAndroid Build Coastguard Worker       _so->Flush();
638*f6dc9357SAndroid Build Coastguard Worker   }
639*f6dc9357SAndroid Build Coastguard Worker 
640*f6dc9357SAndroid Build Coastguard Worker   if (NeedPercents())
641*f6dc9357SAndroid Build Coastguard Worker   {
642*f6dc9357SAndroid Build Coastguard Worker     if (PercentsNameLevel >= 1)
643*f6dc9357SAndroid Build Coastguard Worker     {
644*f6dc9357SAndroid Build Coastguard Worker       _percent.FileName.Empty();
645*f6dc9357SAndroid Build Coastguard Worker       _percent.Command.Empty();
646*f6dc9357SAndroid Build Coastguard Worker       if (PercentsNameLevel > 1 || !show2)
647*f6dc9357SAndroid Build Coastguard Worker       {
648*f6dc9357SAndroid Build Coastguard Worker         _percent.Command = command;
649*f6dc9357SAndroid Build Coastguard Worker         if (name)
650*f6dc9357SAndroid Build Coastguard Worker           _percent.FileName = name;
651*f6dc9357SAndroid Build Coastguard Worker       }
652*f6dc9357SAndroid Build Coastguard Worker     }
653*f6dc9357SAndroid Build Coastguard Worker     _percent.Print();
654*f6dc9357SAndroid Build Coastguard Worker   }
655*f6dc9357SAndroid Build Coastguard Worker 
656*f6dc9357SAndroid Build Coastguard Worker   return CheckBreak2();
657*f6dc9357SAndroid Build Coastguard Worker }
658*f6dc9357SAndroid Build Coastguard Worker 
659*f6dc9357SAndroid Build Coastguard Worker 
660*f6dc9357SAndroid Build Coastguard Worker /*
661*f6dc9357SAndroid Build Coastguard Worker void CCallbackConsoleBase::PrintInfoLine(const UString &s)
662*f6dc9357SAndroid Build Coastguard Worker {
663*f6dc9357SAndroid Build Coastguard Worker   if (LogLevel < 1000)
664*f6dc9357SAndroid Build Coastguard Worker     return;
665*f6dc9357SAndroid Build Coastguard Worker 
666*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
667*f6dc9357SAndroid Build Coastguard Worker 
668*f6dc9357SAndroid Build Coastguard Worker   const bool show2 = (_so != NULL);
669*f6dc9357SAndroid Build Coastguard Worker 
670*f6dc9357SAndroid Build Coastguard Worker   if (show2)
671*f6dc9357SAndroid Build Coastguard Worker   {
672*f6dc9357SAndroid Build Coastguard Worker     ClosePercents_for_so();
673*f6dc9357SAndroid Build Coastguard Worker     _so->PrintUString(s, _tempA);
674*f6dc9357SAndroid Build Coastguard Worker     *_so << endl;
675*f6dc9357SAndroid Build Coastguard Worker     if (NeedFlush)
676*f6dc9357SAndroid Build Coastguard Worker       _so->Flush();
677*f6dc9357SAndroid Build Coastguard Worker   }
678*f6dc9357SAndroid Build Coastguard Worker }
679*f6dc9357SAndroid Build Coastguard Worker */
680*f6dc9357SAndroid Build Coastguard Worker 
GetStream(const wchar_t * name,bool isDir,bool isAnti,UInt32 mode)681*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::GetStream(const wchar_t *name, bool isDir, bool isAnti, UInt32 mode)
682*f6dc9357SAndroid Build Coastguard Worker {
683*f6dc9357SAndroid Build Coastguard Worker   if (StdOutMode)
684*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
685*f6dc9357SAndroid Build Coastguard Worker 
686*f6dc9357SAndroid Build Coastguard Worker   if (!name || name[0] == 0)
687*f6dc9357SAndroid Build Coastguard Worker     name = kEmptyFileAlias;
688*f6dc9357SAndroid Build Coastguard Worker 
689*f6dc9357SAndroid Build Coastguard Worker   unsigned requiredLevel = 1;
690*f6dc9357SAndroid Build Coastguard Worker 
691*f6dc9357SAndroid Build Coastguard Worker   const char *s;
692*f6dc9357SAndroid Build Coastguard Worker   if (mode == NUpdateNotifyOp::kAdd ||
693*f6dc9357SAndroid Build Coastguard Worker       mode == NUpdateNotifyOp::kUpdate)
694*f6dc9357SAndroid Build Coastguard Worker   {
695*f6dc9357SAndroid Build Coastguard Worker     if (isAnti)
696*f6dc9357SAndroid Build Coastguard Worker       s = "Anti";
697*f6dc9357SAndroid Build Coastguard Worker     else if (mode == NUpdateNotifyOp::kAdd)
698*f6dc9357SAndroid Build Coastguard Worker       s = "+";
699*f6dc9357SAndroid Build Coastguard Worker     else
700*f6dc9357SAndroid Build Coastguard Worker       s = "U";
701*f6dc9357SAndroid Build Coastguard Worker   }
702*f6dc9357SAndroid Build Coastguard Worker   else
703*f6dc9357SAndroid Build Coastguard Worker   {
704*f6dc9357SAndroid Build Coastguard Worker     requiredLevel = 3;
705*f6dc9357SAndroid Build Coastguard Worker     if (mode == NUpdateNotifyOp::kAnalyze)
706*f6dc9357SAndroid Build Coastguard Worker       s = "A";
707*f6dc9357SAndroid Build Coastguard Worker     else
708*f6dc9357SAndroid Build Coastguard Worker       s = "Reading";
709*f6dc9357SAndroid Build Coastguard Worker   }
710*f6dc9357SAndroid Build Coastguard Worker 
711*f6dc9357SAndroid Build Coastguard Worker   return PrintProgress(name, isDir, s, LogLevel >= requiredLevel);
712*f6dc9357SAndroid Build Coastguard Worker }
713*f6dc9357SAndroid Build Coastguard Worker 
OpenFileError(const FString & path,DWORD systemError)714*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::OpenFileError(const FString &path, DWORD systemError)
715*f6dc9357SAndroid Build Coastguard Worker {
716*f6dc9357SAndroid Build Coastguard Worker   return OpenFileError_Base(path, systemError);
717*f6dc9357SAndroid Build Coastguard Worker }
718*f6dc9357SAndroid Build Coastguard Worker 
ReadingFileError(const FString & path,DWORD systemError)719*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::ReadingFileError(const FString &path, DWORD systemError)
720*f6dc9357SAndroid Build Coastguard Worker {
721*f6dc9357SAndroid Build Coastguard Worker   return ReadingFileError_Base(path, systemError);
722*f6dc9357SAndroid Build Coastguard Worker }
723*f6dc9357SAndroid Build Coastguard Worker 
SetOperationResult(Int32)724*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::SetOperationResult(Int32 /* opRes */)
725*f6dc9357SAndroid Build Coastguard Worker {
726*f6dc9357SAndroid Build Coastguard Worker   MT_LOCK
727*f6dc9357SAndroid Build Coastguard Worker   _percent.Files++;
728*f6dc9357SAndroid Build Coastguard Worker   /*
729*f6dc9357SAndroid Build Coastguard Worker   if (opRes != NArchive::NUpdate::NOperationResult::kOK)
730*f6dc9357SAndroid Build Coastguard Worker   {
731*f6dc9357SAndroid Build Coastguard Worker     if (opRes == NArchive::NUpdate::NOperationResult::kError_FileChanged)
732*f6dc9357SAndroid Build Coastguard Worker     {
733*f6dc9357SAndroid Build Coastguard Worker       CommonError("Input file changed");
734*f6dc9357SAndroid Build Coastguard Worker     }
735*f6dc9357SAndroid Build Coastguard Worker   }
736*f6dc9357SAndroid Build Coastguard Worker   */
737*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
738*f6dc9357SAndroid Build Coastguard Worker }
739*f6dc9357SAndroid Build Coastguard Worker 
740*f6dc9357SAndroid Build Coastguard Worker void SetExtractErrorMessage(Int32 opRes, Int32 encrypted, AString &dest);
741*f6dc9357SAndroid Build Coastguard Worker 
ReportExtractResult(Int32 opRes,Int32 isEncrypted,const wchar_t * name)742*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::ReportExtractResult(Int32 opRes, Int32 isEncrypted, const wchar_t *name)
743*f6dc9357SAndroid Build Coastguard Worker {
744*f6dc9357SAndroid Build Coastguard Worker   // if (StdOutMode) return S_OK;
745*f6dc9357SAndroid Build Coastguard Worker 
746*f6dc9357SAndroid Build Coastguard Worker   if (opRes != NArchive::NExtract::NOperationResult::kOK)
747*f6dc9357SAndroid Build Coastguard Worker   {
748*f6dc9357SAndroid Build Coastguard Worker     ClosePercents2();
749*f6dc9357SAndroid Build Coastguard Worker 
750*f6dc9357SAndroid Build Coastguard Worker     if (_se)
751*f6dc9357SAndroid Build Coastguard Worker     {
752*f6dc9357SAndroid Build Coastguard Worker       if (_so)
753*f6dc9357SAndroid Build Coastguard Worker         _so->Flush();
754*f6dc9357SAndroid Build Coastguard Worker 
755*f6dc9357SAndroid Build Coastguard Worker       AString s;
756*f6dc9357SAndroid Build Coastguard Worker       SetExtractErrorMessage(opRes, isEncrypted, s);
757*f6dc9357SAndroid Build Coastguard Worker       *_se << s << " : " << endl;
758*f6dc9357SAndroid Build Coastguard Worker       _se->NormalizePrint_wstr_Path(name);
759*f6dc9357SAndroid Build Coastguard Worker       *_se << endl << endl;
760*f6dc9357SAndroid Build Coastguard Worker       _se->Flush();
761*f6dc9357SAndroid Build Coastguard Worker     }
762*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
763*f6dc9357SAndroid Build Coastguard Worker   }
764*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
765*f6dc9357SAndroid Build Coastguard Worker }
766*f6dc9357SAndroid Build Coastguard Worker 
767*f6dc9357SAndroid Build Coastguard Worker 
ReportUpdateOperation(UInt32 op,const wchar_t * name,bool isDir)768*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::ReportUpdateOperation(UInt32 op, const wchar_t *name, bool isDir)
769*f6dc9357SAndroid Build Coastguard Worker {
770*f6dc9357SAndroid Build Coastguard Worker   // if (StdOutMode) return S_OK;
771*f6dc9357SAndroid Build Coastguard Worker 
772*f6dc9357SAndroid Build Coastguard Worker   char temp[16];
773*f6dc9357SAndroid Build Coastguard Worker   const char *s;
774*f6dc9357SAndroid Build Coastguard Worker 
775*f6dc9357SAndroid Build Coastguard Worker   unsigned requiredLevel = 1;
776*f6dc9357SAndroid Build Coastguard Worker 
777*f6dc9357SAndroid Build Coastguard Worker   switch (op)
778*f6dc9357SAndroid Build Coastguard Worker   {
779*f6dc9357SAndroid Build Coastguard Worker     case NUpdateNotifyOp::kAdd:       s = "+"; break;
780*f6dc9357SAndroid Build Coastguard Worker     case NUpdateNotifyOp::kUpdate:    s = "U"; break;
781*f6dc9357SAndroid Build Coastguard Worker     case NUpdateNotifyOp::kAnalyze:   s = "A"; requiredLevel = 3; break;
782*f6dc9357SAndroid Build Coastguard Worker     case NUpdateNotifyOp::kReplicate: s = "="; requiredLevel = 3; break;
783*f6dc9357SAndroid Build Coastguard Worker     case NUpdateNotifyOp::kRepack:    s = "R"; requiredLevel = 2; break;
784*f6dc9357SAndroid Build Coastguard Worker     case NUpdateNotifyOp::kSkip:      s = "."; requiredLevel = 2; break;
785*f6dc9357SAndroid Build Coastguard Worker     case NUpdateNotifyOp::kDelete:    s = "D"; requiredLevel = 3; break;
786*f6dc9357SAndroid Build Coastguard Worker     case NUpdateNotifyOp::kHeader:    s = "Header creation"; requiredLevel = 100; break;
787*f6dc9357SAndroid Build Coastguard Worker     case NUpdateNotifyOp::kInFileChanged: s = "Size of input file was changed:"; requiredLevel = 10; break;
788*f6dc9357SAndroid Build Coastguard Worker     // case NUpdateNotifyOp::kOpFinished:  s = "Finished"; requiredLevel = 100; break;
789*f6dc9357SAndroid Build Coastguard Worker     default:
790*f6dc9357SAndroid Build Coastguard Worker     {
791*f6dc9357SAndroid Build Coastguard Worker       temp[0] = 'o';
792*f6dc9357SAndroid Build Coastguard Worker       temp[1] = 'p';
793*f6dc9357SAndroid Build Coastguard Worker       ConvertUInt64ToString(op, temp + 2);
794*f6dc9357SAndroid Build Coastguard Worker       s = temp;
795*f6dc9357SAndroid Build Coastguard Worker     }
796*f6dc9357SAndroid Build Coastguard Worker   }
797*f6dc9357SAndroid Build Coastguard Worker 
798*f6dc9357SAndroid Build Coastguard Worker   return PrintProgress(name, isDir, s, LogLevel >= requiredLevel);
799*f6dc9357SAndroid Build Coastguard Worker }
800*f6dc9357SAndroid Build Coastguard Worker 
801*f6dc9357SAndroid Build Coastguard Worker /*
802*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::SetPassword(const UString &
803*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_NO_CRYPTO
804*f6dc9357SAndroid Build Coastguard Worker     password
805*f6dc9357SAndroid Build Coastguard Worker     #endif
806*f6dc9357SAndroid Build Coastguard Worker     )
807*f6dc9357SAndroid Build Coastguard Worker {
808*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_NO_CRYPTO
809*f6dc9357SAndroid Build Coastguard Worker   PasswordIsDefined = true;
810*f6dc9357SAndroid Build Coastguard Worker   Password = password;
811*f6dc9357SAndroid Build Coastguard Worker   #endif
812*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
813*f6dc9357SAndroid Build Coastguard Worker }
814*f6dc9357SAndroid Build Coastguard Worker */
815*f6dc9357SAndroid Build Coastguard Worker 
CryptoGetTextPassword2(Int32 * passwordIsDefined,BSTR * password)816*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)
817*f6dc9357SAndroid Build Coastguard Worker {
818*f6dc9357SAndroid Build Coastguard Worker   COM_TRY_BEGIN
819*f6dc9357SAndroid Build Coastguard Worker 
820*f6dc9357SAndroid Build Coastguard Worker   *password = NULL;
821*f6dc9357SAndroid Build Coastguard Worker 
822*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_NO_CRYPTO
823*f6dc9357SAndroid Build Coastguard Worker 
824*f6dc9357SAndroid Build Coastguard Worker   *passwordIsDefined = false;
825*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
826*f6dc9357SAndroid Build Coastguard Worker 
827*f6dc9357SAndroid Build Coastguard Worker   #else
828*f6dc9357SAndroid Build Coastguard Worker 
829*f6dc9357SAndroid Build Coastguard Worker   if (!PasswordIsDefined)
830*f6dc9357SAndroid Build Coastguard Worker   {
831*f6dc9357SAndroid Build Coastguard Worker     if (AskPassword)
832*f6dc9357SAndroid Build Coastguard Worker     {
833*f6dc9357SAndroid Build Coastguard Worker       RINOK(GetPassword_HRESULT(_so, Password))
834*f6dc9357SAndroid Build Coastguard Worker       PasswordIsDefined = true;
835*f6dc9357SAndroid Build Coastguard Worker     }
836*f6dc9357SAndroid Build Coastguard Worker   }
837*f6dc9357SAndroid Build Coastguard Worker   *passwordIsDefined = BoolToInt(PasswordIsDefined);
838*f6dc9357SAndroid Build Coastguard Worker   return StringToBstr(Password, password);
839*f6dc9357SAndroid Build Coastguard Worker 
840*f6dc9357SAndroid Build Coastguard Worker   #endif
841*f6dc9357SAndroid Build Coastguard Worker 
842*f6dc9357SAndroid Build Coastguard Worker   COM_TRY_END
843*f6dc9357SAndroid Build Coastguard Worker }
844*f6dc9357SAndroid Build Coastguard Worker 
CryptoGetTextPassword(BSTR * password)845*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::CryptoGetTextPassword(BSTR *password)
846*f6dc9357SAndroid Build Coastguard Worker {
847*f6dc9357SAndroid Build Coastguard Worker   COM_TRY_BEGIN
848*f6dc9357SAndroid Build Coastguard Worker 
849*f6dc9357SAndroid Build Coastguard Worker   *password = NULL;
850*f6dc9357SAndroid Build Coastguard Worker 
851*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_NO_CRYPTO
852*f6dc9357SAndroid Build Coastguard Worker 
853*f6dc9357SAndroid Build Coastguard Worker   return E_NOTIMPL;
854*f6dc9357SAndroid Build Coastguard Worker 
855*f6dc9357SAndroid Build Coastguard Worker   #else
856*f6dc9357SAndroid Build Coastguard Worker 
857*f6dc9357SAndroid Build Coastguard Worker   if (!PasswordIsDefined)
858*f6dc9357SAndroid Build Coastguard Worker   {
859*f6dc9357SAndroid Build Coastguard Worker     {
860*f6dc9357SAndroid Build Coastguard Worker       RINOK(GetPassword_HRESULT(_so, Password))
861*f6dc9357SAndroid Build Coastguard Worker       PasswordIsDefined = true;
862*f6dc9357SAndroid Build Coastguard Worker     }
863*f6dc9357SAndroid Build Coastguard Worker   }
864*f6dc9357SAndroid Build Coastguard Worker   return StringToBstr(Password, password);
865*f6dc9357SAndroid Build Coastguard Worker 
866*f6dc9357SAndroid Build Coastguard Worker   #endif
867*f6dc9357SAndroid Build Coastguard Worker   COM_TRY_END
868*f6dc9357SAndroid Build Coastguard Worker }
869*f6dc9357SAndroid Build Coastguard Worker 
ShowDeleteFile(const wchar_t * name,bool isDir)870*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::ShowDeleteFile(const wchar_t *name, bool isDir)
871*f6dc9357SAndroid Build Coastguard Worker {
872*f6dc9357SAndroid Build Coastguard Worker   if (StdOutMode)
873*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
874*f6dc9357SAndroid Build Coastguard Worker 
875*f6dc9357SAndroid Build Coastguard Worker   if (LogLevel > 7)
876*f6dc9357SAndroid Build Coastguard Worker   {
877*f6dc9357SAndroid Build Coastguard Worker     if (!name || name[0] == 0)
878*f6dc9357SAndroid Build Coastguard Worker       name = kEmptyFileAlias;
879*f6dc9357SAndroid Build Coastguard Worker     return PrintProgress(name, isDir, "D", true);
880*f6dc9357SAndroid Build Coastguard Worker   }
881*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
882*f6dc9357SAndroid Build Coastguard Worker }
883*f6dc9357SAndroid Build Coastguard Worker 
884*f6dc9357SAndroid Build Coastguard Worker /*
885*f6dc9357SAndroid Build Coastguard Worker void GetPropName(PROPID propID, const wchar_t *name, AString &nameA, UString &nameU);
886*f6dc9357SAndroid Build Coastguard Worker 
887*f6dc9357SAndroid Build Coastguard Worker static void GetPropName(PROPID propID, UString &nameU)
888*f6dc9357SAndroid Build Coastguard Worker {
889*f6dc9357SAndroid Build Coastguard Worker   AString nameA;
890*f6dc9357SAndroid Build Coastguard Worker   GetPropName(propID, NULL, nameA, nameU);
891*f6dc9357SAndroid Build Coastguard Worker   // if (!nameA.IsEmpty())
892*f6dc9357SAndroid Build Coastguard Worker     nameU = nameA;
893*f6dc9357SAndroid Build Coastguard Worker }
894*f6dc9357SAndroid Build Coastguard Worker 
895*f6dc9357SAndroid Build Coastguard Worker 
896*f6dc9357SAndroid Build Coastguard Worker static void AddPropNamePrefix(UString &s, PROPID propID)
897*f6dc9357SAndroid Build Coastguard Worker {
898*f6dc9357SAndroid Build Coastguard Worker   UString name;
899*f6dc9357SAndroid Build Coastguard Worker   GetPropName(propID, name);
900*f6dc9357SAndroid Build Coastguard Worker   s += name;
901*f6dc9357SAndroid Build Coastguard Worker   s += " = ";
902*f6dc9357SAndroid Build Coastguard Worker }
903*f6dc9357SAndroid Build Coastguard Worker 
904*f6dc9357SAndroid Build Coastguard Worker void CCallbackConsoleBase::PrintPropInfo(UString &s, PROPID propID, const PROPVARIANT *value)
905*f6dc9357SAndroid Build Coastguard Worker {
906*f6dc9357SAndroid Build Coastguard Worker   AddPropNamePrefix(s, propID);
907*f6dc9357SAndroid Build Coastguard Worker   {
908*f6dc9357SAndroid Build Coastguard Worker     UString dest;
909*f6dc9357SAndroid Build Coastguard Worker     const int level = 9; // we show up to ns precision level
910*f6dc9357SAndroid Build Coastguard Worker     ConvertPropertyToString2(dest, *value, propID, level);
911*f6dc9357SAndroid Build Coastguard Worker     s += dest;
912*f6dc9357SAndroid Build Coastguard Worker   }
913*f6dc9357SAndroid Build Coastguard Worker   PrintInfoLine(s);
914*f6dc9357SAndroid Build Coastguard Worker }
915*f6dc9357SAndroid Build Coastguard Worker 
916*f6dc9357SAndroid Build Coastguard Worker static void Add_IndexType_Index(UString &s, UInt32 indexType, UInt32 index)
917*f6dc9357SAndroid Build Coastguard Worker {
918*f6dc9357SAndroid Build Coastguard Worker   if (indexType == NArchive::NEventIndexType::kArcProp)
919*f6dc9357SAndroid Build Coastguard Worker   {
920*f6dc9357SAndroid Build Coastguard Worker   }
921*f6dc9357SAndroid Build Coastguard Worker   else
922*f6dc9357SAndroid Build Coastguard Worker   {
923*f6dc9357SAndroid Build Coastguard Worker     if (indexType == NArchive::NEventIndexType::kBlockIndex)
924*f6dc9357SAndroid Build Coastguard Worker     {
925*f6dc9357SAndroid Build Coastguard Worker       s += "#";
926*f6dc9357SAndroid Build Coastguard Worker     }
927*f6dc9357SAndroid Build Coastguard Worker     else if (indexType == NArchive::NEventIndexType::kOutArcIndex)
928*f6dc9357SAndroid Build Coastguard Worker     {
929*f6dc9357SAndroid Build Coastguard Worker     }
930*f6dc9357SAndroid Build Coastguard Worker     else
931*f6dc9357SAndroid Build Coastguard Worker     {
932*f6dc9357SAndroid Build Coastguard Worker       s += "indexType_";
933*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt32(indexType);
934*f6dc9357SAndroid Build Coastguard Worker       s.Add_Space();
935*f6dc9357SAndroid Build Coastguard Worker     }
936*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(index);
937*f6dc9357SAndroid Build Coastguard Worker   }
938*f6dc9357SAndroid Build Coastguard Worker   s += ": ";
939*f6dc9357SAndroid Build Coastguard Worker }
940*f6dc9357SAndroid Build Coastguard Worker 
941*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::ReportProp(UInt32 indexType, UInt32 index, PROPID propID, const PROPVARIANT *value)
942*f6dc9357SAndroid Build Coastguard Worker {
943*f6dc9357SAndroid Build Coastguard Worker   UString s;
944*f6dc9357SAndroid Build Coastguard Worker   Add_IndexType_Index(s, indexType, index);
945*f6dc9357SAndroid Build Coastguard Worker   PrintPropInfo(s, propID, value);
946*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
947*f6dc9357SAndroid Build Coastguard Worker }
948*f6dc9357SAndroid Build Coastguard Worker 
949*f6dc9357SAndroid Build Coastguard Worker static inline char GetHex(Byte value)
950*f6dc9357SAndroid Build Coastguard Worker {
951*f6dc9357SAndroid Build Coastguard Worker   return (char)((value < 10) ? ('0' + value) : ('a' + (value - 10)));
952*f6dc9357SAndroid Build Coastguard Worker }
953*f6dc9357SAndroid Build Coastguard Worker 
954*f6dc9357SAndroid Build Coastguard Worker static void AddHexToString(UString &dest, const Byte *data, UInt32 size)
955*f6dc9357SAndroid Build Coastguard Worker {
956*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 0; i < size; i++)
957*f6dc9357SAndroid Build Coastguard Worker   {
958*f6dc9357SAndroid Build Coastguard Worker     Byte b = data[i];
959*f6dc9357SAndroid Build Coastguard Worker     dest += GetHex((Byte)((b >> 4) & 0xF));
960*f6dc9357SAndroid Build Coastguard Worker     dest += GetHex((Byte)(b & 0xF));
961*f6dc9357SAndroid Build Coastguard Worker   }
962*f6dc9357SAndroid Build Coastguard Worker }
963*f6dc9357SAndroid Build Coastguard Worker 
964*f6dc9357SAndroid Build Coastguard Worker void HashHexToString(char *dest, const Byte *data, UInt32 size);
965*f6dc9357SAndroid Build Coastguard Worker 
966*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::ReportRawProp(UInt32 indexType, UInt32 index,
967*f6dc9357SAndroid Build Coastguard Worker     PROPID propID, const void *data, UInt32 dataSize, UInt32 propType)
968*f6dc9357SAndroid Build Coastguard Worker {
969*f6dc9357SAndroid Build Coastguard Worker   UString s;
970*f6dc9357SAndroid Build Coastguard Worker   propType = propType;
971*f6dc9357SAndroid Build Coastguard Worker   Add_IndexType_Index(s, indexType, index);
972*f6dc9357SAndroid Build Coastguard Worker   AddPropNamePrefix(s, propID);
973*f6dc9357SAndroid Build Coastguard Worker   if (propID == kpidChecksum)
974*f6dc9357SAndroid Build Coastguard Worker   {
975*f6dc9357SAndroid Build Coastguard Worker     char temp[k_HashCalc_DigestSize_Max + 8];
976*f6dc9357SAndroid Build Coastguard Worker     HashHexToString(temp, (const Byte *)data, dataSize);
977*f6dc9357SAndroid Build Coastguard Worker     s += temp;
978*f6dc9357SAndroid Build Coastguard Worker   }
979*f6dc9357SAndroid Build Coastguard Worker   else
980*f6dc9357SAndroid Build Coastguard Worker     AddHexToString(s, (const Byte *)data, dataSize);
981*f6dc9357SAndroid Build Coastguard Worker   PrintInfoLine(s);
982*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
983*f6dc9357SAndroid Build Coastguard Worker }
984*f6dc9357SAndroid Build Coastguard Worker 
985*f6dc9357SAndroid Build Coastguard Worker HRESULT CUpdateCallbackConsole::ReportFinished(UInt32 indexType, UInt32 index, Int32 opRes)
986*f6dc9357SAndroid Build Coastguard Worker {
987*f6dc9357SAndroid Build Coastguard Worker   UString s;
988*f6dc9357SAndroid Build Coastguard Worker   Add_IndexType_Index(s, indexType, index);
989*f6dc9357SAndroid Build Coastguard Worker   s += "finished";
990*f6dc9357SAndroid Build Coastguard Worker   if (opRes != NArchive::NUpdate::NOperationResult::kOK)
991*f6dc9357SAndroid Build Coastguard Worker   {
992*f6dc9357SAndroid Build Coastguard Worker     s += ": ";
993*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt32(opRes);
994*f6dc9357SAndroid Build Coastguard Worker   }
995*f6dc9357SAndroid Build Coastguard Worker   PrintInfoLine(s);
996*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
997*f6dc9357SAndroid Build Coastguard Worker }
998*f6dc9357SAndroid Build Coastguard Worker */
999