1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// UpdateCallbackConsole.cpp
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h"
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
5f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka#include "../../../Common/IntToString.h"
6f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Windows/ErrorMsg.h"
8f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef _7ZIP_ST
10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Windows/Synchronization.h"
11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif
12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "ConsoleClose.h"
14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "UserInputUtils.h"
15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "UpdateCallbackConsole.h"
16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
17baa3858d3f5d128a5c8466b700098109edcad5f2repo syncusing namespace NWindows;
18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#ifndef _7ZIP_ST
20baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic NSynchronization::CCriticalSection g_CriticalSection;
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#else
23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define MT_LOCK
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#endif
25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
26baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic const wchar_t *kEmptyFileAlias = L"[Content]";
27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
28f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *kOpenArchiveMessage = "Open archive: ";
29f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *kCreatingArchiveMessage = "Creating archive: ";
30f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *kUpdatingArchiveMessage = "Updating archive: ";
31f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *kScanningMessage = "Scanning the drive:";
32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
33f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *kError = "ERROR: ";
34f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *kWarning = "WARNING: ";
35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
36f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic HRESULT CheckBreak2()
37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
38f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return NConsoleClose::TestBreakSignal() ? E_ABORT : S_OK;
39f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
40f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
41f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT Print_OpenArchive_Props(CStdOutStream &so, const CCodecs *codecs, const CArchiveLink &arcLink);
42f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT Print_OpenArchive_Error(CStdOutStream &so, const CCodecs *codecs, const CArchiveLink &arcLink);
43f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
44f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakavoid PrintErrorFlags(CStdOutStream &so, const char *s, UInt32 errorFlags);
45f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
46f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakavoid Print_ErrorFormatIndex_Warning(CStdOutStream *_so, const CCodecs *codecs, const CArc &arc);
47f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
48f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::OpenResult(
49f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    const CCodecs *codecs, const CArchiveLink &arcLink,
50f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    const wchar_t *name, HRESULT result)
51f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
52f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  ClosePercents2();
53f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
54f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  FOR_VECTOR (level, arcLink.Arcs)
55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
56f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    const CArc &arc = arcLink.Arcs[level];
57f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    const CArcErrorInfo &er = arc.ErrorInfo;
58f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
59f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    UInt32 errorFlags = er.GetErrorFlags();
60f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
61f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (errorFlags != 0 || !er.ErrorMessage.IsEmpty())
62f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
63f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (_se)
64f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
65f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        *_se << endl;
66f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (level != 0)
67f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          *_se << arc.Path << endl;
68f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
69f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
70f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (errorFlags != 0)
71f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
72f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (_se)
73f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          PrintErrorFlags(*_se, "ERRORS:", errorFlags);
74f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
75f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
76f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (!er.ErrorMessage.IsEmpty())
77f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
78f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (_se)
79f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          *_se << "ERRORS:" << endl << er.ErrorMessage << endl;
80f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
81f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
82f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (_se)
83f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
84f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        *_se << endl;
85f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        _se->Flush();
86f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
87f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
88f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
89f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    UInt32 warningFlags = er.GetWarningFlags();
90f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
91f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (warningFlags != 0 || !er.WarningMessage.IsEmpty())
92f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
93f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (_so)
94f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
95f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        *_so << endl;
96f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (level != 0)
97f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          *_so << arc.Path << endl;
98f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
99f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
100f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (warningFlags != 0)
101f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
102f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (_so)
103f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          PrintErrorFlags(*_so, "WARNINGS:", warningFlags);
104f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
105f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
106f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (!er.WarningMessage.IsEmpty())
107f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
108f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (_so)
109f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          *_so << "WARNINGS:" << endl << er.WarningMessage << endl;
110f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
111f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
112f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (_so)
113f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
114f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        *_so << endl;
115f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (NeedFlush)
116f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          _so->Flush();
117f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
118f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
119f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
120f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
121f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (er.ErrorFormatIndex >= 0)
122f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
123f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (_so)
124f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
125f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        Print_ErrorFormatIndex_Warning(_so, codecs, arc);
126f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (NeedFlush)
127f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          _so->Flush();
128f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
129f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
130cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
131f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
132f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (result == S_OK)
133f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
134f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (_so)
135f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
136f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      RINOK(Print_OpenArchive_Props(*_so, codecs, arcLink));
137f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      *_so << endl;
138f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
139f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
140f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  else
141f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
142f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (_so)
143f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _so->Flush();
144f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (_se)
145f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
146f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      *_se << kError << name << endl;
147f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      HRESULT res = Print_OpenArchive_Error(*_se, codecs, arcLink);
148f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      RINOK(res);
149f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _se->Flush();
150f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
151f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
152f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
153baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
154baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
155baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
156baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CUpdateCallbackConsole::StartScanning()
157baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
158f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (_so)
159f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << kScanningMessage << endl;
160f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  _percent.Command = "Scan ";
161baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
162baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
163baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
164f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::ScanProgress(const CDirItemsStat &st, const FString &path, bool /* isDir */)
165baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
166f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (NeedPercents())
167f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
168f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.Files = st.NumDirs + st.NumFiles + st.NumAltStreams;
169f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.Completed = st.GetTotalBytes();
170f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.FileName = fs2us(path);
171f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.Print();
172f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
173f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
174baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return CheckBreak();
175baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
176baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
177f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakavoid CCallbackConsoleBase::CommonError(const FString &path, DWORD systemError, bool isWarning)
178baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
179f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  ClosePercents2();
180f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
181f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (_se)
182baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
183f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (_so)
184f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _so->Flush();
185f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
186f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_se << endl << (isWarning ? kWarning : kError)
187f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        << NError::MyFormatMessage(systemError)
188f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        << endl << fs2us(path) << endl << endl;
189f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _se->Flush();
190baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
191f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
192f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
193f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
194f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CCallbackConsoleBase::ScanError_Base(const FString &path, DWORD systemError)
195f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
196f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  MT_LOCK
197f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
198f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  ScanErrors.AddError(path, systemError);
199f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  CommonError(path, systemError, true);
200f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
201baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
202baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
203baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
204f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CCallbackConsoleBase::OpenFileError_Base(const FString &path, DWORD systemError)
205f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
206f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  MT_LOCK
207f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  FailedFiles.AddError(path, systemError);
208f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  /*
209f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (systemError == ERROR_SHARING_VIOLATION)
210f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
211f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  */
212f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    CommonError(path, systemError, true);
213f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    return S_FALSE;
214f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  /*
215f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
216f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return systemError;
217f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  */
218f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
219f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
220f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CCallbackConsoleBase::ReadingFileError_Base(const FString &path, DWORD systemError)
221f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
222f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  MT_LOCK
223f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  CommonError(path, systemError, false);
224f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return HRESULT_FROM_WIN32(systemError);
225f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
226f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
227f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::ScanError(const FString &path, DWORD systemError)
228f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
229f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return ScanError_Base(path, systemError);
230f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
231f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
232f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
233f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic void PrintPropPair(AString &s, const char *name, UInt64 val)
234cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
235f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  char temp[32];
236f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  ConvertUInt64ToString(val, temp);
237f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  s += name;
238f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  s += ": ";
239f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  s += temp;
240cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
241cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
242f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakavoid PrintSize_bytes_Smart(AString &s, UInt64 val);
243f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakavoid Print_DirItemsStat(AString &s, const CDirItemsStat &st);
244f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
245f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::FinishScanning(const CDirItemsStat &st)
246baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
247f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (NeedPercents())
248f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
249f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.ClosePrint(true);
250f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.ClearCurState();
251f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
252f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
253f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (_so)
254f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
255f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    AString s;
256f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    Print_DirItemsStat(s, st);
257f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << s << endl << endl;
258f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
259f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return S_OK;
260f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
261f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
262f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakastatic const char *k_StdOut_ArcName = "StdOut";
263f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
264f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::StartOpenArchive(const wchar_t *name)
265f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
266f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (_so)
267f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
268f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << kOpenArchiveMessage;
269f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (name)
270f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      *_so << name;
271f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    else
272f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      *_so << k_StdOut_ArcName;
273f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << endl;
274f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
275baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
276baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
277baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
278baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CUpdateCallbackConsole::StartArchive(const wchar_t *name, bool updating)
279baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
280f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (_so)
281f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
282f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << (updating ? kUpdatingArchiveMessage : kCreatingArchiveMessage);
283f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (name != 0)
284f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      *_so << name;
285f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    else
286f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      *_so << k_StdOut_ArcName;
287f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka   *_so << endl << endl;
288f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
289baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
290baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
291baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
292f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::FinishArchive(const CFinishArchiveStat &st)
293baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
294f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  ClosePercents2();
295f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
296f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (_so)
297f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
298f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    AString s;
299f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    // Print_UInt64_and_String(s, _percent.Files == 1 ? "file" : "files", _percent.Files);
300f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    PrintPropPair(s, "Files read from disk", _percent.Files);
301f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    s.Add_LF();
302f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    s += "Archive size: ";
303f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    PrintSize_bytes_Smart(s, st.OutArcFileSize);
304f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    s.Add_LF();
305f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << endl;
306f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << s;
307f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    // *_so << endl;
308f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
309f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
310baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
311baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
312baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
313f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::WriteSfx(const wchar_t *name, UInt64 size)
314baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
315f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (_so)
316f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
317f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << "Write SFX: ";
318f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << name;
319f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    AString s = " : ";
320f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    PrintSize_bytes_Smart(s, size);
321f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << s << endl;
322f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
323baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
324baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
325baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
326f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
327f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::DeletingAfterArchiving(const FString &path, bool /* isDir */)
328baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
329f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (LogLevel > 0 && _so)
330baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
331f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    ClosePercents_for_so();
332f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
333f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (!DeleteMessageWasShown)
334f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
335f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (_so)
336f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        *_so << endl << ": Removing files after including to archive" << endl;
337f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
338f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
339baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
340f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
341f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        _tempA = "Removing";
342f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        _tempA.Add_Space();
343f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        *_so << _tempA;
344f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        _tempU = fs2us(path);
345f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        _so->PrintUString(_tempU, _tempA);
346f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        *_so << endl;
347f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (NeedFlush)
348f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          _so->Flush();
349f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
350baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
351f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
352f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
353f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (!DeleteMessageWasShown)
354f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
355f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (NeedPercents())
356baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
357f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _percent.ClearCurState();
358baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
359f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    DeleteMessageWasShown = true;
360f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
361f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  else
362f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
363f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.Files++;
364baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
365f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
366f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (NeedPercents())
367f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
368f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    // if (!FullLog)
369f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
370f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _percent.Command = "Removing";
371f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _percent.FileName = fs2us(path);
372f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
373f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.Print();
374f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
375f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
376f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return S_OK;
377f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
378f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
379f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
380f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::FinishDeletingAfterArchiving()
381f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
382f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  ClosePercents2();
383f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (_so && DeleteMessageWasShown)
384f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << endl;
385f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return S_OK;
386f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
387f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
388f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::CheckBreak()
389f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
390f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return CheckBreak2();
391f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
392f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
393f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka/*
394f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::Finalize()
395f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
396f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  // MT_LOCK
397baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
398baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
399f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka*/
400baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
401f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::SetNumItems(UInt64 numItems)
402baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
403f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (_so)
404f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
405f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    ClosePercents_for_so();
406f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    AString s;
407f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    PrintPropPair(s, "Items to compress", numItems);
408f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << s << endl << endl;
409f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
410baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
411baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
412baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
413baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CUpdateCallbackConsole::SetTotal(UInt64 size)
414baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
415baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  MT_LOCK
416f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (NeedPercents())
417f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
418f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.Total = size;
419f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.Print();
420f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
421baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
422baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
423baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
424baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CUpdateCallbackConsole::SetCompleted(const UInt64 *completeValue)
425baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
426baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  MT_LOCK
427f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (completeValue)
428baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
429f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (NeedPercents())
430baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
431f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _percent.Completed = *completeValue;
432f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _percent.Print();
433baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
434baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
435f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return CheckBreak2();
436baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
437baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
438baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CUpdateCallbackConsole::SetRatioInfo(const UInt64 * /* inSize */, const UInt64 * /* outSize */)
439baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
440f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return CheckBreak2();
441baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
442baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
443f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CCallbackConsoleBase::PrintProgress(const wchar_t *name, const char *command, bool showInLog)
444baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
445baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  MT_LOCK
446f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
447f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  bool show2 = (showInLog && _so);
448f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
449f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (show2)
450f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
451f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    ClosePercents_for_so();
452f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
453f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _tempA = command;
454f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (name)
455f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _tempA.Add_Space();
456f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << _tempA;
457f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
458f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _tempU.Empty();
459f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (name)
460f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _tempU = name;
461f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _so->PrintUString(_tempU, _tempA);
462f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    *_so << endl;
463f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (NeedFlush)
464f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _so->Flush();
465f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
466f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
467f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (NeedPercents())
468f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
469f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (PercentsNameLevel >= 1)
470f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
471f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _percent.FileName.Empty();
472f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _percent.Command.Empty();
473f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (PercentsNameLevel > 1 || !show2)
474f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      {
475f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        _percent.Command = command;
476f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        if (name)
477f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka          _percent.FileName = name;
478f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      }
479f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
480f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    _percent.Print();
481f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
482f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
483f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return CheckBreak2();
484f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
485f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
486f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::GetStream(const wchar_t *name, bool /* isDir */, bool isAnti, UInt32 mode)
487f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
488baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (StdOutMode)
489baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return S_OK;
490f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
491f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (!name || name[0] == 0)
492baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    name = kEmptyFileAlias;
493f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
494f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  unsigned requiredLevel = 1;
495f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
496f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  const char *s;
497f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (mode == NUpdateNotifyOp::kAdd ||
498f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      mode == NUpdateNotifyOp::kUpdate)
499f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
500f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (isAnti)
501f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      s = "Anti";
502f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    else if (mode == NUpdateNotifyOp::kAdd)
503f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      s = "+";
504f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    else
505f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      s = "U";
506f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
507f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  else
508f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
509f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    requiredLevel = 3;
510f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (mode == NUpdateNotifyOp::kAnalyze)
511f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      s = "A";
512f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    else
513f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      s = "Reading";
514f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
515f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
516f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return PrintProgress(name, s, LogLevel >= requiredLevel);
517f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
518f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
519f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::OpenFileError(const FString &path, DWORD systemError)
520f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
521f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return OpenFileError_Base(path, systemError);
522f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
523f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
524f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::ReadingFileError(const FString &path, DWORD systemError)
525f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
526f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return ReadingFileError_Base(path, systemError);
527baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
528baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
529f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::SetOperationResult(Int32)
530baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
531baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  MT_LOCK
532f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  _percent.Files++;
533f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return S_OK;
534f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
535f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
536f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osakavoid SetExtractErrorMessage(Int32 opRes, Int32 encrypted, AString &dest);
537f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
538f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::ReportExtractResult(Int32 opRes, Int32 isEncrypted, const wchar_t *name)
539f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
540f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  // if (StdOutMode) return S_OK;
541f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
542f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (opRes != NArchive::NExtract::NOperationResult::kOK)
543baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
544f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    ClosePercents2();
545f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
546f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (_se)
547f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
548f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      if (_so)
549f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka        _so->Flush();
550f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
551f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      AString s;
552f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      SetExtractErrorMessage(opRes, isEncrypted, s);
553f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      *_se << s << " : " << endl << name << endl << endl;
554f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      _se->Flush();
555f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
556f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    return S_OK;
557baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
558f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return S_OK;
559baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
560baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
561f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
562f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::ReportUpdateOpeartion(UInt32 op, const wchar_t *name, bool /* isDir */)
563f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka{
564f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  // if (StdOutMode) return S_OK;
565f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
566f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  char temp[16];
567f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  const char *s;
568f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
569f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  unsigned requiredLevel = 1;
570f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
571f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  switch (op)
572f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
573f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    case NUpdateNotifyOp::kAdd:       s = "+"; break;
574f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    case NUpdateNotifyOp::kUpdate:    s = "U"; break;
575f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    case NUpdateNotifyOp::kAnalyze:   s = "A"; requiredLevel = 3; break;
576f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    case NUpdateNotifyOp::kReplicate: s = "="; requiredLevel = 3; break;
577f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    case NUpdateNotifyOp::kRepack:    s = "R"; requiredLevel = 2; break;
578f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    case NUpdateNotifyOp::kSkip:      s = "."; requiredLevel = 2; break;
579f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    case NUpdateNotifyOp::kDelete:    s = "D"; requiredLevel = 3; break;
580f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    case NUpdateNotifyOp::kHeader:    s = "Header creation"; requiredLevel = 100; break;
581f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    default:
582f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    {
583f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      temp[0] = 'o';
584f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      temp[1] = 'p';
585f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      ConvertUInt64ToString(op, temp + 2);
586f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      s = temp;
587f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    }
588f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
589f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
590f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return PrintProgress(name, s, LogLevel >= requiredLevel);
591f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka}
592f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
593f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka/*
594f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::SetPassword(const UString &
595f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    #ifndef _NO_CRYPTO
596f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    password
597f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    #endif
598f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    )
599baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
600f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  #ifndef _NO_CRYPTO
601f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  PasswordIsDefined = true;
602f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  Password = password;
603f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  #endif
604baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
605baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
606f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka*/
607baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
608baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CUpdateCallbackConsole::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)
609baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
610f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  COM_TRY_BEGIN
611f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
612baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  *password = NULL;
613baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
614baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifdef _NO_CRYPTO
615baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
616baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  *passwordIsDefined = false;
617baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
618baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
619baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #else
620baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
621baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (!PasswordIsDefined)
622baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
623baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (AskPassword)
624baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
625f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      Password = GetPassword(_so);
626baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      PasswordIsDefined = true;
627baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
628baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
629baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  *passwordIsDefined = BoolToInt(PasswordIsDefined);
630baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return StringToBstr(Password, password);
631baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
632baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
633f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
634f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  COM_TRY_END
635baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
636baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
637baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT CUpdateCallbackConsole::CryptoGetTextPassword(BSTR *password)
638baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
639f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  COM_TRY_BEGIN
640f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
641baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  *password = NULL;
642baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
643baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #ifdef _NO_CRYPTO
644baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
645baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return E_NOTIMPL;
646baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
647baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #else
648baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
649baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (!PasswordIsDefined)
650baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
651baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
652f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      Password = GetPassword(_so);
653baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      PasswordIsDefined = true;
654baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
655baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
656baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return StringToBstr(Password, password);
657baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
658baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  #endif
659f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  COM_TRY_END
660baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
661baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
662f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo OsakaHRESULT CUpdateCallbackConsole::ShowDeleteFile(const wchar_t *name, bool /* isDir */)
663baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
664baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (StdOutMode)
665baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return S_OK;
666f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka
667f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (LogLevel > 7)
668f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  {
669f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    if (!name || name[0] == 0)
670f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      name = kEmptyFileAlias;
671f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    return PrintProgress(name, "D", true);
672f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  }
673baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
674baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
675