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