Index: third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zHandlerOut.cpp |
diff --git a/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zHandlerOut.cpp b/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zHandlerOut.cpp |
deleted file mode 100644 |
index 3e2591d5beaf02565c79c3fe534c4982af67b721..0000000000000000000000000000000000000000 |
--- a/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zHandlerOut.cpp |
+++ /dev/null |
@@ -1,477 +0,0 @@ |
-// 7zHandlerOut.cpp |
- |
-#include "StdAfx.h" |
- |
-#include "../../../Windows/PropVariant.h" |
- |
-#include "../../../Common/ComTry.h" |
-#include "../../../Common/StringToInt.h" |
- |
-#include "../../ICoder.h" |
- |
-#include "../Common/ItemNameUtils.h" |
-#include "../Common/ParseProperties.h" |
- |
-#include "7zHandler.h" |
-#include "7zOut.h" |
-#include "7zUpdate.h" |
- |
-using namespace NWindows; |
- |
-namespace NArchive { |
-namespace N7z { |
- |
-static const wchar_t *kLZMAMethodName = L"LZMA"; |
-static const wchar_t *kCopyMethod = L"Copy"; |
-static const wchar_t *kDefaultMethodName = kLZMAMethodName; |
- |
-static const UInt32 kLzmaAlgorithmX5 = 1; |
-static const wchar_t *kLzmaMatchFinderForHeaders = L"BT2"; |
-static const UInt32 kDictionaryForHeaders = 1 << 20; |
-static const UInt32 kNumFastBytesForHeaders = 273; |
-static const UInt32 kAlgorithmForHeaders = kLzmaAlgorithmX5; |
- |
-static inline bool IsCopyMethod(const UString &methodName) |
- { return (methodName.CompareNoCase(kCopyMethod) == 0); } |
- |
-STDMETHODIMP CHandler::GetFileTimeType(UInt32 *type) |
-{ |
- *type = NFileTimeType::kWindows; |
- return S_OK; |
-} |
- |
-HRESULT CHandler::SetPassword(CCompressionMethodMode &methodMode, |
- IArchiveUpdateCallback *updateCallback) |
-{ |
- CMyComPtr<ICryptoGetTextPassword2> getTextPassword; |
- if (!getTextPassword) |
- { |
- CMyComPtr<IArchiveUpdateCallback> udateCallback2(updateCallback); |
- udateCallback2.QueryInterface(IID_ICryptoGetTextPassword2, &getTextPassword); |
- } |
- |
- if (getTextPassword) |
- { |
- CMyComBSTR password; |
- Int32 passwordIsDefined; |
- RINOK(getTextPassword->CryptoGetTextPassword2( |
- &passwordIsDefined, &password)); |
- methodMode.PasswordIsDefined = IntToBool(passwordIsDefined); |
- if (methodMode.PasswordIsDefined) |
- methodMode.Password = password; |
- } |
- else |
- methodMode.PasswordIsDefined = false; |
- return S_OK; |
-} |
- |
-HRESULT CHandler::SetCompressionMethod( |
- CCompressionMethodMode &methodMode, |
- CCompressionMethodMode &headerMethod) |
-{ |
- HRESULT res = SetCompressionMethod(methodMode, _methods |
- #ifdef COMPRESS_MT |
- , _numThreads |
- #endif |
- ); |
- RINOK(res); |
- methodMode.Binds = _binds; |
- |
- if (_compressHeaders) |
- { |
- // headerMethod.Methods.Add(methodMode.Methods.Back()); |
- |
- CObjectVector<COneMethodInfo> headerMethodInfoVector; |
- COneMethodInfo oneMethodInfo; |
- oneMethodInfo.MethodName = kLZMAMethodName; |
- { |
- CProp prop; |
- prop.Id = NCoderPropID::kMatchFinder; |
- prop.Value = kLzmaMatchFinderForHeaders; |
- oneMethodInfo.Props.Add(prop); |
- } |
- { |
- CProp prop; |
- prop.Id = NCoderPropID::kAlgorithm; |
- prop.Value = kAlgorithmForHeaders; |
- oneMethodInfo.Props.Add(prop); |
- } |
- { |
- CProp prop; |
- prop.Id = NCoderPropID::kNumFastBytes; |
- prop.Value = (UInt32)kNumFastBytesForHeaders; |
- oneMethodInfo.Props.Add(prop); |
- } |
- { |
- CProp prop; |
- prop.Id = NCoderPropID::kDictionarySize; |
- prop.Value = (UInt32)kDictionaryForHeaders; |
- oneMethodInfo.Props.Add(prop); |
- } |
- headerMethodInfoVector.Add(oneMethodInfo); |
- HRESULT res = SetCompressionMethod(headerMethod, headerMethodInfoVector |
- #ifdef COMPRESS_MT |
- ,1 |
- #endif |
- ); |
- RINOK(res); |
- } |
- return S_OK; |
-} |
- |
-HRESULT CHandler::SetCompressionMethod( |
- CCompressionMethodMode &methodMode, |
- CObjectVector<COneMethodInfo> &methodsInfo |
- #ifdef COMPRESS_MT |
- , UInt32 numThreads |
- #endif |
- ) |
-{ |
- UInt32 level = _level; |
- |
- if (methodsInfo.IsEmpty()) |
- { |
- COneMethodInfo oneMethodInfo; |
- oneMethodInfo.MethodName = ((level == 0) ? kCopyMethod : kDefaultMethodName); |
- methodsInfo.Add(oneMethodInfo); |
- } |
- |
- bool needSolid = false; |
- for(int i = 0; i < methodsInfo.Size(); i++) |
- { |
- COneMethodInfo &oneMethodInfo = methodsInfo[i]; |
- SetCompressionMethod2(oneMethodInfo |
- #ifdef COMPRESS_MT |
- , numThreads |
- #endif |
- ); |
- |
- if (!IsCopyMethod(oneMethodInfo.MethodName)) |
- needSolid = true; |
- |
- CMethodFull methodFull; |
- |
- if (!FindMethod( |
- EXTERNAL_CODECS_VARS |
- oneMethodInfo.MethodName, methodFull.Id, methodFull.NumInStreams, methodFull.NumOutStreams)) |
- return E_INVALIDARG; |
- methodFull.Props = oneMethodInfo.Props; |
- methodMode.Methods.Add(methodFull); |
- |
- if (!_numSolidBytesDefined) |
- { |
- for (int j = 0; j < methodFull.Props.Size(); j++) |
- { |
- const CProp &prop = methodFull.Props[j]; |
- if ((prop.Id == NCoderPropID::kDictionarySize || |
- prop.Id == NCoderPropID::kUsedMemorySize) && prop.Value.vt == VT_UI4) |
- { |
- _numSolidBytes = ((UInt64)prop.Value.ulVal) << 7; |
- const UInt64 kMinSize = (1 << 24); |
- if (_numSolidBytes < kMinSize) |
- _numSolidBytes = kMinSize; |
- _numSolidBytesDefined = true; |
- break; |
- } |
- } |
- } |
- } |
- |
- if (!needSolid && !_numSolidBytesDefined) |
- { |
- _numSolidBytesDefined = true; |
- _numSolidBytes = 0; |
- } |
- return S_OK; |
-} |
- |
-static HRESULT GetTime(IArchiveUpdateCallback *updateCallback, int index, bool writeTime, PROPID propID, UInt64 &ft, bool &ftDefined) |
-{ |
- ft = 0; |
- ftDefined = false; |
- if (!writeTime) |
- return S_OK; |
- NCOM::CPropVariant prop; |
- RINOK(updateCallback->GetProperty(index, propID, &prop)); |
- if (prop.vt == VT_FILETIME) |
- { |
- ft = prop.filetime.dwLowDateTime | ((UInt64)prop.filetime.dwHighDateTime << 32); |
- ftDefined = true; |
- } |
- else if (prop.vt != VT_EMPTY) |
- return E_INVALIDARG; |
- return S_OK; |
-} |
- |
-STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems, |
- IArchiveUpdateCallback *updateCallback) |
-{ |
- COM_TRY_BEGIN |
- |
- const CArchiveDatabaseEx *db = 0; |
- #ifdef _7Z_VOL |
- if(_volumes.Size() > 1) |
- return E_FAIL; |
- const CVolume *volume = 0; |
- if (_volumes.Size() == 1) |
- { |
- volume = &_volumes.Front(); |
- db = &volume->Database; |
- } |
- #else |
- if (_inStream != 0) |
- db = &_db; |
- #endif |
- |
- CObjectVector<CUpdateItem> updateItems; |
- |
- for (UInt32 i = 0; i < numItems; i++) |
- { |
- Int32 newData; |
- Int32 newProperties; |
- UInt32 indexInArchive; |
- if (!updateCallback) |
- return E_FAIL; |
- RINOK(updateCallback->GetUpdateItemInfo(i, &newData, &newProperties, &indexInArchive)); |
- CUpdateItem ui; |
- ui.NewProperties = IntToBool(newProperties); |
- ui.NewData = IntToBool(newData); |
- ui.IndexInArchive = indexInArchive; |
- ui.IndexInClient = i; |
- ui.IsAnti = false; |
- ui.Size = 0; |
- |
- if (ui.IndexInArchive != -1) |
- { |
- const CFileItem &fi = db->Files[ui.IndexInArchive]; |
- ui.Name = fi.Name; |
- ui.IsDir = fi.IsDir; |
- ui.Size = fi.Size; |
- ui.IsAnti = db->IsItemAnti(ui.IndexInArchive); |
- |
- ui.CTimeDefined = db->CTime.GetItem(ui.IndexInArchive, ui.CTime); |
- ui.ATimeDefined = db->ATime.GetItem(ui.IndexInArchive, ui.ATime); |
- ui.MTimeDefined = db->MTime.GetItem(ui.IndexInArchive, ui.MTime); |
- } |
- |
- if (ui.NewProperties) |
- { |
- bool nameIsDefined; |
- bool folderStatusIsDefined; |
- { |
- NCOM::CPropVariant prop; |
- RINOK(updateCallback->GetProperty(i, kpidAttrib, &prop)); |
- if (prop.vt == VT_EMPTY) |
- ui.AttribDefined = false; |
- else if (prop.vt != VT_UI4) |
- return E_INVALIDARG; |
- else |
- { |
- ui.Attrib = prop.ulVal; |
- ui.AttribDefined = true; |
- } |
- } |
- |
- // we need MTime to sort files. |
- RINOK(GetTime(updateCallback, i, WriteCTime, kpidCTime, ui.CTime, ui.CTimeDefined)); |
- RINOK(GetTime(updateCallback, i, WriteATime, kpidATime, ui.ATime, ui.ATimeDefined)); |
- RINOK(GetTime(updateCallback, i, true, kpidMTime, ui.MTime, ui.MTimeDefined)); |
- |
- { |
- NCOM::CPropVariant prop; |
- RINOK(updateCallback->GetProperty(i, kpidPath, &prop)); |
- if (prop.vt == VT_EMPTY) |
- nameIsDefined = false; |
- else if (prop.vt != VT_BSTR) |
- return E_INVALIDARG; |
- else |
- { |
- ui.Name = NItemName::MakeLegalName(prop.bstrVal); |
- nameIsDefined = true; |
- } |
- } |
- { |
- NCOM::CPropVariant prop; |
- RINOK(updateCallback->GetProperty(i, kpidIsDir, &prop)); |
- if (prop.vt == VT_EMPTY) |
- folderStatusIsDefined = false; |
- else if (prop.vt != VT_BOOL) |
- return E_INVALIDARG; |
- else |
- { |
- ui.IsDir = (prop.boolVal != VARIANT_FALSE); |
- folderStatusIsDefined = true; |
- } |
- } |
- |
- { |
- NCOM::CPropVariant prop; |
- RINOK(updateCallback->GetProperty(i, kpidIsAnti, &prop)); |
- if (prop.vt == VT_EMPTY) |
- ui.IsAnti = false; |
- else if (prop.vt != VT_BOOL) |
- return E_INVALIDARG; |
- else |
- ui.IsAnti = (prop.boolVal != VARIANT_FALSE); |
- } |
- |
- if (ui.IsAnti) |
- { |
- ui.AttribDefined = false; |
- |
- ui.CTimeDefined = false; |
- ui.ATimeDefined = false; |
- ui.MTimeDefined = false; |
- |
- ui.Size = 0; |
- } |
- |
- if (!folderStatusIsDefined && ui.AttribDefined) |
- ui.SetDirStatusFromAttrib(); |
- } |
- |
- if (ui.NewData) |
- { |
- NCOM::CPropVariant prop; |
- RINOK(updateCallback->GetProperty(i, kpidSize, &prop)); |
- if (prop.vt != VT_UI8) |
- return E_INVALIDARG; |
- ui.Size = (UInt64)prop.uhVal.QuadPart; |
- if (ui.Size != 0 && ui.IsAnti) |
- return E_INVALIDARG; |
- } |
- updateItems.Add(ui); |
- } |
- |
- CCompressionMethodMode methodMode, headerMethod; |
- RINOK(SetCompressionMethod(methodMode, headerMethod)); |
- #ifdef COMPRESS_MT |
- methodMode.NumThreads = _numThreads; |
- headerMethod.NumThreads = 1; |
- #endif |
- |
- RINOK(SetPassword(methodMode, updateCallback)); |
- |
- bool compressMainHeader = _compressHeaders; // check it |
- |
- bool encryptHeaders = false; |
- |
- if (methodMode.PasswordIsDefined) |
- { |
- if (_encryptHeadersSpecified) |
- encryptHeaders = _encryptHeaders; |
- #ifndef _NO_CRYPTO |
- else |
- encryptHeaders = _passwordIsDefined; |
- #endif |
- compressMainHeader = true; |
- if(encryptHeaders) |
- RINOK(SetPassword(headerMethod, updateCallback)); |
- } |
- |
- if (numItems < 2) |
- compressMainHeader = false; |
- |
- CUpdateOptions options; |
- options.Method = &methodMode; |
- options.HeaderMethod = (_compressHeaders || encryptHeaders) ? &headerMethod : 0; |
- options.UseFilters = _level != 0 && _autoFilter; |
- options.MaxFilter = _level >= 8; |
- |
- options.HeaderOptions.CompressMainHeader = compressMainHeader; |
- options.HeaderOptions.WriteCTime = WriteCTime; |
- options.HeaderOptions.WriteATime = WriteATime; |
- options.HeaderOptions.WriteMTime = WriteMTime; |
- |
- options.NumSolidFiles = _numSolidFiles; |
- options.NumSolidBytes = _numSolidBytes; |
- options.SolidExtension = _solidExtension; |
- options.RemoveSfxBlock = _removeSfxBlock; |
- options.VolumeMode = _volumeMode; |
- |
- COutArchive archive; |
- CArchiveDatabase newDatabase; |
- HRESULT res = Update( |
- EXTERNAL_CODECS_VARS |
- #ifdef _7Z_VOL |
- volume ? volume->Stream: 0, |
- volume ? db : 0, |
- #else |
- _inStream, |
- db, |
- #endif |
- updateItems, |
- archive, newDatabase, outStream, updateCallback, options); |
- |
- RINOK(res); |
- |
- updateItems.ClearAndFree(); |
- |
- return archive.WriteDatabase(EXTERNAL_CODECS_VARS |
- newDatabase, options.HeaderMethod, options.HeaderOptions); |
- |
- COM_TRY_END |
-} |
- |
-static HRESULT GetBindInfoPart(UString &srcString, UInt32 &coder, UInt32 &stream) |
-{ |
- stream = 0; |
- int index = ParseStringToUInt32(srcString, coder); |
- if (index == 0) |
- return E_INVALIDARG; |
- srcString.Delete(0, index); |
- if (srcString[0] == 'S') |
- { |
- srcString.Delete(0); |
- int index = ParseStringToUInt32(srcString, stream); |
- if (index == 0) |
- return E_INVALIDARG; |
- srcString.Delete(0, index); |
- } |
- return S_OK; |
-} |
- |
-static HRESULT GetBindInfo(UString &srcString, CBind &bind) |
-{ |
- RINOK(GetBindInfoPart(srcString, bind.OutCoder, bind.OutStream)); |
- if (srcString[0] != ':') |
- return E_INVALIDARG; |
- srcString.Delete(0); |
- RINOK(GetBindInfoPart(srcString, bind.InCoder, bind.InStream)); |
- if (!srcString.IsEmpty()) |
- return E_INVALIDARG; |
- return S_OK; |
-} |
- |
-STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) |
-{ |
- COM_TRY_BEGIN |
- _binds.Clear(); |
- BeforeSetProperty(); |
- |
- for (int i = 0; i < numProperties; i++) |
- { |
- UString name = names[i]; |
- name.MakeUpper(); |
- if (name.IsEmpty()) |
- return E_INVALIDARG; |
- |
- const PROPVARIANT &value = values[i]; |
- |
- if (name[0] == 'B') |
- { |
- name.Delete(0); |
- CBind bind; |
- RINOK(GetBindInfo(name, bind)); |
- _binds.Add(bind); |
- continue; |
- } |
- |
- RINOK(SetProperty(name, value)); |
- } |
- |
- return S_OK; |
- COM_TRY_END |
-} |
- |
-}} |