diff options
Diffstat (limited to 'src/libs/7zip/win/CPP/7zip/Archive/Cab')
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.cpp | 189 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.h | 44 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.cpp | 929 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.h | 28 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.cpp | 15 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.h | 44 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.cpp | 272 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.h | 161 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/CabItem.h | 63 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/CabRegister.cpp | 13 | ||||
-rw-r--r-- | src/libs/7zip/win/CPP/7zip/Archive/Cab/StdAfx.h | 8 |
11 files changed, 0 insertions, 1766 deletions
diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.cpp deleted file mode 100644 index 12c73eb5f..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.cpp +++ /dev/null @@ -1,189 +0,0 @@ -// CabBlockInStream.cpp - -#include "StdAfx.h" - -#include "../../../../C/Alloc.h" - -#include "Common/Defs.h" - -#include "../../Common/StreamUtils.h" - -#include "CabBlockInStream.h" - -namespace NArchive { -namespace NCab { - -static const UInt32 kBlockSize = (1 << 16); - -bool CCabBlockInStream::Create() -{ - if (!_buffer) - _buffer = (Byte *)::MyAlloc(kBlockSize); - return (_buffer != 0); -} - -CCabBlockInStream::~CCabBlockInStream() -{ - MyFree(_buffer); -} - -class CCheckSum2 -{ - UInt32 m_Value; - int m_Pos; - Byte m_Hist[4]; -public: - CCheckSum2(): m_Value(0){}; - void Init() { m_Value = 0; m_Pos = 0; } - void Update(const void *data, UInt32 size); - void FinishDataUpdate() - { - for (int i = 0; i < m_Pos; i++) - m_Value ^= ((UInt32)(m_Hist[i])) << (8 * (m_Pos - i - 1)); - } - void UpdateUInt32(UInt32 v) { m_Value ^= v; } - UInt32 GetResult() const { return m_Value; } -}; - -void CCheckSum2::Update(const void *data, UInt32 size) -{ - UInt32 checkSum = m_Value; - const Byte *dataPointer = (const Byte *)data; - - while (size != 0 && m_Pos != 0) - { - m_Hist[m_Pos] = *dataPointer++; - m_Pos = (m_Pos + 1) & 3; - size--; - if (m_Pos == 0) - for (int i = 0; i < 4; i++) - checkSum ^= ((UInt32)m_Hist[i]) << (8 * i); - } - - int numWords = size / 4; - - while (numWords-- != 0) - { - UInt32 temp = *dataPointer++; - temp |= ((UInt32)(*dataPointer++)) << 8; - temp |= ((UInt32)(*dataPointer++)) << 16; - temp |= ((UInt32)(*dataPointer++)) << 24; - checkSum ^= temp; - } - m_Value = checkSum; - - size &= 3; - - while (size != 0) - { - m_Hist[m_Pos] = *dataPointer++; - m_Pos = (m_Pos + 1) & 3; - size--; - } -} - -static const UInt32 kDataBlockHeaderSize = 8; - -class CTempCabInBuffer2 -{ -public: - Byte Buffer[kDataBlockHeaderSize]; - UInt32 Pos; - Byte ReadByte() - { - return Buffer[Pos++]; - } - UInt32 ReadUInt32() - { - UInt32 value = 0; - for (int i = 0; i < 4; i++) - value |= (((UInt32)ReadByte()) << (8 * i)); - return value; - } - UInt16 ReadUInt16() - { - UInt16 value = 0; - for (int i = 0; i < 2; i++) - value |= (((UInt16)ReadByte()) << (8 * i)); - return value; - } -}; - -HRESULT CCabBlockInStream::PreRead(UInt32 &packSize, UInt32 &unpackSize) -{ - CTempCabInBuffer2 inBuffer; - inBuffer.Pos = 0; - RINOK(ReadStream_FALSE(_stream, inBuffer.Buffer, kDataBlockHeaderSize)) - - UInt32 checkSum = inBuffer.ReadUInt32(); - packSize = inBuffer.ReadUInt16(); - unpackSize = inBuffer.ReadUInt16(); - if (ReservedSize != 0) - { - RINOK(ReadStream_FALSE(_stream, _buffer, ReservedSize)); - } - _pos = 0; - CCheckSum2 checkSumCalc; - checkSumCalc.Init(); - UInt32 packSize2 = packSize; - if (MsZip && _size == 0) - { - if (packSize < 2) - return S_FALSE; // bad block; - Byte sig[2]; - RINOK(ReadStream_FALSE(_stream, sig, 2)); - if (sig[0] != 0x43 || sig[1] != 0x4B) - return S_FALSE; - packSize2 -= 2; - checkSumCalc.Update(sig, 2); - } - - if (kBlockSize - _size < packSize2) - return S_FALSE; - - UInt32 curSize = packSize2; - if (curSize != 0) - { - size_t processedSizeLoc = curSize; - RINOK(ReadStream(_stream, _buffer + _size, &processedSizeLoc)); - checkSumCalc.Update(_buffer + _size, (UInt32)processedSizeLoc); - _size += (UInt32)processedSizeLoc; - if (processedSizeLoc != curSize) - return S_FALSE; - } - TotalPackSize = _size; - - checkSumCalc.FinishDataUpdate(); - - bool dataError; - if (checkSum == 0) - dataError = false; - else - { - checkSumCalc.UpdateUInt32(packSize | (((UInt32)unpackSize) << 16)); - dataError = (checkSumCalc.GetResult() != checkSum); - } - DataError |= dataError; - return dataError ? S_FALSE : S_OK; -} - -STDMETHODIMP CCabBlockInStream::Read(void *data, UInt32 size, UInt32 *processedSize) -{ - if (processedSize != 0) - *processedSize = 0; - if (size == 0) - return S_OK; - if (_size != 0) - { - size = MyMin(_size, size); - memmove(data, _buffer + _pos, size); - _pos += size; - _size -= size; - if (processedSize != 0) - *processedSize = size; - return S_OK; - } - return S_OK; // no blocks data -} - -}} diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.h deleted file mode 100644 index 1db3835b4..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabBlockInStream.h +++ /dev/null @@ -1,44 +0,0 @@ -// CabBlockInStream.cpp - -#ifndef __CABBLOCKINSTREAM_H -#define __CABBLOCKINSTREAM_H - -#include "Common/MyCom.h" -#include "../../IStream.h" - -namespace NArchive { -namespace NCab { - -class CCabBlockInStream: - public ISequentialInStream, - public CMyUnknownImp -{ - CMyComPtr<ISequentialInStream> _stream; - Byte *_buffer; - UInt32 _pos; - UInt32 _size; - -public: - UInt32 TotalPackSize; - UInt32 ReservedSize; - bool DataError; - bool MsZip; - - CCabBlockInStream(): _buffer(0), ReservedSize(0), MsZip(false), DataError(false), TotalPackSize(0) {} - ~CCabBlockInStream(); - bool Create(); - void SetStream(ISequentialInStream *stream) { _stream = stream; } - - void InitForNewFolder() { TotalPackSize = 0; } - void InitForNewBlock() { _size = 0; } - - MY_UNKNOWN_IMP - - STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); - - HRESULT PreRead(UInt32 &packSize, UInt32 &unpackSize); -}; - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.cpp deleted file mode 100644 index 20f670d35..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.cpp +++ /dev/null @@ -1,929 +0,0 @@ -// CabHandler.cpp - -#include "StdAfx.h" - -#include "../../../../C/Alloc.h" - -#include "Common/Buffer.h" -#include "Common/ComTry.h" -#include "Common/Defs.h" -#include "Common/IntToString.h" -#include "Common/StringConvert.h" -#include "Common/UTFConvert.h" - -#include "Windows/PropVariant.h" -#include "Windows/Time.h" - -#include "../../Common/ProgressUtils.h" -#include "../../Common/StreamUtils.h" - -#include "../../Compress/CopyCoder.h" -#include "../../Compress/DeflateDecoder.h" -#include "../../Compress/LzxDecoder.h" -#include "../../Compress/QuantumDecoder.h" - -#include "../Common/ItemNameUtils.h" - -#include "CabBlockInStream.h" -#include "CabHandler.h" - -using namespace NWindows; - -namespace NArchive { -namespace NCab { - -// #define _CAB_DETAILS - -#ifdef _CAB_DETAILS -enum -{ - kpidBlockReal = kpidUserDefined -}; -#endif - -static STATPROPSTG kProps[] = -{ - { NULL, kpidPath, VT_BSTR}, - { NULL, kpidSize, VT_UI8}, - { NULL, kpidMTime, VT_FILETIME}, - { NULL, kpidAttrib, VT_UI4}, - { NULL, kpidMethod, VT_BSTR}, - { NULL, kpidBlock, VT_I4} - #ifdef _CAB_DETAILS - , - { L"BlockReal", kpidBlockReal, VT_UI4}, - { NULL, kpidOffset, VT_UI4}, - { NULL, kpidVolume, VT_UI4} - #endif -}; - -static const char *kMethods[] = -{ - "None", - "MSZip", - "Quantum", - "LZX" -}; - -static const int kNumMethods = sizeof(kMethods) / sizeof(kMethods[0]); -static const char *kUnknownMethod = "Unknown"; - -static STATPROPSTG kArcProps[] = -{ - { NULL, kpidMethod, VT_BSTR}, - // { NULL, kpidSolid, VT_BOOL}, - { NULL, kpidNumBlocks, VT_UI4}, - { NULL, kpidNumVolumes, VT_UI4} -}; - -IMP_IInArchive_Props -IMP_IInArchive_ArcProps - -STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - switch(propID) - { - case kpidMethod: - { - AString resString; - CRecordVector<Byte> ids; - int i; - for (int v = 0; v < m_Database.Volumes.Size(); v++) - { - const CDatabaseEx &de = m_Database.Volumes[v]; - for (i = 0; i < de.Folders.Size(); i++) - ids.AddToUniqueSorted(de.Folders[i].GetCompressionMethod()); - } - for (i = 0; i < ids.Size(); i++) - { - Byte id = ids[i]; - AString method = (id < kNumMethods) ? kMethods[id] : kUnknownMethod; - if (!resString.IsEmpty()) - resString += ' '; - resString += method; - } - prop = resString; - break; - } - // case kpidSolid: prop = _database.IsSolid(); break; - case kpidNumBlocks: - { - UInt32 numFolders = 0; - for (int v = 0; v < m_Database.Volumes.Size(); v++) - numFolders += m_Database.Volumes[v].Folders.Size(); - prop = numFolders; - break; - } - case kpidNumVolumes: - { - prop = (UInt32)m_Database.Volumes.Size(); - break; - } - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) -{ - COM_TRY_BEGIN - NWindows::NCOM::CPropVariant prop; - - const CMvItem &mvItem = m_Database.Items[index]; - const CDatabaseEx &db = m_Database.Volumes[mvItem.VolumeIndex]; - int itemIndex = mvItem.ItemIndex; - const CItem &item = db.Items[itemIndex]; - switch(propID) - { - case kpidPath: - { - UString unicodeName; - if (item.IsNameUTF()) - ConvertUTF8ToUnicode(item.Name, unicodeName); - else - unicodeName = MultiByteToUnicodeString(item.Name, CP_ACP); - prop = (const wchar_t *)NItemName::WinNameToOSName(unicodeName); - break; - } - case kpidIsDir: prop = item.IsDir(); break; - case kpidSize: prop = item.Size; break; - case kpidAttrib: prop = item.GetWinAttributes(); break; - - case kpidMTime: - { - FILETIME localFileTime, utcFileTime; - if (NTime::DosTimeToFileTime(item.Time, localFileTime)) - { - if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime)) - utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0; - } - else - utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0; - prop = utcFileTime; - break; - } - - case kpidMethod: - { - UInt32 realFolderIndex = item.GetFolderIndex(db.Folders.Size()); - const CFolder &folder = db.Folders[realFolderIndex]; - int methodIndex = folder.GetCompressionMethod(); - AString method = (methodIndex < kNumMethods) ? kMethods[methodIndex] : kUnknownMethod; - if (methodIndex == NHeader::NCompressionMethodMajor::kLZX || - methodIndex == NHeader::NCompressionMethodMajor::kQuantum) - { - method += ':'; - char temp[32]; - ConvertUInt64ToString(folder.CompressionTypeMinor, temp); - method += temp; - } - prop = method; - break; - } - case kpidBlock: prop = (Int32)m_Database.GetFolderIndex(&mvItem); break; - - #ifdef _CAB_DETAILS - - case kpidBlockReal: prop = (UInt32)item.FolderIndex; break; - case kpidOffset: prop = (UInt32)item.Offset; break; - case kpidVolume: prop = (UInt32)mvItem.VolumeIndex; break; - - #endif - } - prop.Detach(value); - return S_OK; - COM_TRY_END -} - -/* -class CProgressImp: public CProgressVirt -{ - CMyComPtr<IArchiveOpenCallback> m_OpenArchiveCallback; -public: - STDMETHOD(SetTotal)(const UInt64 *numFiles); - STDMETHOD(SetCompleted)(const UInt64 *numFiles); - void Init(IArchiveOpenCallback *openArchiveCallback) - { m_OpenArchiveCallback = openArchiveCallback; } -}; - -STDMETHODIMP CProgressImp::SetTotal(const UInt64 *numFiles) -{ - if (m_OpenArchiveCallback) - return m_OpenArchiveCallback->SetCompleted(numFiles, NULL); - return S_OK; -} - -STDMETHODIMP CProgressImp::SetCompleted(const UInt64 *numFiles) -{ - if (m_OpenArchiveCallback) - return m_OpenArchiveCallback->SetCompleted(numFiles, NULL); - return S_OK; -} -*/ - -STDMETHODIMP CHandler::Open(IInStream *inStream, - const UInt64 *maxCheckStartPosition, - IArchiveOpenCallback *callback) -{ - COM_TRY_BEGIN - Close(); - HRESULT res = S_FALSE; - CInArchive archive; - CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback; - callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback); - - CMyComPtr<IInStream> nextStream = inStream; - bool prevChecked = false; - UInt64 numItems = 0; - try - { - while (nextStream != 0) - { - CDatabaseEx db; - db.Stream = nextStream; - res = archive.Open(maxCheckStartPosition, db); - if (res == S_OK) - { - if (!m_Database.Volumes.IsEmpty()) - { - const CDatabaseEx &dbPrev = m_Database.Volumes[prevChecked ? m_Database.Volumes.Size() - 1 : 0]; - if (dbPrev.ArchiveInfo.SetID != db.ArchiveInfo.SetID || - dbPrev.ArchiveInfo.CabinetNumber + (prevChecked ? 1: - 1) != - db.ArchiveInfo.CabinetNumber) - res = S_FALSE; - } - } - if (res == S_OK) - m_Database.Volumes.Insert(prevChecked ? m_Database.Volumes.Size() : 0, db); - else if (res != S_FALSE) - return res; - else - { - if (m_Database.Volumes.IsEmpty()) - return S_FALSE; - if (prevChecked) - break; - prevChecked = true; - } - - numItems += db.Items.Size(); - RINOK(callback->SetCompleted(&numItems, NULL)); - - nextStream = 0; - for (;;) - { - const COtherArchive *otherArchive = 0; - if (!prevChecked) - { - const CInArchiveInfo &ai = m_Database.Volumes.Front().ArchiveInfo; - if (ai.IsTherePrev()) - otherArchive = &ai.PrevArc; - else - prevChecked = true; - } - if (otherArchive == 0) - { - const CInArchiveInfo &ai = m_Database.Volumes.Back().ArchiveInfo; - if (ai.IsThereNext()) - otherArchive = &ai.NextArc; - } - if (!otherArchive) - break; - const UString fullName = MultiByteToUnicodeString(otherArchive->FileName, CP_ACP); - if (!openVolumeCallback) - break; - - HRESULT result = openVolumeCallback->GetStream(fullName, &nextStream); - if (result == S_OK) - break; - if (result != S_FALSE) - return result; - if (prevChecked) - break; - prevChecked = true; - } - } - if (res == S_OK) - { - m_Database.FillSortAndShrink(); - if (!m_Database.Check()) - res = S_FALSE; - } - } - catch(...) - { - res = S_FALSE; - } - if (res != S_OK) - { - Close(); - return res; - } - COM_TRY_END - return S_OK; -} - -STDMETHODIMP CHandler::Close() -{ - m_Database.Clear(); - return S_OK; -} - -class CFolderOutStream: - public ISequentialOutStream, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP - - STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); -private: - const CMvDatabaseEx *m_Database; - const CRecordVector<bool> *m_ExtractStatuses; - - Byte *TempBuf; - UInt32 TempBufSize; - int NumIdenticalFiles; - bool TempBufMode; - UInt32 m_BufStartFolderOffset; - - int m_StartIndex; - int m_CurrentIndex; - CMyComPtr<IArchiveExtractCallback> m_ExtractCallback; - bool m_TestMode; - - CMyComPtr<ISequentialOutStream> m_RealOutStream; - - bool m_IsOk; - bool m_FileIsOpen; - UInt32 m_RemainFileSize; - UInt64 m_FolderSize; - UInt64 m_PosInFolder; - - void FreeTempBuf() - { - ::MyFree(TempBuf); - TempBuf = NULL; - } - - HRESULT OpenFile(); - HRESULT CloseFileWithResOp(Int32 resOp); - HRESULT CloseFile(); - HRESULT Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK); -public: - HRESULT WriteEmptyFiles(); - - CFolderOutStream(): TempBuf(NULL) {} - ~CFolderOutStream() { FreeTempBuf(); } - void Init( - const CMvDatabaseEx *database, - const CRecordVector<bool> *extractStatuses, - int startIndex, - UInt64 folderSize, - IArchiveExtractCallback *extractCallback, - bool testMode); - HRESULT FlushCorrupted(); - HRESULT Unsupported(); - - UInt64 GetRemain() const { return m_FolderSize - m_PosInFolder; } - UInt64 GetPosInFolder() const { return m_PosInFolder; } -}; - -void CFolderOutStream::Init( - const CMvDatabaseEx *database, - const CRecordVector<bool> *extractStatuses, - int startIndex, - UInt64 folderSize, - IArchiveExtractCallback *extractCallback, - bool testMode) -{ - m_Database = database; - m_ExtractStatuses = extractStatuses; - m_StartIndex = startIndex; - m_FolderSize = folderSize; - - m_ExtractCallback = extractCallback; - m_TestMode = testMode; - - m_CurrentIndex = 0; - m_PosInFolder = 0; - m_FileIsOpen = false; - m_IsOk = true; - TempBufMode = false; - NumIdenticalFiles = 0; -} - -HRESULT CFolderOutStream::CloseFileWithResOp(Int32 resOp) -{ - m_RealOutStream.Release(); - m_FileIsOpen = false; - NumIdenticalFiles--; - return m_ExtractCallback->SetOperationResult(resOp); -} - -HRESULT CFolderOutStream::CloseFile() -{ - return CloseFileWithResOp(m_IsOk ? - NExtract::NOperationResult::kOK: - NExtract::NOperationResult::kDataError); -} - -HRESULT CFolderOutStream::OpenFile() -{ - if (NumIdenticalFiles == 0) - { - const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex]; - const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex]; - int numExtractItems = 0; - int curIndex; - for (curIndex = m_CurrentIndex; curIndex < m_ExtractStatuses->Size(); curIndex++) - { - const CMvItem &mvItem2 = m_Database->Items[m_StartIndex + curIndex]; - const CItem &item2 = m_Database->Volumes[mvItem2.VolumeIndex].Items[mvItem2.ItemIndex]; - if (item.Offset != item2.Offset || - item.Size != item2.Size || - item.Size == 0) - break; - if (!m_TestMode && (*m_ExtractStatuses)[curIndex]) - numExtractItems++; - } - NumIdenticalFiles = (curIndex - m_CurrentIndex); - if (NumIdenticalFiles == 0) - NumIdenticalFiles = 1; - TempBufMode = false; - if (numExtractItems > 1) - { - if (!TempBuf || item.Size > TempBufSize) - { - FreeTempBuf(); - TempBuf = (Byte *)MyAlloc(item.Size); - TempBufSize = item.Size; - if (TempBuf == NULL) - return E_OUTOFMEMORY; - } - TempBufMode = true; - m_BufStartFolderOffset = item.Offset; - } - else if (numExtractItems == 1) - { - while (NumIdenticalFiles && !(*m_ExtractStatuses)[m_CurrentIndex]) - { - CMyComPtr<ISequentialOutStream> stream; - RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &stream, NExtract::NAskMode::kSkip)); - if (stream) - return E_FAIL; - RINOK(m_ExtractCallback->PrepareOperation(NExtract::NAskMode::kSkip)); - m_CurrentIndex++; - m_FileIsOpen = true; - CloseFile(); - } - } - } - - Int32 askMode = (*m_ExtractStatuses)[m_CurrentIndex] ? (m_TestMode ? - NExtract::NAskMode::kTest : - NExtract::NAskMode::kExtract) : - NExtract::NAskMode::kSkip; - RINOK(m_ExtractCallback->GetStream(m_StartIndex + m_CurrentIndex, &m_RealOutStream, askMode)); - if (!m_RealOutStream && !m_TestMode) - askMode = NExtract::NAskMode::kSkip; - return m_ExtractCallback->PrepareOperation(askMode); -} - -HRESULT CFolderOutStream::WriteEmptyFiles() -{ - if (m_FileIsOpen) - return S_OK; - for (; m_CurrentIndex < m_ExtractStatuses->Size(); m_CurrentIndex++) - { - const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex]; - const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex]; - UInt64 fileSize = item.Size; - if (fileSize != 0) - return S_OK; - HRESULT result = OpenFile(); - m_RealOutStream.Release(); - RINOK(result); - RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); - } - return S_OK; -} - -// This is Write function -HRESULT CFolderOutStream::Write2(const void *data, UInt32 size, UInt32 *processedSize, bool isOK) -{ - COM_TRY_BEGIN - UInt32 realProcessed = 0; - if (processedSize != NULL) - *processedSize = 0; - while (size != 0) - { - if (m_FileIsOpen) - { - UInt32 numBytesToWrite = MyMin(m_RemainFileSize, size); - HRESULT res = S_OK; - if (numBytesToWrite > 0) - { - if (!isOK) - m_IsOk = false; - if (m_RealOutStream) - { - UInt32 processedSizeLocal = 0; - res = m_RealOutStream->Write((const Byte *)data, numBytesToWrite, &processedSizeLocal); - numBytesToWrite = processedSizeLocal; - } - if (TempBufMode && TempBuf) - memcpy(TempBuf + (m_PosInFolder - m_BufStartFolderOffset), data, numBytesToWrite); - } - realProcessed += numBytesToWrite; - if (processedSize != NULL) - *processedSize = realProcessed; - data = (const void *)((const Byte *)data + numBytesToWrite); - size -= numBytesToWrite; - m_RemainFileSize -= numBytesToWrite; - m_PosInFolder += numBytesToWrite; - if (res != S_OK) - return res; - if (m_RemainFileSize == 0) - { - RINOK(CloseFile()); - - while (NumIdenticalFiles) - { - HRESULT result = OpenFile(); - m_FileIsOpen = true; - m_CurrentIndex++; - if (result == S_OK && m_RealOutStream && TempBuf) - result = WriteStream(m_RealOutStream, TempBuf, (size_t)(m_PosInFolder - m_BufStartFolderOffset)); - - if (!TempBuf && TempBufMode && m_RealOutStream) - { - RINOK(CloseFileWithResOp(NExtract::NOperationResult::kUnSupportedMethod)); - } - else - { - RINOK(CloseFile()); - } - RINOK(result); - } - TempBufMode = false; - } - if (realProcessed > 0) - break; // with this break this function works as Write-Part - } - else - { - if (m_CurrentIndex >= m_ExtractStatuses->Size()) - return E_FAIL; - - const CMvItem &mvItem = m_Database->Items[m_StartIndex + m_CurrentIndex]; - const CItem &item = m_Database->Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex]; - - m_RemainFileSize = item.Size; - - UInt32 fileOffset = item.Offset; - if (fileOffset < m_PosInFolder) - return E_FAIL; - if (fileOffset > m_PosInFolder) - { - UInt32 numBytesToWrite = MyMin(fileOffset - (UInt32)m_PosInFolder, size); - realProcessed += numBytesToWrite; - if (processedSize != NULL) - *processedSize = realProcessed; - data = (const void *)((const Byte *)data + numBytesToWrite); - size -= numBytesToWrite; - m_PosInFolder += numBytesToWrite; - } - if (fileOffset == m_PosInFolder) - { - RINOK(OpenFile()); - m_FileIsOpen = true; - m_CurrentIndex++; - m_IsOk = true; - } - } - } - return WriteEmptyFiles(); - COM_TRY_END -} - -STDMETHODIMP CFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) -{ - return Write2(data, size, processedSize, true); -} - -HRESULT CFolderOutStream::FlushCorrupted() -{ - const UInt32 kBufferSize = (1 << 10); - Byte buffer[kBufferSize]; - for (int i = 0; i < kBufferSize; i++) - buffer[i] = 0; - for (;;) - { - UInt64 remain = GetRemain(); - if (remain == 0) - return S_OK; - UInt32 size = (UInt32)MyMin(remain, (UInt64)kBufferSize); - UInt32 processedSizeLocal = 0; - RINOK(Write2(buffer, size, &processedSizeLocal, false)); - } -} - -HRESULT CFolderOutStream::Unsupported() -{ - while(m_CurrentIndex < m_ExtractStatuses->Size()) - { - HRESULT result = OpenFile(); - if (result != S_FALSE && result != S_OK) - return result; - m_RealOutStream.Release(); - RINOK(m_ExtractCallback->SetOperationResult(NExtract::NOperationResult::kUnSupportedMethod)); - m_CurrentIndex++; - } - return S_OK; -} - - -STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, - Int32 testModeSpec, IArchiveExtractCallback *extractCallback) -{ - COM_TRY_BEGIN - bool allFilesMode = (numItems == (UInt32)-1); - if (allFilesMode) - numItems = m_Database.Items.Size(); - if(numItems == 0) - return S_OK; - bool testMode = (testModeSpec != 0); - UInt64 totalUnPacked = 0; - - UInt32 i; - int lastFolder = -2; - UInt64 lastFolderSize = 0; - for(i = 0; i < numItems; i++) - { - int index = allFilesMode ? i : indices[i]; - const CMvItem &mvItem = m_Database.Items[index]; - const CItem &item = m_Database.Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex]; - if (item.IsDir()) - continue; - int folderIndex = m_Database.GetFolderIndex(&mvItem); - if (folderIndex != lastFolder) - totalUnPacked += lastFolderSize; - lastFolder = folderIndex; - lastFolderSize = item.GetEndOffset(); - } - totalUnPacked += lastFolderSize; - - extractCallback->SetTotal(totalUnPacked); - - totalUnPacked = 0; - - UInt64 totalPacked = 0; - - CLocalProgress *lps = new CLocalProgress; - CMyComPtr<ICompressProgressInfo> progress = lps; - lps->Init(extractCallback, false); - - NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder; - CMyComPtr<ICompressCoder> copyCoder = copyCoderSpec; - - NCompress::NDeflate::NDecoder::CCOMCoder *deflateDecoderSpec = NULL; - CMyComPtr<ICompressCoder> deflateDecoder; - - NCompress::NLzx::CDecoder *lzxDecoderSpec = NULL; - CMyComPtr<ICompressCoder> lzxDecoder; - - NCompress::NQuantum::CDecoder *quantumDecoderSpec = NULL; - CMyComPtr<ICompressCoder> quantumDecoder; - - CCabBlockInStream *cabBlockInStreamSpec = new CCabBlockInStream(); - CMyComPtr<ISequentialInStream> cabBlockInStream = cabBlockInStreamSpec; - if (!cabBlockInStreamSpec->Create()) - return E_OUTOFMEMORY; - - CRecordVector<bool> extractStatuses; - for(i = 0; i < numItems;) - { - int index = allFilesMode ? i : indices[i]; - - const CMvItem &mvItem = m_Database.Items[index]; - const CDatabaseEx &db = m_Database.Volumes[mvItem.VolumeIndex]; - int itemIndex = mvItem.ItemIndex; - const CItem &item = db.Items[itemIndex]; - - i++; - if (item.IsDir()) - { - Int32 askMode = testMode ? - NExtract::NAskMode::kTest : - NExtract::NAskMode::kExtract; - CMyComPtr<ISequentialOutStream> realOutStream; - RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - RINOK(extractCallback->PrepareOperation(askMode)); - realOutStream.Release(); - RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK)); - continue; - } - int folderIndex = m_Database.GetFolderIndex(&mvItem); - if (folderIndex < 0) - { - // If we need previous archive - Int32 askMode= testMode ? - NExtract::NAskMode::kTest : - NExtract::NAskMode::kExtract; - CMyComPtr<ISequentialOutStream> realOutStream; - RINOK(extractCallback->GetStream(index, &realOutStream, askMode)); - RINOK(extractCallback->PrepareOperation(askMode)); - realOutStream.Release(); - RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kDataError)); - continue; - } - int startIndex2 = m_Database.FolderStartFileIndex[folderIndex]; - int startIndex = startIndex2; - extractStatuses.Clear(); - for (; startIndex < index; startIndex++) - extractStatuses.Add(false); - extractStatuses.Add(true); - startIndex++; - UInt64 curUnpack = item.GetEndOffset(); - for(;i < numItems; i++) - { - int indexNext = allFilesMode ? i : indices[i]; - const CMvItem &mvItem = m_Database.Items[indexNext]; - const CItem &item = m_Database.Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex]; - if (item.IsDir()) - continue; - int newFolderIndex = m_Database.GetFolderIndex(&mvItem); - - if (newFolderIndex != folderIndex) - break; - for (; startIndex < indexNext; startIndex++) - extractStatuses.Add(false); - extractStatuses.Add(true); - startIndex++; - curUnpack = item.GetEndOffset(); - } - - lps->OutSize = totalUnPacked; - lps->InSize = totalPacked; - RINOK(lps->SetCur()); - - CFolderOutStream *cabFolderOutStream = new CFolderOutStream; - CMyComPtr<ISequentialOutStream> outStream(cabFolderOutStream); - - const CFolder &folder = db.Folders[item.GetFolderIndex(db.Folders.Size())]; - - cabFolderOutStream->Init(&m_Database, &extractStatuses, startIndex2, - curUnpack, extractCallback, testMode); - - cabBlockInStreamSpec->MsZip = false; - switch(folder.GetCompressionMethod()) - { - case NHeader::NCompressionMethodMajor::kNone: - break; - case NHeader::NCompressionMethodMajor::kMSZip: - if(deflateDecoderSpec == NULL) - { - deflateDecoderSpec = new NCompress::NDeflate::NDecoder::CCOMCoder; - deflateDecoder = deflateDecoderSpec; - } - cabBlockInStreamSpec->MsZip = true; - break; - case NHeader::NCompressionMethodMajor::kLZX: - if(lzxDecoderSpec == NULL) - { - lzxDecoderSpec = new NCompress::NLzx::CDecoder; - lzxDecoder = lzxDecoderSpec; - } - RINOK(lzxDecoderSpec->SetParams(folder.CompressionTypeMinor)); - break; - case NHeader::NCompressionMethodMajor::kQuantum: - if(quantumDecoderSpec == NULL) - { - quantumDecoderSpec = new NCompress::NQuantum::CDecoder; - quantumDecoder = quantumDecoderSpec; - } - quantumDecoderSpec->SetParams(folder.CompressionTypeMinor); - break; - default: - { - RINOK(cabFolderOutStream->Unsupported()); - totalUnPacked += curUnpack; - continue; - } - } - - cabBlockInStreamSpec->InitForNewFolder(); - - HRESULT res = S_OK; - - { - int volIndex = mvItem.VolumeIndex; - int locFolderIndex = item.GetFolderIndex(db.Folders.Size()); - bool keepHistory = false; - bool keepInputBuffer = false; - for (UInt32 f = 0; cabFolderOutStream->GetRemain() != 0;) - { - if (volIndex >= m_Database.Volumes.Size()) - { - res = S_FALSE; - break; - } - - const CDatabaseEx &db = m_Database.Volumes[volIndex]; - const CFolder &folder = db.Folders[locFolderIndex]; - if (f == 0) - { - cabBlockInStreamSpec->SetStream(db.Stream); - cabBlockInStreamSpec->ReservedSize = db.ArchiveInfo.GetDataBlockReserveSize(); - RINOK(db.Stream->Seek(db.StartPosition + folder.DataStart, STREAM_SEEK_SET, NULL)); - } - if (f == folder.NumDataBlocks) - { - volIndex++; - locFolderIndex = 0; - f = 0; - continue; - } - f++; - - cabBlockInStreamSpec->DataError = false; - - if (!keepInputBuffer) - cabBlockInStreamSpec->InitForNewBlock(); - - UInt32 packSize, unpackSize; - res = cabBlockInStreamSpec->PreRead(packSize, unpackSize); - if (res == S_FALSE) - break; - RINOK(res); - keepInputBuffer = (unpackSize == 0); - if (keepInputBuffer) - continue; - - UInt64 totalUnPacked2 = totalUnPacked + cabFolderOutStream->GetPosInFolder(); - totalPacked += packSize; - - lps->OutSize = totalUnPacked2; - lps->InSize = totalPacked; - RINOK(lps->SetCur()); - - UInt64 unpackRemain = cabFolderOutStream->GetRemain(); - - const UInt32 kBlockSizeMax = (1 << 15); - if (unpackRemain > kBlockSizeMax) - unpackRemain = kBlockSizeMax; - if (unpackRemain > unpackSize) - unpackRemain = unpackSize; - - switch(folder.GetCompressionMethod()) - { - case NHeader::NCompressionMethodMajor::kNone: - res = copyCoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL); - break; - case NHeader::NCompressionMethodMajor::kMSZip: - deflateDecoderSpec->SetKeepHistory(keepHistory); - res = deflateDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL); - break; - case NHeader::NCompressionMethodMajor::kLZX: - lzxDecoderSpec->SetKeepHistory(keepHistory); - res = lzxDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL); - break; - case NHeader::NCompressionMethodMajor::kQuantum: - quantumDecoderSpec->SetKeepHistory(keepHistory); - res = quantumDecoder->Code(cabBlockInStream, outStream, NULL, &unpackRemain, NULL); - break; - } - if (res != S_OK) - { - if (res != S_FALSE) - RINOK(res); - break; - } - keepHistory = true; - } - if (res == S_OK) - { - RINOK(cabFolderOutStream->WriteEmptyFiles()); - } - } - if (res != S_OK || cabFolderOutStream->GetRemain() != 0) - { - RINOK(cabFolderOutStream->FlushCorrupted()); - } - totalUnPacked += curUnpack; - } - return S_OK; - COM_TRY_END -} - -STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) -{ - *numItems = m_Database.Items.Size(); - return S_OK; -} - -}} diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.h deleted file mode 100644 index 1edcd11e2..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHandler.h +++ /dev/null @@ -1,28 +0,0 @@ -// CabHandler.h - -#ifndef __CAB_HANDLER_H -#define __CAB_HANDLER_H - -#include "Common/MyCom.h" -#include "../IArchive.h" -#include "CabIn.h" - -namespace NArchive { -namespace NCab { - -class CHandler: - public IInArchive, - public CMyUnknownImp -{ -public: - MY_UNKNOWN_IMP1(IInArchive) - - INTERFACE_IInArchive(;) - -private: - CMvDatabaseEx m_Database; -}; - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.cpp deleted file mode 100644 index 0cba1b0b7..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// CabHeader.cpp - -#include "StdAfx.h" - -#include "CabHeader.h" - -namespace NArchive { -namespace NCab { -namespace NHeader { - -Byte kMarker[kMarkerSize] = {'M', 'S', 'C', 'F', 0, 0, 0, 0 }; - -// struct CSignatureInitializer { CSignatureInitializer() { kMarker[0]--; }; } g_SignatureInitializer; - -}}} diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.h deleted file mode 100644 index 0f0d2af35..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabHeader.h +++ /dev/null @@ -1,44 +0,0 @@ -// Archive/Cab/Header.h - -#ifndef __ARCHIVE_CAB_HEADER_H -#define __ARCHIVE_CAB_HEADER_H - -#include "Common/Types.h" - -namespace NArchive { -namespace NCab { -namespace NHeader { - -const unsigned kMarkerSize = 8; -extern Byte kMarker[kMarkerSize]; - -namespace NArchive -{ - namespace NFlags - { - const int kPrevCabinet = 0x0001; - const int kNextCabinet = 0x0002; - const int kReservePresent = 0x0004; - } -} - -namespace NCompressionMethodMajor -{ - const Byte kNone = 0; - const Byte kMSZip = 1; - const Byte kQuantum = 2; - const Byte kLZX = 3; -} - -const int kFileNameIsUTFAttributeMask = 0x80; - -namespace NFolderIndex -{ - const int kContinuedFromPrev = 0xFFFD; - const int kContinuedToNext = 0xFFFE; - const int kContinuedPrevAndNext = 0xFFFF; -} - -}}} - -#endif diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.cpp deleted file mode 100644 index c0bffa2d2..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.cpp +++ /dev/null @@ -1,272 +0,0 @@ -// Archive/CabIn.cpp - -#include "StdAfx.h" - -#include "../Common/FindSignature.h" - -#include "CabIn.h" - -namespace NArchive { -namespace NCab { - -Byte CInArchive::Read8() -{ - Byte b; - if (!inBuffer.ReadByte(b)) - throw CInArchiveException(CInArchiveException::kUnsupported); - return b; -} - -UInt16 CInArchive::Read16() -{ - UInt16 value = 0; - for (int i = 0; i < 2; i++) - { - Byte b = Read8(); - value |= (UInt16(b) << (8 * i)); - } - return value; -} - -UInt32 CInArchive::Read32() -{ - UInt32 value = 0; - for (int i = 0; i < 4; i++) - { - Byte b = Read8(); - value |= (UInt32(b) << (8 * i)); - } - return value; -} - -AString CInArchive::SafeReadName() -{ - AString name; - for (;;) - { - Byte b = Read8(); - if (b == 0) - return name; - name += (char)b; - } -} - -void CInArchive::ReadOtherArchive(COtherArchive &oa) -{ - oa.FileName = SafeReadName(); - oa.DiskName = SafeReadName(); -} - -void CInArchive::Skip(UInt32 size) -{ - while (size-- != 0) - Read8(); -} - -HRESULT CInArchive::Open(const UInt64 *searchHeaderSizeLimit, CDatabaseEx &db) -{ - IInStream *stream = db.Stream; - db.Clear(); - RINOK(stream->Seek(0, STREAM_SEEK_SET, &db.StartPosition)); - - RINOK(FindSignatureInStream(stream, NHeader::kMarker, NHeader::kMarkerSize, - searchHeaderSizeLimit, db.StartPosition)); - - RINOK(stream->Seek(db.StartPosition + NHeader::kMarkerSize, STREAM_SEEK_SET, NULL)); - if (!inBuffer.Create(1 << 17)) - return E_OUTOFMEMORY; - inBuffer.SetStream(stream); - inBuffer.Init(); - - CInArchiveInfo &ai = db.ArchiveInfo; - - ai.Size = Read32(); - if (Read32() != 0) - return S_FALSE; - ai.FileHeadersOffset = Read32(); - if (Read32() != 0) - return S_FALSE; - - ai.VersionMinor = Read8(); - ai.VersionMajor = Read8(); - ai.NumFolders = Read16(); - ai.NumFiles = Read16(); - ai.Flags = Read16(); - if (ai.Flags > 7) - return S_FALSE; - ai.SetID = Read16(); - ai.CabinetNumber = Read16(); - - if (ai.ReserveBlockPresent()) - { - ai.PerCabinetAreaSize = Read16(); - ai.PerFolderAreaSize = Read8(); - ai.PerDataBlockAreaSize = Read8(); - - Skip(ai.PerCabinetAreaSize); - } - - { - if (ai.IsTherePrev()) - ReadOtherArchive(ai.PrevArc); - if (ai.IsThereNext()) - ReadOtherArchive(ai.NextArc); - } - - int i; - for (i = 0; i < ai.NumFolders; i++) - { - CFolder folder; - - folder.DataStart = Read32(); - folder.NumDataBlocks = Read16(); - folder.CompressionTypeMajor = Read8(); - folder.CompressionTypeMinor = Read8(); - - Skip(ai.PerFolderAreaSize); - db.Folders.Add(folder); - } - - RINOK(stream->Seek(db.StartPosition + ai.FileHeadersOffset, STREAM_SEEK_SET, NULL)); - - inBuffer.SetStream(stream); - inBuffer.Init(); - for (i = 0; i < ai.NumFiles; i++) - { - CItem item; - item.Size = Read32(); - item.Offset = Read32(); - item.FolderIndex = Read16(); - UInt16 pureDate = Read16(); - UInt16 pureTime = Read16(); - item.Time = ((UInt32(pureDate) << 16)) | pureTime; - item.Attributes = Read16(); - item.Name = SafeReadName(); - int folderIndex = item.GetFolderIndex(db.Folders.Size()); - if (folderIndex >= db.Folders.Size()) - return S_FALSE; - db.Items.Add(item); - } - return S_OK; -} - -#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; } - -static int CompareMvItems(const CMvItem *p1, const CMvItem *p2, void *param) -{ - const CMvDatabaseEx &mvDb = *(const CMvDatabaseEx *)param; - const CDatabaseEx &db1 = mvDb.Volumes[p1->VolumeIndex]; - const CDatabaseEx &db2 = mvDb.Volumes[p2->VolumeIndex]; - const CItem &item1 = db1.Items[p1->ItemIndex]; - const CItem &item2 = db2.Items[p2->ItemIndex];; - bool isDir1 = item1.IsDir(); - bool isDir2 = item2.IsDir(); - if (isDir1 && !isDir2) - return -1; - if (isDir2 && !isDir1) - return 1; - int f1 = mvDb.GetFolderIndex(p1); - int f2 = mvDb.GetFolderIndex(p2); - RINOZ(MyCompare(f1, f2)); - RINOZ(MyCompare(item1.Offset, item2.Offset)); - RINOZ(MyCompare(item1.Size, item2.Size)); - RINOZ(MyCompare(p1->VolumeIndex, p2->VolumeIndex)); - return MyCompare(p1->ItemIndex, p2->ItemIndex); -} - -bool CMvDatabaseEx::AreItemsEqual(int i1, int i2) -{ - const CMvItem *p1 = &Items[i1]; - const CMvItem *p2 = &Items[i2]; - const CDatabaseEx &db1 = Volumes[p1->VolumeIndex]; - const CDatabaseEx &db2 = Volumes[p2->VolumeIndex]; - const CItem &item1 = db1.Items[p1->ItemIndex]; - const CItem &item2 = db2.Items[p2->ItemIndex];; - return GetFolderIndex(p1) == GetFolderIndex(p2) && - item1.Offset == item2.Offset && - item1.Size == item2.Size && - item1.Name == item2.Name; -} - -void CMvDatabaseEx::FillSortAndShrink() -{ - Items.Clear(); - StartFolderOfVol.Clear(); - FolderStartFileIndex.Clear(); - int offset = 0; - for (int v = 0; v < Volumes.Size(); v++) - { - const CDatabaseEx &db = Volumes[v]; - int curOffset = offset; - if (db.IsTherePrevFolder()) - curOffset--; - StartFolderOfVol.Add(curOffset); - offset += db.GetNumberOfNewFolders(); - - CMvItem mvItem; - mvItem.VolumeIndex = v; - for (int i = 0 ; i < db.Items.Size(); i++) - { - mvItem.ItemIndex = i; - Items.Add(mvItem); - } - } - - Items.Sort(CompareMvItems, (void *)this); - int j = 1; - int i; - for (i = 1; i < Items.Size(); i++) - if (!AreItemsEqual(i, i -1)) - Items[j++] = Items[i]; - Items.DeleteFrom(j); - - for (i = 0; i < Items.Size(); i++) - { - int folderIndex = GetFolderIndex(&Items[i]); - if (folderIndex >= FolderStartFileIndex.Size()) - FolderStartFileIndex.Add(i); - } -} - -bool CMvDatabaseEx::Check() -{ - for (int v = 1; v < Volumes.Size(); v++) - { - const CDatabaseEx &db1 = Volumes[v]; - if (db1.IsTherePrevFolder()) - { - const CDatabaseEx &db0 = Volumes[v - 1]; - if (db0.Folders.IsEmpty() || db1.Folders.IsEmpty()) - return false; - const CFolder &f0 = db0.Folders.Back(); - const CFolder &f1 = db1.Folders.Front(); - if (f0.CompressionTypeMajor != f1.CompressionTypeMajor || - f0.CompressionTypeMinor != f1.CompressionTypeMinor) - return false; - } - } - UInt32 beginPos = 0; - UInt64 endPos = 0; - int prevFolder = -2; - for (int i = 0; i < Items.Size(); i++) - { - const CMvItem &mvItem = Items[i]; - int fIndex = GetFolderIndex(&mvItem); - if (fIndex >= FolderStartFileIndex.Size()) - return false; - const CItem &item = Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex]; - if (item.IsDir()) - continue; - int folderIndex = GetFolderIndex(&mvItem); - if (folderIndex != prevFolder) - prevFolder = folderIndex; - else if (item.Offset < endPos && - (item.Offset != beginPos || item.GetEndOffset() != endPos)) - return false; - beginPos = item.Offset; - endPos = item.GetEndOffset(); - } - return true; -} - -}} diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.h deleted file mode 100644 index 1e9b188b5..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabIn.h +++ /dev/null @@ -1,161 +0,0 @@ -// Archive/CabIn.h - -#ifndef __ARCHIVE_CAB_IN_H -#define __ARCHIVE_CAB_IN_H - -#include "../../IStream.h" -#include "../../Common/InBuffer.h" -#include "CabHeader.h" -#include "CabItem.h" - -namespace NArchive { -namespace NCab { - -class CInArchiveException -{ -public: - enum CCauseType - { - kUnexpectedEndOfArchive = 0, - kIncorrectArchive, - kUnsupported - } Cause; - CInArchiveException(CCauseType cause) : Cause(cause) {} -}; - -struct COtherArchive -{ - AString FileName; - AString DiskName; -}; - -struct CArchiveInfo -{ - Byte VersionMinor; /* cabinet file format version, minor */ - Byte VersionMajor; /* cabinet file format version, major */ - UInt16 NumFolders; /* number of CFFOLDER entries in this cabinet */ - UInt16 NumFiles; /* number of CFFILE entries in this cabinet */ - UInt16 Flags; /* cabinet file option indicators */ - UInt16 SetID; /* must be the same for all cabinets in a set */ - UInt16 CabinetNumber; /* number of this cabinet file in a set */ - - bool ReserveBlockPresent() const { return (Flags & NHeader::NArchive::NFlags::kReservePresent) != 0; } - - bool IsTherePrev() const { return (Flags & NHeader::NArchive::NFlags::kPrevCabinet) != 0; } - bool IsThereNext() const { return (Flags & NHeader::NArchive::NFlags::kNextCabinet) != 0; } - - UInt16 PerCabinetAreaSize; // (optional) size of per-cabinet reserved area - Byte PerFolderAreaSize; // (optional) size of per-folder reserved area - Byte PerDataBlockAreaSize; // (optional) size of per-datablock reserved area - - Byte GetDataBlockReserveSize() const { return (Byte)(ReserveBlockPresent() ? PerDataBlockAreaSize : 0); } - - COtherArchive PrevArc; - COtherArchive NextArc; - - CArchiveInfo() - { - Clear(); - } - - void Clear() - { - PerCabinetAreaSize = 0; - PerFolderAreaSize = 0; - PerDataBlockAreaSize = 0; - } -}; - -struct CInArchiveInfo: public CArchiveInfo -{ - UInt32 Size; /* size of this cabinet file in bytes */ - UInt32 FileHeadersOffset; // offset of the first CFFILE entry -}; - - -struct CDatabase -{ - UInt64 StartPosition; - CInArchiveInfo ArchiveInfo; - CObjectVector<CFolder> Folders; - CObjectVector<CItem> Items; - - void Clear() - { - ArchiveInfo.Clear(); - Folders.Clear(); - Items.Clear(); - } - bool IsTherePrevFolder() const - { - for (int i = 0; i < Items.Size(); i++) - if (Items[i].ContinuedFromPrev()) - return true; - return false; - } - int GetNumberOfNewFolders() const - { - int res = Folders.Size(); - if (IsTherePrevFolder()) - res--; - return res; - } - UInt32 GetFileOffset(int index) const { return Items[index].Offset; } - UInt32 GetFileSize(int index) const { return Items[index].Size; } -}; - -struct CDatabaseEx: public CDatabase -{ - CMyComPtr<IInStream> Stream; -}; - -struct CMvItem -{ - int VolumeIndex; - int ItemIndex; -}; - -class CMvDatabaseEx -{ - bool AreItemsEqual(int i1, int i2); -public: - CObjectVector<CDatabaseEx> Volumes; - CRecordVector<CMvItem> Items; - CRecordVector<int> StartFolderOfVol; - CRecordVector<int> FolderStartFileIndex; - - int GetFolderIndex(const CMvItem *mvi) const - { - const CDatabaseEx &db = Volumes[mvi->VolumeIndex]; - return StartFolderOfVol[mvi->VolumeIndex] + - db.Items[mvi->ItemIndex].GetFolderIndex(db.Folders.Size()); - } - void Clear() - { - Volumes.Clear(); - Items.Clear(); - StartFolderOfVol.Clear(); - FolderStartFileIndex.Clear(); - } - void FillSortAndShrink(); - bool Check(); -}; - -class CInArchive -{ - CInBuffer inBuffer; - - Byte Read8(); - UInt16 Read16(); - UInt32 Read32(); - AString SafeReadName(); - void Skip(UInt32 size); - void ReadOtherArchive(COtherArchive &oa); - -public: - HRESULT Open(const UInt64 *searchHeaderSizeLimit, CDatabaseEx &db); -}; - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabItem.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabItem.h deleted file mode 100644 index 63a1e856c..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabItem.h +++ /dev/null @@ -1,63 +0,0 @@ -// Archive/CabItem.h - -#ifndef __ARCHIVE_CAB_ITEM_H -#define __ARCHIVE_CAB_ITEM_H - -#include "Common/Types.h" -#include "Common/MyString.h" -#include "CabHeader.h" - -namespace NArchive { -namespace NCab { - -struct CFolder -{ - UInt32 DataStart; // offset of the first CFDATA block in this folder - UInt16 NumDataBlocks; // number of CFDATA blocks in this folder - Byte CompressionTypeMajor; - Byte CompressionTypeMinor; - Byte GetCompressionMethod() const { return (Byte)(CompressionTypeMajor & 0xF); } -}; - -struct CItem -{ - AString Name; - UInt32 Offset; - UInt32 Size; - UInt32 Time; - UInt16 FolderIndex; - UInt16 Flags; - UInt16 Attributes; - - UInt64 GetEndOffset() const { return (UInt64)Offset + Size; } - UInt32 GetWinAttributes() const { return (Attributes & ~NHeader::kFileNameIsUTFAttributeMask); } - bool IsNameUTF() const { return (Attributes & NHeader::kFileNameIsUTFAttributeMask) != 0; } - bool IsDir() const { return (Attributes & FILE_ATTRIBUTE_DIRECTORY) != 0; } - - bool ContinuedFromPrev() const - { - return - (FolderIndex == NHeader::NFolderIndex::kContinuedFromPrev) || - (FolderIndex == NHeader::NFolderIndex::kContinuedPrevAndNext); - } - - bool ContinuedToNext() const - { - return - (FolderIndex == NHeader::NFolderIndex::kContinuedToNext) || - (FolderIndex == NHeader::NFolderIndex::kContinuedPrevAndNext); - } - - int GetFolderIndex(int numFolders) const - { - if (ContinuedFromPrev()) - return 0; - if (ContinuedToNext()) - return (numFolders - 1); - return FolderIndex; - } -}; - -}} - -#endif diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabRegister.cpp b/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabRegister.cpp deleted file mode 100644 index 15fe4099f..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/CabRegister.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// CabRegister.cpp - -#include "StdAfx.h" - -#include "../../Common/RegisterArc.h" - -#include "CabHandler.h" -static IInArchive *CreateArc() { return new NArchive::NCab::CHandler; } - -static CArcInfo g_ArcInfo = - { L"Cab", L"cab", 0, 8, { 0x4D, 0x53, 0x43, 0x46 }, 4, false, CreateArc, 0 }; - -REGISTER_ARC(Cab) diff --git a/src/libs/7zip/win/CPP/7zip/Archive/Cab/StdAfx.h b/src/libs/7zip/win/CPP/7zip/Archive/Cab/StdAfx.h deleted file mode 100644 index e7fb6986d..000000000 --- a/src/libs/7zip/win/CPP/7zip/Archive/Cab/StdAfx.h +++ /dev/null @@ -1,8 +0,0 @@ -// StdAfx.h - -#ifndef __STDAFX_H -#define __STDAFX_H - -#include "../../../Common/MyWindows.h" - -#endif |