| Index: third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zEncode.cpp
|
| diff --git a/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zEncode.cpp b/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zEncode.cpp
|
| deleted file mode 100644
|
| index 01803842bc4ef66690c2e1a9cf3817663121978b..0000000000000000000000000000000000000000
|
| --- a/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zEncode.cpp
|
| +++ /dev/null
|
| @@ -1,453 +0,0 @@
|
| -// Encode.cpp
|
| -
|
| -#include "StdAfx.h"
|
| -
|
| -#include "7zEncode.h"
|
| -#include "7zSpecStream.h"
|
| -
|
| -#include "../../IPassword.h"
|
| -#include "../../Common/ProgressUtils.h"
|
| -#include "../../Common/LimitedStreams.h"
|
| -#include "../../Common/InOutTempBuffer.h"
|
| -#include "../../Common/StreamObjects.h"
|
| -#include "../../Common/CreateCoder.h"
|
| -#include "../../Common/FilterCoder.h"
|
| -
|
| -static const UInt64 k_AES = 0x06F10701;
|
| -static const UInt64 k_BCJ = 0x03030103;
|
| -static const UInt64 k_BCJ2 = 0x0303011B;
|
| -
|
| -namespace NArchive {
|
| -namespace N7z {
|
| -
|
| -static void ConvertBindInfoToFolderItemInfo(const NCoderMixer::CBindInfo &bindInfo,
|
| - const CRecordVector<CMethodId> decompressionMethods,
|
| - CFolder &folder)
|
| -{
|
| - folder.Coders.Clear();
|
| - // bindInfo.CoderMethodIDs.Clear();
|
| - // folder.OutStreams.Clear();
|
| - folder.PackStreams.Clear();
|
| - folder.BindPairs.Clear();
|
| - int i;
|
| - for (i = 0; i < bindInfo.BindPairs.Size(); i++)
|
| - {
|
| - CBindPair bindPair;
|
| - bindPair.InIndex = bindInfo.BindPairs[i].InIndex;
|
| - bindPair.OutIndex = bindInfo.BindPairs[i].OutIndex;
|
| - folder.BindPairs.Add(bindPair);
|
| - }
|
| - for (i = 0; i < bindInfo.Coders.Size(); i++)
|
| - {
|
| - CCoderInfo coderInfo;
|
| - const NCoderMixer::CCoderStreamsInfo &coderStreamsInfo = bindInfo.Coders[i];
|
| - coderInfo.NumInStreams = coderStreamsInfo.NumInStreams;
|
| - coderInfo.NumOutStreams = coderStreamsInfo.NumOutStreams;
|
| - coderInfo.MethodID = decompressionMethods[i];
|
| - folder.Coders.Add(coderInfo);
|
| - }
|
| - for (i = 0; i < bindInfo.InStreams.Size(); i++)
|
| - folder.PackStreams.Add(bindInfo.InStreams[i]);
|
| -}
|
| -
|
| -HRESULT CEncoder::CreateMixerCoder(
|
| - DECL_EXTERNAL_CODECS_LOC_VARS
|
| - const UInt64 *inSizeForReduce)
|
| -{
|
| - _mixerCoderSpec = new NCoderMixer::CCoderMixer2MT;
|
| - _mixerCoder = _mixerCoderSpec;
|
| - RINOK(_mixerCoderSpec->SetBindInfo(_bindInfo));
|
| - for (int i = 0; i < _options.Methods.Size(); i++)
|
| - {
|
| - const CMethodFull &methodFull = _options.Methods[i];
|
| - _codersInfo.Add(CCoderInfo());
|
| - CCoderInfo &encodingInfo = _codersInfo.Back();
|
| - encodingInfo.MethodID = methodFull.Id;
|
| - CMyComPtr<ICompressCoder> encoder;
|
| - CMyComPtr<ICompressCoder2> encoder2;
|
| -
|
| -
|
| - RINOK(CreateCoder(
|
| - EXTERNAL_CODECS_LOC_VARS
|
| - methodFull.Id, encoder, encoder2, true));
|
| -
|
| - if (!encoder && !encoder2)
|
| - return E_FAIL;
|
| -
|
| - CMyComPtr<IUnknown> encoderCommon = encoder ? (IUnknown *)encoder : (IUnknown *)encoder2;
|
| -
|
| - #ifdef COMPRESS_MT
|
| - {
|
| - CMyComPtr<ICompressSetCoderMt> setCoderMt;
|
| - encoderCommon.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt);
|
| - if (setCoderMt)
|
| - {
|
| - RINOK(setCoderMt->SetNumberOfThreads(_options.NumThreads));
|
| - }
|
| - }
|
| - #endif
|
| -
|
| -
|
| - RINOK(SetMethodProperties(methodFull, inSizeForReduce, encoderCommon));
|
| -
|
| - /*
|
| - CMyComPtr<ICryptoResetSalt> resetSalt;
|
| - encoderCommon.QueryInterface(IID_ICryptoResetSalt, (void **)&resetSalt);
|
| - if (resetSalt != NULL)
|
| - {
|
| - resetSalt->ResetSalt();
|
| - }
|
| - */
|
| -
|
| - #ifdef EXTERNAL_CODECS
|
| - CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo;
|
| - encoderCommon.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo);
|
| - if (setCompressCodecsInfo)
|
| - {
|
| - RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecsInfo));
|
| - }
|
| - #endif
|
| -
|
| - CMyComPtr<ICryptoSetPassword> cryptoSetPassword;
|
| - encoderCommon.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword);
|
| -
|
| - if (cryptoSetPassword)
|
| - {
|
| - CByteBuffer buffer;
|
| - const UInt32 sizeInBytes = _options.Password.Length() * 2;
|
| - buffer.SetCapacity(sizeInBytes);
|
| - for (int i = 0; i < _options.Password.Length(); i++)
|
| - {
|
| - wchar_t c = _options.Password[i];
|
| - ((Byte *)buffer)[i * 2] = (Byte)c;
|
| - ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8);
|
| - }
|
| - RINOK(cryptoSetPassword->CryptoSetPassword((const Byte *)buffer, sizeInBytes));
|
| - }
|
| -
|
| - if (encoder)
|
| - _mixerCoderSpec->AddCoder(encoder);
|
| - else
|
| - _mixerCoderSpec->AddCoder2(encoder2);
|
| - }
|
| - return S_OK;
|
| -}
|
| -
|
| -HRESULT CEncoder::Encode(
|
| - DECL_EXTERNAL_CODECS_LOC_VARS
|
| - ISequentialInStream *inStream,
|
| - const UInt64 *inStreamSize, const UInt64 *inSizeForReduce,
|
| - CFolder &folderItem,
|
| - ISequentialOutStream *outStream,
|
| - CRecordVector<UInt64> &packSizes,
|
| - ICompressProgressInfo *compressProgress)
|
| -{
|
| - RINOK(EncoderConstr());
|
| -
|
| - if (_mixerCoderSpec == NULL)
|
| - {
|
| - RINOK(CreateMixerCoder(EXTERNAL_CODECS_LOC_VARS inSizeForReduce));
|
| - }
|
| - _mixerCoderSpec->ReInit();
|
| - // _mixerCoderSpec->SetCoderInfo(0, NULL, NULL, progress);
|
| -
|
| - CObjectVector<CInOutTempBuffer> inOutTempBuffers;
|
| - CObjectVector<CSequentialOutTempBufferImp *> tempBufferSpecs;
|
| - CObjectVector<CMyComPtr<ISequentialOutStream> > tempBuffers;
|
| - int numMethods = _bindInfo.Coders.Size();
|
| - int i;
|
| - for (i = 1; i < _bindInfo.OutStreams.Size(); i++)
|
| - {
|
| - inOutTempBuffers.Add(CInOutTempBuffer());
|
| - inOutTempBuffers.Back().Create();
|
| - inOutTempBuffers.Back().InitWriting();
|
| - }
|
| - for (i = 1; i < _bindInfo.OutStreams.Size(); i++)
|
| - {
|
| - CSequentialOutTempBufferImp *tempBufferSpec =
|
| - new CSequentialOutTempBufferImp;
|
| - CMyComPtr<ISequentialOutStream> tempBuffer = tempBufferSpec;
|
| - tempBufferSpec->Init(&inOutTempBuffers[i - 1]);
|
| - tempBuffers.Add(tempBuffer);
|
| - tempBufferSpecs.Add(tempBufferSpec);
|
| - }
|
| -
|
| - for (i = 0; i < numMethods; i++)
|
| - _mixerCoderSpec->SetCoderInfo(i, NULL, NULL);
|
| -
|
| - if (_bindInfo.InStreams.IsEmpty())
|
| - return E_FAIL;
|
| - UInt32 mainCoderIndex, mainStreamIndex;
|
| - _bindInfo.FindInStream(_bindInfo.InStreams[0], mainCoderIndex, mainStreamIndex);
|
| -
|
| - if (inStreamSize != NULL)
|
| - {
|
| - CRecordVector<const UInt64 *> sizePointers;
|
| - for (UInt32 i = 0; i < _bindInfo.Coders[mainCoderIndex].NumInStreams; i++)
|
| - if (i == mainStreamIndex)
|
| - sizePointers.Add(inStreamSize);
|
| - else
|
| - sizePointers.Add(NULL);
|
| - _mixerCoderSpec->SetCoderInfo(mainCoderIndex, &sizePointers.Front(), NULL);
|
| - }
|
| -
|
| -
|
| - // UInt64 outStreamStartPos;
|
| - // RINOK(stream->Seek(0, STREAM_SEEK_CUR, &outStreamStartPos));
|
| -
|
| - CSequentialInStreamSizeCount2 *inStreamSizeCountSpec =
|
| - new CSequentialInStreamSizeCount2;
|
| - CMyComPtr<ISequentialInStream> inStreamSizeCount = inStreamSizeCountSpec;
|
| - CSequentialOutStreamSizeCount *outStreamSizeCountSpec =
|
| - new CSequentialOutStreamSizeCount;
|
| - CMyComPtr<ISequentialOutStream> outStreamSizeCount = outStreamSizeCountSpec;
|
| -
|
| - inStreamSizeCountSpec->Init(inStream);
|
| - outStreamSizeCountSpec->SetStream(outStream);
|
| - outStreamSizeCountSpec->Init();
|
| -
|
| - CRecordVector<ISequentialInStream *> inStreamPointers;
|
| - CRecordVector<ISequentialOutStream *> outStreamPointers;
|
| - inStreamPointers.Add(inStreamSizeCount);
|
| - outStreamPointers.Add(outStreamSizeCount);
|
| - for (i = 1; i < _bindInfo.OutStreams.Size(); i++)
|
| - outStreamPointers.Add(tempBuffers[i - 1]);
|
| -
|
| - for (i = 0; i < _codersInfo.Size(); i++)
|
| - {
|
| - CCoderInfo &encodingInfo = _codersInfo[i];
|
| -
|
| - CMyComPtr<ICryptoResetInitVector> resetInitVector;
|
| - _mixerCoderSpec->_coders[i].QueryInterface(IID_ICryptoResetInitVector, (void **)&resetInitVector);
|
| - if (resetInitVector != NULL)
|
| - {
|
| - resetInitVector->ResetInitVector();
|
| - }
|
| -
|
| - CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties;
|
| - _mixerCoderSpec->_coders[i].QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties);
|
| - if (writeCoderProperties != NULL)
|
| - {
|
| - CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp;
|
| - CMyComPtr<ISequentialOutStream> outStream(outStreamSpec);
|
| - outStreamSpec->Init();
|
| - writeCoderProperties->WriteCoderProperties(outStream);
|
| - size_t size = outStreamSpec->GetSize();
|
| - encodingInfo.Props.SetCapacity(size);
|
| - memmove(encodingInfo.Props, outStreamSpec->GetBuffer(), size);
|
| - }
|
| - }
|
| -
|
| - UInt32 progressIndex = mainCoderIndex;
|
| -
|
| - for (i = 0; i < _codersInfo.Size(); i++)
|
| - {
|
| - const CCoderInfo &e = _codersInfo[i];
|
| - if ((e.MethodID == k_BCJ || e.MethodID == k_BCJ2) && i + 1 < _codersInfo.Size())
|
| - progressIndex = i + 1;
|
| - }
|
| -
|
| - _mixerCoderSpec->SetProgressCoderIndex(progressIndex);
|
| -
|
| - RINOK(_mixerCoder->Code(&inStreamPointers.Front(), NULL, 1,
|
| - &outStreamPointers.Front(), NULL, outStreamPointers.Size(), compressProgress));
|
| -
|
| - ConvertBindInfoToFolderItemInfo(_decompressBindInfo, _decompressionMethods,
|
| - folderItem);
|
| -
|
| - packSizes.Add(outStreamSizeCountSpec->GetSize());
|
| -
|
| - for (i = 1; i < _bindInfo.OutStreams.Size(); i++)
|
| - {
|
| - CInOutTempBuffer &inOutTempBuffer = inOutTempBuffers[i - 1];
|
| - inOutTempBuffer.FlushWrite();
|
| - inOutTempBuffer.InitReading();
|
| - inOutTempBuffer.WriteToStream(outStream);
|
| - packSizes.Add(inOutTempBuffer.GetDataSize());
|
| - }
|
| -
|
| - for (i = 0; i < (int)_bindReverseConverter->NumSrcInStreams; i++)
|
| - {
|
| - int binder = _bindInfo.FindBinderForInStream(
|
| - _bindReverseConverter->DestOutToSrcInMap[i]);
|
| - UInt64 streamSize;
|
| - if (binder < 0)
|
| - streamSize = inStreamSizeCountSpec->GetSize();
|
| - else
|
| - streamSize = _mixerCoderSpec->GetWriteProcessedSize(binder);
|
| - folderItem.UnpackSizes.Add(streamSize);
|
| - }
|
| - for (i = numMethods - 1; i >= 0; i--)
|
| - folderItem.Coders[numMethods - 1 - i].Props = _codersInfo[i].Props;
|
| - return S_OK;
|
| -}
|
| -
|
| -
|
| -CEncoder::CEncoder(const CCompressionMethodMode &options):
|
| - _bindReverseConverter(0),
|
| - _constructed(false)
|
| -{
|
| - if (options.IsEmpty())
|
| - throw 1;
|
| -
|
| - _options = options;
|
| - _mixerCoderSpec = NULL;
|
| -}
|
| -
|
| -HRESULT CEncoder::EncoderConstr()
|
| -{
|
| - if (_constructed)
|
| - return S_OK;
|
| - if (_options.Methods.IsEmpty())
|
| - {
|
| - // it has only password method;
|
| - if (!_options.PasswordIsDefined)
|
| - throw 1;
|
| - if (!_options.Binds.IsEmpty())
|
| - throw 1;
|
| - NCoderMixer::CCoderStreamsInfo coderStreamsInfo;
|
| - CMethodFull method;
|
| -
|
| - method.NumInStreams = 1;
|
| - method.NumOutStreams = 1;
|
| - coderStreamsInfo.NumInStreams = 1;
|
| - coderStreamsInfo.NumOutStreams = 1;
|
| - method.Id = k_AES;
|
| -
|
| - _options.Methods.Add(method);
|
| - _bindInfo.Coders.Add(coderStreamsInfo);
|
| -
|
| - _bindInfo.InStreams.Add(0);
|
| - _bindInfo.OutStreams.Add(0);
|
| - }
|
| - else
|
| - {
|
| -
|
| - UInt32 numInStreams = 0, numOutStreams = 0;
|
| - int i;
|
| - for (i = 0; i < _options.Methods.Size(); i++)
|
| - {
|
| - const CMethodFull &methodFull = _options.Methods[i];
|
| - NCoderMixer::CCoderStreamsInfo coderStreamsInfo;
|
| - coderStreamsInfo.NumInStreams = methodFull.NumOutStreams;
|
| - coderStreamsInfo.NumOutStreams = methodFull.NumInStreams;
|
| - if (_options.Binds.IsEmpty())
|
| - {
|
| - if (i < _options.Methods.Size() - 1)
|
| - {
|
| - NCoderMixer::CBindPair bindPair;
|
| - bindPair.InIndex = numInStreams + coderStreamsInfo.NumInStreams;
|
| - bindPair.OutIndex = numOutStreams;
|
| - _bindInfo.BindPairs.Add(bindPair);
|
| - }
|
| - else
|
| - _bindInfo.OutStreams.Insert(0, numOutStreams);
|
| - for (UInt32 j = 1; j < coderStreamsInfo.NumOutStreams; j++)
|
| - _bindInfo.OutStreams.Add(numOutStreams + j);
|
| - }
|
| -
|
| - numInStreams += coderStreamsInfo.NumInStreams;
|
| - numOutStreams += coderStreamsInfo.NumOutStreams;
|
| -
|
| - _bindInfo.Coders.Add(coderStreamsInfo);
|
| - }
|
| -
|
| - if (!_options.Binds.IsEmpty())
|
| - {
|
| - for (i = 0; i < _options.Binds.Size(); i++)
|
| - {
|
| - NCoderMixer::CBindPair bindPair;
|
| - const CBind &bind = _options.Binds[i];
|
| - bindPair.InIndex = _bindInfo.GetCoderInStreamIndex(bind.InCoder) + bind.InStream;
|
| - bindPair.OutIndex = _bindInfo.GetCoderOutStreamIndex(bind.OutCoder) + bind.OutStream;
|
| - _bindInfo.BindPairs.Add(bindPair);
|
| - }
|
| - for (i = 0; i < (int)numOutStreams; i++)
|
| - if (_bindInfo.FindBinderForOutStream(i) == -1)
|
| - _bindInfo.OutStreams.Add(i);
|
| - }
|
| -
|
| - for (i = 0; i < (int)numInStreams; i++)
|
| - if (_bindInfo.FindBinderForInStream(i) == -1)
|
| - _bindInfo.InStreams.Add(i);
|
| -
|
| - if (_bindInfo.InStreams.IsEmpty())
|
| - throw 1; // this is error
|
| -
|
| - // Make main stream first in list
|
| - int inIndex = _bindInfo.InStreams[0];
|
| - for (;;)
|
| - {
|
| - UInt32 coderIndex, coderStreamIndex;
|
| - _bindInfo.FindInStream(inIndex, coderIndex, coderStreamIndex);
|
| - UInt32 outIndex = _bindInfo.GetCoderOutStreamIndex(coderIndex);
|
| - int binder = _bindInfo.FindBinderForOutStream(outIndex);
|
| - if (binder >= 0)
|
| - {
|
| - inIndex = _bindInfo.BindPairs[binder].InIndex;
|
| - continue;
|
| - }
|
| - for (i = 0; i < _bindInfo.OutStreams.Size(); i++)
|
| - if (_bindInfo.OutStreams[i] == outIndex)
|
| - {
|
| - _bindInfo.OutStreams.Delete(i);
|
| - _bindInfo.OutStreams.Insert(0, outIndex);
|
| - break;
|
| - }
|
| - break;
|
| - }
|
| -
|
| - if (_options.PasswordIsDefined)
|
| - {
|
| - int numCryptoStreams = _bindInfo.OutStreams.Size();
|
| -
|
| - for (i = 0; i < numCryptoStreams; i++)
|
| - {
|
| - NCoderMixer::CBindPair bindPair;
|
| - bindPair.InIndex = numInStreams + i;
|
| - bindPair.OutIndex = _bindInfo.OutStreams[i];
|
| - _bindInfo.BindPairs.Add(bindPair);
|
| - }
|
| - _bindInfo.OutStreams.Clear();
|
| -
|
| - /*
|
| - if (numCryptoStreams == 0)
|
| - numCryptoStreams = 1;
|
| - */
|
| -
|
| - for (i = 0; i < numCryptoStreams; i++)
|
| - {
|
| - NCoderMixer::CCoderStreamsInfo coderStreamsInfo;
|
| - CMethodFull method;
|
| - method.NumInStreams = 1;
|
| - method.NumOutStreams = 1;
|
| - coderStreamsInfo.NumInStreams = method.NumOutStreams;
|
| - coderStreamsInfo.NumOutStreams = method.NumInStreams;
|
| - method.Id = k_AES;
|
| -
|
| - _options.Methods.Add(method);
|
| - _bindInfo.Coders.Add(coderStreamsInfo);
|
| - _bindInfo.OutStreams.Add(numOutStreams + i);
|
| - }
|
| - }
|
| -
|
| - }
|
| -
|
| - for (int i = _options.Methods.Size() - 1; i >= 0; i--)
|
| - {
|
| - const CMethodFull &methodFull = _options.Methods[i];
|
| - _decompressionMethods.Add(methodFull.Id);
|
| - }
|
| -
|
| - _bindReverseConverter = new NCoderMixer::CBindReverseConverter(_bindInfo);
|
| - _bindReverseConverter->CreateReverseBindInfo(_decompressBindInfo);
|
| - _constructed = true;
|
| - return S_OK;
|
| -}
|
| -
|
| -CEncoder::~CEncoder()
|
| -{
|
| - delete _bindReverseConverter;
|
| -}
|
| -
|
| -}}
|
|
|