Index: third_party/lzma/v4_65/files/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp |
diff --git a/third_party/lzma/v4_65/files/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp b/third_party/lzma/v4_65/files/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp |
deleted file mode 100644 |
index 5af5286b3f34bbf99a745c5c6c5cd0976663821d..0000000000000000000000000000000000000000 |
--- a/third_party/lzma/v4_65/files/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp |
+++ /dev/null |
@@ -1,476 +0,0 @@ |
-// ArchiveExtractCallback.cpp |
- |
-#include "StdAfx.h" |
- |
-#include "ArchiveExtractCallback.h" |
- |
-#include "Common/Wildcard.h" |
-#include "Common/StringConvert.h" |
-#include "Common/ComTry.h" |
- |
-#include "Windows/FileDir.h" |
-#include "Windows/FileFind.h" |
-#include "Windows/Time.h" |
-#include "Windows/Defs.h" |
-#include "Windows/PropVariant.h" |
- |
-#include "Windows/PropVariantConversions.h" |
- |
-#include "../../Common/FilePathAutoRename.h" |
- |
-#include "../Common/ExtractingFilePath.h" |
-#include "OpenArchive.h" |
- |
-using namespace NWindows; |
- |
-static const wchar_t *kCantAutoRename = L"ERROR: Can not create file with auto name"; |
-static const wchar_t *kCantRenameFile = L"ERROR: Can not rename existing file "; |
-static const wchar_t *kCantDeleteOutputFile = L"ERROR: Can not delete output file "; |
- |
- |
-void CArchiveExtractCallback::Init( |
- IInArchive *archiveHandler, |
- IFolderArchiveExtractCallback *extractCallback2, |
- bool stdOutMode, |
- const UString &directoryPath, |
- const UStringVector &removePathParts, |
- const UString &itemDefaultName, |
- const FILETIME &utcMTimeDefault, |
- UInt32 attributesDefault, |
- UInt64 packSize) |
-{ |
- _stdOutMode = stdOutMode; |
- _numErrors = 0; |
- _unpTotal = 1; |
- _packTotal = packSize; |
- |
- _extractCallback2 = extractCallback2; |
- _compressProgress.Release(); |
- _extractCallback2.QueryInterface(IID_ICompressProgressInfo, &_compressProgress); |
- |
- LocalProgressSpec->Init(extractCallback2, true); |
- LocalProgressSpec->SendProgress = false; |
- |
- _itemDefaultName = itemDefaultName; |
- _utcMTimeDefault = utcMTimeDefault; |
- _attributesDefault = attributesDefault; |
- _removePathParts = removePathParts; |
- _archiveHandler = archiveHandler; |
- _directoryPath = directoryPath; |
- NFile::NName::NormalizeDirPathPrefix(_directoryPath); |
-} |
- |
-STDMETHODIMP CArchiveExtractCallback::SetTotal(UInt64 size) |
-{ |
- COM_TRY_BEGIN |
- _unpTotal = size; |
- if (!_multiArchives && _extractCallback2) |
- return _extractCallback2->SetTotal(size); |
- return S_OK; |
- COM_TRY_END |
-} |
- |
-static void NormalizeVals(UInt64 &v1, UInt64 &v2) |
-{ |
- const UInt64 kMax = (UInt64)1 << 31; |
- while (v1 > kMax) |
- { |
- v1 >>= 1; |
- v2 >>= 1; |
- } |
-} |
- |
-static UInt64 MyMultDiv64(UInt64 unpCur, UInt64 unpTotal, UInt64 packTotal) |
-{ |
- NormalizeVals(packTotal, unpTotal); |
- NormalizeVals(unpCur, unpTotal); |
- if (unpTotal == 0) |
- unpTotal = 1; |
- return unpCur * packTotal / unpTotal; |
-} |
- |
-STDMETHODIMP CArchiveExtractCallback::SetCompleted(const UInt64 *completeValue) |
-{ |
- COM_TRY_BEGIN |
- if (!_extractCallback2) |
- return S_OK; |
- |
- if (_multiArchives) |
- { |
- if (completeValue != NULL) |
- { |
- UInt64 packCur = LocalProgressSpec->InSize + MyMultDiv64(*completeValue, _unpTotal, _packTotal); |
- return _extractCallback2->SetCompleted(&packCur); |
- } |
- } |
- return _extractCallback2->SetCompleted(completeValue); |
- COM_TRY_END |
-} |
- |
-STDMETHODIMP CArchiveExtractCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) |
-{ |
- COM_TRY_BEGIN |
- return _localProgress->SetRatioInfo(inSize, outSize); |
- COM_TRY_END |
-} |
- |
-void CArchiveExtractCallback::CreateComplexDirectory(const UStringVector &dirPathParts, UString &fullPath) |
-{ |
- fullPath = _directoryPath; |
- for(int i = 0; i < dirPathParts.Size(); i++) |
- { |
- if (i > 0) |
- fullPath += wchar_t(NFile::NName::kDirDelimiter); |
- fullPath += dirPathParts[i]; |
- NFile::NDirectory::MyCreateDirectory(fullPath); |
- } |
-} |
- |
-static UString MakePathNameFromParts(const UStringVector &parts) |
-{ |
- UString result; |
- for(int i = 0; i < parts.Size(); i++) |
- { |
- if(i != 0) |
- result += wchar_t(NFile::NName::kDirDelimiter); |
- result += parts[i]; |
- } |
- return result; |
-} |
- |
- |
-HRESULT CArchiveExtractCallback::GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined) |
-{ |
- filetimeIsDefined = false; |
- NCOM::CPropVariant prop; |
- RINOK(_archiveHandler->GetProperty(index, propID, &prop)); |
- if (prop.vt == VT_FILETIME) |
- { |
- filetime = prop.filetime; |
- filetimeIsDefined = (filetime.dwHighDateTime != 0 || filetime.dwLowDateTime != 0); |
- } |
- else if (prop.vt != VT_EMPTY) |
- return E_FAIL; |
- return S_OK; |
-} |
- |
-STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode) |
-{ |
- COM_TRY_BEGIN |
- *outStream = 0; |
- _outFileStream.Release(); |
- |
- _encrypted = false; |
- _isSplit = false; |
- _curSize = 0; |
- |
- UString fullPath; |
- |
- RINOK(GetArchiveItemPath(_archiveHandler, index, _itemDefaultName, fullPath)); |
- RINOK(IsArchiveItemFolder(_archiveHandler, index, _processedFileInfo.IsDir)); |
- |
- _filePath = fullPath; |
- |
- { |
- NCOM::CPropVariant prop; |
- RINOK(_archiveHandler->GetProperty(index, kpidPosition, &prop)); |
- if (prop.vt != VT_EMPTY) |
- { |
- if (prop.vt != VT_UI8) |
- return E_FAIL; |
- _position = prop.uhVal.QuadPart; |
- _isSplit = true; |
- } |
- } |
- |
- RINOK(IsArchiveItemProp(_archiveHandler, index, kpidEncrypted, _encrypted)); |
- |
- bool newFileSizeDefined; |
- UInt64 newFileSize; |
- { |
- NCOM::CPropVariant prop; |
- RINOK(_archiveHandler->GetProperty(index, kpidSize, &prop)); |
- newFileSizeDefined = (prop.vt != VT_EMPTY); |
- if (newFileSizeDefined) |
- { |
- newFileSize = ConvertPropVariantToUInt64(prop); |
- _curSize = newFileSize; |
- } |
- } |
- |
- if(askExtractMode == NArchive::NExtract::NAskMode::kExtract) |
- { |
- if (_stdOutMode) |
- { |
- CMyComPtr<ISequentialOutStream> outStreamLoc = new CStdOutFileStream; |
- *outStream = outStreamLoc.Detach(); |
- return S_OK; |
- } |
- |
- { |
- NCOM::CPropVariant prop; |
- RINOK(_archiveHandler->GetProperty(index, kpidAttrib, &prop)); |
- if (prop.vt == VT_EMPTY) |
- { |
- _processedFileInfo.Attributes = _attributesDefault; |
- _processedFileInfo.AttributesAreDefined = false; |
- } |
- else |
- { |
- if (prop.vt != VT_UI4) |
- return E_FAIL; |
- _processedFileInfo.Attributes = prop.ulVal; |
- _processedFileInfo.AttributesAreDefined = true; |
- } |
- } |
- |
- RINOK(GetTime(index, kpidCTime, _processedFileInfo.CTime, _processedFileInfo.CTimeDefined)); |
- RINOK(GetTime(index, kpidATime, _processedFileInfo.ATime, _processedFileInfo.ATimeDefined)); |
- RINOK(GetTime(index, kpidMTime, _processedFileInfo.MTime, _processedFileInfo.MTimeDefined)); |
- |
- bool isAnti = false; |
- RINOK(IsArchiveItemProp(_archiveHandler, index, kpidIsAnti, isAnti)); |
- |
- UStringVector pathParts; |
- SplitPathToParts(fullPath, pathParts); |
- |
- if(pathParts.IsEmpty()) |
- return E_FAIL; |
- int numRemovePathParts = 0; |
- switch(_pathMode) |
- { |
- case NExtract::NPathMode::kFullPathnames: |
- break; |
- case NExtract::NPathMode::kCurrentPathnames: |
- { |
- numRemovePathParts = _removePathParts.Size(); |
- if (pathParts.Size() <= numRemovePathParts) |
- return E_FAIL; |
- for (int i = 0; i < numRemovePathParts; i++) |
- if (_removePathParts[i].CompareNoCase(pathParts[i]) != 0) |
- return E_FAIL; |
- break; |
- } |
- case NExtract::NPathMode::kNoPathnames: |
- { |
- numRemovePathParts = pathParts.Size() - 1; |
- break; |
- } |
- } |
- pathParts.Delete(0, numRemovePathParts); |
- MakeCorrectPath(pathParts); |
- UString processedPath = MakePathNameFromParts(pathParts); |
- if (!isAnti) |
- { |
- if (!_processedFileInfo.IsDir) |
- { |
- if (!pathParts.IsEmpty()) |
- pathParts.DeleteBack(); |
- } |
- |
- if (!pathParts.IsEmpty()) |
- { |
- UString fullPathNew; |
- CreateComplexDirectory(pathParts, fullPathNew); |
- if (_processedFileInfo.IsDir) |
- NFile::NDirectory::SetDirTime(fullPathNew, |
- (WriteCTime && _processedFileInfo.CTimeDefined) ? &_processedFileInfo.CTime : NULL, |
- (WriteATime && _processedFileInfo.ATimeDefined) ? &_processedFileInfo.ATime : NULL, |
- (WriteMTime && _processedFileInfo.MTimeDefined) ? &_processedFileInfo.MTime : &_utcMTimeDefault); |
- } |
- } |
- |
- |
- UString fullProcessedPath = _directoryPath + processedPath; |
- |
- if(_processedFileInfo.IsDir) |
- { |
- _diskFilePath = fullProcessedPath; |
- if (isAnti) |
- NFile::NDirectory::MyRemoveDirectory(_diskFilePath); |
- return S_OK; |
- } |
- |
- if (!_isSplit) |
- { |
- NFile::NFind::CFileInfoW fileInfo; |
- if(NFile::NFind::FindFile(fullProcessedPath, fileInfo)) |
- { |
- switch(_overwriteMode) |
- { |
- case NExtract::NOverwriteMode::kSkipExisting: |
- return S_OK; |
- case NExtract::NOverwriteMode::kAskBefore: |
- { |
- Int32 overwiteResult; |
- RINOK(_extractCallback2->AskOverwrite( |
- fullProcessedPath, &fileInfo.MTime, &fileInfo.Size, fullPath, |
- _processedFileInfo.MTimeDefined ? &_processedFileInfo.MTime : NULL, |
- newFileSizeDefined ? &newFileSize : NULL, |
- &overwiteResult)) |
- |
- switch(overwiteResult) |
- { |
- case NOverwriteAnswer::kCancel: |
- return E_ABORT; |
- case NOverwriteAnswer::kNo: |
- return S_OK; |
- case NOverwriteAnswer::kNoToAll: |
- _overwriteMode = NExtract::NOverwriteMode::kSkipExisting; |
- return S_OK; |
- case NOverwriteAnswer::kYesToAll: |
- _overwriteMode = NExtract::NOverwriteMode::kWithoutPrompt; |
- break; |
- case NOverwriteAnswer::kYes: |
- break; |
- case NOverwriteAnswer::kAutoRename: |
- _overwriteMode = NExtract::NOverwriteMode::kAutoRename; |
- break; |
- default: |
- return E_FAIL; |
- } |
- } |
- } |
- if (_overwriteMode == NExtract::NOverwriteMode::kAutoRename) |
- { |
- if (!AutoRenamePath(fullProcessedPath)) |
- { |
- UString message = UString(kCantAutoRename) + fullProcessedPath; |
- RINOK(_extractCallback2->MessageError(message)); |
- return E_FAIL; |
- } |
- } |
- else if (_overwriteMode == NExtract::NOverwriteMode::kAutoRenameExisting) |
- { |
- UString existPath = fullProcessedPath; |
- if (!AutoRenamePath(existPath)) |
- { |
- UString message = kCantAutoRename + fullProcessedPath; |
- RINOK(_extractCallback2->MessageError(message)); |
- return E_FAIL; |
- } |
- if(!NFile::NDirectory::MyMoveFile(fullProcessedPath, existPath)) |
- { |
- UString message = UString(kCantRenameFile) + fullProcessedPath; |
- RINOK(_extractCallback2->MessageError(message)); |
- return E_FAIL; |
- } |
- } |
- else |
- if (!NFile::NDirectory::DeleteFileAlways(fullProcessedPath)) |
- { |
- UString message = UString(kCantDeleteOutputFile) + fullProcessedPath; |
- RINOK(_extractCallback2->MessageError(message)); |
- return S_OK; |
- // return E_FAIL; |
- } |
- } |
- } |
- if (!isAnti) |
- { |
- _outFileStreamSpec = new COutFileStream; |
- CMyComPtr<ISequentialOutStream> outStreamLoc(_outFileStreamSpec); |
- if (!_outFileStreamSpec->Open(fullProcessedPath, _isSplit ? OPEN_ALWAYS: CREATE_ALWAYS)) |
- { |
- // if (::GetLastError() != ERROR_FILE_EXISTS || !isSplit) |
- { |
- UString message = L"can not open output file " + fullProcessedPath; |
- RINOK(_extractCallback2->MessageError(message)); |
- return S_OK; |
- } |
- } |
- if (_isSplit) |
- { |
- RINOK(_outFileStreamSpec->Seek(_position, STREAM_SEEK_SET, NULL)); |
- } |
- _outFileStream = outStreamLoc; |
- *outStream = outStreamLoc.Detach(); |
- } |
- _diskFilePath = fullProcessedPath; |
- } |
- else |
- { |
- *outStream = NULL; |
- } |
- return S_OK; |
- COM_TRY_END |
-} |
- |
-STDMETHODIMP CArchiveExtractCallback::PrepareOperation(Int32 askExtractMode) |
-{ |
- COM_TRY_BEGIN |
- _extractMode = false; |
- switch (askExtractMode) |
- { |
- case NArchive::NExtract::NAskMode::kExtract: |
- _extractMode = true; |
- }; |
- return _extractCallback2->PrepareOperation(_filePath, _processedFileInfo.IsDir, |
- askExtractMode, _isSplit ? &_position: 0); |
- COM_TRY_END |
-} |
- |
-STDMETHODIMP CArchiveExtractCallback::SetOperationResult(Int32 operationResult) |
-{ |
- COM_TRY_BEGIN |
- switch(operationResult) |
- { |
- case NArchive::NExtract::NOperationResult::kOK: |
- case NArchive::NExtract::NOperationResult::kUnSupportedMethod: |
- case NArchive::NExtract::NOperationResult::kCRCError: |
- case NArchive::NExtract::NOperationResult::kDataError: |
- break; |
- default: |
- _outFileStream.Release(); |
- return E_FAIL; |
- } |
- if (_outFileStream != NULL) |
- { |
- _outFileStreamSpec->SetTime( |
- (WriteCTime && _processedFileInfo.CTimeDefined) ? &_processedFileInfo.CTime : NULL, |
- (WriteATime && _processedFileInfo.ATimeDefined) ? &_processedFileInfo.ATime : NULL, |
- (WriteMTime && _processedFileInfo.MTimeDefined) ? &_processedFileInfo.MTime : &_utcMTimeDefault); |
- _curSize = _outFileStreamSpec->ProcessedSize; |
- RINOK(_outFileStreamSpec->Close()); |
- _outFileStream.Release(); |
- } |
- UnpackSize += _curSize; |
- if (_processedFileInfo.IsDir) |
- NumFolders++; |
- else |
- NumFiles++; |
- |
- if (_extractMode && _processedFileInfo.AttributesAreDefined) |
- NFile::NDirectory::MySetFileAttributes(_diskFilePath, _processedFileInfo.Attributes); |
- RINOK(_extractCallback2->SetOperationResult(operationResult, _encrypted)); |
- return S_OK; |
- COM_TRY_END |
-} |
- |
-/* |
-STDMETHODIMP CArchiveExtractCallback::GetInStream( |
- const wchar_t *name, ISequentialInStream **inStream) |
-{ |
- COM_TRY_BEGIN |
- CInFileStream *inFile = new CInFileStream; |
- CMyComPtr<ISequentialInStream> inStreamTemp = inFile; |
- if (!inFile->Open(_srcDirectoryPrefix + name)) |
- return ::GetLastError(); |
- *inStream = inStreamTemp.Detach(); |
- return S_OK; |
- COM_TRY_END |
-} |
-*/ |
- |
-STDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR *password) |
-{ |
- COM_TRY_BEGIN |
- if (!_cryptoGetTextPassword) |
- { |
- RINOK(_extractCallback2.QueryInterface(IID_ICryptoGetTextPassword, |
- &_cryptoGetTextPassword)); |
- } |
- return _cryptoGetTextPassword->CryptoGetTextPassword(password); |
- COM_TRY_END |
-} |
- |