| Index: third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zHandler.cpp
|
| diff --git a/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zHandler.cpp b/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zHandler.cpp
|
| deleted file mode 100644
|
| index 44131fae9cb2bdc60ca075c7efa4d46813bd014b..0000000000000000000000000000000000000000
|
| --- a/third_party/lzma/v4_65/files/CPP/7zip/Archive/7z/7zHandler.cpp
|
| +++ /dev/null
|
| @@ -1,503 +0,0 @@
|
| -// 7zHandler.cpp
|
| -
|
| -#include "StdAfx.h"
|
| -
|
| -extern "C"
|
| -{
|
| - #include "../../../../C/CpuArch.h"
|
| -}
|
| -
|
| -#include "../../../Common/ComTry.h"
|
| -#include "../../../Common/IntToString.h"
|
| -
|
| -#ifdef COMPRESS_MT
|
| -#include "../../../Windows/System.h"
|
| -#endif
|
| -
|
| -#include "../Common/ItemNameUtils.h"
|
| -
|
| -#include "7zHandler.h"
|
| -#include "7zProperties.h"
|
| -
|
| -#ifdef __7Z_SET_PROPERTIES
|
| -#ifdef EXTRACT_ONLY
|
| -#include "../Common/ParseProperties.h"
|
| -#endif
|
| -#endif
|
| -
|
| -using namespace NWindows;
|
| -
|
| -extern UString ConvertMethodIdToString(UInt64 id);
|
| -
|
| -namespace NArchive {
|
| -namespace N7z {
|
| -
|
| -CHandler::CHandler()
|
| -{
|
| - _crcSize = 4;
|
| -
|
| - #ifndef _NO_CRYPTO
|
| - _passwordIsDefined = false;
|
| - #endif
|
| -
|
| - #ifdef EXTRACT_ONLY
|
| - #ifdef COMPRESS_MT
|
| - _numThreads = NSystem::GetNumberOfProcessors();
|
| - #endif
|
| - #else
|
| - Init();
|
| - #endif
|
| -}
|
| -
|
| -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
|
| -{
|
| - *numItems = _db.Files.Size();
|
| - return S_OK;
|
| -}
|
| -
|
| -#ifdef _SFX
|
| -
|
| -IMP_IInArchive_ArcProps_NO
|
| -
|
| -STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 * /* numProperties */)
|
| -{
|
| - return E_NOTIMPL;
|
| -}
|
| -
|
| -STDMETHODIMP CHandler::GetPropertyInfo(UInt32 /* index */,
|
| - BSTR * /* name */, PROPID * /* propID */, VARTYPE * /* varType */)
|
| -{
|
| - return E_NOTIMPL;
|
| -}
|
| -
|
| -
|
| -#else
|
| -
|
| -STATPROPSTG kArcProps[] =
|
| -{
|
| - { NULL, kpidMethod, VT_BSTR},
|
| - { NULL, kpidSolid, VT_BOOL},
|
| - { NULL, kpidNumBlocks, VT_UI4},
|
| - { NULL, kpidPhySize, VT_UI8},
|
| - { NULL, kpidHeadersSize, VT_UI8},
|
| - { NULL, kpidOffset, VT_UI8}
|
| -};
|
| -
|
| -STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
|
| -{
|
| - COM_TRY_BEGIN
|
| - NCOM::CPropVariant prop;
|
| - switch(propID)
|
| - {
|
| - case kpidMethod:
|
| - {
|
| - UString resString;
|
| - CRecordVector<UInt64> ids;
|
| - int i;
|
| - for (i = 0; i < _db.Folders.Size(); i++)
|
| - {
|
| - const CFolder &f = _db.Folders[i];
|
| - for (int j = f.Coders.Size() - 1; j >= 0; j--)
|
| - ids.AddToUniqueSorted(f.Coders[j].MethodID);
|
| - }
|
| -
|
| - for (i = 0; i < ids.Size(); i++)
|
| - {
|
| - UInt64 id = ids[i];
|
| - UString methodName;
|
| - /* bool methodIsKnown = */ FindMethod(EXTERNAL_CODECS_VARS id, methodName);
|
| - if (methodName.IsEmpty())
|
| - methodName = ConvertMethodIdToString(id);
|
| - if (!resString.IsEmpty())
|
| - resString += L' ';
|
| - resString += methodName;
|
| - }
|
| - prop = resString;
|
| - break;
|
| - }
|
| - case kpidSolid: prop = _db.IsSolid(); break;
|
| - case kpidNumBlocks: prop = (UInt32)_db.Folders.Size(); break;
|
| - case kpidHeadersSize: prop = _db.HeadersSize; break;
|
| - case kpidPhySize: prop = _db.PhySize; break;
|
| - case kpidOffset: if (_db.ArchiveInfo.StartPosition != 0) prop = _db.ArchiveInfo.StartPosition; break;
|
| - }
|
| - prop.Detach(value);
|
| - return S_OK;
|
| - COM_TRY_END
|
| -}
|
| -
|
| -IMP_IInArchive_ArcProps
|
| -
|
| -#endif
|
| -
|
| -static void SetPropFromUInt64Def(CUInt64DefVector &v, int index, NCOM::CPropVariant &prop)
|
| -{
|
| - UInt64 value;
|
| - if (v.GetItem(index, value))
|
| - {
|
| - FILETIME ft;
|
| - ft.dwLowDateTime = (DWORD)value;
|
| - ft.dwHighDateTime = (DWORD)(value >> 32);
|
| - prop = ft;
|
| - }
|
| -}
|
| -
|
| -#ifndef _SFX
|
| -
|
| -static UString ConvertUInt32ToString(UInt32 value)
|
| -{
|
| - wchar_t buffer[32];
|
| - ConvertUInt64ToString(value, buffer);
|
| - return buffer;
|
| -}
|
| -
|
| -static UString GetStringForSizeValue(UInt32 value)
|
| -{
|
| - for (int i = 31; i >= 0; i--)
|
| - if ((UInt32(1) << i) == value)
|
| - return ConvertUInt32ToString(i);
|
| - UString result;
|
| - if (value % (1 << 20) == 0)
|
| - {
|
| - result += ConvertUInt32ToString(value >> 20);
|
| - result += L"m";
|
| - }
|
| - else if (value % (1 << 10) == 0)
|
| - {
|
| - result += ConvertUInt32ToString(value >> 10);
|
| - result += L"k";
|
| - }
|
| - else
|
| - {
|
| - result += ConvertUInt32ToString(value);
|
| - result += L"b";
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -static const UInt64 k_Copy = 0x0;
|
| -static const UInt64 k_LZMA = 0x030101;
|
| -static const UInt64 k_PPMD = 0x030401;
|
| -
|
| -static wchar_t GetHex(Byte value)
|
| -{
|
| - return (wchar_t)((value < 10) ? (L'0' + value) : (L'A' + (value - 10)));
|
| -}
|
| -static inline UString GetHex2(Byte value)
|
| -{
|
| - UString result;
|
| - result += GetHex((Byte)(value >> 4));
|
| - result += GetHex((Byte)(value & 0xF));
|
| - return result;
|
| -}
|
| -
|
| -#endif
|
| -
|
| -static const UInt64 k_AES = 0x06F10701;
|
| -
|
| -bool CHandler::IsEncrypted(UInt32 index2) const
|
| -{
|
| - CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
|
| - if (folderIndex != kNumNoIndex)
|
| - {
|
| - const CFolder &folderInfo = _db.Folders[folderIndex];
|
| - for (int i = folderInfo.Coders.Size() - 1; i >= 0; i--)
|
| - if (folderInfo.Coders[i].MethodID == k_AES)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
|
| -{
|
| - COM_TRY_BEGIN
|
| - NCOM::CPropVariant prop;
|
| -
|
| - /*
|
| - const CRef2 &ref2 = _refs[index];
|
| - if (ref2.Refs.IsEmpty())
|
| - return E_FAIL;
|
| - const CRef &ref = ref2.Refs.Front();
|
| - */
|
| -
|
| - const CFileItem &item = _db.Files[index];
|
| - UInt32 index2 = index;
|
| -
|
| - switch(propID)
|
| - {
|
| - case kpidPath:
|
| - if (!item.Name.IsEmpty())
|
| - prop = NItemName::GetOSName(item.Name);
|
| - break;
|
| - case kpidIsDir: prop = item.IsDir; break;
|
| - case kpidSize:
|
| - {
|
| - prop = item.Size;
|
| - // prop = ref2.Size;
|
| - break;
|
| - }
|
| - case kpidPackSize:
|
| - {
|
| - // prop = ref2.PackSize;
|
| - {
|
| - CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
|
| - if (folderIndex != kNumNoIndex)
|
| - {
|
| - if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2)
|
| - prop = _db.GetFolderFullPackSize(folderIndex);
|
| - /*
|
| - else
|
| - prop = (UInt64)0;
|
| - */
|
| - }
|
| - else
|
| - prop = (UInt64)0;
|
| - }
|
| - break;
|
| - }
|
| - case kpidPosition: { UInt64 v; if (_db.StartPos.GetItem(index2, v)) prop = v; break; }
|
| - case kpidCTime: SetPropFromUInt64Def(_db.CTime, index2, prop); break;
|
| - case kpidATime: SetPropFromUInt64Def(_db.ATime, index2, prop); break;
|
| - case kpidMTime: SetPropFromUInt64Def(_db.MTime, index2, prop); break;
|
| - case kpidAttrib: if (item.AttribDefined) prop = item.Attrib; break;
|
| - case kpidCRC: if (item.CrcDefined) prop = item.Crc; break;
|
| - case kpidEncrypted: prop = IsEncrypted(index2); break;
|
| - case kpidIsAnti: prop = _db.IsItemAnti(index2); break;
|
| - #ifndef _SFX
|
| - case kpidMethod:
|
| - {
|
| - CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
|
| - if (folderIndex != kNumNoIndex)
|
| - {
|
| - const CFolder &folderInfo = _db.Folders[folderIndex];
|
| - UString methodsString;
|
| - for (int i = folderInfo.Coders.Size() - 1; i >= 0; i--)
|
| - {
|
| - const CCoderInfo &coderInfo = folderInfo.Coders[i];
|
| - if (!methodsString.IsEmpty())
|
| - methodsString += L' ';
|
| -
|
| - {
|
| - UString methodName;
|
| - bool methodIsKnown = FindMethod(
|
| - EXTERNAL_CODECS_VARS
|
| - coderInfo.MethodID, methodName);
|
| -
|
| - if (methodIsKnown)
|
| - {
|
| - methodsString += methodName;
|
| - if (coderInfo.MethodID == k_LZMA)
|
| - {
|
| - if (coderInfo.Props.GetCapacity() >= 5)
|
| - {
|
| - methodsString += L":";
|
| - UInt32 dicSize = GetUi32((const Byte *)coderInfo.Props + 1);
|
| - methodsString += GetStringForSizeValue(dicSize);
|
| - }
|
| - }
|
| - else if (coderInfo.MethodID == k_PPMD)
|
| - {
|
| - if (coderInfo.Props.GetCapacity() >= 5)
|
| - {
|
| - Byte order = *(const Byte *)coderInfo.Props;
|
| - methodsString += L":o";
|
| - methodsString += ConvertUInt32ToString(order);
|
| - methodsString += L":mem";
|
| - UInt32 dicSize = GetUi32((const Byte *)coderInfo.Props + 1);
|
| - methodsString += GetStringForSizeValue(dicSize);
|
| - }
|
| - }
|
| - else if (coderInfo.MethodID == k_AES)
|
| - {
|
| - if (coderInfo.Props.GetCapacity() >= 1)
|
| - {
|
| - methodsString += L":";
|
| - const Byte *data = (const Byte *)coderInfo.Props;
|
| - Byte firstByte = *data++;
|
| - UInt32 numCyclesPower = firstByte & 0x3F;
|
| - methodsString += ConvertUInt32ToString(numCyclesPower);
|
| - /*
|
| - if ((firstByte & 0xC0) != 0)
|
| - {
|
| - methodsString += L":";
|
| - return S_OK;
|
| - UInt32 saltSize = (firstByte >> 7) & 1;
|
| - UInt32 ivSize = (firstByte >> 6) & 1;
|
| - if (coderInfo.Props.GetCapacity() >= 2)
|
| - {
|
| - Byte secondByte = *data++;
|
| - saltSize += (secondByte >> 4);
|
| - ivSize += (secondByte & 0x0F);
|
| - }
|
| - }
|
| - */
|
| - }
|
| - }
|
| - else
|
| - {
|
| - if (coderInfo.Props.GetCapacity() > 0)
|
| - {
|
| - methodsString += L":[";
|
| - for (size_t bi = 0; bi < coderInfo.Props.GetCapacity(); bi++)
|
| - {
|
| - if (bi > 5 && bi + 1 < coderInfo.Props.GetCapacity())
|
| - {
|
| - methodsString += L"..";
|
| - break;
|
| - }
|
| - else
|
| - methodsString += GetHex2(coderInfo.Props[bi]);
|
| - }
|
| - methodsString += L"]";
|
| - }
|
| - }
|
| - }
|
| - else
|
| - {
|
| - methodsString += ConvertMethodIdToString(coderInfo.MethodID);
|
| - }
|
| - }
|
| - }
|
| - prop = methodsString;
|
| - }
|
| - }
|
| - break;
|
| - case kpidBlock:
|
| - {
|
| - CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
|
| - if (folderIndex != kNumNoIndex)
|
| - prop = (UInt32)folderIndex;
|
| - }
|
| - break;
|
| - case kpidPackedSize0:
|
| - case kpidPackedSize1:
|
| - case kpidPackedSize2:
|
| - case kpidPackedSize3:
|
| - case kpidPackedSize4:
|
| - {
|
| - CNum folderIndex = _db.FileIndexToFolderIndexMap[index2];
|
| - if (folderIndex != kNumNoIndex)
|
| - {
|
| - const CFolder &folderInfo = _db.Folders[folderIndex];
|
| - if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2 &&
|
| - folderInfo.PackStreams.Size() > (int)(propID - kpidPackedSize0))
|
| - {
|
| - prop = _db.GetFolderPackStreamSize(folderIndex, propID - kpidPackedSize0);
|
| - }
|
| - else
|
| - prop = (UInt64)0;
|
| - }
|
| - else
|
| - prop = (UInt64)0;
|
| - }
|
| - break;
|
| - #endif
|
| - }
|
| - prop.Detach(value);
|
| - return S_OK;
|
| - COM_TRY_END
|
| -}
|
| -
|
| -STDMETHODIMP CHandler::Open(IInStream *stream,
|
| - const UInt64 *maxCheckStartPosition,
|
| - IArchiveOpenCallback *openArchiveCallback)
|
| -{
|
| - COM_TRY_BEGIN
|
| - Close();
|
| - #ifndef _SFX
|
| - _fileInfoPopIDs.Clear();
|
| - #endif
|
| - try
|
| - {
|
| - CMyComPtr<IArchiveOpenCallback> openArchiveCallbackTemp = openArchiveCallback;
|
| -
|
| - #ifndef _NO_CRYPTO
|
| - CMyComPtr<ICryptoGetTextPassword> getTextPassword;
|
| - if (openArchiveCallback)
|
| - {
|
| - openArchiveCallbackTemp.QueryInterface(
|
| - IID_ICryptoGetTextPassword, &getTextPassword);
|
| - }
|
| - #endif
|
| - CInArchive archive;
|
| - RINOK(archive.Open(stream, maxCheckStartPosition));
|
| - #ifndef _NO_CRYPTO
|
| - _passwordIsDefined = false;
|
| - UString password;
|
| - #endif
|
| - HRESULT result = archive.ReadDatabase(
|
| - EXTERNAL_CODECS_VARS
|
| - _db
|
| - #ifndef _NO_CRYPTO
|
| - , getTextPassword, _passwordIsDefined
|
| - #endif
|
| - );
|
| - RINOK(result);
|
| - _db.Fill();
|
| - _inStream = stream;
|
| - }
|
| - catch(...)
|
| - {
|
| - Close();
|
| - return S_FALSE;
|
| - }
|
| - // _inStream = stream;
|
| - #ifndef _SFX
|
| - FillPopIDs();
|
| - #endif
|
| - return S_OK;
|
| - COM_TRY_END
|
| -}
|
| -
|
| -STDMETHODIMP CHandler::Close()
|
| -{
|
| - COM_TRY_BEGIN
|
| - _inStream.Release();
|
| - _db.Clear();
|
| - return S_OK;
|
| - COM_TRY_END
|
| -}
|
| -
|
| -#ifdef __7Z_SET_PROPERTIES
|
| -#ifdef EXTRACT_ONLY
|
| -
|
| -STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties)
|
| -{
|
| - COM_TRY_BEGIN
|
| - #ifdef COMPRESS_MT
|
| - const UInt32 numProcessors = NSystem::GetNumberOfProcessors();
|
| - _numThreads = numProcessors;
|
| - #endif
|
| -
|
| - for (int i = 0; i < numProperties; i++)
|
| - {
|
| - UString name = names[i];
|
| - name.MakeUpper();
|
| - if (name.IsEmpty())
|
| - return E_INVALIDARG;
|
| - const PROPVARIANT &value = values[i];
|
| - UInt32 number;
|
| - int index = ParseStringToUInt32(name, number);
|
| - if (index == 0)
|
| - {
|
| - if(name.Left(2).CompareNoCase(L"MT") == 0)
|
| - {
|
| - #ifdef COMPRESS_MT
|
| - RINOK(ParseMtProp(name.Mid(2), value, numProcessors, _numThreads));
|
| - #endif
|
| - continue;
|
| - }
|
| - else
|
| - return E_INVALIDARG;
|
| - }
|
| - }
|
| - return S_OK;
|
| - COM_TRY_END
|
| -}
|
| -
|
| -#endif
|
| -#endif
|
| -
|
| -IMPL_ISetCompressCodecsInfo
|
| -
|
| -}}
|
|
|