Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Unified Diff: third_party/lzma/v4_65/files/CPP/7zip/UI/Common/OpenArchive.cpp

Issue 624713003: Keep only base/extractor.[cc|h]. (Closed) Base URL: https://chromium.googlesource.com/external/omaha.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
-}

Powered by Google App Engine
This is Rietveld 408576698