From acd742622d1e0daf50ae815bec4ddb2143bafbf5 Mon Sep 17 00:00:00 2001 From: Igor Pavlov Date: Wed, 24 Oct 2007 00:00:00 +0000 Subject: 4.56 beta --- CPP/7zip/Archive/7z/7zExtract.cpp | 2 +- CPP/7zip/Archive/7z/7zFolderInStream.cpp | 9 +++++---- CPP/7zip/Archive/7z/7zFolderOutStream.cpp | 9 ++++++--- CPP/7zip/Archive/7z/7zFolderOutStream.h | 5 ++++- CPP/7zip/Archive/7z/7zHandler.cpp | 2 ++ CPP/7zip/Archive/7z/7zHandler.h | 4 +++- CPP/7zip/Archive/Archive2.def | 1 + CPP/7zip/Archive/Chm/ChmIn.cpp | 18 ++++++++++++++++-- CPP/7zip/Archive/Common/HandlerOut.cpp | 9 +++++++++ CPP/7zip/Archive/Common/HandlerOut.h | 2 ++ CPP/7zip/Archive/DllExports.cpp | 10 +++++++--- CPP/7zip/Archive/DllExports2.cpp | 10 +++++++--- 12 files changed, 63 insertions(+), 18 deletions(-) (limited to 'CPP/7zip/Archive') diff --git a/CPP/7zip/Archive/7z/7zExtract.cpp b/CPP/7zip/Archive/7z/7zExtract.cpp index 65f9c9eb..42977097 100755 --- a/CPP/7zip/Archive/7z/7zExtract.cpp +++ b/CPP/7zip/Archive/7z/7zExtract.cpp @@ -195,7 +195,7 @@ STDMETHODIMP CHandler::Extract(const UInt32* indices, UInt32 numItems, 0, #endif startIndex, - &efi.ExtractStatuses, extractCallback, testMode); + &efi.ExtractStatuses, extractCallback, testMode, _crcSize != 0); RINOK(result); diff --git a/CPP/7zip/Archive/7z/7zFolderInStream.cpp b/CPP/7zip/Archive/7z/7zFolderInStream.cpp index fb1cfd3a..f60a7177 100755 --- a/CPP/7zip/Archive/7z/7zFolderInStream.cpp +++ b/CPP/7zip/Archive/7z/7zFolderInStream.cpp @@ -113,13 +113,14 @@ STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSiz STDMETHODIMP CFolderInStream::GetSubStreamSize(UInt64 subStream, UInt64 *value) { *value = 0; - if (subStream < Sizes.Size()) + int subStreamIndex = (int)subStream; + if (subStreamIndex < 0 || subStream > Sizes.Size()) + return E_FAIL; + if (subStreamIndex < Sizes.Size()) { - *value= Sizes[(int)(size_t)subStream]; + *value= Sizes[subStreamIndex]; return S_OK; } - if (subStream > Sizes.Size()) - return E_FAIL; if (!_currentSizeIsDefined) return S_FALSE; *value = _currentSize; diff --git a/CPP/7zip/Archive/7z/7zFolderOutStream.cpp b/CPP/7zip/Archive/7z/7zFolderOutStream.cpp index 93bed3d9..6206ffec 100755 --- a/CPP/7zip/Archive/7z/7zFolderOutStream.cpp +++ b/CPP/7zip/Archive/7z/7zFolderOutStream.cpp @@ -19,7 +19,8 @@ HRESULT CFolderOutStream::Init( UInt32 startIndex, const CBoolVector *extractStatuses, IArchiveExtractCallback *extractCallback, - bool testMode) + bool testMode, + bool checkCrc) { _archiveDatabase = archiveDatabase; _ref2Offset = ref2Offset; @@ -29,6 +30,8 @@ HRESULT CFolderOutStream::Init( _extractCallback = extractCallback; _testMode = testMode; + _checkCrc = checkCrc; + _currentIndex = 0; _fileIsOpen = false; return WriteEmptyFiles(); @@ -49,7 +52,7 @@ HRESULT CFolderOutStream::OpenFile() RINOK(_extractCallback->GetStream(_ref2Offset + index, &realOutStream, askMode)); _outStreamWithHashSpec->SetStream(realOutStream); - _outStreamWithHashSpec->Init(); + _outStreamWithHashSpec->Init(_checkCrc); if (askMode == NArchive::NExtract::NAskMode::kExtract && (!realOutStream)) { @@ -100,7 +103,7 @@ STDMETHODIMP CFolderOutStream::Write(const void *data, if (_filePos == fileSize) { bool digestsAreEqual; - if (fileInfo.IsFileCRCDefined) + if (fileInfo.IsFileCRCDefined && _checkCrc) digestsAreEqual = fileInfo.FileCRC == _outStreamWithHashSpec->GetCRC(); else digestsAreEqual = true; diff --git a/CPP/7zip/Archive/7z/7zFolderOutStream.h b/CPP/7zip/Archive/7z/7zFolderOutStream.h index c132c79a..8ca91e64 100755 --- a/CPP/7zip/Archive/7z/7zFolderOutStream.h +++ b/CPP/7zip/Archive/7z/7zFolderOutStream.h @@ -36,6 +36,8 @@ private: bool _testMode; bool _fileIsOpen; + + bool _checkCrc; UInt64 _filePos; HRESULT OpenFile(); @@ -47,7 +49,8 @@ public: UInt32 startIndex, const CBoolVector *extractStatuses, IArchiveExtractCallback *extractCallback, - bool testMode); + bool testMode, + bool checkCrc); HRESULT FlushCorrupted(Int32 resultEOperationResult); HRESULT WasWritingFinished(); }; diff --git a/CPP/7zip/Archive/7z/7zHandler.cpp b/CPP/7zip/Archive/7z/7zHandler.cpp index d5dc8720..bbef1ea5 100755 --- a/CPP/7zip/Archive/7z/7zHandler.cpp +++ b/CPP/7zip/Archive/7z/7zHandler.cpp @@ -33,6 +33,8 @@ namespace N7z { CHandler::CHandler() { + _crcSize = 4; + #ifdef EXTRACT_ONLY #ifdef COMPRESS_MT _numThreads = NWindows::NSystem::GetNumberOfProcessors(); diff --git a/CPP/7zip/Archive/7z/7zHandler.h b/CPP/7zip/Archive/7z/7zHandler.h index 1006f204..ad4df41f 100755 --- a/CPP/7zip/Archive/7z/7zHandler.h +++ b/CPP/7zip/Archive/7z/7zHandler.h @@ -110,7 +110,9 @@ private: #ifdef COMPRESS_MT UInt32 _numThreads; #endif - + + UInt32 _crcSize; + #else CRecordVector _binds; diff --git a/CPP/7zip/Archive/Archive2.def b/CPP/7zip/Archive/Archive2.def index 78ec1dd7..885d39d1 100755 --- a/CPP/7zip/Archive/Archive2.def +++ b/CPP/7zip/Archive/Archive2.def @@ -6,3 +6,4 @@ EXPORTS CreateObject PRIVATE GetNumberOfMethods PRIVATE GetMethodProperty PRIVATE + SetLargePageMode PRIVATE diff --git a/CPP/7zip/Archive/Chm/ChmIn.cpp b/CPP/7zip/Archive/Chm/ChmIn.cpp index 8c56ec91..5e13f54b 100755 --- a/CPP/7zip/Archive/Chm/ChmIn.cpp +++ b/CPP/7zip/Archive/Chm/ChmIn.cpp @@ -759,9 +759,23 @@ HRESULT CInArchive::OpenHighLevel(IInStream *inStream, CFilesDatabase &database) li.ResetInterval = ReadUInt32(); li.WindowSize = ReadUInt32(); li.CacheSize = ReadUInt32(); - if (li.ResetInterval != 2 && li.ResetInterval != 4) + if ( + li.ResetInterval != 1 && + li.ResetInterval != 2 && + li.ResetInterval != 4 && + li.ResetInterval != 8 && + li.ResetInterval != 16 && + li.ResetInterval != 32 && + li.ResetInterval != 64) return S_FALSE; - if (li.WindowSize != 2 && li.WindowSize != 4) + if ( + li.WindowSize != 1 && + li.WindowSize != 2 && + li.WindowSize != 4 && + li.WindowSize != 8 && + li.WindowSize != 16 && + li.WindowSize != 32 && + li.WindowSize != 64) return S_FALSE; numDWORDS -= 5; while (numDWORDS-- != 0) diff --git a/CPP/7zip/Archive/Common/HandlerOut.cpp b/CPP/7zip/Archive/Common/HandlerOut.cpp index 7c214c3c..0dcf449e 100755 --- a/CPP/7zip/Archive/Common/HandlerOut.cpp +++ b/CPP/7zip/Archive/Common/HandlerOut.cpp @@ -468,6 +468,7 @@ void COutHandler::Init() _level = 5; _autoFilter = true; _volumeMode = false; + _crcSize = 4; InitSolid(); } @@ -481,6 +482,7 @@ void COutHandler::BeforeSetProperty() mainDicSize = 0xFFFFFFFF; mainDicMethodIndex = 0xFFFFFFFF; minNumber = 0; + _crcSize = 4; } HRESULT COutHandler::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value) @@ -507,6 +509,13 @@ HRESULT COutHandler::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &val return SetSolidSettings(name); } + if (name == L"CRC") + { + _crcSize = 4; + name.Delete(0, 3); + return ParsePropValue(name, value, _crcSize); + } + UInt32 number; int index = ParseStringToUInt32(name, number); UString realName = name.Mid(index); diff --git a/CPP/7zip/Archive/Common/HandlerOut.h b/CPP/7zip/Archive/Common/HandlerOut.h index eded0786..ab925cc3 100755 --- a/CPP/7zip/Archive/Common/HandlerOut.h +++ b/CPP/7zip/Archive/Common/HandlerOut.h @@ -26,6 +26,8 @@ public: UInt32 _numThreads; #endif + UInt32 _crcSize; + CObjectVector _methods; bool _removeSfxBlock; diff --git a/CPP/7zip/Archive/DllExports.cpp b/CPP/7zip/Archive/DllExports.cpp index 58daedb4..dae2698f 100755 --- a/CPP/7zip/Archive/DllExports.cpp +++ b/CPP/7zip/Archive/DllExports.cpp @@ -33,9 +33,6 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) #ifndef _UNICODE g_IsNT = IsItWindowsNT(); #endif - #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) - SetLargePageSize(); - #endif } return TRUE; } @@ -50,3 +47,10 @@ STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject) return CreateArchiver(clsid, iid, outObject); } +STDAPI SetLargePageMode() +{ + #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) + SetLargePageSize(); + #endif + return S_OK; +} diff --git a/CPP/7zip/Archive/DllExports2.cpp b/CPP/7zip/Archive/DllExports2.cpp index 216afdb1..d3b15f06 100755 --- a/CPP/7zip/Archive/DllExports2.cpp +++ b/CPP/7zip/Archive/DllExports2.cpp @@ -43,9 +43,6 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) g_IsNT = IsItWindowsNT(); #endif #endif - #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) - SetLargePageSize(); - #endif } return TRUE; } @@ -76,3 +73,10 @@ STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject) // COM_TRY_END } +STDAPI SetLargePageMode() +{ + #if defined(_WIN32) && defined(_7ZIP_LARGE_PAGES) + SetLargePageSize(); + #endif + return S_OK; +} -- cgit v1.2.3