// UpdateCallbackConsole.cpp #include "StdAfx.h" #include "../../../Windows/ErrorMsg.h" #ifndef _7ZIP_ST #include "../../../Windows/Synchronization.h" #endif #include "ConsoleClose.h" #include "UserInputUtils.h" #include "UpdateCallbackConsole.h" using namespace NWindows; #ifndef _7ZIP_ST static NSynchronization::CCriticalSection g_CriticalSection; #define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection); #else #define MT_LOCK #endif static const wchar_t *kEmptyFileAlias = L"[Content]"; static const char *kCreatingArchiveMessage = "Creating archive "; static const char *kUpdatingArchiveMessage = "Updating archive "; static const char *kScanningMessage = "Scanning"; HRESULT CUpdateCallbackConsole::OpenResult(const wchar_t *name, HRESULT result, const wchar_t *errorArcType) { (*OutStream) << endl; if (result != S_OK) { (*OutStream) << "Error: " << name; if (errorArcType) (*OutStream) << " : can not open the file as [" << errorArcType << "] archive"; else (*OutStream) << " is not supported archive"; (*OutStream) << endl; } return S_OK; } HRESULT CUpdateCallbackConsole::StartScanning() { (*OutStream) << kScanningMessage; return S_OK; } HRESULT CUpdateCallbackConsole::ScanProgress(UInt64 /* numFolders */, UInt64 /* numFiles */, UInt64 /* totalSize */, const wchar_t * /* path */, bool /* isDir */) { return CheckBreak(); } HRESULT CCallbackConsoleBase::CanNotFindError_Base(const wchar_t *name, DWORD systemError) { CantFindFiles.Add(name); CantFindCodes.Add(systemError); // m_PercentPrinter.ClosePrint(); if (!m_WarningsMode) { (*OutStream) << endl << endl; m_PercentPrinter.PrintNewLine(); m_WarningsMode = true; } m_PercentPrinter.PrintString(name); m_PercentPrinter.PrintString(": WARNING: "); m_PercentPrinter.PrintString(NError::MyFormatMessage(systemError)); m_PercentPrinter.PrintNewLine(); return S_OK; } HRESULT CUpdateCallbackConsole::CanNotFindError(const wchar_t *name, DWORD systemError) { return CanNotFindError_Base(name, systemError); } HRESULT CUpdateCallbackConsole::FinishScanning() { (*OutStream) << endl << endl; return S_OK; } HRESULT CUpdateCallbackConsole::StartArchive(const wchar_t *name, bool updating) { if(updating) (*OutStream) << kUpdatingArchiveMessage; else (*OutStream) << kCreatingArchiveMessage; if (name != 0) (*OutStream) << name; else (*OutStream) << "StdOut"; (*OutStream) << endl << endl; return S_OK; } HRESULT CUpdateCallbackConsole::FinishArchive() { (*OutStream) << endl; return S_OK; } HRESULT CUpdateCallbackConsole::CheckBreak() { if (NConsoleClose::TestBreakSignal()) return E_ABORT; return S_OK; } HRESULT CUpdateCallbackConsole::Finilize() { MT_LOCK if (m_NeedBeClosed) { if (EnablePercents) { m_PercentPrinter.ClosePrint(); } if (!StdOutMode && m_NeedNewLine) { m_PercentPrinter.PrintNewLine(); m_NeedNewLine = false; } m_NeedBeClosed = false; } return S_OK; } HRESULT CUpdateCallbackConsole::SetNumFiles(UInt64 /* numFiles */) { return S_OK; } HRESULT CUpdateCallbackConsole::SetTotal(UInt64 size) { MT_LOCK if (EnablePercents) m_PercentPrinter.SetTotal(size); return S_OK; } HRESULT CUpdateCallbackConsole::SetCompleted(const UInt64 *completeValue) { MT_LOCK if (completeValue != NULL) { if (EnablePercents) { m_PercentPrinter.SetRatio(*completeValue); m_PercentPrinter.PrintRatio(); m_NeedBeClosed = true; } } if (NConsoleClose::TestBreakSignal()) return E_ABORT; return S_OK; } HRESULT CUpdateCallbackConsole::SetRatioInfo(const UInt64 * /* inSize */, const UInt64 * /* outSize */) { if (NConsoleClose::TestBreakSignal()) return E_ABORT; return S_OK; } HRESULT CUpdateCallbackConsole::GetStream(const wchar_t *name, bool isAnti) { MT_LOCK if (StdOutMode) return S_OK; if(isAnti) m_PercentPrinter.PrintString("Anti item "); else m_PercentPrinter.PrintString("Compressing "); if (name[0] == 0) name = kEmptyFileAlias; m_PercentPrinter.PrintString(name); if (EnablePercents) m_PercentPrinter.RePrintRatio(); return S_OK; } HRESULT CUpdateCallbackConsole::OpenFileError(const wchar_t *name, DWORD systemError) { MT_LOCK FailedCodes.Add(systemError); FailedFiles.Add(name); /* if (systemError == ERROR_SHARING_VIOLATION) { */ m_PercentPrinter.ClosePrint(); m_PercentPrinter.PrintNewLine(); m_PercentPrinter.PrintString("WARNING: "); m_PercentPrinter.PrintString(NError::MyFormatMessage(systemError)); return S_FALSE; /* } return systemError; */ } HRESULT CUpdateCallbackConsole::SetOperationResult(Int32 ) { m_NeedBeClosed = true; m_NeedNewLine = true; return S_OK; } HRESULT CUpdateCallbackConsole::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) { *password = NULL; #ifdef _NO_CRYPTO *passwordIsDefined = false; return S_OK; #else if (!PasswordIsDefined) { if (AskPassword) { Password = GetPassword(OutStream); PasswordIsDefined = true; } } *passwordIsDefined = BoolToInt(PasswordIsDefined); return StringToBstr(Password, password); #endif } HRESULT CUpdateCallbackConsole::CryptoGetTextPassword(BSTR *password) { *password = NULL; #ifdef _NO_CRYPTO return E_NOTIMPL; #else if (!PasswordIsDefined) { { Password = GetPassword(OutStream); PasswordIsDefined = true; } } return StringToBstr(Password, password); #endif } /* HRESULT CUpdateCallbackConsole::ShowDeleteFile(const wchar_t *name) { // MT_LOCK if (StdOutMode) return S_OK; RINOK(Finilize()); m_PercentPrinter.PrintString("Deleting "); if (name[0] == 0) name = kEmptyFileAlias; m_PercentPrinter.PrintString(name); if (EnablePercents) m_PercentPrinter.RePrintRatio(); m_NeedBeClosed = true; m_NeedNewLine = true; return S_OK; } */