Index: third_party/lzma/v4_65/files/CPP/7zip/UI/Common/OpenArchive.cpp |
diff --git a/third_party/lzma/v4_65/files/CPP/7zip/UI/Common/OpenArchive.cpp b/third_party/lzma/v4_65/files/CPP/7zip/UI/Common/OpenArchive.cpp |
deleted file mode 100644 |
index 364ddff5f2cb6923d2162b8967894e59ef3cccd9..0000000000000000000000000000000000000000 |
--- a/third_party/lzma/v4_65/files/CPP/7zip/UI/Common/OpenArchive.cpp |
+++ /dev/null |
@@ -1,550 +0,0 @@ |
-// OpenArchive.cpp |
- |
-#include "StdAfx.h" |
- |
-#include "OpenArchive.h" |
- |
-#include "Common/Wildcard.h" |
- |
-#include "Windows/FileName.h" |
-#include "Windows/FileDir.h" |
-#include "Windows/Defs.h" |
-#include "Windows/PropVariant.h" |
- |
-#include "../../Common/FileStreams.h" |
-#include "../../Common/StreamUtils.h" |
- |
-#include "Common/StringConvert.h" |
- |
-#include "DefaultName.h" |
- |
-using namespace NWindows; |
- |
-HRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, UString &result) |
-{ |
- NCOM::CPropVariant prop; |
- RINOK(archive->GetProperty(index, kpidPath, &prop)); |
- if(prop.vt == VT_BSTR) |
- result = prop.bstrVal; |
- else if (prop.vt == VT_EMPTY) |
- result.Empty(); |
- else |
- return E_FAIL; |
- return S_OK; |
-} |
- |
-HRESULT GetArchiveItemPath(IInArchive *archive, UInt32 index, const UString &defaultName, UString &result) |
-{ |
- RINOK(GetArchiveItemPath(archive, index, result)); |
- if (result.IsEmpty()) |
- { |
- result = defaultName; |
- NCOM::CPropVariant prop; |
- RINOK(archive->GetProperty(index, kpidExtension, &prop)); |
- if (prop.vt == VT_BSTR) |
- { |
- result += L'.'; |
- result += prop.bstrVal; |
- } |
- else if (prop.vt != VT_EMPTY) |
- return E_FAIL; |
- } |
- return S_OK; |
-} |
- |
-HRESULT GetArchiveItemFileTime(IInArchive *archive, UInt32 index, |
- const FILETIME &defaultFileTime, FILETIME &fileTime) |
-{ |
- NCOM::CPropVariant prop; |
- RINOK(archive->GetProperty(index, kpidMTime, &prop)); |
- if (prop.vt == VT_FILETIME) |
- fileTime = prop.filetime; |
- else if (prop.vt == VT_EMPTY) |
- fileTime = defaultFileTime; |
- else |
- return E_FAIL; |
- return S_OK; |
-} |
- |
-HRESULT IsArchiveItemProp(IInArchive *archive, UInt32 index, PROPID propID, bool &result) |
-{ |
- NCOM::CPropVariant prop; |
- RINOK(archive->GetProperty(index, propID, &prop)); |
- if(prop.vt == VT_BOOL) |
- result = VARIANT_BOOLToBool(prop.boolVal); |
- else if (prop.vt == VT_EMPTY) |
- result = false; |
- else |
- return E_FAIL; |
- return S_OK; |
-} |
- |
-HRESULT IsArchiveItemFolder(IInArchive *archive, UInt32 index, bool &result) |
-{ |
- return IsArchiveItemProp(archive, index, kpidIsDir, result); |
-} |
- |
-HRESULT IsArchiveItemAnti(IInArchive *archive, UInt32 index, bool &result) |
-{ |
- return IsArchiveItemProp(archive, index, kpidIsAnti, result); |
-} |
- |
-// Static-SFX (for Linux) can be big. |
-const UInt64 kMaxCheckStartPosition = 1 << 22; |
- |
-HRESULT ReOpenArchive(IInArchive *archive, const UString &fileName, IArchiveOpenCallback *openArchiveCallback) |
-{ |
- CInFileStream *inStreamSpec = new CInFileStream; |
- CMyComPtr<IInStream> inStream(inStreamSpec); |
- inStreamSpec->Open(fileName); |
- return archive->Open(inStream, &kMaxCheckStartPosition, openArchiveCallback); |
-} |
- |
-#ifndef _SFX |
-static inline bool TestSignature(const Byte *p1, const Byte *p2, size_t size) |
-{ |
- for (size_t i = 0; i < size; i++) |
- if (p1[i] != p2[i]) |
- return false; |
- return true; |
-} |
-#endif |
- |
-HRESULT OpenArchive( |
- CCodecs *codecs, |
- int arcTypeIndex, |
- IInStream *inStream, |
- const UString &fileName, |
- IInArchive **archiveResult, |
- int &formatIndex, |
- UString &defaultItemName, |
- IArchiveOpenCallback *openArchiveCallback) |
-{ |
- *archiveResult = NULL; |
- UString extension; |
- { |
- int dotPos = fileName.ReverseFind(L'.'); |
- if (dotPos >= 0) |
- extension = fileName.Mid(dotPos + 1); |
- } |
- CIntVector orderIndices; |
- if (arcTypeIndex >= 0) |
- orderIndices.Add(arcTypeIndex); |
- else |
- { |
- |
- int i; |
- int numFinded = 0; |
- for (i = 0; i < codecs->Formats.Size(); i++) |
- if (codecs->Formats[i].FindExtension(extension) >= 0) |
- orderIndices.Insert(numFinded++, i); |
- else |
- orderIndices.Add(i); |
- |
- #ifndef _SFX |
- if (numFinded != 1) |
- { |
- CIntVector orderIndices2; |
- CByteBuffer byteBuffer; |
- const size_t kBufferSize = (1 << 21); |
- byteBuffer.SetCapacity(kBufferSize); |
- RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL)); |
- size_t processedSize = kBufferSize; |
- RINOK(ReadStream(inStream, byteBuffer, &processedSize)); |
- if (processedSize == 0) |
- return S_FALSE; |
- |
- const Byte *buf = byteBuffer; |
- Byte hash[1 << 16]; |
- memset(hash, 0xFF, 1 << 16); |
- Byte prevs[256]; |
- if (orderIndices.Size() > 255) |
- return S_FALSE; |
- int i; |
- for (i = 0; i < orderIndices.Size(); i++) |
- { |
- const CArcInfoEx &ai = codecs->Formats[orderIndices[i]]; |
- const CByteBuffer &sig = ai.StartSignature; |
- if (sig.GetCapacity() < 2) |
- continue; |
- UInt32 v = sig[0] | ((UInt32)sig[1] << 8); |
- prevs[i] = hash[v]; |
- hash[v] = (Byte)i; |
- } |
- |
- processedSize--; |
- for (UInt32 pos = 0; pos < processedSize; pos++) |
- { |
- for (; pos < processedSize && hash[buf[pos] | ((UInt32)buf[pos + 1] << 8)] == 0xFF; pos++); |
- if (pos == processedSize) |
- break; |
- UInt32 v = buf[pos] | ((UInt32)buf[pos + 1] << 8); |
- Byte *ptr = &hash[v]; |
- int i = *ptr; |
- do |
- { |
- int index = orderIndices[i]; |
- const CArcInfoEx &ai = codecs->Formats[index]; |
- const CByteBuffer &sig = ai.StartSignature; |
- if (sig.GetCapacity() != 0 && pos + sig.GetCapacity() <= processedSize + 1) |
- if (TestSignature(buf + pos, sig, sig.GetCapacity())) |
- { |
- orderIndices2.Add(index); |
- orderIndices[i] = 0xFF; |
- *ptr = prevs[i]; |
- } |
- ptr = &prevs[i]; |
- i = *ptr; |
- } |
- while (i != 0xFF); |
- } |
- |
- for (i = 0; i < orderIndices.Size(); i++) |
- { |
- int val = orderIndices[i]; |
- if (val != 0xFF) |
- orderIndices2.Add(val); |
- } |
- orderIndices = orderIndices2; |
- |
- if (orderIndices.Size() >= 2) |
- { |
- int isoIndex = codecs->FindFormatForArchiveType(L"iso"); |
- int udfIndex = codecs->FindFormatForArchiveType(L"udf"); |
- int iIso = -1; |
- int iUdf = -1; |
- for (int i = 0; i < orderIndices.Size(); i++) |
- { |
- if (orderIndices[i] == isoIndex) iIso = i; |
- if (orderIndices[i] == udfIndex) iUdf = i; |
- } |
- if (iUdf == iIso + 1) |
- { |
- orderIndices[iUdf] = isoIndex; |
- orderIndices[iIso] = udfIndex; |
- } |
- } |
- } |
- else if (extension == L"000" || extension == L"001") |
- { |
- CByteBuffer byteBuffer; |
- const size_t kBufferSize = (1 << 10); |
- byteBuffer.SetCapacity(kBufferSize); |
- Byte *buffer = byteBuffer; |
- RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL)); |
- size_t processedSize = kBufferSize; |
- RINOK(ReadStream(inStream, buffer, &processedSize)); |
- if (processedSize >= 16) |
- { |
- Byte kRarHeader[] = {0x52 , 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}; |
- if (TestSignature(buffer, kRarHeader, 7) && buffer[9] == 0x73 && (buffer[10] & 1) != 0) |
- { |
- for (int i = 0; i < orderIndices.Size(); i++) |
- { |
- int index = orderIndices[i]; |
- const CArcInfoEx &ai = codecs->Formats[index]; |
- if (ai.Name.CompareNoCase(L"rar") != 0) |
- continue; |
- orderIndices.Delete(i--); |
- orderIndices.Insert(0, index); |
- break; |
- } |
- } |
- } |
- } |
- #endif |
- } |
- |
- for(int i = 0; i < orderIndices.Size(); i++) |
- { |
- inStream->Seek(0, STREAM_SEEK_SET, NULL); |
- |
- CMyComPtr<IInArchive> archive; |
- |
- formatIndex = orderIndices[i]; |
- RINOK(codecs->CreateInArchive(formatIndex, archive)); |
- if (!archive) |
- continue; |
- |
- #ifdef EXTERNAL_CODECS |
- { |
- CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo; |
- archive.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo); |
- if (setCompressCodecsInfo) |
- { |
- RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(codecs)); |
- } |
- } |
- #endif |
- |
- HRESULT result = archive->Open(inStream, &kMaxCheckStartPosition, openArchiveCallback); |
- if (result == S_FALSE) |
- continue; |
- RINOK(result); |
- *archiveResult = archive.Detach(); |
- const CArcInfoEx &format = codecs->Formats[formatIndex]; |
- if (format.Exts.Size() == 0) |
- { |
- defaultItemName = GetDefaultName2(fileName, L"", L""); |
- } |
- else |
- { |
- int subExtIndex = format.FindExtension(extension); |
- if (subExtIndex < 0) |
- subExtIndex = 0; |
- defaultItemName = GetDefaultName2(fileName, |
- format.Exts[subExtIndex].Ext, |
- format.Exts[subExtIndex].AddExt); |
- } |
- return S_OK; |
- } |
- return S_FALSE; |
-} |
- |
-HRESULT OpenArchive( |
- CCodecs *codecs, |
- int arcTypeIndex, |
- const UString &filePath, |
- IInArchive **archiveResult, |
- int &formatIndex, |
- UString &defaultItemName, |
- IArchiveOpenCallback *openArchiveCallback) |
-{ |
- CInFileStream *inStreamSpec = new CInFileStream; |
- CMyComPtr<IInStream> inStream(inStreamSpec); |
- if (!inStreamSpec->Open(filePath)) |
- return GetLastError(); |
- return OpenArchive(codecs, arcTypeIndex, inStream, ExtractFileNameFromPath(filePath), |
- archiveResult, formatIndex, |
- defaultItemName, openArchiveCallback); |
-} |
- |
-static void MakeDefaultName(UString &name) |
-{ |
- int dotPos = name.ReverseFind(L'.'); |
- if (dotPos < 0) |
- return; |
- UString ext = name.Mid(dotPos + 1); |
- if (ext.IsEmpty()) |
- return; |
- for (int pos = 0; pos < ext.Length(); pos++) |
- if (ext[pos] < L'0' || ext[pos] > L'9') |
- return; |
- name = name.Left(dotPos); |
-} |
- |
-HRESULT OpenArchive( |
- CCodecs *codecs, |
- const CIntVector &formatIndices, |
- const UString &fileName, |
- IInArchive **archive0, |
- IInArchive **archive1, |
- int &formatIndex0, |
- int &formatIndex1, |
- UString &defaultItemName0, |
- UString &defaultItemName1, |
- IArchiveOpenCallback *openArchiveCallback) |
-{ |
- if (formatIndices.Size() >= 3) |
- return E_NOTIMPL; |
- |
- int arcTypeIndex = -1; |
- if (formatIndices.Size() >= 1) |
- arcTypeIndex = formatIndices[formatIndices.Size() - 1]; |
- |
- HRESULT result = OpenArchive(codecs, arcTypeIndex, fileName, |
- archive0, formatIndex0, defaultItemName0, openArchiveCallback); |
- RINOK(result); |
- |
- if (formatIndices.Size() == 1) |
- return S_OK; |
- arcTypeIndex = -1; |
- if (formatIndices.Size() >= 2) |
- arcTypeIndex = formatIndices[formatIndices.Size() - 2]; |
- |
- HRESULT resSpec = (formatIndices.Size() == 0 ? S_OK : E_NOTIMPL); |
- |
- CMyComPtr<IInArchiveGetStream> getStream; |
- result = (*archive0)->QueryInterface(IID_IInArchiveGetStream, (void **)&getStream); |
- if (result != S_OK || !getStream) |
- return resSpec; |
- |
- CMyComPtr<ISequentialInStream> subSeqStream; |
- result = getStream->GetStream(0, &subSeqStream); |
- if (result != S_OK || !subSeqStream) |
- return resSpec; |
- |
- CMyComPtr<IInStream> subStream; |
- result = subSeqStream.QueryInterface(IID_IInStream, &subStream); |
- if (result != S_OK || !subStream) |
- return resSpec; |
- |
- UInt32 numItems; |
- RINOK((*archive0)->GetNumberOfItems(&numItems)); |
- if (numItems < 1) |
- return resSpec; |
- |
- UString subPath; |
- RINOK(GetArchiveItemPath(*archive0, 0, subPath)) |
- if (subPath.IsEmpty()) |
- { |
- MakeDefaultName(defaultItemName0); |
- subPath = defaultItemName0; |
- const CArcInfoEx &format = codecs->Formats[formatIndex0]; |
- if (format.Name.CompareNoCase(L"7z") == 0) |
- { |
- if (subPath.Right(3).CompareNoCase(L".7z") != 0) |
- subPath += L".7z"; |
- } |
- } |
- else |
- subPath = ExtractFileNameFromPath(subPath); |
- |
- CMyComPtr<IArchiveOpenSetSubArchiveName> setSubArchiveName; |
- openArchiveCallback->QueryInterface(IID_IArchiveOpenSetSubArchiveName, (void **)&setSubArchiveName); |
- if (setSubArchiveName) |
- setSubArchiveName->SetSubArchiveName(subPath); |
- |
- result = OpenArchive(codecs, arcTypeIndex, subStream, subPath, |
- archive1, formatIndex1, defaultItemName1, openArchiveCallback); |
- resSpec = (formatIndices.Size() == 0 ? S_OK : S_FALSE); |
- if (result != S_OK) |
- return resSpec; |
- return S_OK; |
-} |
- |
-static void SetCallback(const UString &archiveName, |
- IOpenCallbackUI *openCallbackUI, |
- IArchiveOpenCallback *reOpenCallback, |
- CMyComPtr<IArchiveOpenCallback> &openCallback) |
-{ |
- COpenCallbackImp *openCallbackSpec = new COpenCallbackImp; |
- openCallback = openCallbackSpec; |
- openCallbackSpec->Callback = openCallbackUI; |
- openCallbackSpec->ReOpenCallback = reOpenCallback; |
- |
- UString fullName; |
- int fileNamePartStartIndex; |
- NFile::NDirectory::MyGetFullPathName(archiveName, fullName, fileNamePartStartIndex); |
- openCallbackSpec->Init( |
- fullName.Left(fileNamePartStartIndex), |
- fullName.Mid(fileNamePartStartIndex)); |
-} |
- |
-HRESULT MyOpenArchive( |
- CCodecs *codecs, |
- int arcTypeIndex, |
- const UString &archiveName, |
- IInArchive **archive, UString &defaultItemName, IOpenCallbackUI *openCallbackUI) |
-{ |
- CMyComPtr<IArchiveOpenCallback> openCallback; |
- SetCallback(archiveName, openCallbackUI, NULL, openCallback); |
- int formatInfo; |
- return OpenArchive(codecs, arcTypeIndex, archiveName, archive, formatInfo, defaultItemName, openCallback); |
-} |
- |
-HRESULT MyOpenArchive( |
- CCodecs *codecs, |
- const CIntVector &formatIndices, |
- const UString &archiveName, |
- IInArchive **archive0, |
- IInArchive **archive1, |
- UString &defaultItemName0, |
- UString &defaultItemName1, |
- UStringVector &volumePaths, |
- UInt64 &volumesSize, |
- IOpenCallbackUI *openCallbackUI) |
-{ |
- volumesSize = 0; |
- COpenCallbackImp *openCallbackSpec = new COpenCallbackImp; |
- CMyComPtr<IArchiveOpenCallback> openCallback = openCallbackSpec; |
- openCallbackSpec->Callback = openCallbackUI; |
- |
- UString fullName; |
- int fileNamePartStartIndex; |
- NFile::NDirectory::MyGetFullPathName(archiveName, fullName, fileNamePartStartIndex); |
- UString prefix = fullName.Left(fileNamePartStartIndex); |
- UString name = fullName.Mid(fileNamePartStartIndex); |
- openCallbackSpec->Init(prefix, name); |
- |
- int formatIndex0, formatIndex1; |
- RINOK(OpenArchive(codecs, formatIndices, archiveName, |
- archive0, |
- archive1, |
- formatIndex0, |
- formatIndex1, |
- defaultItemName0, |
- defaultItemName1, |
- openCallback)); |
- volumePaths.Add(prefix + name); |
- for (int i = 0; i < openCallbackSpec->FileNames.Size(); i++) |
- volumePaths.Add(prefix + openCallbackSpec->FileNames[i]); |
- volumesSize = openCallbackSpec->TotalSize; |
- return S_OK; |
-} |
- |
-HRESULT CArchiveLink::Close() |
-{ |
- if (Archive1 != 0) |
- RINOK(Archive1->Close()); |
- if (Archive0 != 0) |
- RINOK(Archive0->Close()); |
- IsOpen = false; |
- return S_OK; |
-} |
- |
-void CArchiveLink::Release() |
-{ |
- IsOpen = false; |
- Archive1.Release(); |
- Archive0.Release(); |
-} |
- |
-HRESULT OpenArchive( |
- CCodecs *codecs, |
- const CIntVector &formatIndices, |
- const UString &archiveName, |
- CArchiveLink &archiveLink, |
- IArchiveOpenCallback *openCallback) |
-{ |
- HRESULT res = OpenArchive(codecs, formatIndices, archiveName, |
- &archiveLink.Archive0, &archiveLink.Archive1, |
- archiveLink.FormatIndex0, archiveLink.FormatIndex1, |
- archiveLink.DefaultItemName0, archiveLink.DefaultItemName1, |
- openCallback); |
- archiveLink.IsOpen = (res == S_OK); |
- return res; |
-} |
- |
-HRESULT MyOpenArchive(CCodecs *codecs, |
- const CIntVector &formatIndices, |
- const UString &archiveName, |
- CArchiveLink &archiveLink, |
- IOpenCallbackUI *openCallbackUI) |
-{ |
- HRESULT res = MyOpenArchive(codecs, formatIndices, archiveName, |
- &archiveLink.Archive0, &archiveLink.Archive1, |
- archiveLink.DefaultItemName0, archiveLink.DefaultItemName1, |
- archiveLink.VolumePaths, |
- archiveLink.VolumesSize, |
- openCallbackUI); |
- archiveLink.IsOpen = (res == S_OK); |
- return res; |
-} |
- |
-HRESULT ReOpenArchive(CCodecs *codecs, CArchiveLink &archiveLink, const UString &fileName, |
- IArchiveOpenCallback *openCallback) |
-{ |
- if (archiveLink.GetNumLevels() > 1) |
- return E_NOTIMPL; |
- |
- if (archiveLink.GetNumLevels() == 0) |
- return MyOpenArchive(codecs, CIntVector(), fileName, archiveLink, 0); |
- |
- CMyComPtr<IArchiveOpenCallback> openCallbackNew; |
- SetCallback(fileName, NULL, openCallback, openCallbackNew); |
- |
- HRESULT res = ReOpenArchive(archiveLink.GetArchive(), fileName, openCallbackNew); |
- archiveLink.IsOpen = (res == S_OK); |
- return res; |
-} |