diff options
author | Igor Pavlov <ipavlov@users.sourceforge.net> | 2007-01-20 03:00:00 +0300 |
---|---|---|
committer | Kornel LesiĆski <kornel@geekhood.net> | 2016-05-28 02:15:49 +0300 |
commit | d9666cf046a8453b33b3e2fbf4d82295a9f87df3 (patch) | |
tree | c722ed19b844b53042aec0c1d7d2f8381140a5ed /CPP/7zip/UI/Far/ExtractEngine.cpp | |
parent | 804edc5756fede54dbb1aefda6d39d306111938d (diff) |
4.44 beta
Diffstat (limited to 'CPP/7zip/UI/Far/ExtractEngine.cpp')
-rwxr-xr-x | CPP/7zip/UI/Far/ExtractEngine.cpp | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/CPP/7zip/UI/Far/ExtractEngine.cpp b/CPP/7zip/UI/Far/ExtractEngine.cpp new file mode 100755 index 00000000..e85df5e1 --- /dev/null +++ b/CPP/7zip/UI/Far/ExtractEngine.cpp @@ -0,0 +1,168 @@ +// ExtractEngine.h + +#include "StdAfx.h" + +#include <stdio.h> + +#include "ExtractEngine.h" + +#include "Common/Wildcard.h" +#include "Common/StringConvert.h" + +#include "Windows/Defs.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) +{ + if (m_ProgressBox != 0) + { + m_ProgressBox->SetTotal(size); + m_ProgressBox->PrintCompeteValue(0); + } + return S_OK; +} + +STDMETHODIMP CExtractCallBackImp::SetCompleted(const UINT64 *completeValue) +{ + if(WasEscPressed()) + return E_ABORT; + if (m_ProgressBox != 0 && completeValue != NULL) + m_ProgressBox->PrintCompeteValue(*completeValue); + return S_OK; +} + +STDMETHODIMP CExtractCallBackImp::AskOverwrite( + const wchar_t *existName, const FILETIME *existTime, const UINT64 *existSize, + const wchar_t *newName, const FILETIME *aNewTime, 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.Time = *aNewTime; + + 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: + throw 20413; + } + return S_OK; +} + +STDMETHODIMP CExtractCallBackImp::PrepareOperation(const wchar_t *name, INT32 /* askExtractMode */, const UINT64 * /* position */) +{ + 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; +} + +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 = NMessageID::kExtractCRCFailed; + break; + case NArchive::NExtract::NOperationResult::kDataError: + idMessage = NMessageID::kExtractDataError; + break; + default: + return E_FAIL; + } + char buffer[512]; + sprintf(buffer, g_StartupInfo.GetMsgString(idMessage), + GetSystemString(m_CurrentFilePath, m_CodePage)); + if (g_StartupInfo.ShowMessage(buffer) == -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; + } + CMyComBSTR tempName = m_Password; + *password = tempName.Detach(); + + return S_OK; +} |