1// UpdateCallbackConsole.cpp
2
3#include "StdAfx.h"
4
5#include "UpdateCallbackConsole.h"
6
7#include "Windows/Error.h"
8#ifndef _7ZIP_ST
9#include "Windows/Synchronization.h"
10#endif
11
12#include "ConsoleClose.h"
13#include "UserInputUtils.h"
14
15using namespace NWindows;
16
17#ifndef _7ZIP_ST
18static NSynchronization::CCriticalSection g_CriticalSection;
19#define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
20#else
21#define MT_LOCK
22#endif
23
24static const wchar_t *kEmptyFileAlias = L"[Content]";
25
26static const char *kCreatingArchiveMessage = "Creating archive ";
27static const char *kUpdatingArchiveMessage = "Updating archive ";
28static const char *kScanningMessage = "Scanning";
29
30
31HRESULT CUpdateCallbackConsole::OpenResult(const wchar_t *name, HRESULT result)
32{
33  (*OutStream) << endl;
34  if (result != S_OK)
35    (*OutStream) << "Error: " << name << " is not supported archive" << endl;
36  return S_OK;
37}
38
39HRESULT CUpdateCallbackConsole::StartScanning()
40{
41  (*OutStream) << kScanningMessage;
42  return S_OK;
43}
44
45HRESULT CUpdateCallbackConsole::ScanProgress(UInt64 /* numFolders */, UInt64 /* numFiles */, const wchar_t * /* path */)
46{
47  return CheckBreak();
48}
49
50HRESULT CUpdateCallbackConsole::CanNotFindError(const wchar_t *name, DWORD systemError)
51{
52  CantFindFiles.Add(name);
53  CantFindCodes.Add(systemError);
54  // m_PercentPrinter.ClosePrint();
55  if (!m_WarningsMode)
56  {
57    (*OutStream) << endl << endl;
58    m_PercentPrinter.PrintNewLine();
59    m_WarningsMode = true;
60  }
61  m_PercentPrinter.PrintString(name);
62  m_PercentPrinter.PrintString(":  WARNING: ");
63  m_PercentPrinter.PrintString(NError::MyFormatMessageW(systemError));
64  m_PercentPrinter.PrintNewLine();
65  return S_OK;
66}
67
68HRESULT CUpdateCallbackConsole::FinishScanning()
69{
70  (*OutStream) << endl << endl;
71  return S_OK;
72}
73
74HRESULT CUpdateCallbackConsole::StartArchive(const wchar_t *name, bool updating)
75{
76  if(updating)
77    (*OutStream) << kUpdatingArchiveMessage;
78  else
79    (*OutStream) << kCreatingArchiveMessage;
80  if (name != 0)
81    (*OutStream) << name;
82  else
83    (*OutStream) << "StdOut";
84  (*OutStream) << endl << endl;
85  return S_OK;
86}
87
88HRESULT CUpdateCallbackConsole::FinishArchive()
89{
90  (*OutStream) << endl;
91  return S_OK;
92}
93
94HRESULT CUpdateCallbackConsole::CheckBreak()
95{
96  if (NConsoleClose::TestBreakSignal())
97    return E_ABORT;
98  return S_OK;
99}
100
101HRESULT CUpdateCallbackConsole::Finilize()
102{
103  MT_LOCK
104  if (m_NeedBeClosed)
105  {
106    if (EnablePercents)
107    {
108      m_PercentPrinter.ClosePrint();
109    }
110    if (!StdOutMode && m_NeedNewLine)
111    {
112      m_PercentPrinter.PrintNewLine();
113      m_NeedNewLine = false;
114    }
115    m_NeedBeClosed = false;
116  }
117  return S_OK;
118}
119
120HRESULT CUpdateCallbackConsole::SetNumFiles(UInt64 /* numFiles */)
121{
122  return S_OK;
123}
124
125HRESULT CUpdateCallbackConsole::SetTotal(UInt64 size)
126{
127  MT_LOCK
128  if (EnablePercents)
129    m_PercentPrinter.SetTotal(size);
130  return S_OK;
131}
132
133HRESULT CUpdateCallbackConsole::SetCompleted(const UInt64 *completeValue)
134{
135  MT_LOCK
136  if (completeValue != NULL)
137  {
138    if (EnablePercents)
139    {
140      m_PercentPrinter.SetRatio(*completeValue);
141      m_PercentPrinter.PrintRatio();
142      m_NeedBeClosed = true;
143    }
144  }
145  if (NConsoleClose::TestBreakSignal())
146    return E_ABORT;
147  return S_OK;
148}
149
150HRESULT CUpdateCallbackConsole::SetRatioInfo(const UInt64 * /* inSize */, const UInt64 * /* outSize */)
151{
152  if (NConsoleClose::TestBreakSignal())
153    return E_ABORT;
154  return S_OK;
155}
156
157HRESULT CUpdateCallbackConsole::GetStream(const wchar_t *name, bool isAnti)
158{
159  MT_LOCK
160  if (StdOutMode)
161    return S_OK;
162  if(isAnti)
163    m_PercentPrinter.PrintString("Anti item    ");
164  else
165    m_PercentPrinter.PrintString("Compressing  ");
166  if (name[0] == 0)
167    name = kEmptyFileAlias;
168  m_PercentPrinter.PrintString(name);
169  if (EnablePercents)
170    m_PercentPrinter.RePrintRatio();
171  return S_OK;
172}
173
174HRESULT CUpdateCallbackConsole::OpenFileError(const wchar_t *name, DWORD systemError)
175{
176  MT_LOCK
177  FailedCodes.Add(systemError);
178  FailedFiles.Add(name);
179  // if (systemError == ERROR_SHARING_VIOLATION)
180  {
181    m_PercentPrinter.ClosePrint();
182    m_PercentPrinter.PrintNewLine();
183    m_PercentPrinter.PrintString("WARNING: ");
184    m_PercentPrinter.PrintString(NError::MyFormatMessageW(systemError));
185    return S_FALSE;
186  }
187  // return systemError;
188}
189
190HRESULT CUpdateCallbackConsole::SetOperationResult(Int32 )
191{
192  m_NeedBeClosed = true;
193  m_NeedNewLine = true;
194  return S_OK;
195}
196
197HRESULT CUpdateCallbackConsole::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)
198{
199  *password = NULL;
200
201  #ifdef _NO_CRYPTO
202
203  *passwordIsDefined = false;
204  return S_OK;
205
206  #else
207
208  if (!PasswordIsDefined)
209  {
210    if (AskPassword)
211    {
212      Password = GetPassword(OutStream);
213      PasswordIsDefined = true;
214    }
215  }
216  *passwordIsDefined = BoolToInt(PasswordIsDefined);
217  return StringToBstr(Password, password);
218
219  #endif
220}
221
222HRESULT CUpdateCallbackConsole::CryptoGetTextPassword(BSTR *password)
223{
224  *password = NULL;
225
226  #ifdef _NO_CRYPTO
227
228  return E_NOTIMPL;
229
230  #else
231
232  if (!PasswordIsDefined)
233  {
234    {
235      Password = GetPassword(OutStream);
236      PasswordIsDefined = true;
237    }
238  }
239  return StringToBstr(Password, password);
240
241  #endif
242}
243
244/*
245HRESULT CUpdateCallbackConsole::ShowDeleteFile(const wchar_t *name)
246{
247  // MT_LOCK
248  if (StdOutMode)
249    return S_OK;
250  RINOK(Finilize());
251  m_PercentPrinter.PrintString("Deleting  ");
252  if (name[0] == 0)
253    name = kEmptyFileAlias;
254  m_PercentPrinter.PrintString(name);
255  if (EnablePercents)
256    m_PercentPrinter.RePrintRatio();
257  m_NeedBeClosed = true;
258  m_NeedNewLine = true;
259  return S_OK;
260}
261*/
262