// ExtractEngine.h #include "StdAfx.h" #include "Common/StringConvert.h" #include "ExtractEngine.h" #include "FarUtils.h" #include "Messages.h" #include "OverwriteDialog.h" using namespace NWindows; using namespace NFar; extern void PrintMessage(const char *message); CExtractCallBackImp::~CExtractCallBackImp() { } void CExtractCallBackImp::Init( UINT codePage, CProgressBox *progressBox, bool passwordIsDefined, const UString &password) { m_PasswordIsDefined = passwordIsDefined; m_Password = password; m_CodePage = codePage; m_ProgressBox = progressBox; } STDMETHODIMP CExtractCallBackImp::SetTotal(UInt64 size) { _total = size; _totalIsDefined = true; return S_OK; } STDMETHODIMP CExtractCallBackImp::SetCompleted(const UInt64 *completeValue) { if (WasEscPressed()) return E_ABORT; _processedIsDefined = (completeValue != NULL); if (_processedIsDefined) _processed = *completeValue; if (m_ProgressBox != 0) m_ProgressBox->Progress( _totalIsDefined ? &_total: NULL, _processedIsDefined ? &_processed: NULL, AString()); return S_OK; } STDMETHODIMP CExtractCallBackImp::AskOverwrite( const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize, const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize, Int32 *answer) { NOverwriteDialog::CFileInfo oldFileInfo, newFileInfo; oldFileInfo.Time = *existTime; oldFileInfo.SizeIsDefined = (existSize != NULL); if (oldFileInfo.SizeIsDefined) oldFileInfo.Size = *existSize; oldFileInfo.Name = GetSystemString(existName, m_CodePage); newFileInfo.TimeIsDefined = (newTime != 0); if (newFileInfo.TimeIsDefined) newFileInfo.Time = *newTime; newFileInfo.SizeIsDefined = (newSize != NULL); if (newFileInfo.SizeIsDefined) newFileInfo.Size = *newSize; newFileInfo.Name = GetSystemString(newName, m_CodePage); NOverwriteDialog::NResult::EEnum result = NOverwriteDialog::Execute(oldFileInfo, newFileInfo); switch(result) { case NOverwriteDialog::NResult::kCancel: // *answer = NOverwriteAnswer::kCancel; // break; return E_ABORT; case NOverwriteDialog::NResult::kNo: *answer = NOverwriteAnswer::kNo; break; case NOverwriteDialog::NResult::kNoToAll: *answer = NOverwriteAnswer::kNoToAll; break; case NOverwriteDialog::NResult::kYesToAll: *answer = NOverwriteAnswer::kYesToAll; break; case NOverwriteDialog::NResult::kYes: *answer = NOverwriteAnswer::kYes; break; case NOverwriteDialog::NResult::kAutoRename: *answer = NOverwriteAnswer::kAutoRename; break; default: return E_FAIL; } return S_OK; } STDMETHODIMP CExtractCallBackImp::PrepareOperation(const wchar_t *name, bool /* isFolder */, Int32 /* askExtractMode */, const UInt64 * /* position */) { if (WasEscPressed()) return E_ABORT; m_CurrentFilePath = name; return S_OK; } STDMETHODIMP CExtractCallBackImp::MessageError(const wchar_t *message) { AString s = UnicodeStringToMultiByte(message, CP_OEMCP); if (g_StartupInfo.ShowMessage((const char *)s) == -1) return E_ABORT; return S_OK; } static void ReduceString(UString &s, int size) { if (s.Length() > size) s = s.Left(size / 2) + UString(L" ... ") + s.Right(size / 2); } STDMETHODIMP CExtractCallBackImp::SetOperationResult(Int32 operationResult, bool encrypted) { switch(operationResult) { case NArchive::NExtract::NOperationResult::kOK: break; default: { UINT idMessage; switch(operationResult) { case NArchive::NExtract::NOperationResult::kUnSupportedMethod: idMessage = NMessageID::kExtractUnsupportedMethod; break; case NArchive::NExtract::NOperationResult::kCRCError: idMessage = encrypted ? NMessageID::kExtractCRCFailedEncrypted : NMessageID::kExtractCRCFailed; break; case NArchive::NExtract::NOperationResult::kDataError: idMessage = encrypted ? NMessageID::kExtractDataErrorEncrypted : NMessageID::kExtractDataError; break; default: return E_FAIL; } UString name = m_CurrentFilePath; ReduceString(name, 70); AString s = g_StartupInfo.GetMsgString(idMessage); s.Replace(" '%s'", ""); if (g_StartupInfo.ShowMessageLines(s + (AString)("\n") + UnicodeStringToMultiByte(name, m_CodePage)) == -1) return E_ABORT; } } return S_OK; } extern HRESULT GetPassword(UString &password); STDMETHODIMP CExtractCallBackImp::CryptoGetTextPassword(BSTR *password) { if (!m_PasswordIsDefined) { RINOK(GetPassword(m_Password)); m_PasswordIsDefined = true; } return StringToBstr(m_Password, password); }