diff options
Diffstat (limited to 'CPP/7zip')
181 files changed, 2286 insertions, 1700 deletions
diff --git a/CPP/7zip/Archive/7z/7z.dsp b/CPP/7zip/Archive/7z/7z.dsp index de892631..fc4c3698 100755 --- a/CPP/7zip/Archive/7z/7z.dsp +++ b/CPP/7zip/Archive/7z/7z.dsp @@ -290,43 +290,43 @@ SOURCE=..\..\..\Common\IntToString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.h +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\MyVector.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.cpp +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.h +SOURCE=..\..\..\Common\NewHandler.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringToInt.cpp +SOURCE=..\..\..\Common\StringConvert.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringToInt.h +SOURCE=..\..\..\Common\StringConvert.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp +SOURCE=..\..\..\Common\StringToInt.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.h +SOURCE=..\..\..\Common\StringToInt.h # End Source File # End Group # Begin Group "Archive Common" @@ -358,6 +358,14 @@ SOURCE=..\Common\CrossThreadProgress.h # End Source File # Begin Source File +SOURCE=..\Common\HandlerOut.cpp +# End Source File +# Begin Source File + +SOURCE=..\Common\HandlerOut.h +# End Source File +# Begin Source File + SOURCE=..\Common\InStreamWithCRC.cpp # End Source File # Begin Source File @@ -450,6 +458,14 @@ SOURCE=..\..\Common\MethodId.h # End Source File # Begin Source File +SOURCE=..\..\Common\MethodProps.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MethodProps.h +# End Source File +# Begin Source File + SOURCE=..\..\Common\OutBuffer.cpp # End Source File # Begin Source File @@ -496,6 +512,14 @@ SOURCE=..\..\Common\StreamUtils.cpp SOURCE=..\..\Common\StreamUtils.h # End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.h +# End Source File # End Group # Begin Group "Windows" @@ -558,6 +582,14 @@ SOURCE=..\..\..\Windows\Synchronization.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\System.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\Thread.h # End Source File # End Group @@ -594,6 +626,15 @@ SOURCE=..\..\..\..\C\Alloc.c SOURCE=..\..\..\..\C\Alloc.h # End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Threads.c +# SUBTRACT CPP /YX /Yc /Yu +# End Source File +# Begin Source File + +SOURCE=..\..\..\..\C\Threads.h +# End Source File # End Group # Begin Source File diff --git a/CPP/7zip/Archive/7z/7zCompressionMode.h b/CPP/7zip/Archive/7z/7zCompressionMode.h index 65e573d1..5753606f 100755 --- a/CPP/7zip/Archive/7z/7zCompressionMode.h +++ b/CPP/7zip/Archive/7z/7zCompressionMode.h @@ -3,28 +3,20 @@ #ifndef __7Z_COMPRESSION_MODE_H #define __7Z_COMPRESSION_MODE_H -#include "../../../Common/String.h" +#include "../../../Common/MyString.h" #include "../../../Windows/PropVariant.h" -#include "../../Common/MethodId.h" +#include "../../Common/MethodProps.h" namespace NArchive { namespace N7z { -struct CProperty +struct CMethodFull: public CMethod { - PROPID PropID; - NWindows::NCOM::CPropVariant Value; -}; - -struct CMethodFull -{ - CMethodId MethodID; UInt32 NumInStreams; UInt32 NumOutStreams; bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); } - CObjectVector<CProperty> CoderProperties; }; struct CBind diff --git a/CPP/7zip/Archive/7z/7zDecode.cpp b/CPP/7zip/Archive/7z/7zDecode.cpp index 19b08b78..0f81de40 100755 --- a/CPP/7zip/Archive/7z/7zDecode.cpp +++ b/CPP/7zip/Archive/7z/7zDecode.cpp @@ -22,7 +22,7 @@ static void ConvertFolderItemInfoToBindInfo(const CFolder &folder, int i; for (i = 0; i < folder.BindPairs.Size(); i++) { - NCoderMixer2::CBindPair bindPair; + NCoderMixer::CBindPair bindPair; bindPair.InIndex = (UInt32)folder.BindPairs[i].InIndex; bindPair.OutIndex = (UInt32)folder.BindPairs[i].OutIndex; bindInfo.BindPairs.Add(bindPair); @@ -30,7 +30,7 @@ static void ConvertFolderItemInfoToBindInfo(const CFolder &folder, UInt32 outStreamIndex = 0; for (i = 0; i < folder.Coders.Size(); i++) { - NCoderMixer2::CCoderStreamsInfo coderStreamsInfo; + NCoderMixer::CCoderStreamsInfo coderStreamsInfo; const CCoderInfo &coderInfo = folder.Coders[i]; coderStreamsInfo.NumInStreams = (UInt32)coderInfo.NumInStreams; coderStreamsInfo.NumOutStreams = (UInt32)coderInfo.NumOutStreams; @@ -44,14 +44,14 @@ static void ConvertFolderItemInfoToBindInfo(const CFolder &folder, bindInfo.InStreams.Add((UInt32)folder.PackStreams[i]); } -static bool AreCodersEqual(const NCoderMixer2::CCoderStreamsInfo &a1, - const NCoderMixer2::CCoderStreamsInfo &a2) +static bool AreCodersEqual(const NCoderMixer::CCoderStreamsInfo &a1, + const NCoderMixer::CCoderStreamsInfo &a2) { return (a1.NumInStreams == a2.NumInStreams) && (a1.NumOutStreams == a2.NumOutStreams); } -static bool AreBindPairsEqual(const NCoderMixer2::CBindPair &a1, const NCoderMixer2::CBindPair &a2) +static bool AreBindPairsEqual(const NCoderMixer::CBindPair &a1, const NCoderMixer::CBindPair &a2) { return (a1.InIndex == a2.InIndex) && (a1.OutIndex == a2.OutIndex); @@ -145,14 +145,14 @@ HRESULT CDecoder::Decode( if (_multiThread) { - _mixerCoderMTSpec = new NCoderMixer2::CCoderMixer2MT; + _mixerCoderMTSpec = new NCoderMixer::CCoderMixer2MT; _mixerCoder = _mixerCoderMTSpec; _mixerCoderCommon = _mixerCoderMTSpec; } else { #ifdef _ST_MODE - _mixerCoderSTSpec = new NCoderMixer2::CCoderMixer2ST; + _mixerCoderSTSpec = new NCoderMixer::CCoderMixer2ST; _mixerCoder = _mixerCoderSTSpec; _mixerCoderCommon = _mixerCoderSTSpec; #endif diff --git a/CPP/7zip/Archive/7z/7zDecode.h b/CPP/7zip/Archive/7z/7zDecode.h index 2e493c37..7c10dfe2 100755 --- a/CPP/7zip/Archive/7z/7zDecode.h +++ b/CPP/7zip/Archive/7z/7zDecode.h @@ -19,7 +19,7 @@ namespace NArchive { namespace N7z { -struct CBindInfoEx: public NCoderMixer2::CBindInfo +struct CBindInfoEx: public NCoderMixer::CBindInfo { CRecordVector<CMethodId> CoderMethodIDs; void Clear() @@ -36,10 +36,10 @@ class CDecoder bool _multiThread; #ifdef _ST_MODE - NCoderMixer2::CCoderMixer2ST *_mixerCoderSTSpec; + NCoderMixer::CCoderMixer2ST *_mixerCoderSTSpec; #endif - NCoderMixer2::CCoderMixer2MT *_mixerCoderMTSpec; - NCoderMixer2::CCoderMixer2 *_mixerCoderCommon; + NCoderMixer::CCoderMixer2MT *_mixerCoderMTSpec; + NCoderMixer::CCoderMixer2 *_mixerCoderCommon; CMyComPtr<ICompressCoder2> _mixerCoder; CObjectVector<CMyComPtr<IUnknown> > _decoders; diff --git a/CPP/7zip/Archive/7z/7zEncode.cpp b/CPP/7zip/Archive/7z/7zEncode.cpp index ef74b9bf..8c229362 100755 --- a/CPP/7zip/Archive/7z/7zEncode.cpp +++ b/CPP/7zip/Archive/7z/7zEncode.cpp @@ -13,14 +13,12 @@ #include "../../Common/CreateCoder.h" #include "../../Common/FilterCoder.h" -static UInt64 k_LZMA = 0x030101; -// static UInt64 k_LZMA2 = 0x030102; static UInt64 k_AES = 0x06F10701; namespace NArchive { namespace N7z { -static void ConvertBindInfoToFolderItemInfo(const NCoderMixer2::CBindInfo &bindInfo, +static void ConvertBindInfoToFolderItemInfo(const NCoderMixer::CBindInfo &bindInfo, const CRecordVector<CMethodId> decompressionMethods, CFolder &folder) { @@ -40,7 +38,7 @@ static void ConvertBindInfoToFolderItemInfo(const NCoderMixer2::CBindInfo &bindI for (i = 0; i < bindInfo.Coders.Size(); i++) { CCoderInfo coderInfo; - const NCoderMixer2::CCoderStreamsInfo &coderStreamsInfo = bindInfo.Coders[i]; + const NCoderMixer::CCoderStreamsInfo &coderStreamsInfo = bindInfo.Coders[i]; coderInfo.NumInStreams = coderStreamsInfo.NumInStreams; coderInfo.NumOutStreams = coderStreamsInfo.NumOutStreams; coderInfo.MethodID = decompressionMethods[i]; @@ -54,49 +52,25 @@ HRESULT CEncoder::CreateMixerCoder( DECL_EXTERNAL_CODECS_LOC_VARS const UInt64 *inSizeForReduce) { - _mixerCoderSpec = new NCoderMixer2::CCoderMixer2MT; + _mixerCoderSpec = new NCoderMixer::CCoderMixer2MT; _mixerCoder = _mixerCoderSpec; RINOK(_mixerCoderSpec->SetBindInfo(_bindInfo)); for (int i = 0; i < _options.Methods.Size(); i++) { const CMethodFull &methodFull = _options.Methods[i]; _codersInfo.Add(CCoderInfo()); - CCoderInfo &encodingInfo = _codersInfo.Back(); + // CCoderInfo &encodingInfo = _codersInfo.Back(); CMyComPtr<ICompressCoder> encoder; CMyComPtr<ICompressCoder2> encoder2; RINOK(CreateCoder( EXTERNAL_CODECS_LOC_VARS - methodFull.MethodID, encoder, encoder2, true)); + methodFull.Id, encoder, encoder2, true)); if (!encoder && !encoder2) return E_FAIL; - bool tryReduce = false; - UInt32 reducedDictionarySize = 1 << 10; - if (inSizeForReduce != 0 && (methodFull.MethodID == k_LZMA /* || methodFull.MethodID == k_LZMA2 */)) - { - for (;;) - { - const UInt32 step = (reducedDictionarySize >> 1); - if (reducedDictionarySize >= *inSizeForReduce) - { - tryReduce = true; - break; - } - reducedDictionarySize += step; - if (reducedDictionarySize >= *inSizeForReduce) - { - tryReduce = true; - break; - } - if (reducedDictionarySize >= ((UInt32)11 << 30)) - break; - reducedDictionarySize += step; - } - } - CMyComPtr<IUnknown> encoderCommon = encoder ? (IUnknown *)encoder : (IUnknown *)encoder2; #ifdef COMPRESS_MT @@ -110,50 +84,17 @@ HRESULT CEncoder::CreateMixerCoder( } #endif - if (methodFull.CoderProperties.Size() > 0) + + RINOK(SetMethodProperties(methodFull, inSizeForReduce, encoderCommon)); + + /* + CMyComPtr<ICryptoResetSalt> resetSalt; + encoderCommon.QueryInterface(IID_ICryptoResetSalt, (void **)&resetSalt); + if (resetSalt != NULL) { - CRecordVector<PROPID> propIDs; - int numProperties = methodFull.CoderProperties.Size(); - NWindows::NCOM::CPropVariant *values = new NWindows::NCOM::CPropVariant[numProperties]; - try - { - for (int i = 0; i < numProperties; i++) - { - const CProperty &property = methodFull.CoderProperties[i]; - propIDs.Add(property.PropID); - NWindows::NCOM::CPropVariant value = property.Value; - if (tryReduce && property.PropID == NCoderPropID::kDictionarySize && value.vt == VT_UI4 && reducedDictionarySize < value.ulVal) - value.ulVal = reducedDictionarySize; - values[i] = value; - } - CMyComPtr<ICompressSetCoderProperties> setCoderProperties; - RINOK(encoderCommon.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties)); - RINOK(setCoderProperties->SetCoderProperties(&propIDs.Front(), values, numProperties)); - } - catch(...) - { - delete []values; - throw; - } - delete []values; - } - - CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties; - - encoderCommon.QueryInterface(IID_ICompressWriteCoderProperties, &writeCoderProperties); - - if (writeCoderProperties != NULL) - { - CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp; - CMyComPtr<ISequentialOutStream> outStream(outStreamSpec); - outStreamSpec->Init(); - writeCoderProperties->WriteCoderProperties(outStream); - - size_t size = outStreamSpec->GetSize(); - - encodingInfo.Properties.SetCapacity(size); - memmove(encodingInfo.Properties, outStreamSpec->GetBuffer(), size); + resetSalt->ResetSalt(); } + */ #ifdef EXTERNAL_CODECS CMyComPtr<ISetCompressCodecsInfo> setCompressCodecsInfo; @@ -268,6 +209,31 @@ HRESULT CEncoder::Encode( outStreamPointers.Add(outStreamSizeCount); for (i = 1; i < _bindInfo.OutStreams.Size(); i++) outStreamPointers.Add(tempBuffers[i - 1]); + + for (i = 0; i < _codersInfo.Size(); i++) + { + CCoderInfo &encodingInfo = _codersInfo[i]; + + CMyComPtr<ICryptoResetInitVector> resetInitVector; + _mixerCoderSpec->_coders[i].QueryInterface(IID_ICryptoResetInitVector, (void **)&resetInitVector); + if (resetInitVector != NULL) + { + resetInitVector->ResetInitVector(); + } + + CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties; + _mixerCoderSpec->_coders[i].QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties); + if (writeCoderProperties != NULL) + { + CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp; + CMyComPtr<ISequentialOutStream> outStream(outStreamSpec); + outStreamSpec->Init(); + writeCoderProperties->WriteCoderProperties(outStream); + size_t size = outStreamSpec->GetSize(); + encodingInfo.Properties.SetCapacity(size); + memmove(encodingInfo.Properties, outStreamSpec->GetBuffer(), size); + } + } RINOK(_mixerCoder->Code(&inStreamPointers.Front(), NULL, 1, &outStreamPointers.Front(), NULL, outStreamPointers.Size(), compressProgress)); @@ -325,14 +291,14 @@ HRESULT CEncoder::EncoderConstr() throw 1; if (!_options.Binds.IsEmpty()) throw 1; - NCoderMixer2::CCoderStreamsInfo coderStreamsInfo; + NCoderMixer::CCoderStreamsInfo coderStreamsInfo; CMethodFull method; method.NumInStreams = 1; method.NumOutStreams = 1; coderStreamsInfo.NumInStreams = 1; coderStreamsInfo.NumOutStreams = 1; - method.MethodID = k_AES; + method.Id = k_AES; _options.Methods.Add(method); _bindInfo.Coders.Add(coderStreamsInfo); @@ -348,14 +314,14 @@ HRESULT CEncoder::EncoderConstr() for (i = 0; i < _options.Methods.Size(); i++) { const CMethodFull &methodFull = _options.Methods[i]; - NCoderMixer2::CCoderStreamsInfo coderStreamsInfo; + NCoderMixer::CCoderStreamsInfo coderStreamsInfo; coderStreamsInfo.NumInStreams = methodFull.NumOutStreams; coderStreamsInfo.NumOutStreams = methodFull.NumInStreams; if (_options.Binds.IsEmpty()) { if (i < _options.Methods.Size() - 1) { - NCoderMixer2::CBindPair bindPair; + NCoderMixer::CBindPair bindPair; bindPair.InIndex = numInStreams + coderStreamsInfo.NumInStreams; bindPair.OutIndex = numOutStreams; _bindInfo.BindPairs.Add(bindPair); @@ -376,7 +342,7 @@ HRESULT CEncoder::EncoderConstr() { for (i = 0; i < _options.Binds.Size(); i++) { - NCoderMixer2::CBindPair bindPair; + NCoderMixer::CBindPair bindPair; const CBind &bind = _options.Binds[i]; bindPair.InIndex = _bindInfo.GetCoderInStreamIndex(bind.InCoder) + bind.InStream; bindPair.OutIndex = _bindInfo.GetCoderOutStreamIndex(bind.OutCoder) + bind.OutStream; @@ -423,7 +389,7 @@ HRESULT CEncoder::EncoderConstr() for (i = 0; i < numCryptoStreams; i++) { - NCoderMixer2::CBindPair bindPair; + NCoderMixer::CBindPair bindPair; bindPair.InIndex = numInStreams + i; bindPair.OutIndex = _bindInfo.OutStreams[i]; _bindInfo.BindPairs.Add(bindPair); @@ -437,13 +403,13 @@ HRESULT CEncoder::EncoderConstr() for (i = 0; i < numCryptoStreams; i++) { - NCoderMixer2::CCoderStreamsInfo coderStreamsInfo; + NCoderMixer::CCoderStreamsInfo coderStreamsInfo; CMethodFull method; method.NumInStreams = 1; method.NumOutStreams = 1; coderStreamsInfo.NumInStreams = method.NumOutStreams; coderStreamsInfo.NumOutStreams = method.NumInStreams; - method.MethodID = k_AES; + method.Id = k_AES; _options.Methods.Add(method); _bindInfo.Coders.Add(coderStreamsInfo); @@ -456,10 +422,10 @@ HRESULT CEncoder::EncoderConstr() for (int i = _options.Methods.Size() - 1; i >= 0; i--) { const CMethodFull &methodFull = _options.Methods[i]; - _decompressionMethods.Add(methodFull.MethodID); + _decompressionMethods.Add(methodFull.Id); } - _bindReverseConverter = new NCoderMixer2::CBindReverseConverter(_bindInfo); + _bindReverseConverter = new NCoderMixer::CBindReverseConverter(_bindInfo); _bindReverseConverter->CreateReverseBindInfo(_decompressBindInfo); _constructed = true; return S_OK; diff --git a/CPP/7zip/Archive/7z/7zEncode.h b/CPP/7zip/Archive/7z/7zEncode.h index 588105c3..4909a6e8 100755 --- a/CPP/7zip/Archive/7z/7zEncode.h +++ b/CPP/7zip/Archive/7z/7zEncode.h @@ -21,15 +21,15 @@ namespace N7z { class CEncoder { - NCoderMixer2::CCoderMixer2MT *_mixerCoderSpec; + NCoderMixer::CCoderMixer2MT *_mixerCoderSpec; CMyComPtr<ICompressCoder2> _mixerCoder; CObjectVector<CCoderInfo> _codersInfo; CCompressionMethodMode _options; - NCoderMixer2::CBindInfo _bindInfo; - NCoderMixer2::CBindInfo _decompressBindInfo; - NCoderMixer2::CBindReverseConverter *_bindReverseConverter; + NCoderMixer::CBindInfo _bindInfo; + NCoderMixer::CBindInfo _decompressBindInfo; + NCoderMixer::CBindReverseConverter *_bindReverseConverter; CRecordVector<CMethodId> _decompressionMethods; HRESULT CreateMixerCoder(DECL_EXTERNAL_CODECS_LOC_VARS diff --git a/CPP/7zip/Archive/7z/7zHandler.cpp b/CPP/7zip/Archive/7z/7zHandler.cpp index dc0a6505..9fc45848 100755 --- a/CPP/7zip/Archive/7z/7zHandler.cpp +++ b/CPP/7zip/Archive/7z/7zHandler.cpp @@ -20,6 +20,10 @@ #endif #endif +#ifdef COMPRESS_MT +#include "../../../Windows/System.h" +#endif + using namespace NWindows; extern UString ConvertMethodIdToString(UInt64 id); @@ -29,10 +33,11 @@ namespace N7z { CHandler::CHandler() { + #ifdef EXTRACT_ONLY #ifdef COMPRESS_MT _numThreads = NWindows::NSystem::GetNumberOfProcessors(); #endif - #ifndef EXTRACT_ONLY + #else Init(); #endif } diff --git a/CPP/7zip/Archive/7z/7zHandler.h b/CPP/7zip/Archive/7z/7zHandler.h index 77e4d25c..95e53340 100755 --- a/CPP/7zip/Archive/7z/7zHandler.h +++ b/CPP/7zip/Archive/7z/7zHandler.h @@ -9,12 +9,12 @@ #include "7zCompressionMode.h" -#ifdef COMPRESS_MT -#include "../../../Windows/System.h" -#endif - #include "../../Common/CreateCoder.h" +#ifndef EXTRACT_ONLY +#include "../Common/HandlerOut.h" +#endif + namespace NArchive { namespace N7z { @@ -44,15 +44,6 @@ struct CVolume }; #endif -#ifndef EXTRACT_ONLY - -struct COneMethodInfo -{ - CObjectVector<CProperty> CoderProperties; - UString MethodName; -}; -#endif - // {23170F69-40C1-278A-1000-000110070000} DEFINE_GUID(CLSID_CFormat7z, 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x07, 0x00, 0x00); @@ -71,6 +62,9 @@ DEFINE_GUID(CLSID_CFormat7z, class CHandler: + #ifndef EXTRACT_ONLY + public NArchive::COutHandler, + #endif public IInArchive, #ifdef _7Z_VOL public IInArchiveGetStream, @@ -137,8 +131,6 @@ public: // ISetProperties - HRESULT SetSolidSettings(const UString &s); - HRESULT SetSolidSettings(const PROPVARIANT &value); #endif DECL_ISetCompressCodecsInfo @@ -154,37 +146,15 @@ private: NArchive::N7z::CArchiveDatabaseEx _database; #endif - + #ifdef EXTRACT_ONLY + #ifdef COMPRESS_MT UInt32 _numThreads; #endif - - #ifndef EXTRACT_ONLY - CObjectVector<COneMethodInfo> _methods; + + #else + CRecordVector<CBind> _binds; - bool _removeSfxBlock; - UInt64 _numSolidFiles; - UInt64 _numSolidBytes; - bool _numSolidBytesDefined; - bool _solidExtension; - - bool _compressHeaders; - bool _encryptHeaders; - - bool WriteModified; - bool WriteCreated; - bool WriteAccessed; - - - bool _autoFilter; - UInt32 _level; - - bool _volumeMode; - - DECL_EXTERNAL_CODECS_VARS - - HRESULT SetParam(COneMethodInfo &oneMethodInfo, const UString &name, const UString &value); - HRESULT SetParams(COneMethodInfo &oneMethodInfo, const UString &srcString); HRESULT SetPassword(CCompressionMethodMode &methodMode, IArchiveUpdateCallback *updateCallback); @@ -208,39 +178,6 @@ private: void FillPopIDs(); #endif - - #ifndef EXTRACT_ONLY - - void InitSolidFiles() { _numSolidFiles = UInt64(Int64(-1)); } - void InitSolidSize() { _numSolidBytes = UInt64(Int64(-1)); } - void InitSolid() - { - InitSolidFiles(); - InitSolidSize(); - _solidExtension = false; - _numSolidBytesDefined = false; - } - - void Init() - { - _removeSfxBlock = false; - _compressHeaders = true; - _encryptHeaders = false; - - WriteModified = true; - WriteCreated = false; - WriteAccessed = false; - - #ifdef COMPRESS_MT - _numThreads = NWindows::NSystem::GetNumberOfProcessors(); - #endif - - _level = 5; - _autoFilter = true; - _volumeMode = false; - InitSolid(); - } - #endif }; }} diff --git a/CPP/7zip/Archive/7z/7zHandlerOut.cpp b/CPP/7zip/Archive/7z/7zHandlerOut.cpp index 80d63931..af4b9427 100755 --- a/CPP/7zip/Archive/7z/7zHandlerOut.cpp +++ b/CPP/7zip/Archive/7z/7zHandlerOut.cpp @@ -1,4 +1,4 @@ -// 7z/OutHandler.cpp +// 7zHandlerOut.cpp #include "StdAfx.h" @@ -21,90 +21,19 @@ using namespace NWindows; namespace NArchive { namespace N7z { -const wchar_t *kCopyMethod = L"Copy"; -const wchar_t *kLZMAMethodName = L"LZMA"; -const wchar_t *kLZMA2MethodName = L"LZMA2"; -const wchar_t *kBZip2MethodName = L"BZip2"; -const wchar_t *kPpmdMethodName = L"PPMd"; -const wchar_t *kDeflateMethodName = L"Deflate"; -const wchar_t *kDeflate64MethodName = L"Deflate64"; +static const wchar_t *kLZMAMethodName = L"LZMA"; +static const wchar_t *kCopyMethod = L"Copy"; +static const wchar_t *kDefaultMethodName = kLZMAMethodName; -static const wchar_t *kLzmaMatchFinderX1 = L"HC4"; -static const wchar_t *kLzmaMatchFinderX5 = L"BT4"; - -static const UInt32 kLzmaAlgorithmX1 = 0; static const UInt32 kLzmaAlgorithmX5 = 1; - -static const UInt32 kLzmaDicSizeX1 = 1 << 16; -static const UInt32 kLzmaDicSizeX3 = 1 << 20; -static const UInt32 kLzmaDicSizeX5 = 1 << 24; -static const UInt32 kLzmaDicSizeX7 = 1 << 25; -static const UInt32 kLzmaDicSizeX9 = 1 << 26; - -static const UInt32 kLzmaFastBytesX1 = 32; -static const UInt32 kLzmaFastBytesX7 = 64; - -static const UInt32 kPpmdMemSizeX1 = (1 << 22); -static const UInt32 kPpmdMemSizeX5 = (1 << 24); -static const UInt32 kPpmdMemSizeX7 = (1 << 26); -static const UInt32 kPpmdMemSizeX9 = (192 << 20); - -static const UInt32 kPpmdOrderX1 = 4; -static const UInt32 kPpmdOrderX5 = 6; -static const UInt32 kPpmdOrderX7 = 16; -static const UInt32 kPpmdOrderX9 = 32; - -static const UInt32 kDeflateAlgoX1 = 0; -static const UInt32 kDeflateAlgoX5 = 1; - -static const UInt32 kDeflateFastBytesX1 = 32; -static const UInt32 kDeflateFastBytesX7 = 64; -static const UInt32 kDeflateFastBytesX9 = 128; - -static const UInt32 kDeflatePassesX1 = 1; -static const UInt32 kDeflatePassesX7 = 3; -static const UInt32 kDeflatePassesX9 = 10; - -static const UInt32 kBZip2NumPassesX1 = 1; -static const UInt32 kBZip2NumPassesX7 = 2; -static const UInt32 kBZip2NumPassesX9 = 7; - -static const UInt32 kBZip2DicSizeX1 = 100000; -static const UInt32 kBZip2DicSizeX3 = 500000; -static const UInt32 kBZip2DicSizeX5 = 900000; - -const wchar_t *kDefaultMethodName = kLZMAMethodName; - static const wchar_t *kLzmaMatchFinderForHeaders = L"BT2"; static const UInt32 kDictionaryForHeaders = 1 << 20; static const UInt32 kNumFastBytesForHeaders = 273; static const UInt32 kAlgorithmForHeaders = kLzmaAlgorithmX5; -static bool IsCopyMethod(const UString &methodName) +static inline bool IsCopyMethod(const UString &methodName) { return (methodName.CompareNoCase(kCopyMethod) == 0); } -static bool IsLZMAMethod(const UString &methodName) -{ - return - (methodName.CompareNoCase(kLZMAMethodName) == 0) || - (methodName.CompareNoCase(kLZMA2MethodName) == 0); -} - -/* -static bool IsLZMethod(const UString &methodName) - { return IsLZMAMethod(methodName); } -*/ - -static bool IsBZip2Method(const UString &methodName) - { return (methodName.CompareNoCase(kBZip2MethodName) == 0); } - -static bool IsPpmdMethod(const UString &methodName) - { return (methodName.CompareNoCase(kPpmdMethodName) == 0); } - -static bool IsDeflateMethod(const UString &methodName) - { return (methodName.CompareNoCase(kDeflateMethodName) == 0) || - (methodName.CompareNoCase(kDeflate64MethodName) == 0); } - STDMETHODIMP CHandler::GetFileTimeType(UInt32 *type) { *type = NFileTimeType::kWindows; @@ -136,60 +65,6 @@ HRESULT CHandler::SetPassword(CCompressionMethodMode &methodMode, return S_OK; } -struct CNameToPropID -{ - PROPID PropID; - VARTYPE VarType; - const wchar_t *Name; -}; - -CNameToPropID g_NameToPropID[] = -{ - { NCoderPropID::kOrder, VT_UI4, L"O" }, - { NCoderPropID::kPosStateBits, VT_UI4, L"PB" }, - { NCoderPropID::kLitContextBits, VT_UI4, L"LC" }, - { NCoderPropID::kLitPosBits, VT_UI4, L"LP" }, - - { NCoderPropID::kNumPasses, VT_UI4, L"Pass" }, - { NCoderPropID::kNumFastBytes, VT_UI4, L"fb" }, - { NCoderPropID::kMatchFinderCycles, VT_UI4, L"mc" }, - { NCoderPropID::kAlgorithm, VT_UI4, L"a" }, - { NCoderPropID::kMatchFinder, VT_BSTR, L"mf" }, - { NCoderPropID::kNumThreads, VT_UI4, L"mt" } -}; - -bool ConvertProperty(PROPVARIANT srcProp, VARTYPE varType, - NCOM::CPropVariant &destProp) -{ - if (varType == srcProp.vt) - { - destProp = srcProp; - return true; - } - if (varType == VT_UI1) - { - if(srcProp.vt == VT_UI4) - { - UInt32 value = srcProp.ulVal; - if (value > 0xFF) - return false; - destProp = Byte(value); - return true; - } - } - return false; -} - -const int kNumNameToPropIDItems = sizeof(g_NameToPropID) / sizeof(g_NameToPropID[0]); - -int FindPropIdFromStringName(const UString &name) -{ - for (int i = 0; i < kNumNameToPropIDItems; i++) - if (name.CompareNoCase(g_NameToPropID[i].Name) == 0) - return i; - return -1; -} - HRESULT CHandler::SetCompressionMethod( CCompressionMethodMode &methodMode, CCompressionMethodMode &headerMethod) @@ -210,28 +85,28 @@ HRESULT CHandler::SetCompressionMethod( COneMethodInfo oneMethodInfo; oneMethodInfo.MethodName = kLZMAMethodName; { - CProperty property; - property.PropID = NCoderPropID::kMatchFinder; + CProp property; + property.Id = NCoderPropID::kMatchFinder; property.Value = kLzmaMatchFinderForHeaders; - oneMethodInfo.CoderProperties.Add(property); + oneMethodInfo.Properties.Add(property); } { - CProperty property; - property.PropID = NCoderPropID::kAlgorithm; + CProp property; + property.Id = NCoderPropID::kAlgorithm; property.Value = kAlgorithmForHeaders; - oneMethodInfo.CoderProperties.Add(property); + oneMethodInfo.Properties.Add(property); } { - CProperty property; - property.PropID = NCoderPropID::kNumFastBytes; + CProp property; + property.Id = NCoderPropID::kNumFastBytes; property.Value = UInt32(kNumFastBytesForHeaders); - oneMethodInfo.CoderProperties.Add(property); + oneMethodInfo.Properties.Add(property); } { - CProperty property; - property.PropID = NCoderPropID::kDictionarySize; + CProp property; + property.Id = NCoderPropID::kDictionarySize; property.Value = UInt32(kDictionaryForHeaders); - oneMethodInfo.CoderProperties.Add(property); + oneMethodInfo.Properties.Add(property); } headerMethodInfoVector.Add(oneMethodInfo); HRESULT res = SetCompressionMethod(headerMethod, headerMethodInfoVector @@ -244,21 +119,6 @@ HRESULT CHandler::SetCompressionMethod( return S_OK; } -static void SetOneMethodProp(COneMethodInfo &oneMethodInfo, PROPID propID, - const NWindows::NCOM::CPropVariant &value) -{ - int j; - for (j = 0; j < oneMethodInfo.CoderProperties.Size(); j++) - if (oneMethodInfo.CoderProperties[j].PropID == propID) - break; - if (j != oneMethodInfo.CoderProperties.Size()) - return; - CProperty property; - property.PropID = propID; - property.Value = value; - oneMethodInfo.CoderProperties.Add(property); -} - HRESULT CHandler::SetCompressionMethod( CCompressionMethodMode &methodMode, CObjectVector<COneMethodInfo> &methodsInfo @@ -280,113 +140,31 @@ HRESULT CHandler::SetCompressionMethod( for(int i = 0; i < methodsInfo.Size(); i++) { COneMethodInfo &oneMethodInfo = methodsInfo[i]; - if (oneMethodInfo.MethodName.IsEmpty()) - oneMethodInfo.MethodName = kDefaultMethodName; - - if (!IsCopyMethod(oneMethodInfo.MethodName)) - needSolid = true; - - if (IsLZMAMethod(oneMethodInfo.MethodName)) - { - UInt32 dicSize = - (level >= 9 ? kLzmaDicSizeX9 : - (level >= 7 ? kLzmaDicSizeX7 : - (level >= 5 ? kLzmaDicSizeX5 : - (level >= 3 ? kLzmaDicSizeX3 : - kLzmaDicSizeX1)))); - - UInt32 algorithm = - (level >= 5 ? kLzmaAlgorithmX5 : - kLzmaAlgorithmX1); - - UInt32 fastBytes = - (level >= 7 ? kLzmaFastBytesX7 : - kLzmaFastBytesX1); - - const wchar_t *matchFinder = - (level >= 5 ? kLzmaMatchFinderX5 : - kLzmaMatchFinderX1); - - SetOneMethodProp(oneMethodInfo, NCoderPropID::kDictionarySize, dicSize); - SetOneMethodProp(oneMethodInfo, NCoderPropID::kAlgorithm, algorithm); - SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumFastBytes, fastBytes); - SetOneMethodProp(oneMethodInfo, NCoderPropID::kMatchFinder, matchFinder); - #ifdef COMPRESS_MT - SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumThreads, numThreads); - #endif - } - else if (IsDeflateMethod(oneMethodInfo.MethodName)) - { - UInt32 fastBytes = - (level >= 9 ? kDeflateFastBytesX9 : - (level >= 7 ? kDeflateFastBytesX7 : - kDeflateFastBytesX1)); - - UInt32 numPasses = - (level >= 9 ? kDeflatePassesX9 : - (level >= 7 ? kDeflatePassesX7 : - kDeflatePassesX1)); - UInt32 algo = - (level >= 5 ? kDeflateAlgoX5 : - kDeflateAlgoX1); - - SetOneMethodProp(oneMethodInfo, NCoderPropID::kAlgorithm, algo); - SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumFastBytes, fastBytes); - SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumPasses, numPasses); - } - else if (IsBZip2Method(oneMethodInfo.MethodName)) - { - UInt32 numPasses = - (level >= 9 ? kBZip2NumPassesX9 : - (level >= 7 ? kBZip2NumPassesX7 : - kBZip2NumPassesX1)); - - UInt32 dicSize = - (level >= 5 ? kBZip2DicSizeX5 : - (level >= 3 ? kBZip2DicSizeX3 : - kBZip2DicSizeX1)); - - SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumPasses, numPasses); - SetOneMethodProp(oneMethodInfo, NCoderPropID::kDictionarySize, dicSize); + SetCompressionMethod2(oneMethodInfo #ifdef COMPRESS_MT - SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumThreads, numThreads); + , numThreads #endif - } - else if (IsPpmdMethod(oneMethodInfo.MethodName)) - { - UInt32 useMemSize = - (level >= 9 ? kPpmdMemSizeX9 : - (level >= 7 ? kPpmdMemSizeX7 : - (level >= 5 ? kPpmdMemSizeX5 : - kPpmdMemSizeX1))); - - UInt32 order = - (level >= 9 ? kPpmdOrderX9 : - (level >= 7 ? kPpmdOrderX7 : - (level >= 5 ? kPpmdOrderX5 : - kPpmdOrderX1))); - - SetOneMethodProp(oneMethodInfo, NCoderPropID::kUsedMemorySize, useMemSize); - SetOneMethodProp(oneMethodInfo, NCoderPropID::kOrder, order); - } + ); + if (!IsCopyMethod(oneMethodInfo.MethodName)) + needSolid = true; CMethodFull methodFull; if (!FindMethod( EXTERNAL_CODECS_VARS - oneMethodInfo.MethodName, methodFull.MethodID, methodFull.NumInStreams, methodFull.NumOutStreams)) + oneMethodInfo.MethodName, methodFull.Id, methodFull.NumInStreams, methodFull.NumOutStreams)) return E_INVALIDARG; - methodFull.CoderProperties = oneMethodInfo.CoderProperties; + methodFull.Properties = oneMethodInfo.Properties; methodMode.Methods.Add(methodFull); if (!_numSolidBytesDefined) { - for (int j = 0; j < methodFull.CoderProperties.Size(); j++) + for (int j = 0; j < methodFull.Properties.Size(); j++) { - const CProperty &prop = methodFull.CoderProperties[j]; - if ((prop.PropID == NCoderPropID::kDictionarySize || - prop.PropID == NCoderPropID::kUsedMemorySize) && prop.Value.vt == VT_UI4) + const CProp &prop = methodFull.Properties[j]; + if ((prop.Id == NCoderPropID::kDictionarySize || + prop.Id == NCoderPropID::kUsedMemorySize) && prop.Value.vt == VT_UI4) { _numSolidBytes = ((UInt64)prop.Value.ulVal) << 7; const UInt64 kMinSize = (1 << 24); @@ -652,198 +430,11 @@ static HRESULT GetBindInfo(UString &srcString, CBind &bind) return S_OK; } -static void SplitParams(const UString &srcString, UStringVector &subStrings) -{ - subStrings.Clear(); - UString name; - int len = srcString.Length(); - if (len == 0) - return; - for (int i = 0; i < len; i++) - { - wchar_t c = srcString[i]; - if (c == L':') - { - subStrings.Add(name); - name.Empty(); - } - else - name += c; - } - subStrings.Add(name); -} - -static void SplitParam(const UString ¶m, UString &name, UString &value) -{ - int eqPos = param.Find(L'='); - if (eqPos >= 0) - { - name = param.Left(eqPos); - value = param.Mid(eqPos + 1); - return; - } - for(int i = 0; i < param.Length(); i++) - { - wchar_t c = param[i]; - if (c >= L'0' && c <= L'9') - { - name = param.Left(i); - value = param.Mid(i); - return; - } - } - name = param; -} - -HRESULT CHandler::SetParam(COneMethodInfo &oneMethodInfo, const UString &name, const UString &value) -{ - CProperty property; - if (name.CompareNoCase(L"D") == 0 || name.CompareNoCase(L"MEM") == 0) - { - UInt32 dicSize; - RINOK(ParsePropDictionaryValue(value, dicSize)); - if (name.CompareNoCase(L"D") == 0) - property.PropID = NCoderPropID::kDictionarySize; - else - property.PropID = NCoderPropID::kUsedMemorySize; - property.Value = dicSize; - oneMethodInfo.CoderProperties.Add(property); - } - else - { - int index = FindPropIdFromStringName(name); - if (index < 0) - return E_INVALIDARG; - - const CNameToPropID &nameToPropID = g_NameToPropID[index]; - property.PropID = nameToPropID.PropID; - - NCOM::CPropVariant propValue; - - - if (nameToPropID.VarType == VT_BSTR) - propValue = value; - else - { - UInt32 number; - if (ParseStringToUInt32(value, number) == value.Length()) - propValue = number; - else - propValue = value; - } - - if (!ConvertProperty(propValue, nameToPropID.VarType, property.Value)) - return E_INVALIDARG; - - oneMethodInfo.CoderProperties.Add(property); - } - return S_OK; -} - -HRESULT CHandler::SetParams(COneMethodInfo &oneMethodInfo, const UString &srcString) -{ - UStringVector params; - SplitParams(srcString, params); - if (params.Size() > 0) - oneMethodInfo.MethodName = params[0]; - for (int i = 1; i < params.Size(); i++) - { - const UString ¶m = params[i]; - UString name, value; - SplitParam(param, name, value); - RINOK(SetParam(oneMethodInfo, name, value)); - } - return S_OK; -} - -HRESULT CHandler::SetSolidSettings(const UString &s) -{ - UString s2 = s; - s2.MakeUpper(); - if (s2.IsEmpty() || s2.Compare(L"ON") == 0) - { - InitSolid(); - return S_OK; - } - if (s2.Compare(L"OFF") == 0) - { - _numSolidFiles = 1; - return S_OK; - } - for (int i = 0; i < s2.Length();) - { - const wchar_t *start = ((const wchar_t *)s2) + i; - const wchar_t *end; - UInt64 v = ConvertStringToUInt64(start, &end); - if (start == end) - { - if (s2[i++] != 'E') - return E_INVALIDARG; - _solidExtension = true; - continue; - } - i += (int)(end - start); - if (i == s2.Length()) - return E_INVALIDARG; - wchar_t c = s2[i++]; - switch(c) - { - case 'F': - if (v < 1) - v = 1; - _numSolidFiles = v; - break; - case 'B': - _numSolidBytes = v; - _numSolidBytesDefined = true; - break; - case 'K': - _numSolidBytes = (v << 10); - _numSolidBytesDefined = true; - break; - case 'M': - _numSolidBytes = (v << 20); - _numSolidBytesDefined = true; - break; - case 'G': - _numSolidBytes = (v << 30); - _numSolidBytesDefined = true; - break; - default: - return E_INVALIDARG; - } - } - return S_OK; -} - -HRESULT CHandler::SetSolidSettings(const PROPVARIANT &value) -{ - switch(value.vt) - { - case VT_EMPTY: - InitSolid(); - return S_OK; - case VT_BSTR: - return SetSolidSettings(value.bstrVal); - default: - return E_INVALIDARG; - } -} - STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) { COM_TRY_BEGIN - _methods.Clear(); _binds.Clear(); - Init(); - #ifdef COMPRESS_MT - const UInt32 numProcessors = NSystem::GetNumberOfProcessors(); - #endif - - UInt32 mainDicSize = 0xFFFFFFFF; - UInt32 mainDicMethodIndex = 0xFFFFFFFF; - - UInt32 minNumber = 0; + BeforeSetProperty(); for (int i = 0; i < numProperties; i++) { @@ -854,14 +445,6 @@ STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *v const PROPVARIANT &value = values[i]; - if (name[0] == 'X') - { - name.Delete(0); - _level = 9; - RINOK(ParsePropValue(name, value, _level)); - continue; - } - if (name[0] == 'B') { name.Delete(0); @@ -871,142 +454,7 @@ STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *v continue; } - if (name[0] == L'S') - { - name.Delete(0); - if (name.IsEmpty()) - { - RINOK(SetSolidSettings(value)); - } - else - { - RINOK(SetSolidSettings(name)); - } - continue; - } - - - UInt32 number; - int index = ParseStringToUInt32(name, number); - UString realName = name.Mid(index); - 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 if (name.CompareNoCase(L"RSFX") == 0) - { - RINOK(SetBoolProperty(_removeSfxBlock, value)); - continue; - } - else if (name.CompareNoCase(L"F") == 0) - { - RINOK(SetBoolProperty(_autoFilter, value)); - continue; - } - else if (name.CompareNoCase(L"HC") == 0) - { - RINOK(SetBoolProperty(_compressHeaders, value)); - continue; - } - else if (name.CompareNoCase(L"HCF") == 0) - { - bool compressHeadersFull = true; - RINOK(SetBoolProperty(compressHeadersFull, value)); - if (!compressHeadersFull) - return E_INVALIDARG; - continue; - } - else if (name.CompareNoCase(L"HE") == 0) - { - RINOK(SetBoolProperty(_encryptHeaders, value)); - continue; - } - else if (name.CompareNoCase(L"TM") == 0) - { - RINOK(SetBoolProperty(WriteModified, value)); - continue; - } - else if (name.CompareNoCase(L"TC") == 0) - { - RINOK(SetBoolProperty(WriteCreated, value)); - continue; - } - else if (name.CompareNoCase(L"TA") == 0) - { - RINOK(SetBoolProperty(WriteAccessed, value)); - continue; - } - else if (name.CompareNoCase(L"V") == 0) - { - RINOK(SetBoolProperty(_volumeMode, value)); - continue; - } - number = 0; - } - if (number > 10000) - return E_FAIL; - if (number < minNumber) - return E_INVALIDARG; - number -= minNumber; - for(int j = _methods.Size(); j <= (int)number; j++) - { - COneMethodInfo oneMethodInfo; - _methods.Add(oneMethodInfo); - } - - COneMethodInfo &oneMethodInfo = _methods[number]; - - if (realName.Length() == 0) - { - if (value.vt != VT_BSTR) - return E_INVALIDARG; - - // oneMethodInfo.MethodName = UnicodeStringToMultiByte(UString(value.bstrVal)); - RINOK(SetParams(oneMethodInfo, value.bstrVal)); - } - else - { - CProperty property; - if (realName.Left(1).CompareNoCase(L"D") == 0) - { - UInt32 dicSize; - RINOK(ParsePropDictionaryValue(realName.Mid(1), value, dicSize)); - property.PropID = NCoderPropID::kDictionarySize; - property.Value = dicSize; - oneMethodInfo.CoderProperties.Add(property); - if (number <= mainDicMethodIndex) - mainDicSize = dicSize; - } - else if (realName.Left(3).CompareNoCase(L"MEM") == 0) - { - UInt32 dicSize; - RINOK(ParsePropDictionaryValue(realName.Mid(3), value, dicSize)); - property.PropID = NCoderPropID::kUsedMemorySize; - property.Value = dicSize; - oneMethodInfo.CoderProperties.Add(property); - if (number <= mainDicMethodIndex) - mainDicSize = dicSize; - } - else - { - int index = FindPropIdFromStringName(realName); - if (index < 0) - return E_INVALIDARG; - - const CNameToPropID &nameToPropID = g_NameToPropID[index]; - property.PropID = nameToPropID.PropID; - - if (!ConvertProperty(value, nameToPropID.VarType, property.Value)) - return E_INVALIDARG; - - oneMethodInfo.CoderProperties.Add(property); - } - } + RINOK(SetProperty(name, value)); } return S_OK; diff --git a/CPP/7zip/Archive/7z/7zHeader.cpp b/CPP/7zip/Archive/7z/7zHeader.cpp index cff4d121..425231fc 100755 --- a/CPP/7zip/Archive/7z/7zHeader.cpp +++ b/CPP/7zip/Archive/7z/7zHeader.cpp @@ -7,12 +7,20 @@ namespace NArchive { namespace N7z { Byte kSignature[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C}; +#ifdef _7Z_VOL Byte kFinishSignature[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C + 1}; +#endif class SignatureInitializer { public: - SignatureInitializer() { kSignature[0]--; kFinishSignature[0]--;}; + SignatureInitializer() + { + kSignature[0]--; + #ifdef _7Z_VOL + kFinishSignature[0]--; + #endif + }; } g_SignatureInitializer; }} diff --git a/CPP/7zip/Archive/7z/7zIn.cpp b/CPP/7zip/Archive/7z/7zIn.cpp index d1ad9da8..c9150898 100755 --- a/CPP/7zip/Archive/7z/7zIn.cpp +++ b/CPP/7zip/Archive/7z/7zIn.cpp @@ -12,7 +12,9 @@ extern "C" } // define FORMAT_7Z_RECOVERY if you want to recover multivolume archives with empty StartHeader -// #define FORMAT_7Z_RECOVERY +#ifndef _SFX +#define FORMAT_7Z_RECOVERY +#endif namespace NArchive { namespace N7z { @@ -1268,13 +1270,13 @@ HRESULT CInArchive::ReadDatabase( return S_FALSE; nextHeaderSize = realProcessedSize - i; nextHeaderOffset = cur2 - cur + i; - nextHeaderCRC = CCRC::CalculateDigest(buf + i, (size_t)nextHeaderSize); + nextHeaderCRC = CrcCalc(buf + i, (size_t)nextHeaderSize); RINOK(_stream->Seek(cur, STREAM_SEEK_SET, &_position)); } #endif #ifdef FORMAT_7Z_RECOVERY - crcFromArchive = crc.GetDigest(); + crcFromArchive = CRC_GET_DIGEST(crc); #endif #ifdef _7Z_VOL diff --git a/CPP/7zip/Archive/7z/7zItem.h b/CPP/7zip/Archive/7z/7zItem.h index cad88dc1..388f19d3 100755 --- a/CPP/7zip/Archive/7z/7zItem.h +++ b/CPP/7zip/Archive/7z/7zItem.h @@ -4,7 +4,7 @@ #define __7Z_ITEM_H #include "../../../Common/Buffer.h" -#include "../../../Common/String.h" +#include "../../../Common/MyString.h" #include "../../Common/MethodId.h" #include "7zHeader.h" diff --git a/CPP/7zip/Archive/7z/7zOut.cpp b/CPP/7zip/Archive/7z/7zOut.cpp index 2399f652..a00cdf5c 100755 --- a/CPP/7zip/Archive/7z/7zOut.cpp +++ b/CPP/7zip/Archive/7z/7zOut.cpp @@ -151,7 +151,7 @@ HRESULT COutArchive::Create(ISequentialOutStream *stream, bool endMarker) { if (!Stream) return E_FAIL; - WriteSignature(); + RINOK(WriteSignature()); RINOK(Stream->Seek(0, STREAM_SEEK_CUR, &_prefixHeaderPos)); } return S_OK; diff --git a/CPP/7zip/Archive/7z/7zUpdate.cpp b/CPP/7zip/Archive/7z/7zUpdate.cpp index 2b197adb..59e7c4fc 100755 --- a/CPP/7zip/Archive/7z/7zUpdate.cpp +++ b/CPP/7zip/Archive/7z/7zUpdate.cpp @@ -357,7 +357,7 @@ static const UInt64 k_BCJ2 = 0x0303011B; static bool GetMethodFull(UInt64 methodID, UInt32 numInStreams, CMethodFull &methodResult) { - methodResult.MethodID = methodID; + methodResult.Id = methodID; methodResult.NumInStreams = numInStreams; methodResult.NumOutStreams = 1; return true; @@ -376,28 +376,28 @@ static bool MakeExeMethod(const CCompressionMethodMode &method, if (!GetMethodFull(k_LZMA, 1, methodFull)) return false; { - CProperty property; - property.PropID = NCoderPropID::kAlgorithm; + CProp property; + property.Id = NCoderPropID::kAlgorithm; property.Value = kAlgorithmForBCJ2_LZMA; - methodFull.CoderProperties.Add(property); + methodFull.Properties.Add(property); } { - CProperty property; - property.PropID = NCoderPropID::kMatchFinder; + CProp property; + property.Id = NCoderPropID::kMatchFinder; property.Value = kMatchFinderForBCJ2_LZMA; - methodFull.CoderProperties.Add(property); + methodFull.Properties.Add(property); } { - CProperty property; - property.PropID = NCoderPropID::kDictionarySize; + CProp property; + property.Id = NCoderPropID::kDictionarySize; property.Value = kDictionaryForBCJ2_LZMA; - methodFull.CoderProperties.Add(property); + methodFull.Properties.Add(property); } { - CProperty property; - property.PropID = NCoderPropID::kNumFastBytes; + CProp property; + property.Id = NCoderPropID::kNumFastBytes; property.Value = kNumFastBytesForBCJ2_LZMA; - methodFull.CoderProperties.Add(property); + methodFull.Properties.Add(property); } exeMethod.Methods.Add(methodFull); diff --git a/CPP/7zip/Archive/7z/makefile b/CPP/7zip/Archive/7z/makefile index 03ef4e46..1a72da0e 100755 --- a/CPP/7zip/Archive/7z/makefile +++ b/CPP/7zip/Archive/7z/makefile @@ -31,10 +31,10 @@ COMMON_OBJS = \ $O\CRC.obj \ $O\IntToString.obj \ $O\NewHandler.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ WIN_OBJS = \ $O\DLL.obj \ @@ -42,7 +42,8 @@ WIN_OBJS = \ $O\FileFind.obj \ $O\FileIO.obj \ $O\PropVariant.obj \ - $O\Synchronization.obj + $O\Synchronization.obj \ + $O\System.obj \ 7ZIP_COMMON_OBJS = \ $O\CreateCoder.obj \ @@ -51,16 +52,19 @@ WIN_OBJS = \ $O\LimitedStreams.obj \ $O\LockedStream.obj \ $O\MethodId.obj \ + $O\MethodProps.obj \ $O\OutBuffer.obj \ $O\ProgressUtils.obj \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ AR_COMMON_OBJS = \ $O\CoderMixer2.obj \ $O\CoderMixer2MT.obj \ $O\CrossThreadProgress.obj \ + $O\HandlerOut.obj \ $O\InStreamWithCRC.obj \ $O\ItemNameUtils.obj \ $O\MultiStream.obj \ @@ -69,6 +73,7 @@ AR_COMMON_OBJS = \ C_OBJS = \ $O\Alloc.obj \ + $O\Threads.obj \ !include "../../Crc2.mak" diff --git a/CPP/7zip/Archive/Arj/ArjItem.h b/CPP/7zip/Archive/Arj/ArjItem.h index d48fe38d..a0112107 100755 --- a/CPP/7zip/Archive/Arj/ArjItem.h +++ b/CPP/7zip/Archive/Arj/ArjItem.h @@ -4,7 +4,7 @@ #define __ARCHIVE_ARJ_ITEM_H #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "ArjHeader.h" namespace NArchive { diff --git a/CPP/7zip/Archive/BZip2/BZip2HandlerOut.cpp b/CPP/7zip/Archive/BZip2/BZip2HandlerOut.cpp index 38797c33..134d4124 100755 --- a/CPP/7zip/Archive/BZip2/BZip2HandlerOut.cpp +++ b/CPP/7zip/Archive/BZip2/BZip2HandlerOut.cpp @@ -6,7 +6,6 @@ #include "BZip2Update.h" #include "Common/Defs.h" -#include "Common/String.h" #include "Windows/PropVariant.h" diff --git a/CPP/7zip/Archive/Cab/CabItem.h b/CPP/7zip/Archive/Cab/CabItem.h index 21327eca..8b41fe69 100755 --- a/CPP/7zip/Archive/Cab/CabItem.h +++ b/CPP/7zip/Archive/Cab/CabItem.h @@ -4,7 +4,7 @@ #define __ARCHIVE_CAB_ITEM_H #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "CabHeader.h" namespace NArchive { diff --git a/CPP/7zip/Archive/Chm/ChmIn.h b/CPP/7zip/Archive/Chm/ChmIn.h index ebf3c4be..e677c618 100755 --- a/CPP/7zip/Archive/Chm/ChmIn.h +++ b/CPP/7zip/Archive/Chm/ChmIn.h @@ -3,7 +3,7 @@ #ifndef __ARCHIVE_CHM_IN_H #define __ARCHIVE_CHM_IN_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Buffer.h" #include "../../IStream.h" #include "../../Common/InBuffer.h" diff --git a/CPP/7zip/Archive/Common/CoderMixer.cpp b/CPP/7zip/Archive/Common/CoderMixer.cpp new file mode 100755 index 00000000..db626fe1 --- /dev/null +++ b/CPP/7zip/Archive/Common/CoderMixer.cpp @@ -0,0 +1,19 @@ +// CoderMixer.cpp + +#include "StdAfx.h" + +#include "CoderMixer.h" + +namespace NCoderMixer { + +void CCoderInfo::SetCoderInfo(const UInt64 *inSize, const UInt64 *outSize) +{ + InSizeAssigned = (inSize != 0); + if (InSizeAssigned) + InSizeValue = *inSize; + OutSizeAssigned = (outSize != 0); + if (OutSizeAssigned) + OutSizeValue = *outSize; +} + +} diff --git a/CPP/7zip/Archive/Common/CoderMixer.h b/CPP/7zip/Archive/Common/CoderMixer.h new file mode 100755 index 00000000..6379dd80 --- /dev/null +++ b/CPP/7zip/Archive/Common/CoderMixer.h @@ -0,0 +1,32 @@ +// CoderMixer.h + +#ifndef __CODER_MIXER_H +#define __CODER_MIXER_H + +#include "../../../Common/MyCom.h" +#include "../../ICoder.h" + +namespace NCoderMixer { + +struct CCoderInfo +{ + CMyComPtr<ICompressCoder> Coder; + CMyComPtr<ISequentialInStream> InStream; + CMyComPtr<ISequentialOutStream> OutStream; + CMyComPtr<ICompressProgressInfo> Progress; + + UInt64 InSizeValue; + UInt64 OutSizeValue; + bool InSizeAssigned; + bool OutSizeAssigned; + + void ReInit() + { + InSizeAssigned = OutSizeAssigned = false; + } + + void SetCoderInfo(const UInt64 *inSize, const UInt64 *outSize); +}; + +} +#endif diff --git a/CPP/7zip/Archive/Common/CoderMixer2.cpp b/CPP/7zip/Archive/Common/CoderMixer2.cpp index 8f46e985..d11e9e60 100755 --- a/CPP/7zip/Archive/Common/CoderMixer2.cpp +++ b/CPP/7zip/Archive/Common/CoderMixer2.cpp @@ -4,7 +4,7 @@ #include "CoderMixer2.h" -namespace NCoderMixer2 { +namespace NCoderMixer { CBindReverseConverter::CBindReverseConverter(const CBindInfo &srcBindInfo): _srcBindInfo(srcBindInfo) @@ -81,7 +81,7 @@ void CBindReverseConverter::CreateReverseBindInfo(CBindInfo &destBindInfo) destBindInfo.InStreams.Add(_srcOutToDestInMap[_srcBindInfo.OutStreams[i]]); } -CCoderInfo::CCoderInfo(UInt32 numInStreams, UInt32 numOutStreams): +CCoderInfo2::CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams): NumInStreams(numInStreams), NumOutStreams(numOutStreams) { @@ -111,7 +111,7 @@ static void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes, } } -void CCoderInfo::SetCoderInfo(const UInt64 **inSizes, +void CCoderInfo2::SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes) { SetSizes(inSizes, InSizes, InSizePointers, NumInStreams); diff --git a/CPP/7zip/Archive/Common/CoderMixer2.h b/CPP/7zip/Archive/Common/CoderMixer2.h index 597a7b60..be68c680 100755 --- a/CPP/7zip/Archive/Common/CoderMixer2.h +++ b/CPP/7zip/Archive/Common/CoderMixer2.h @@ -3,12 +3,12 @@ #ifndef __CODER_MIXER2_H #define __CODER_MIXER2_H -#include "../../../Common/Vector.h" +#include "../../../Common/MyVector.h" #include "../../../Common/Types.h" #include "../../../Common/MyCom.h" #include "../../ICoder.h" -namespace NCoderMixer2 { +namespace NCoderMixer { struct CBindPair { @@ -127,7 +127,7 @@ struct CBindInfo class CBindReverseConverter { UInt32 _numSrcOutStreams; - NCoderMixer2::CBindInfo _srcBindInfo; + NCoderMixer::CBindInfo _srcBindInfo; CRecordVector<UInt32> _srcInToDestOutMap; CRecordVector<UInt32> _srcOutToDestInMap; CRecordVector<UInt32> _destInToSrcOutMap; @@ -135,11 +135,11 @@ public: UInt32 NumSrcInStreams; CRecordVector<UInt32> DestOutToSrcInMap; - CBindReverseConverter(const NCoderMixer2::CBindInfo &srcBindInfo); - void CreateReverseBindInfo(NCoderMixer2::CBindInfo &destBindInfo); + CBindReverseConverter(const NCoderMixer::CBindInfo &srcBindInfo); + void CreateReverseBindInfo(NCoderMixer::CBindInfo &destBindInfo); }; -struct CCoderInfo +struct CCoderInfo2 { CMyComPtr<ICompressCoder> Coder; CMyComPtr<ICompressCoder2> Coder2; @@ -151,8 +151,14 @@ struct CCoderInfo CRecordVector<const UInt64 *> InSizePointers; CRecordVector<const UInt64 *> OutSizePointers; - CCoderInfo(UInt32 numInStreams, UInt32 numOutStreams); + CCoderInfo2(UInt32 numInStreams, UInt32 numOutStreams); void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes); + + HRESULT QueryInterface(REFGUID iid, void** pp) const + { + IUnknown *p = Coder ? (IUnknown *)Coder : (IUnknown *)Coder2; + return p->QueryInterface(iid, pp); + } }; class CCoderMixer2 diff --git a/CPP/7zip/Archive/Common/CoderMixer2MT.cpp b/CPP/7zip/Archive/Common/CoderMixer2MT.cpp index 8a37a10d..bff689dd 100755 --- a/CPP/7zip/Archive/Common/CoderMixer2MT.cpp +++ b/CPP/7zip/Archive/Common/CoderMixer2MT.cpp @@ -3,16 +3,11 @@ #include "StdAfx.h" #include "CoderMixer2MT.h" -#include "CrossThreadProgress.h" -using namespace NWindows; -using namespace NSynchronization; +namespace NCoderMixer { -namespace NCoderMixer2 { - -CThreadCoderInfo::CThreadCoderInfo(UInt32 numInStreams, UInt32 numOutStreams): - ExitEvent(NULL), - CCoderInfo(numInStreams, numOutStreams) +CCoder2::CCoder2(UInt32 numInStreams, UInt32 numOutStreams): + CCoderInfo2(numInStreams, numOutStreams) { InStreams.Reserve(NumInStreams); InStreamPointers.Reserve(NumInStreams); @@ -20,62 +15,38 @@ CThreadCoderInfo::CThreadCoderInfo(UInt32 numInStreams, UInt32 numOutStreams): OutStreamPointers.Reserve(NumOutStreams); } -class CCoderInfoFlusher2 +void CCoder2::Execute() { Code(NULL); } + +void CCoder2::Code(ICompressProgressInfo *progress) { - CThreadCoderInfo *m_CoderInfo; -public: - CCoderInfoFlusher2(CThreadCoderInfo *coderInfo): m_CoderInfo(coderInfo) {} - ~CCoderInfoFlusher2() + InStreamPointers.Clear(); + OutStreamPointers.Clear(); + UInt32 i; + for (i = 0; i < NumInStreams; i++) { - int i; - for (i = 0; i < m_CoderInfo->InStreams.Size(); i++) - m_CoderInfo->InStreams[i].Release(); - for (i = 0; i < m_CoderInfo->OutStreams.Size(); i++) - m_CoderInfo->OutStreams[i].Release(); - m_CoderInfo->CompressionCompletedEvent.Set(); + if (InSizePointers[i] != NULL) + InSizePointers[i] = &InSizes[i]; + InStreamPointers.Add(InStreams[i]); } -}; - -bool CThreadCoderInfo::WaitAndCode() -{ - HANDLE events[2] = { ExitEvent, CompressEvent }; - DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE); - if (waitResult == WAIT_OBJECT_0 + 0) - return false; - + for (i = 0; i < NumOutStreams; i++) { - InStreamPointers.Clear(); - OutStreamPointers.Clear(); - UInt32 i; - for (i = 0; i < NumInStreams; i++) - { - if (InSizePointers[i] != NULL) - InSizePointers[i] = &InSizes[i]; - InStreamPointers.Add(InStreams[i]); - } - for (i = 0; i < NumOutStreams; i++) - { - if (OutSizePointers[i] != NULL) - OutSizePointers[i] = &OutSizes[i]; - OutStreamPointers.Add(OutStreams[i]); - } - CCoderInfoFlusher2 coderInfoFlusher(this); - if (Coder) - Result = Coder->Code(InStreamPointers[0], - OutStreamPointers[0], - InSizePointers[0], - OutSizePointers[0], - Progress); - else - Result = Coder2->Code(&InStreamPointers.Front(), - &InSizePointers.Front(), - NumInStreams, - &OutStreamPointers.Front(), - &OutSizePointers.Front(), - NumOutStreams, - Progress); + if (OutSizePointers[i] != NULL) + OutSizePointers[i] = &OutSizes[i]; + OutStreamPointers.Add(OutStreams[i]); + } + if (Coder) + Result = Coder->Code(InStreamPointers[0], OutStreamPointers[0], + InSizePointers[0], OutSizePointers[0], progress); + else + Result = Coder2->Code(&InStreamPointers.Front(), &InSizePointers.Front(), NumInStreams, + &OutStreamPointers.Front(), &OutSizePointers.Front(), NumOutStreams, progress); + { + int i; + for (i = 0; i < InStreams.Size(); i++) + InStreams[i].Release(); + for (i = 0; i < OutStreams.Size(); i++) + OutStreams[i].Release(); } - return true; } static void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes, @@ -99,54 +70,15 @@ static void SetSizes(const UInt64 **srcSizes, CRecordVector<UInt64> &sizes, } -void CThreadCoderInfo::SetCoderInfo(const UInt64 **inSizes, - const UInt64 **outSizes, ICompressProgressInfo *progress) +void CCoder2::SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes) { - Progress = progress; SetSizes(inSizes, InSizes, InSizePointers, NumInStreams); SetSizes(outSizes, OutSizes, OutSizePointers, NumOutStreams); } -static THREAD_FUNC_DECL CoderThread(void *threadCoderInfo) -{ - for (;;) - { - if (!((CThreadCoderInfo *)threadCoderInfo)->WaitAndCode()) - return 0; - } -} - ////////////////////////////////////// // CCoderMixer2MT -static THREAD_FUNC_DECL MainCoderThread(void *threadCoderInfo) -{ - for (;;) - { - if (!((CCoderMixer2MT *)threadCoderInfo)->MyCode()) - return 0; - } -} - -CCoderMixer2MT::CCoderMixer2MT() -{ - if (CreateEvents() != S_OK) - throw 271824; - if (_mainThread.Create(MainCoderThread, this) != S_OK) - throw 271825; -} - -CCoderMixer2MT::~CCoderMixer2MT() -{ - _exitEvent.Set(); - _mainThread.Wait(); - for(int i = 0; i < _threads.Size(); i++) - { - _threads[i].Wait(); - _threads[i].Close(); - } -} - HRESULT CCoderMixer2MT::SetBindInfo(const CBindInfo &bindInfo) { _bindInfo = bindInfo; @@ -161,48 +93,23 @@ HRESULT CCoderMixer2MT::SetBindInfo(const CBindInfo &bindInfo) void CCoderMixer2MT::AddCoderCommon() { - int index = _coderInfoVector.Size(); - const CCoderStreamsInfo &CoderStreamsInfo = _bindInfo.Coders[index]; - - CThreadCoderInfo threadCoderInfo(CoderStreamsInfo.NumInStreams, - CoderStreamsInfo.NumOutStreams); - _coderInfoVector.Add(threadCoderInfo); - CThreadCoderInfo *tci = &_coderInfoVector.Back(); - tci->CreateEvents(); - tci->ExitEvent = _exitEvent; - - NWindows::CThread newThread; - _threads.Add(newThread); - if (_threads.Back().Create(CoderThread, tci) != S_OK) - throw 271824; + const CCoderStreamsInfo &c = _bindInfo.Coders[_coders.Size()]; + CCoder2 threadCoderInfo(c.NumInStreams, c.NumOutStreams); + _coders.Add(threadCoderInfo); } void CCoderMixer2MT::AddCoder(ICompressCoder *coder) { AddCoderCommon(); - _coderInfoVector.Back().Coder = coder; + _coders.Back().Coder = coder; } void CCoderMixer2MT::AddCoder2(ICompressCoder2 *coder) { AddCoderCommon(); - _coderInfoVector.Back().Coder2 = coder; + _coders.Back().Coder2 = coder; } -/* -void CCoderMixer2MT::FinishAddingCoders() -{ - for(int i = 0; i < _coderInfoVector.Size(); i++) - { - DWORD id; - HANDLE newThread = ::CreateThread(NULL, 0, CoderThread, - &_coderInfoVector[i], 0, &id); - if (newThread == 0) - throw 271824; - _threads.Add(newThread); - } -} -*/ void CCoderMixer2MT::ReInit() { @@ -211,17 +118,16 @@ void CCoderMixer2MT::ReInit() } -STDMETHODIMP CCoderMixer2MT::Init(ISequentialInStream **inStreams, - ISequentialOutStream **outStreams) +HRESULT CCoderMixer2MT::Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams) { /* - if (_coderInfoVector.Size() != _bindInfo.Coders.Size()) + if (_coders.Size() != _bindInfo.Coders.Size()) throw 0; */ int i; - for(i = 0; i < _coderInfoVector.Size(); i++) + for(i = 0; i < _coders.Size(); i++) { - CThreadCoderInfo &coderInfo = _coderInfoVector[i]; + CCoder2 &coderInfo = _coders[i]; const CCoderStreamsInfo &coderStreamsInfo = _bindInfo.Coders[i]; coderInfo.InStreams.Clear(); UInt32 j; @@ -241,45 +147,26 @@ STDMETHODIMP CCoderMixer2MT::Init(ISequentialInStream **inStreams, _bindInfo.FindOutStream(bindPair.OutIndex, outCoderIndex, outCoderStreamIndex); _streamBinders[i].CreateStreams( - &_coderInfoVector[inCoderIndex].InStreams[inCoderStreamIndex], - &_coderInfoVector[outCoderIndex].OutStreams[outCoderStreamIndex]); + &_coders[inCoderIndex].InStreams[inCoderStreamIndex], + &_coders[outCoderIndex].OutStreams[outCoderStreamIndex]); } for(i = 0; i < _bindInfo.InStreams.Size(); i++) { UInt32 inCoderIndex, inCoderStreamIndex; _bindInfo.FindInStream(_bindInfo.InStreams[i], inCoderIndex, inCoderStreamIndex); - _coderInfoVector[inCoderIndex].InStreams[inCoderStreamIndex] = inStreams[i]; + _coders[inCoderIndex].InStreams[inCoderStreamIndex] = inStreams[i]; } for(i = 0; i < _bindInfo.OutStreams.Size(); i++) { UInt32 outCoderIndex, outCoderStreamIndex; _bindInfo.FindOutStream(_bindInfo.OutStreams[i], outCoderIndex, outCoderStreamIndex); - _coderInfoVector[outCoderIndex].OutStreams[outCoderStreamIndex] = outStreams[i]; + _coders[outCoderIndex].OutStreams[outCoderStreamIndex] = outStreams[i]; } return S_OK; } - -bool CCoderMixer2MT::MyCode() -{ - HANDLE events[2] = { _exitEvent, _startCompressingEvent }; - DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE); - if (waitResult == WAIT_OBJECT_0 + 0) - return false; - - int i; - for(i = 0; i < _coderInfoVector.Size(); i++) - _coderInfoVector[i].CompressEvent.Set(); - for (i = 0; i < _coderInfoVector.Size(); i++) - _coderInfoVector[i].CompressionCompletedEvent.Lock(); - - _compressingFinishedEvent.Set(); - return true; -} - - STDMETHODIMP CCoderMixer2MT::Code(ISequentialInStream **inStreams, const UInt64 ** /* inSizes */, UInt32 numInStreams, @@ -294,56 +181,48 @@ STDMETHODIMP CCoderMixer2MT::Code(ISequentialInStream **inStreams, Init(inStreams, outStreams); - _compressingFinishedEvent.Reset(); // ? - - CCrossThreadProgress *progressSpec = new CCrossThreadProgress; - CMyComPtr<ICompressProgressInfo> crossProgress = progressSpec; - RINOK(progressSpec->Create()); - progressSpec->Init(); - _coderInfoVector[_progressCoderIndex].Progress = crossProgress; + int i; + for (i = 0; i < _coders.Size(); i++) + if (i != _progressCoderIndex) + { + RINOK(_coders[i].Create()); + } + + for (i = 0; i < _coders.Size(); i++) + if (i != _progressCoderIndex) + _coders[i].Start(); - _startCompressingEvent.Set(); + _coders[_progressCoderIndex].Code(progress); + for (i = 0; i < _coders.Size(); i++) + if (i != _progressCoderIndex) + _coders[i].WaitFinish(); - for (;;) + for (i = 0; i < _coders.Size(); i++) { - HANDLE events[2] = {_compressingFinishedEvent, progressSpec->ProgressEvent }; - DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE); - if (waitResult == WAIT_OBJECT_0 + 0) - break; - if (progress != NULL) - progressSpec->Result = progress->SetRatioInfo(progressSpec->InSize, - progressSpec->OutSize); - else - progressSpec->Result = S_OK; - progressSpec->WaitEvent.Set(); + HRESULT result = _coders[i].Result; + if (result == E_ABORT) + return result; } - - int i; - for(i = 0; i < _coderInfoVector.Size(); i++) + for (i = 0; i < _coders.Size(); i++) { - HRESULT result = _coderInfoVector[i].Result; + HRESULT result = _coders[i].Result; if (result == S_FALSE) return result; } - for(i = 0; i < _coderInfoVector.Size(); i++) + for (i = 0; i < _coders.Size(); i++) { - HRESULT result = _coderInfoVector[i].Result; + HRESULT result = _coders[i].Result; if (result != S_OK && result != E_FAIL) return result; } - for(i = 0; i < _coderInfoVector.Size(); i++) + for (i = 0; i < _coders.Size(); i++) { - HRESULT result = _coderInfoVector[i].Result; + HRESULT result = _coders[i].Result; if (result != S_OK) return result; } return S_OK; } -UInt64 CCoderMixer2MT::GetWriteProcessedSize(UInt32 binderIndex) const -{ - return _streamBinders[binderIndex].ProcessedSize; -} - } diff --git a/CPP/7zip/Archive/Common/CoderMixer2MT.h b/CPP/7zip/Archive/Common/CoderMixer2MT.h index 67c0c8a5..3cd3282b 100755 --- a/CPP/7zip/Archive/Common/CoderMixer2MT.h +++ b/CPP/7zip/Archive/Common/CoderMixer2MT.h @@ -5,73 +5,55 @@ #include "CoderMixer2.h" #include "../../../Common/MyCom.h" -#include "../../../Windows/Thread.h" #include "../../Common/StreamBinder.h" +#include "../../Common/VirtThread.h" -namespace NCoderMixer2 { +namespace NCoderMixer { -// CreateEvents(); -// { -// SetCoderInfo() -// Init Streams -// set CompressEvent() -// wait CompressionCompletedEvent -// } - -struct CThreadCoderInfo: public CCoderInfo +struct CCoder2: public CCoderInfo2, public CVirtThread { - NWindows::NSynchronization::CAutoResetEvent CompressEvent; - HANDLE ExitEvent; - NWindows::NSynchronization::CAutoResetEvent CompressionCompletedEvent; - + HRESULT Result; CObjectVector< CMyComPtr<ISequentialInStream> > InStreams; CObjectVector< CMyComPtr<ISequentialOutStream> > OutStreams; - CRecordVector<ISequentialInStream *> InStreamPointers; - CRecordVector<ISequentialOutStream *> OutStreamPointers; - - CMyComPtr<ICompressProgressInfo> Progress; // CMyComPtr - HRESULT Result; + CRecordVector<ISequentialInStream*> InStreamPointers; + CRecordVector<ISequentialOutStream*> OutStreamPointers; - CThreadCoderInfo(UInt32 numInStreams, UInt32 numOutStreams); - void SetCoderInfo(const UInt64 **inSizes, - const UInt64 **outSizes, ICompressProgressInfo *progress); - bool WaitAndCode(); - HRes CreateEvents() - { - RINOK(CompressEvent.CreateIfNotCreated()); - return CompressionCompletedEvent.CreateIfNotCreated(); - } + CCoder2(UInt32 numInStreams, UInt32 numOutStreams); + void SetCoderInfo(const UInt64 **inSizes, const UInt64 **outSizes); + virtual void Execute(); + void Code(ICompressProgressInfo *progress); }; -// SetBindInfo() -// for each coder -// { -// AddCoder[2]() -// } -// -// for each file -// { -// ReInit() -// for each coder -// { -// SetCoderInfo -// } -// SetProgressIndex(UInt32 coderIndex); -// Code -// } - +/* + SetBindInfo() + for each coder + AddCoder[2]() + SetProgressIndex(UInt32 coderIndex); + + for each file + { + ReInit() + for each coder + SetCoderInfo + Code + } +*/ class CCoderMixer2MT: public ICompressCoder2, public CCoderMixer2, public CMyUnknownImp { - MY_UNKNOWN_IMP + CBindInfo _bindInfo; + CObjectVector<CStreamBinder> _streamBinders; + int _progressCoderIndex; + void AddCoderCommon(); + HRESULT Init(ISequentialInStream **inStreams, ISequentialOutStream **outStreams); public: - STDMETHOD(Init)(ISequentialInStream **inStreams, - ISequentialOutStream **outStreams); + CObjectVector<CCoder2> _coders; + MY_UNKNOWN_IMP STDMETHOD(Code)(ISequentialInStream **inStreams, const UInt64 **inSizes, @@ -81,50 +63,17 @@ public: UInt32 numOutStreams, ICompressProgressInfo *progress); - - CCoderMixer2MT(); - ~CCoderMixer2MT(); - void AddCoderCommon(); + HRESULT SetBindInfo(const CBindInfo &bindInfo); void AddCoder(ICompressCoder *coder); void AddCoder2(ICompressCoder2 *coder); + void SetProgressCoderIndex(int coderIndex) { _progressCoderIndex = coderIndex; } void ReInit(); void SetCoderInfo(UInt32 coderIndex, const UInt64 **inSizes, const UInt64 **outSizes) - { _coderInfoVector[coderIndex].SetCoderInfo(inSizes, outSizes, NULL); } - void SetProgressCoderIndex(UInt32 coderIndex) - { _progressCoderIndex = coderIndex; } - - - UInt64 GetWriteProcessedSize(UInt32 binderIndex) const; - - - bool MyCode(); - -private: - CBindInfo _bindInfo; - CObjectVector<CStreamBinder> _streamBinders; - CObjectVector<CThreadCoderInfo> _coderInfoVector; - CRecordVector<NWindows::CThread> _threads; - NWindows::CThread _mainThread; - - NWindows::NSynchronization::CAutoResetEvent _startCompressingEvent; - NWindows::NSynchronization::CAutoResetEvent _compressingFinishedEvent; - - NWindows::NSynchronization::CManualResetEvent _exitEvent; - UInt32 _progressCoderIndex; - - HRes CreateEvents() - { - RINOK(_startCompressingEvent.CreateIfNotCreated()); - RINOK(_compressingFinishedEvent.CreateIfNotCreated()); - return _exitEvent.CreateIfNotCreated(); - } - -public: - HRESULT SetBindInfo(const CBindInfo &bindInfo); - + { _coders[coderIndex].SetCoderInfo(inSizes, outSizes); } + UInt64 GetWriteProcessedSize(UInt32 binderIndex) const + { return _streamBinders[binderIndex].ProcessedSize; } }; } #endif - diff --git a/CPP/7zip/Archive/Common/CoderMixerMT.cpp b/CPP/7zip/Archive/Common/CoderMixerMT.cpp new file mode 100755 index 00000000..ad6e12d8 --- /dev/null +++ b/CPP/7zip/Archive/Common/CoderMixerMT.cpp @@ -0,0 +1,97 @@ +// CoderMixerMT.cpp + +#include "StdAfx.h" + +#include "CoderMixerMT.h" + +namespace NCoderMixer { + +void CCoder::Execute() { Code(NULL); } + +void CCoder::Code(ICompressProgressInfo *progress) +{ + Result = Coder->Code(InStream, OutStream, + InSizeAssigned ? &InSizeValue : NULL, + OutSizeAssigned ? &OutSizeValue : NULL, + progress); + InStream.Release(); + OutStream.Release(); +} + +void CCoderMixerMT::AddCoder(ICompressCoder *coder) +{ + _coders.Add(CCoder()); + _coders.Back().Coder = coder; +} + +void CCoderMixerMT::ReInit() +{ + for(int i = 0; i < _coders.Size(); i++) + _coders[i].ReInit(); +} + +STDMETHODIMP CCoderMixerMT::Code(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 * /* outSize */, + ICompressProgressInfo *progress) +{ + _coders.Front().InStream = inStream; + int i; + _coders.Back().OutStream = outStream; + + for (i = 0; i < _coders.Size(); i++) + if (i != _progressCoderIndex) + { + RINOK(_coders[i].Create()); + } + + while (_streamBinders.Size() + 1 < _coders.Size()) + { + _streamBinders.Add(CStreamBinder()); + int i = _streamBinders.Size() - 1; + CStreamBinder &sb = _streamBinders.Back(); + RINOK(sb.CreateEvents()); + sb.CreateStreams(&_coders[i + 1].InStream, &_coders[i].OutStream); + } + + for(i = 0; i < _streamBinders.Size(); i++) + _streamBinders[i].ReInit(); + + for (i = 0; i < _coders.Size(); i++) + if (i != _progressCoderIndex) + _coders[i].Start(); + + _coders[_progressCoderIndex].Code(progress); + + for (i = 0; i < _coders.Size(); i++) + if (i != _progressCoderIndex) + _coders[i].WaitFinish(); + + for (i = 0; i < _coders.Size(); i++) + { + HRESULT result = _coders[i].Result; + if (result == E_ABORT) + return result; + } + for (i = 0; i < _coders.Size(); i++) + { + HRESULT result = _coders[i].Result; + if (result == S_FALSE) + return result; + } + for (i = 0; i < _coders.Size(); i++) + { + HRESULT result = _coders[i].Result; + if (result != S_OK && result != E_FAIL) + return result; + } + for (i = 0; i < _coders.Size(); i++) + { + HRESULT result = _coders[i].Result; + if (result != S_OK) + return result; + } + return S_OK; +} + +} diff --git a/CPP/7zip/Archive/Common/CoderMixerMT.h b/CPP/7zip/Archive/Common/CoderMixerMT.h new file mode 100755 index 00000000..a2250e8a --- /dev/null +++ b/CPP/7zip/Archive/Common/CoderMixerMT.h @@ -0,0 +1,68 @@ +// CoderMixerMT.h + +#ifndef __CODER_MIXER_MT_H +#define __CODER_MIXER_MT_H + +#include "../../../Common/Vector.h" +#include "../../../Common/MyCom.h" +#include "../../ICoder.h" +#include "../../Common/StreamBinder.h" +#include "../../Common/VirtThread.h" +#include "CoderMixer.h" + +namespace NCoderMixer { + +struct CCoder: public CCoderInfo, public CVirtThread +{ + HRESULT Result; + + virtual void Execute(); + void Code(ICompressProgressInfo *progress); +}; + +/* + for each coder + AddCoder() + SetProgressIndex(UInt32 coderIndex); + + for each file + { + ReInit() + for each coder + SetCoderInfo + Code + } +*/ + + +class CCoderMixerMT: + public ICompressCoder, + public CMyUnknownImp +{ + CObjectVector<CStreamBinder> _streamBinders; + int _progressCoderIndex; + +public: + CObjectVector<CCoder> _coders; + MY_UNKNOWN_IMP + + STDMETHOD(Code)(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress); + + void AddCoder(ICompressCoder *coder); + void SetProgressCoderIndex(int coderIndex) { _progressCoderIndex = coderIndex; } + + void ReInit(); + void SetCoderInfo(UInt32 coderIndex, const UInt64 *inSize, const UInt64 *outSize) + { _coders[coderIndex].SetCoderInfo(inSize, outSize); } + + /* + UInt64 GetWriteProcessedSize(UInt32 binderIndex) const + { return _streamBinders[binderIndex].ProcessedSize; } + */ +}; + +} +#endif diff --git a/CPP/7zip/Archive/Common/HandlerOut.cpp b/CPP/7zip/Archive/Common/HandlerOut.cpp new file mode 100755 index 00000000..7c214c3c --- /dev/null +++ b/CPP/7zip/Archive/Common/HandlerOut.cpp @@ -0,0 +1,609 @@ +// HandlerOutCommon.cpp + +#include "StdAfx.h" + +#include "HandlerOut.h" +#include "../../../Windows/PropVariant.h" +#include "../../../Common/StringToInt.h" +#include "../../ICoder.h" +#include "../Common/ParseProperties.h" + +#ifdef COMPRESS_MT +#include "../../../Windows/System.h" +#endif + +using namespace NWindows; + +namespace NArchive { + +static const wchar_t *kCopyMethod = L"Copy"; +static const wchar_t *kLZMAMethodName = L"LZMA"; +static const wchar_t *kLZMA2MethodName = L"LZMA2"; +static const wchar_t *kBZip2MethodName = L"BZip2"; +static const wchar_t *kPpmdMethodName = L"PPMd"; +static const wchar_t *kDeflateMethodName = L"Deflate"; +static const wchar_t *kDeflate64MethodName = L"Deflate64"; + +static const wchar_t *kLzmaMatchFinderX1 = L"HC4"; +static const wchar_t *kLzmaMatchFinderX5 = L"BT4"; + +static const UInt32 kLzmaAlgoX1 = 0; +static const UInt32 kLzmaAlgoX5 = 1; + +static const UInt32 kLzmaDicSizeX1 = 1 << 16; +static const UInt32 kLzmaDicSizeX3 = 1 << 20; +static const UInt32 kLzmaDicSizeX5 = 1 << 24; +static const UInt32 kLzmaDicSizeX7 = 1 << 25; +static const UInt32 kLzmaDicSizeX9 = 1 << 26; + +static const UInt32 kLzmaFastBytesX1 = 32; +static const UInt32 kLzmaFastBytesX7 = 64; + +static const UInt32 kPpmdMemSizeX1 = (1 << 22); +static const UInt32 kPpmdMemSizeX5 = (1 << 24); +static const UInt32 kPpmdMemSizeX7 = (1 << 26); +static const UInt32 kPpmdMemSizeX9 = (192 << 20); + +static const UInt32 kPpmdOrderX1 = 4; +static const UInt32 kPpmdOrderX5 = 6; +static const UInt32 kPpmdOrderX7 = 16; +static const UInt32 kPpmdOrderX9 = 32; + +static const UInt32 kDeflateAlgoX1 = 0; +static const UInt32 kDeflateAlgoX5 = 1; + +static const UInt32 kDeflateFastBytesX1 = 32; +static const UInt32 kDeflateFastBytesX7 = 64; +static const UInt32 kDeflateFastBytesX9 = 128; + +static const UInt32 kDeflatePassesX1 = 1; +static const UInt32 kDeflatePassesX7 = 3; +static const UInt32 kDeflatePassesX9 = 10; + +static const UInt32 kBZip2NumPassesX1 = 1; +static const UInt32 kBZip2NumPassesX7 = 2; +static const UInt32 kBZip2NumPassesX9 = 7; + +static const UInt32 kBZip2DicSizeX1 = 100000; +static const UInt32 kBZip2DicSizeX3 = 500000; +static const UInt32 kBZip2DicSizeX5 = 900000; + +static const wchar_t *kDefaultMethodName = kLZMAMethodName; + +static const wchar_t *kLzmaMatchFinderForHeaders = L"BT2"; +static const UInt32 kDictionaryForHeaders = 1 << 20; +static const UInt32 kNumFastBytesForHeaders = 273; +static const UInt32 kAlgorithmForHeaders = kLzmaAlgoX5; + +static bool AreEqual(const UString &methodName, const wchar_t *s) + { return (methodName.CompareNoCase(s) == 0); } + +static inline bool IsLZMAMethod(const UString &methodName) +{ + return + AreEqual(methodName, kLZMAMethodName) || + AreEqual(methodName, kLZMA2MethodName); +} + +static inline bool IsBZip2Method(const UString &methodName) + { return AreEqual(methodName, kBZip2MethodName); } + +static inline bool IsPpmdMethod(const UString &methodName) + { return AreEqual(methodName, kPpmdMethodName); } + +static inline bool IsDeflateMethod(const UString &methodName) +{ + return + AreEqual(methodName, kDeflateMethodName) || + AreEqual(methodName, kDeflate64MethodName); +} + +struct CNameToPropID +{ + PROPID PropID; + VARTYPE VarType; + const wchar_t *Name; +}; + +CNameToPropID g_NameToPropID[] = +{ + { NCoderPropID::kOrder, VT_UI4, L"O" }, + { NCoderPropID::kPosStateBits, VT_UI4, L"PB" }, + { NCoderPropID::kLitContextBits, VT_UI4, L"LC" }, + { NCoderPropID::kLitPosBits, VT_UI4, L"LP" }, + { NCoderPropID::kEndMarker, VT_BOOL, L"eos" }, + + { NCoderPropID::kNumPasses, VT_UI4, L"Pass" }, + { NCoderPropID::kNumFastBytes, VT_UI4, L"fb" }, + { NCoderPropID::kMatchFinderCycles, VT_UI4, L"mc" }, + { NCoderPropID::kAlgorithm, VT_UI4, L"a" }, + { NCoderPropID::kMatchFinder, VT_BSTR, L"mf" }, + { NCoderPropID::kNumThreads, VT_UI4, L"mt" } +}; + +static bool ConvertProperty(PROPVARIANT srcProp, VARTYPE varType, NCOM::CPropVariant &destProp) +{ + if (varType == srcProp.vt) + { + destProp = srcProp; + return true; + } + if (varType == VT_UI1) + { + if (srcProp.vt == VT_UI4) + { + UInt32 value = srcProp.ulVal; + if (value > 0xFF) + return false; + destProp = (Byte)value; + return true; + } + } + else if (varType == VT_BOOL) + { + bool res; + if (SetBoolProperty(res, srcProp) != S_OK) + return false; + destProp = res; + return true; + } + return false; +} + +static int FindPropIdFromStringName(const UString &name) +{ + for (int i = 0; i < sizeof(g_NameToPropID) / sizeof(g_NameToPropID[0]); i++) + if (name.CompareNoCase(g_NameToPropID[i].Name) == 0) + return i; + return -1; +} + +static void SetOneMethodProp(COneMethodInfo &oneMethodInfo, PROPID propID, + const NWindows::NCOM::CPropVariant &value) +{ + for (int j = 0; j < oneMethodInfo.Properties.Size(); j++) + if (oneMethodInfo.Properties[j].Id == propID) + return; + CProp property; + property.Id = propID; + property.Value = value; + oneMethodInfo.Properties.Add(property); +} + +void COutHandler::SetCompressionMethod2(COneMethodInfo &oneMethodInfo + #ifdef COMPRESS_MT + , UInt32 numThreads + #endif + ) +{ + UInt32 level = _level; + if (oneMethodInfo.MethodName.IsEmpty()) + oneMethodInfo.MethodName = kDefaultMethodName; + + if (IsLZMAMethod(oneMethodInfo.MethodName)) + { + UInt32 dicSize = + (level >= 9 ? kLzmaDicSizeX9 : + (level >= 7 ? kLzmaDicSizeX7 : + (level >= 5 ? kLzmaDicSizeX5 : + (level >= 3 ? kLzmaDicSizeX3 : + kLzmaDicSizeX1)))); + + UInt32 algo = + (level >= 5 ? kLzmaAlgoX5 : + kLzmaAlgoX1); + + UInt32 fastBytes = + (level >= 7 ? kLzmaFastBytesX7 : + kLzmaFastBytesX1); + + const wchar_t *matchFinder = + (level >= 5 ? kLzmaMatchFinderX5 : + kLzmaMatchFinderX1); + + SetOneMethodProp(oneMethodInfo, NCoderPropID::kDictionarySize, dicSize); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kAlgorithm, algo); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumFastBytes, fastBytes); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kMatchFinder, matchFinder); + #ifdef COMPRESS_MT + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumThreads, numThreads); + #endif + } + else if (IsDeflateMethod(oneMethodInfo.MethodName)) + { + UInt32 fastBytes = + (level >= 9 ? kDeflateFastBytesX9 : + (level >= 7 ? kDeflateFastBytesX7 : + kDeflateFastBytesX1)); + + UInt32 numPasses = + (level >= 9 ? kDeflatePassesX9 : + (level >= 7 ? kDeflatePassesX7 : + kDeflatePassesX1)); + + UInt32 algo = + (level >= 5 ? kDeflateAlgoX5 : + kDeflateAlgoX1); + + SetOneMethodProp(oneMethodInfo, NCoderPropID::kAlgorithm, algo); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumFastBytes, fastBytes); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumPasses, numPasses); + } + else if (IsBZip2Method(oneMethodInfo.MethodName)) + { + UInt32 numPasses = + (level >= 9 ? kBZip2NumPassesX9 : + (level >= 7 ? kBZip2NumPassesX7 : + kBZip2NumPassesX1)); + + UInt32 dicSize = + (level >= 5 ? kBZip2DicSizeX5 : + (level >= 3 ? kBZip2DicSizeX3 : + kBZip2DicSizeX1)); + + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumPasses, numPasses); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kDictionarySize, dicSize); + #ifdef COMPRESS_MT + SetOneMethodProp(oneMethodInfo, NCoderPropID::kNumThreads, numThreads); + #endif + } + else if (IsPpmdMethod(oneMethodInfo.MethodName)) + { + UInt32 useMemSize = + (level >= 9 ? kPpmdMemSizeX9 : + (level >= 7 ? kPpmdMemSizeX7 : + (level >= 5 ? kPpmdMemSizeX5 : + kPpmdMemSizeX1))); + + UInt32 order = + (level >= 9 ? kPpmdOrderX9 : + (level >= 7 ? kPpmdOrderX7 : + (level >= 5 ? kPpmdOrderX5 : + kPpmdOrderX1))); + + SetOneMethodProp(oneMethodInfo, NCoderPropID::kUsedMemorySize, useMemSize); + SetOneMethodProp(oneMethodInfo, NCoderPropID::kOrder, order); + } +} + +static void SplitParams(const UString &srcString, UStringVector &subStrings) +{ + subStrings.Clear(); + UString name; + int len = srcString.Length(); + if (len == 0) + return; + for (int i = 0; i < len; i++) + { + wchar_t c = srcString[i]; + if (c == L':') + { + subStrings.Add(name); + name.Empty(); + } + else + name += c; + } + subStrings.Add(name); +} + +static void SplitParam(const UString ¶m, UString &name, UString &value) +{ + int eqPos = param.Find(L'='); + if (eqPos >= 0) + { + name = param.Left(eqPos); + value = param.Mid(eqPos + 1); + return; + } + for(int i = 0; i < param.Length(); i++) + { + wchar_t c = param[i]; + if (c >= L'0' && c <= L'9') + { + name = param.Left(i); + value = param.Mid(i); + return; + } + } + name = param; +} + +HRESULT COutHandler::SetParam(COneMethodInfo &oneMethodInfo, const UString &name, const UString &value) +{ + CProp property; + if ( + name.CompareNoCase(L"D") == 0 || + name.CompareNoCase(L"MEM") == 0) + { + UInt32 dicSize; + RINOK(ParsePropDictionaryValue(value, dicSize)); + if (name.CompareNoCase(L"D") == 0) + property.Id = NCoderPropID::kDictionarySize; + else + property.Id = NCoderPropID::kUsedMemorySize; + property.Value = dicSize; + oneMethodInfo.Properties.Add(property); + } + else + { + int index = FindPropIdFromStringName(name); + if (index < 0) + return E_INVALIDARG; + + const CNameToPropID &nameToPropID = g_NameToPropID[index]; + property.Id = nameToPropID.PropID; + + NCOM::CPropVariant propValue; + + if (nameToPropID.VarType == VT_BSTR) + propValue = value; + else if (nameToPropID.VarType == VT_BOOL) + { + bool res; + if (!StringToBool(value, res)) + return E_INVALIDARG; + propValue = res; + } + else + { + UInt32 number; + if (ParseStringToUInt32(value, number) == value.Length()) + propValue = number; + else + propValue = value; + } + + if (!ConvertProperty(propValue, nameToPropID.VarType, property.Value)) + return E_INVALIDARG; + + oneMethodInfo.Properties.Add(property); + } + return S_OK; +} + +HRESULT COutHandler::SetParams(COneMethodInfo &oneMethodInfo, const UString &srcString) +{ + UStringVector params; + SplitParams(srcString, params); + if (params.Size() > 0) + oneMethodInfo.MethodName = params[0]; + for (int i = 1; i < params.Size(); i++) + { + const UString ¶m = params[i]; + UString name, value; + SplitParam(param, name, value); + RINOK(SetParam(oneMethodInfo, name, value)); + } + return S_OK; +} + +HRESULT COutHandler::SetSolidSettings(const UString &s) +{ + bool res; + if (StringToBool(s, res)) + { + if (res) + InitSolid(); + else + _numSolidFiles = 1; + return S_OK; + } + UString s2 = s; + s2.MakeUpper(); + for (int i = 0; i < s2.Length();) + { + const wchar_t *start = ((const wchar_t *)s2) + i; + const wchar_t *end; + UInt64 v = ConvertStringToUInt64(start, &end); + if (start == end) + { + if (s2[i++] != 'E') + return E_INVALIDARG; + _solidExtension = true; + continue; + } + i += (int)(end - start); + if (i == s2.Length()) + return E_INVALIDARG; + wchar_t c = s2[i++]; + switch(c) + { + case 'F': + if (v < 1) + v = 1; + _numSolidFiles = v; + break; + case 'B': + _numSolidBytes = v; + _numSolidBytesDefined = true; + break; + case 'K': + _numSolidBytes = (v << 10); + _numSolidBytesDefined = true; + break; + case 'M': + _numSolidBytes = (v << 20); + _numSolidBytesDefined = true; + break; + case 'G': + _numSolidBytes = (v << 30); + _numSolidBytesDefined = true; + break; + default: + return E_INVALIDARG; + } + } + return S_OK; +} + +HRESULT COutHandler::SetSolidSettings(const PROPVARIANT &value) +{ + switch(value.vt) + { + case VT_EMPTY: + InitSolid(); + return S_OK; + case VT_BSTR: + return SetSolidSettings(value.bstrVal); + default: + return E_INVALIDARG; + } +} + +void COutHandler::Init() +{ + _removeSfxBlock = false; + _compressHeaders = true; + _encryptHeaders = false; + + WriteModified = true; + WriteCreated = false; + WriteAccessed = false; + + #ifdef COMPRESS_MT + _numThreads = NWindows::NSystem::GetNumberOfProcessors(); + #endif + + _level = 5; + _autoFilter = true; + _volumeMode = false; + InitSolid(); +} + +void COutHandler::BeforeSetProperty() +{ + Init(); + #ifdef COMPRESS_MT + numProcessors = NSystem::GetNumberOfProcessors(); + #endif + + mainDicSize = 0xFFFFFFFF; + mainDicMethodIndex = 0xFFFFFFFF; + minNumber = 0; +} + +HRESULT COutHandler::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value) +{ + UString name = nameSpec; + name.MakeUpper(); + if (name.IsEmpty()) + return E_INVALIDARG; + + if (name[0] == 'X') + { + name.Delete(0); + _level = 9; + return ParsePropValue(name, value, _level); + } + + if (name[0] == L'S') + { + name.Delete(0); + if (name.IsEmpty()) + return SetSolidSettings(value); + if (value.vt != VT_EMPTY) + return E_INVALIDARG; + return SetSolidSettings(name); + } + + UInt32 number; + int index = ParseStringToUInt32(name, number); + UString realName = name.Mid(index); + if (index == 0) + { + if(name.Left(2).CompareNoCase(L"MT") == 0) + { + #ifdef COMPRESS_MT + RINOK(ParseMtProp(name.Mid(2), value, numProcessors, _numThreads)); + #endif + return S_OK; + } + if (name.CompareNoCase(L"RSFX") == 0) + return SetBoolProperty(_removeSfxBlock, value); + if (name.CompareNoCase(L"F") == 0) + return SetBoolProperty(_autoFilter, value); + if (name.CompareNoCase(L"HC") == 0) + return SetBoolProperty(_compressHeaders, value); + if (name.CompareNoCase(L"HCF") == 0) + { + bool compressHeadersFull = true; + RINOK(SetBoolProperty(compressHeadersFull, value)); + if (!compressHeadersFull) + return E_INVALIDARG; + return S_OK; + } + if (name.CompareNoCase(L"HE") == 0) + return SetBoolProperty(_encryptHeaders, value); + if (name.CompareNoCase(L"TM") == 0) + return SetBoolProperty(WriteModified, value); + if (name.CompareNoCase(L"TC") == 0) + return SetBoolProperty(WriteCreated, value); + if (name.CompareNoCase(L"TA") == 0) + return SetBoolProperty(WriteAccessed, value); + if (name.CompareNoCase(L"V") == 0) + return SetBoolProperty(_volumeMode, value); + number = 0; + } + if (number > 10000) + return E_FAIL; + if (number < minNumber) + return E_INVALIDARG; + number -= minNumber; + for(int j = _methods.Size(); j <= (int)number; j++) + { + COneMethodInfo oneMethodInfo; + _methods.Add(oneMethodInfo); + } + + COneMethodInfo &oneMethodInfo = _methods[number]; + + if (realName.Length() == 0) + { + if (value.vt != VT_BSTR) + return E_INVALIDARG; + + RINOK(SetParams(oneMethodInfo, value.bstrVal)); + } + else + { + CProp property; + if (realName.Left(1).CompareNoCase(L"D") == 0) + { + UInt32 dicSize; + RINOK(ParsePropDictionaryValue(realName.Mid(1), value, dicSize)); + property.Id = NCoderPropID::kDictionarySize; + property.Value = dicSize; + oneMethodInfo.Properties.Add(property); + if (number <= mainDicMethodIndex) + mainDicSize = dicSize; + } + else if (realName.Left(3).CompareNoCase(L"MEM") == 0) + { + UInt32 dicSize; + RINOK(ParsePropDictionaryValue(realName.Mid(3), value, dicSize)); + property.Id = NCoderPropID::kUsedMemorySize; + property.Value = dicSize; + oneMethodInfo.Properties.Add(property); + if (number <= mainDicMethodIndex) + mainDicSize = dicSize; + } + else + { + int index = FindPropIdFromStringName(realName); + if (index < 0) + return E_INVALIDARG; + + const CNameToPropID &nameToPropID = g_NameToPropID[index]; + property.Id = nameToPropID.PropID; + + if (!ConvertProperty(value, nameToPropID.VarType, property.Value)) + return E_INVALIDARG; + + oneMethodInfo.Properties.Add(property); + } + } + return S_OK; +} + +} diff --git a/CPP/7zip/Archive/Common/HandlerOut.h b/CPP/7zip/Archive/Common/HandlerOut.h new file mode 100755 index 00000000..eded0786 --- /dev/null +++ b/CPP/7zip/Archive/Common/HandlerOut.h @@ -0,0 +1,84 @@ +// HandlerOut.h + +#ifndef __HANDLER_OUT_H +#define __HANDLER_OUT_H + +#include "../../Common/MethodProps.h" +#include "../../Common/CreateCoder.h" + +namespace NArchive { + +struct COneMethodInfo +{ + CObjectVector<CProp> Properties; + UString MethodName; +}; + +class COutHandler +{ +public: + HRESULT SetProperty(const wchar_t *name, const PROPVARIANT &value); + + HRESULT SetSolidSettings(const UString &s); + HRESULT SetSolidSettings(const PROPVARIANT &value); + + #ifdef COMPRESS_MT + UInt32 _numThreads; + #endif + + CObjectVector<COneMethodInfo> _methods; + bool _removeSfxBlock; + + UInt64 _numSolidFiles; + UInt64 _numSolidBytes; + bool _numSolidBytesDefined; + bool _solidExtension; + + bool _compressHeaders; + bool _encryptHeaders; + + bool WriteModified; + bool WriteCreated; + bool WriteAccessed; + + bool _autoFilter; + UInt32 _level; + + bool _volumeMode; + + HRESULT SetParam(COneMethodInfo &oneMethodInfo, const UString &name, const UString &value); + HRESULT SetParams(COneMethodInfo &oneMethodInfo, const UString &srcString); + + void SetCompressionMethod2(COneMethodInfo &oneMethodInfo + #ifdef COMPRESS_MT + , UInt32 numThreads + #endif + ); + + void InitSolidFiles() { _numSolidFiles = (UInt64)(Int64)(-1); } + void InitSolidSize() { _numSolidBytes = (UInt64)(Int64)(-1); } + void InitSolid() + { + InitSolidFiles(); + InitSolidSize(); + _solidExtension = false; + _numSolidBytesDefined = false; + } + + void Init(); + + COutHandler() { Init(); } + + void BeforeSetProperty(); + + UInt32 minNumber; + UInt32 numProcessors; + UInt32 mainDicSize; + UInt32 mainDicMethodIndex; + + DECL_EXTERNAL_CODECS_VARS +}; + +} + +#endif diff --git a/CPP/7zip/Archive/Common/ItemNameUtils.h b/CPP/7zip/Archive/Common/ItemNameUtils.h index 63a01563..5eafacb1 100755 --- a/CPP/7zip/Archive/Common/ItemNameUtils.h +++ b/CPP/7zip/Archive/Common/ItemNameUtils.h @@ -3,7 +3,7 @@ #ifndef __ARCHIVE_ITEMNAMEUTILS_H #define __ARCHIVE_ITEMNAMEUTILS_H -#include "../../../Common/String.h" +#include "../../../Common/MyString.h" namespace NArchive { namespace NItemName { diff --git a/CPP/7zip/Archive/Common/MultiStream.h b/CPP/7zip/Archive/Common/MultiStream.h index 5a7cc687..b0fe41d6 100755 --- a/CPP/7zip/Archive/Common/MultiStream.h +++ b/CPP/7zip/Archive/Common/MultiStream.h @@ -4,7 +4,7 @@ #define __MULTISTREAM_H #include "../../../Common/MyCom.h" -#include "../../../Common/Vector.h" +#include "../../../Common/MyVector.h" #include "../../Archive/IArchive.h" class CMultiStream: diff --git a/CPP/7zip/Archive/Common/ParseProperties.cpp b/CPP/7zip/Archive/Common/ParseProperties.cpp index 9866d900..f0d4e29c 100755 --- a/CPP/7zip/Archive/Common/ParseProperties.cpp +++ b/CPP/7zip/Archive/Common/ParseProperties.cpp @@ -97,34 +97,37 @@ HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, U return ParsePropDictionaryValue(name, resValue); } +bool StringToBool(const UString &s, bool &res) +{ + if (s.IsEmpty() || s.CompareNoCase(L"ON") == 0) + { + res = true; + return true; + } + if (s.CompareNoCase(L"OFF") == 0) + { + res = false; + return true; + } + return false; +} + HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value) { switch(value.vt) { case VT_EMPTY: dest = true; - break; + return S_OK; /* case VT_UI4: dest = (value.ulVal != 0); break; */ case VT_BSTR: - { - UString valueString = value.bstrVal; - valueString.MakeUpper(); - if (valueString.Compare(L"ON") == 0) - dest = true; - else if (valueString.Compare(L"OFF") == 0) - dest = false; - else - return E_INVALIDARG; - break; - } - default: - return E_INVALIDARG; + return StringToBool(value.bstrVal, dest) ? S_OK : E_INVALIDARG; } - return S_OK; + return E_INVALIDARG; } int ParseStringToUInt32(const UString &srcString, UInt32 &number) diff --git a/CPP/7zip/Archive/Common/ParseProperties.h b/CPP/7zip/Archive/Common/ParseProperties.h index e6db316b..6f80f634 100755 --- a/CPP/7zip/Archive/Common/ParseProperties.h +++ b/CPP/7zip/Archive/Common/ParseProperties.h @@ -3,13 +3,14 @@ #ifndef __PARSEPROPERTIES_H #define __PARSEPROPERTIES_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Types.h" HRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue); HRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize); HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue); +bool StringToBool(const UString &s, bool &res); HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value); int ParseStringToUInt32(const UString &srcString, UInt32 &number); HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads); diff --git a/CPP/7zip/Archive/Cpio/CpioItem.h b/CPP/7zip/Archive/Cpio/CpioItem.h index 0eb2a0b4..cee8b5b3 100755 --- a/CPP/7zip/Archive/Cpio/CpioItem.h +++ b/CPP/7zip/Archive/Cpio/CpioItem.h @@ -6,7 +6,7 @@ #include <sys/stat.h> #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "CpioHeader.h" namespace NArchive { diff --git a/CPP/7zip/Archive/Deb/DebItem.h b/CPP/7zip/Archive/Deb/DebItem.h index f587f3f5..86e6740d 100755 --- a/CPP/7zip/Archive/Deb/DebItem.h +++ b/CPP/7zip/Archive/Deb/DebItem.h @@ -4,7 +4,7 @@ #define __ARCHIVE_DEB_ITEMINFO_H #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "DebHeader.h" namespace NArchive { diff --git a/CPP/7zip/Archive/GZip/GZipItem.h b/CPP/7zip/Archive/GZip/GZipItem.h index 7006dfb3..cd5e59f0 100755 --- a/CPP/7zip/Archive/GZip/GZipItem.h +++ b/CPP/7zip/Archive/GZip/GZipItem.h @@ -4,7 +4,7 @@ #define __ARCHIVE_GZIP_ITEM_H #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Buffer.h" namespace NArchive { diff --git a/CPP/7zip/Archive/Iso/IsoItem.h b/CPP/7zip/Archive/Iso/IsoItem.h index 14024d8d..e899d616 100755 --- a/CPP/7zip/Archive/Iso/IsoItem.h +++ b/CPP/7zip/Archive/Iso/IsoItem.h @@ -4,7 +4,7 @@ #define __ARCHIVE_ISO_ITEM_H #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Buffer.h" #include "IsoHeader.h" diff --git a/CPP/7zip/Archive/Lzh/LzhItem.h b/CPP/7zip/Archive/Lzh/LzhItem.h index 66d4ed75..d0ba25e2 100755 --- a/CPP/7zip/Archive/Lzh/LzhItem.h +++ b/CPP/7zip/Archive/Lzh/LzhItem.h @@ -4,7 +4,7 @@ #define __ARCHIVE_LZH_ITEM_H #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Buffer.h" #include "LzhHeader.h" diff --git a/CPP/7zip/Archive/Rar/RarIn.h b/CPP/7zip/Archive/Rar/RarIn.h index 83a4d193..9cb66512 100755 --- a/CPP/7zip/Archive/Rar/RarIn.h +++ b/CPP/7zip/Archive/Rar/RarIn.h @@ -4,7 +4,6 @@ #define __ARCHIVE_RAR_IN_H #include "Common/DynamicBuffer.h" -#include "Common/Exception.h" #include "Common/MyCom.h" #include "../../IStream.h" #include "../../ICoder.h" diff --git a/CPP/7zip/Archive/Rar/RarItem.h b/CPP/7zip/Archive/Rar/RarItem.h index 85050a42..5ab8a46e 100755 --- a/CPP/7zip/Archive/Rar/RarItem.h +++ b/CPP/7zip/Archive/Rar/RarItem.h @@ -4,7 +4,7 @@ #define __ARCHIVE_RAR_ITEM_H #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" namespace NArchive{ namespace NRar{ diff --git a/CPP/7zip/Archive/Split/SplitHandler.h b/CPP/7zip/Archive/Split/SplitHandler.h index a98dc0a6..65071cfd 100755 --- a/CPP/7zip/Archive/Split/SplitHandler.h +++ b/CPP/7zip/Archive/Split/SplitHandler.h @@ -4,7 +4,7 @@ #define __SPLIT_HANDLER_H #include "Common/MyCom.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "../IArchive.h" namespace NArchive { diff --git a/CPP/7zip/Archive/Tar/TarHandler.cpp b/CPP/7zip/Archive/Tar/TarHandler.cpp index 9c2cd006..f2c83caf 100755 --- a/CPP/7zip/Archive/Tar/TarHandler.cpp +++ b/CPP/7zip/Archive/Tar/TarHandler.cpp @@ -113,8 +113,22 @@ STDMETHODIMP CHandler::Open(IInStream *stream, } } if (_items.Size() == 0) - return S_FALSE; - + { + CMyComPtr<IArchiveOpenVolumeCallback> openVolumeCallback; + if (!openArchiveCallback) + return S_FALSE; + openArchiveCallback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&openVolumeCallback); + if (!openVolumeCallback) + return S_FALSE; + NCOM::CPropVariant propVariant; + RINOK(openVolumeCallback->GetProperty(kpidName, &propVariant)); + if (propVariant.vt != VT_BSTR) + return S_FALSE; + UString baseName = propVariant.bstrVal; + baseName = baseName.Right(4); + if (baseName.CompareNoCase(L".tar") != 0) + return S_FALSE; + } _inStream = stream; } /* diff --git a/CPP/7zip/Archive/Tar/TarItem.h b/CPP/7zip/Archive/Tar/TarItem.h index 71fff7ba..10b57cd0 100755 --- a/CPP/7zip/Archive/Tar/TarItem.h +++ b/CPP/7zip/Archive/Tar/TarItem.h @@ -6,7 +6,7 @@ #include <time.h> #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "../Common/ItemNameUtils.h" #include "TarHeader.h" diff --git a/CPP/7zip/Archive/Tar/TarUpdate.h b/CPP/7zip/Archive/Tar/TarUpdate.h index 92f5cebb..67d671f5 100755 --- a/CPP/7zip/Archive/Tar/TarUpdate.h +++ b/CPP/7zip/Archive/Tar/TarUpdate.h @@ -3,10 +3,6 @@ #ifndef __TAR_UPDATE_H #define __TAR_UPDATE_H -#include "Common/Vector.h" -#include "Common/Types.h" -#include "Common/String.h" - #include "../IArchive.h" #include "TarItem.h" diff --git a/CPP/7zip/Archive/Zip/ZipCompressionMode.h b/CPP/7zip/Archive/Zip/ZipCompressionMode.h index 650d4f35..37f22f77 100755 --- a/CPP/7zip/Archive/Zip/ZipCompressionMode.h +++ b/CPP/7zip/Archive/Zip/ZipCompressionMode.h @@ -3,8 +3,7 @@ #ifndef __ZIP_COMPRESSIONMETHOD_H #define __ZIP_COMPRESSIONMETHOD_H -#include "Common/Vector.h" -#include "Common/String.h" +#include "Common/MyString.h" namespace NArchive { namespace NZip { diff --git a/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp b/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp index 0ccd3727..453c37a3 100755 --- a/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp +++ b/CPP/7zip/Archive/Zip/ZipHandlerOut.cpp @@ -16,6 +16,7 @@ #include "../Common/ItemNameUtils.h" #include "../Common/ParseProperties.h" #include "../../Crypto/WzAES/WzAES.h" +#include "../../Common/OutBuffer.h" using namespace NWindows; using namespace NCOM; @@ -60,10 +61,15 @@ static bool IsAsciiString(const UString &s) return true; } +#define COM_TRY_BEGIN2 try { +#define COM_TRY_END2 } \ +catch(const CSystemException &e) { return e.ErrorCode; } \ +catch(...) { return E_OUTOFMEMORY; } + STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback) { - COM_TRY_BEGIN + COM_TRY_BEGIN2 CObjectVector<CUpdateItem> updateItems; for(UInt32 i = 0; i < numItems; i++) { @@ -276,7 +282,7 @@ STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numIt EXTERNAL_CODECS_VARS m_Items, updateItems, outStream, m_ArchiveIsOpen ? &m_Archive : NULL, &options, updateCallback); - COM_TRY_END + COM_TRY_END2 } STDMETHODIMP CHandler::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties) diff --git a/CPP/7zip/Archive/Zip/ZipIn.cpp b/CPP/7zip/Archive/Zip/ZipIn.cpp index 7c5ecbfb..bb45d1d1 100755 --- a/CPP/7zip/Archive/Zip/ZipIn.cpp +++ b/CPP/7zip/Archive/Zip/ZipIn.cpp @@ -341,11 +341,14 @@ HRESULT CInArchive::ReadLocalItemAfterCdItem(CItemEx &item) RINOK(ReadLocalItem(localItem)); if (item.Flags != localItem.Flags) { - if ((item.CompressionMethod != NFileHeader::NCompressionMethod::kDeflated || - (item.Flags & 0x7FFC) != (localItem.Flags & 0x7FFC)) && - ((item.CompressionMethod != NFileHeader::NCompressionMethod::kStored || - (item.Flags & 0x7FFF) != (localItem.Flags & 0x7FFF)) - )) + if ( + (item.CompressionMethod != NFileHeader::NCompressionMethod::kDeflated || + (item.Flags & 0x7FF9) != (localItem.Flags & 0x7FF9)) && + (item.CompressionMethod != NFileHeader::NCompressionMethod::kStored || + (item.Flags & 0x7FFF) != (localItem.Flags & 0x7FFF)) && + (item.CompressionMethod != NFileHeader::NCompressionMethod::kImploded || + (item.Flags & 0x7FFF) != (localItem.Flags & 0x7FFF)) + ) return S_FALSE; } diff --git a/CPP/7zip/Archive/Zip/ZipItem.h b/CPP/7zip/Archive/Zip/ZipItem.h index 765bfd85..4a7a47f1 100755 --- a/CPP/7zip/Archive/Zip/ZipItem.h +++ b/CPP/7zip/Archive/Zip/ZipItem.h @@ -4,7 +4,7 @@ #define __ARCHIVE_ZIP_ITEM_H #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Buffer.h" #include "ZipHeader.h" diff --git a/CPP/7zip/Archive/Zip/ZipOut.cpp b/CPP/7zip/Archive/Zip/ZipOut.cpp index 1f108235..d5e6895e 100755 --- a/CPP/7zip/Archive/Zip/ZipOut.cpp +++ b/CPP/7zip/Archive/Zip/ZipOut.cpp @@ -12,7 +12,11 @@ namespace NZip { void COutArchive::Create(IOutStream *outStream) { + if (!m_OutBuffer.Create(1 << 16)) + throw CSystemException(E_OUTOFMEMORY); m_Stream = outStream; + m_OutBuffer.SetStream(outStream); + m_OutBuffer.Init(); m_BasePosition = 0; } @@ -47,11 +51,7 @@ void COutArchive::PrepareWriteCompressedData2(UInt16 fileNameLength, UInt64 unPa void COutArchive::WriteBytes(const void *buffer, UInt32 size) { - UInt32 processedSize; - if(WriteStream(m_Stream, buffer, size, &processedSize) != S_OK) - throw 0; - if(processedSize != size) - throw 0; + m_OutBuffer.WriteBytes(buffer, size); m_BasePosition += size; } @@ -101,9 +101,16 @@ void COutArchive::WriteExtra(const CExtraBlock &extra) } } -HRESULT COutArchive::WriteLocalHeader(const CLocalItem &item) +void COutArchive::SeekTo(UInt64 offset) { - m_Stream->Seek(m_BasePosition, STREAM_SEEK_SET, NULL); + HRESULT res = m_Stream->Seek(offset, STREAM_SEEK_SET, NULL); + if (res != S_OK) + throw CSystemException(res); +} + +void COutArchive::WriteLocalHeader(const CLocalItem &item) +{ + SeekTo(m_BasePosition); bool isZip64 = m_IsZip64 || item.PackSize >= 0xFFFFFFFF || item.UnPackSize >= 0xFFFFFFFF; @@ -120,7 +127,7 @@ HRESULT COutArchive::WriteLocalHeader(const CLocalItem &item) { UInt16 localExtraSize = (UInt16)((isZip64 ? (4 + 16): 0) + item.LocalExtra.GetSize()); if (localExtraSize > m_ExtraSize) - return E_FAIL; + throw CSystemException(E_FAIL); } WriteUInt16((UInt16)m_ExtraSize); // test it; WriteBytes((const char *)item.Name, item.Name.Length()); @@ -140,14 +147,13 @@ HRESULT COutArchive::WriteLocalHeader(const CLocalItem &item) for (; extraPos < m_ExtraSize; extraPos++) WriteByte(0); + m_OutBuffer.FlushWithCheck(); MoveBasePosition(item.PackSize); - return m_Stream->Seek(m_BasePosition, STREAM_SEEK_SET, NULL); + SeekTo(m_BasePosition); } void COutArchive::WriteCentralHeader(const CItem &item) { - m_Stream->Seek(m_BasePosition, STREAM_SEEK_SET, NULL); - bool isUnPack64 = item.UnPackSize >= 0xFFFFFFFF; bool isPack64 = item.PackSize >= 0xFFFFFFFF; bool isPosition64 = item.LocalHeaderPosition >= 0xFFFFFFFF; @@ -193,7 +199,7 @@ void COutArchive::WriteCentralHeader(const CItem &item) void COutArchive::WriteCentralDir(const CObjectVector<CItem> &items, const CByteBuffer &comment) { - m_Stream->Seek(m_BasePosition, STREAM_SEEK_SET, NULL); + SeekTo(m_BasePosition); UInt64 cdOffset = GetCurrentPosition(); for(int i = 0; i < items.Size(); i++) @@ -234,6 +240,7 @@ void COutArchive::WriteCentralDir(const CObjectVector<CItem> &items, const CByte WriteUInt16(commentSize); if (commentSize > 0) WriteBytes((const Byte *)comment, commentSize); + m_OutBuffer.FlushWithCheck(); } void COutArchive::CreateStreamForCompressing(IOutStream **outStream) @@ -246,7 +253,7 @@ void COutArchive::CreateStreamForCompressing(IOutStream **outStream) void COutArchive::SeekToPackedDataPosition() { - m_Stream->Seek(m_BasePosition + m_LocalFileHeaderSize, STREAM_SEEK_SET, NULL); + SeekTo(m_BasePosition + m_LocalFileHeaderSize); } void COutArchive::CreateStreamForCopying(ISequentialOutStream **outStream) diff --git a/CPP/7zip/Archive/Zip/ZipOut.h b/CPP/7zip/Archive/Zip/ZipOut.h index e08c306e..24bc83a1 100755 --- a/CPP/7zip/Archive/Zip/ZipOut.h +++ b/CPP/7zip/Archive/Zip/ZipOut.h @@ -6,15 +6,19 @@ #include "Common/MyCom.h" #include "../../IStream.h" +#include "../../Common/OutBuffer.h" #include "ZipItem.h" namespace NArchive { namespace NZip { +// can throw CSystemException and COutBufferException + class COutArchive { CMyComPtr<IOutStream> m_Stream; + COutBuffer m_OutBuffer; UInt64 m_BasePosition; UInt32 m_LocalFileHeaderSize; @@ -30,6 +34,7 @@ class COutArchive void WriteExtraHeader(const CItem &item); void WriteCentralHeader(const CItem &item); void WriteExtra(const CExtraBlock &extra); + void SeekTo(UInt64 offset); public: void Create(IOutStream *outStream); void MoveBasePosition(UInt64 distanceToMove); @@ -37,7 +42,7 @@ public: void PrepareWriteCompressedDataZip64(UInt16 fileNameLength, bool isZip64, bool aesEncryption); void PrepareWriteCompressedData(UInt16 fileNameLength, UInt64 unPackSize, bool aesEncryption); void PrepareWriteCompressedData2(UInt16 fileNameLength, UInt64 unPackSize, UInt64 packSize, bool aesEncryption); - HRESULT WriteLocalHeader(const CLocalItem &item); + void WriteLocalHeader(const CLocalItem &item); void WriteCentralDir(const CObjectVector<CItem> &items, const CByteBuffer &comment); diff --git a/CPP/7zip/Archive/Zip/ZipUpdate.cpp b/CPP/7zip/Archive/Zip/ZipUpdate.cpp index 8caa1409..27284953 100755 --- a/CPP/7zip/Archive/Zip/ZipUpdate.cpp +++ b/CPP/7zip/Archive/Zip/ZipUpdate.cpp @@ -282,12 +282,12 @@ static HRESULT UpdateItemOldData(COutArchive &archive, return S_OK; } -static HRESULT WriteDirHeader(COutArchive &archive, const CCompressionMethodMode *options, +static void WriteDirHeader(COutArchive &archive, const CCompressionMethodMode *options, const CUpdateItem &updateItem, CItemEx &item) { SetFileHeader(archive, *options, updateItem, item); archive.PrepareWriteCompressedData((UInt16)item.Name.Length(), updateItem.Size, options->IsAesMode); - return archive.WriteLocalHeader(item); + archive.WriteLocalHeader(item); } static HRESULT Update2St( @@ -330,7 +330,7 @@ static HRESULT Update2St( bool isDirectory = ((updateItem.NewProperties) ? updateItem.IsDirectory : item.IsDirectory()); if (isDirectory) { - RINOK(WriteDirHeader(archive, options, updateItem, item)); + WriteDirHeader(archive, options, updateItem, item); } else { @@ -355,7 +355,7 @@ static HRESULT Update2St( EXTERNAL_CODECS_LOC_VARS fileInStream, outStream, compressProgress, compressingResult)); SetItemInfoFromCompressingResult(compressingResult, options->IsAesMode, options->AesKeyMode, item); - RINOK(archive.WriteLocalHeader(item)); + archive.WriteLocalHeader(item); RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); complexity += item.UnPackSize; } @@ -611,7 +611,7 @@ static HRESULT Update2( bool isDirectory = ((updateItem.NewProperties) ? updateItem.IsDirectory : item.IsDirectory()); if (isDirectory) { - RINOK(WriteDirHeader(archive, options, updateItem, item)); + WriteDirHeader(archive, options, updateItem, item); } else { @@ -632,7 +632,7 @@ static HRESULT Update2( SetItemInfoFromCompressingResult(memRef.CompressingResult, options->IsAesMode, options->AesKeyMode, item); SetFileHeader(archive, *options, updateItem, item); - RINOK(archive.WriteLocalHeader(item)); + archive.WriteLocalHeader(item); complexity += item.UnPackSize; // RINOK(updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); memRef.FreeOpt(&memManager); @@ -666,7 +666,7 @@ static HRESULT Update2( SetItemInfoFromCompressingResult(threadInfo.CompressingResult, options->IsAesMode, options->AesKeyMode, item); SetFileHeader(archive, *options, updateItem, item); - RINOK(archive.WriteLocalHeader(item)); + archive.WriteLocalHeader(item); complexity += item.UnPackSize; } else diff --git a/CPP/7zip/Archive/Zip/ZipUpdate.h b/CPP/7zip/Archive/Zip/ZipUpdate.h index 8b03cfa3..168eedd6 100755 --- a/CPP/7zip/Archive/Zip/ZipUpdate.h +++ b/CPP/7zip/Archive/Zip/ZipUpdate.h @@ -3,9 +3,6 @@ #ifndef __ZIP_UPDATE_H #define __ZIP_UPDATE_H -#include "Common/Vector.h" -#include "Common/Types.h" - #include "../../ICoder.h" #include "../IArchive.h" diff --git a/CPP/7zip/Bundles/Alone/Alone.dsp b/CPP/7zip/Bundles/Alone/Alone.dsp index f7ceb6b8..6250c0bd 100755 --- a/CPP/7zip/Bundles/Alone/Alone.dsp +++ b/CPP/7zip/Bundles/Alone/Alone.dsp @@ -237,14 +237,6 @@ SOURCE=.\StdAfx.h # PROP Default_Filter "" # Begin Source File -SOURCE=..\..\..\Common\AlignedBuffer.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\Common\AlignedBuffer.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\AutoPtr.h # End Source File # Begin Source File @@ -277,10 +269,6 @@ SOURCE=..\..\..\Common\DynamicBuffer.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Exception.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\IntToString.cpp # End Source File # Begin Source File @@ -301,6 +289,10 @@ SOURCE=..\..\..\Common\MyCom.h # End Source File # Begin Source File +SOURCE=..\..\..\Common\MyException.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Common\MyGuidDef.h # End Source File # Begin Source File @@ -309,10 +301,26 @@ SOURCE=..\..\..\Common\MyInitGuid.h # End Source File # Begin Source File +SOURCE=..\..\..\Common\MyString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyString.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Common\MyUnknown.h # End Source File # Begin Source File +SOURCE=..\..\..\Common\MyVector.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyVector.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Common\MyWindows.cpp # End Source File # Begin Source File @@ -353,14 +361,6 @@ SOURCE=..\..\..\Common\StdOutStream.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\Common\String.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\StringConvert.cpp # End Source File # Begin Source File @@ -389,14 +389,6 @@ SOURCE=..\..\..\Common\UTFConvert.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\Common\Vector.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\Wildcard.cpp # End Source File # Begin Source File @@ -501,6 +493,14 @@ SOURCE=..\..\..\Windows\Synchronization.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\System.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\Thread.h # End Source File # Begin Source File @@ -613,6 +613,14 @@ SOURCE=..\..\Common\MethodId.h # End Source File # Begin Source File +SOURCE=..\..\Common\MethodProps.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MethodProps.h +# End Source File +# Begin Source File + SOURCE=..\..\Common\MSBFDecoder.h # End Source File # Begin Source File @@ -683,6 +691,14 @@ SOURCE=..\..\Common\StreamUtils.cpp SOURCE=..\..\Common\StreamUtils.h # End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.h +# End Source File # End Group # Begin Group "Compress" @@ -1705,19 +1721,19 @@ SOURCE=..\..\Archive\Common\CoderMixer2MT.h # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\CoderMixer2ST.cpp +SOURCE=..\..\Archive\Common\DummyOutStream.cpp # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\CoderMixer2ST.h +SOURCE=..\..\Archive\Common\DummyOutStream.h # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\DummyOutStream.cpp +SOURCE=..\..\Archive\Common\HandlerOut.cpp # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\DummyOutStream.h +SOURCE=..\..\Archive\Common\HandlerOut.h # End Source File # Begin Source File diff --git a/CPP/7zip/Bundles/Alone/makefile b/CPP/7zip/Bundles/Alone/makefile index eeec13a2..ee881a01 100755 --- a/CPP/7zip/Bundles/Alone/makefile +++ b/CPP/7zip/Bundles/Alone/makefile @@ -29,11 +29,11 @@ COMMON_OBJS = \ $O\NewHandler.obj \ $O\StdInStream.obj \ $O\StdOutStream.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ $O\UTFConvert.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -46,7 +46,8 @@ WIN_OBJS = \ $O\MemoryLock.obj \ $O\PropVariant.obj \ $O\PropVariantConversions.obj \ - $O\Synchronization.obj + $O\Synchronization.obj \ + $O\System.obj \ 7ZIP_COMMON_OBJS = \ $O\CreateCoder.obj \ @@ -61,6 +62,7 @@ WIN_OBJS = \ $O\LSBFEncoder.obj \ $O\MemBlocks.obj \ $O\MethodId.obj \ + $O\MethodProps.obj \ $O\OffsetStream.obj \ $O\OutBuffer.obj \ $O\OutMemStream.obj \ @@ -69,6 +71,7 @@ WIN_OBJS = \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ UI_COMMON_OBJS = \ $O\ArchiveCommandLine.obj \ @@ -96,6 +99,7 @@ AR_COMMON_OBJS = \ $O\CoderMixer2MT.obj \ $O\CrossThreadProgress.obj \ $O\DummyOutStream.obj \ + $O\HandlerOut.obj \ $O\InStreamWithCRC.obj \ $O\ItemNameUtils.obj \ $O\MultiStream.obj \ diff --git a/CPP/7zip/Bundles/Alone7z/Alone.dsp b/CPP/7zip/Bundles/Alone7z/Alone.dsp index e0c46273..b9f389bb 100755 --- a/CPP/7zip/Bundles/Alone7z/Alone.dsp +++ b/CPP/7zip/Bundles/Alone7z/Alone.dsp @@ -237,14 +237,6 @@ SOURCE=.\StdAfx.h # PROP Default_Filter "" # Begin Source File -SOURCE=..\..\..\Common\AlignedBuffer.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\Common\AlignedBuffer.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\AutoPtr.h # End Source File # Begin Source File @@ -277,10 +269,6 @@ SOURCE=..\..\..\Common\DynamicBuffer.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Exception.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\IntToString.cpp # End Source File # Begin Source File @@ -301,6 +289,10 @@ SOURCE=..\..\..\Common\MyCom.h # End Source File # Begin Source File +SOURCE=..\..\..\Common\MyException.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Common\MyGuidDef.h # End Source File # Begin Source File @@ -309,10 +301,26 @@ SOURCE=..\..\..\Common\MyInitGuid.h # End Source File # Begin Source File +SOURCE=..\..\..\Common\MyString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyString.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Common\MyUnknown.h # End Source File # Begin Source File +SOURCE=..\..\..\Common\MyVector.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\MyVector.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Common\MyWindows.cpp # End Source File # Begin Source File @@ -353,14 +361,6 @@ SOURCE=..\..\..\Common\StdOutStream.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\Common\String.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\StringConvert.cpp # End Source File # Begin Source File @@ -389,14 +389,6 @@ SOURCE=..\..\..\Common\UTFConvert.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\Common\Vector.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\Wildcard.cpp # End Source File # Begin Source File @@ -501,6 +493,14 @@ SOURCE=..\..\..\Windows\Synchronization.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\System.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\Thread.h # End Source File # Begin Source File @@ -609,6 +609,14 @@ SOURCE=..\..\Common\MethodId.h # End Source File # Begin Source File +SOURCE=..\..\Common\MethodProps.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MethodProps.h +# End Source File +# Begin Source File + SOURCE=..\..\Common\MSBFDecoder.h # End Source File # Begin Source File @@ -679,6 +687,14 @@ SOURCE=..\..\Common\StreamUtils.cpp SOURCE=..\..\Common\StreamUtils.h # End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.h +# End Source File # End Group # Begin Group "Compress" @@ -1054,19 +1070,19 @@ SOURCE=..\..\Archive\Common\CoderMixer2MT.h # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\CoderMixer2ST.cpp +SOURCE=..\..\Archive\Common\DummyOutStream.cpp # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\CoderMixer2ST.h +SOURCE=..\..\Archive\Common\DummyOutStream.h # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\DummyOutStream.cpp +SOURCE=..\..\Archive\Common\HandlerOut.cpp # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\DummyOutStream.h +SOURCE=..\..\Archive\Common\HandlerOut.h # End Source File # Begin Source File @@ -1199,6 +1215,10 @@ SOURCE=..\..\UI\Common\OpenArchive.h # End Source File # Begin Source File +SOURCE=..\..\UI\Common\Property.h +# End Source File +# Begin Source File + SOURCE=..\..\UI\Common\PropIDUtils.cpp # End Source File # Begin Source File diff --git a/CPP/7zip/Bundles/Alone7z/makefile b/CPP/7zip/Bundles/Alone7z/makefile index 4ae28d39..1feb1fbd 100755 --- a/CPP/7zip/Bundles/Alone7z/makefile +++ b/CPP/7zip/Bundles/Alone7z/makefile @@ -30,11 +30,11 @@ COMMON_OBJS = \ $O\NewHandler.obj \ $O\StdInStream.obj \ $O\StdOutStream.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ $O\UTFConvert.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -47,7 +47,8 @@ WIN_OBJS = \ $O\MemoryLock.obj \ $O\PropVariant.obj \ $O\PropVariantConversions.obj \ - $O\Synchronization.obj + $O\Synchronization.obj \ + $O\System.obj \ 7ZIP_COMMON_OBJS = \ $O\CreateCoder.obj \ @@ -59,12 +60,14 @@ WIN_OBJS = \ $O\LimitedStreams.obj \ $O\LockedStream.obj \ $O\MethodId.obj \ + $O\MethodProps.obj \ $O\OffsetStream.obj \ $O\OutBuffer.obj \ $O\ProgressUtils.obj \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ UI_COMMON_OBJS = \ $O\ArchiveCommandLine.obj \ @@ -92,6 +95,7 @@ AR_COMMON_OBJS = \ $O\CoderMixer2MT.obj \ $O\CrossThreadProgress.obj \ $O\DummyOutStream.obj \ + $O\HandlerOut.obj \ $O\InStreamWithCRC.obj \ $O\ItemNameUtils.obj \ $O\MultiStream.obj \ diff --git a/CPP/7zip/Bundles/Format7z/makefile b/CPP/7zip/Bundles/Format7z/makefile index f74602ae..e690dd3a 100755 --- a/CPP/7zip/Bundles/Format7z/makefile +++ b/CPP/7zip/Bundles/Format7z/makefile @@ -12,10 +12,10 @@ COMMON_OBJS = \ $O\CRC.obj \ $O\IntToString.obj \ $O\NewHandler.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -23,7 +23,8 @@ WIN_OBJS = \ $O\FileFind.obj \ $O\FileIO.obj \ $O\PropVariant.obj \ - $O\Synchronization.obj + $O\Synchronization.obj \ + $O\System.obj \ 7ZIP_COMMON_OBJS = \ $O\CreateCoder.obj \ @@ -34,11 +35,13 @@ WIN_OBJS = \ $O\LockedStream.obj \ $O\LSBFDecoder.obj \ $O\MethodId.obj \ + $O\MethodProps.obj \ $O\OutBuffer.obj \ $O\ProgressUtils.obj \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ AR_OBJS = \ $O\ArchiveExports.obj \ @@ -48,6 +51,7 @@ AR_COMMON_OBJS = \ $O\CoderMixer2.obj \ $O\CoderMixer2MT.obj \ $O\CrossThreadProgress.obj \ + $O\HandlerOut.obj \ $O\InStreamWithCRC.obj \ $O\ItemNameUtils.obj \ $O\OutStreamWithCRC.obj \ @@ -134,6 +138,8 @@ AES_ORIG_OBJS = \ $O\aestab.obj \ CRYPTO_HASH_OBJS = \ + $O\RandGen.obj \ + $O\Sha1.obj \ $O\Sha256.obj \ C_OBJS = \ diff --git a/CPP/7zip/Bundles/Format7zExtract/makefile b/CPP/7zip/Bundles/Format7zExtract/makefile index 5926949f..a2362869 100755 --- a/CPP/7zip/Bundles/Format7zExtract/makefile +++ b/CPP/7zip/Bundles/Format7zExtract/makefile @@ -10,10 +10,10 @@ COMMON_OBJS = \ $O\CRC.obj \ $O\IntToString.obj \ $O\NewHandler.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -21,7 +21,8 @@ WIN_OBJS = \ $O\FileFind.obj \ $O\FileIO.obj \ $O\PropVariant.obj \ - $O\Synchronization.obj + $O\Synchronization.obj \ + $O\System.obj \ 7ZIP_COMMON_OBJS = \ $O\CreateCoder.obj \ @@ -37,6 +38,7 @@ WIN_OBJS = \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ AR_OBJS = \ $O\ArchiveExports.obj \ diff --git a/CPP/7zip/Bundles/Format7zExtractR/makefile b/CPP/7zip/Bundles/Format7zExtractR/makefile index e2c1b838..0632e718 100755 --- a/CPP/7zip/Bundles/Format7zExtractR/makefile +++ b/CPP/7zip/Bundles/Format7zExtractR/makefile @@ -10,10 +10,10 @@ COMMON_OBJS = \ $O\CRC.obj \ $O\IntToString.obj \ $O\NewHandler.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -21,7 +21,8 @@ WIN_OBJS = \ $O\FileFind.obj \ $O\FileIO.obj \ $O\PropVariant.obj \ - $O\Synchronization.obj + $O\Synchronization.obj \ + $O\System.obj \ 7ZIP_COMMON_OBJS = \ $O\CreateCoder.obj \ @@ -31,11 +32,13 @@ WIN_OBJS = \ $O\LimitedStreams.obj \ $O\LockedStream.obj \ $O\MethodId.obj \ + $O\MethodProps.obj \ $O\OutBuffer.obj \ $O\ProgressUtils.obj \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ AR_OBJS = \ $O\ArchiveExports.obj \ @@ -45,6 +48,7 @@ AR_COMMON_OBJS = \ $O\CoderMixer2.obj \ $O\CoderMixer2MT.obj \ $O\CrossThreadProgress.obj \ + $O\HandlerOut.obj \ $O\ItemNameUtils.obj \ $O\OutStreamWithCRC.obj \ $O\ParseProperties.obj \ diff --git a/CPP/7zip/Bundles/Format7zF/Format7z.dsp b/CPP/7zip/Bundles/Format7zF/Format7z.dsp index 7a4bafb2..66ae5d92 100755 --- a/CPP/7zip/Bundles/Format7zF/Format7z.dsp +++ b/CPP/7zip/Bundles/Format7zF/Format7z.dsp @@ -142,47 +142,51 @@ SOURCE=..\..\..\Common\IntToString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyException.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.cpp +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.h +SOURCE=..\..\..\Common\MyVector.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringToInt.cpp +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringToInt.h +SOURCE=..\..\..\Common\StringConvert.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\UTFConvert.cpp +SOURCE=..\..\..\Common\StringConvert.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\UTFConvert.h +SOURCE=..\..\..\Common\StringToInt.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StringToInt.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp +SOURCE=..\..\..\Common\UTFConvert.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.h +SOURCE=..\..\..\Common\UTFConvert.h # End Source File # Begin Source File @@ -238,6 +242,14 @@ SOURCE=..\..\..\Windows\Synchronization.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\System.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\Thread.h # End Source File # End Group @@ -1160,6 +1172,14 @@ SOURCE=..\..\Common\MethodId.h # End Source File # Begin Source File +SOURCE=..\..\Common\MethodProps.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MethodProps.h +# End Source File +# Begin Source File + SOURCE=..\..\Common\OffsetStream.cpp # End Source File # Begin Source File @@ -1230,6 +1250,14 @@ SOURCE=..\..\Common\StreamUtils.cpp SOURCE=..\..\Common\StreamUtils.h # End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.h +# End Source File # End Group # Begin Group "C" @@ -1411,7 +1439,7 @@ SOURCE=..\..\..\..\C\Compress\Branch\BranchX86.c !IF "$(CFG)" == "7z - Win32 Release" -# ADD CPP /O2 +# ADD CPP /O2 /FAs # SUBTRACT CPP /YX /Yc /Yu !ELSEIF "$(CFG)" == "7z - Win32 Debug" @@ -1826,19 +1854,19 @@ SOURCE=..\..\Archive\Common\CoderMixer2MT.h # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\CrossThreadProgress.cpp +SOURCE=..\..\Archive\Common\DummyOutStream.cpp # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\CrossThreadProgress.h +SOURCE=..\..\Archive\Common\DummyOutStream.h # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\DummyOutStream.cpp +SOURCE=..\..\Archive\Common\HandlerOut.cpp # End Source File # Begin Source File -SOURCE=..\..\Archive\Common\DummyOutStream.h +SOURCE=..\..\Archive\Common\HandlerOut.h # End Source File # Begin Source File diff --git a/CPP/7zip/Bundles/Format7zF/makefile b/CPP/7zip/Bundles/Format7zF/makefile index 52554f24..d3e9d8c7 100755 --- a/CPP/7zip/Bundles/Format7zF/makefile +++ b/CPP/7zip/Bundles/Format7zF/makefile @@ -12,10 +12,10 @@ COMMON_OBJS = \ $O\CRC.obj \ $O\IntToString.obj \ $O\NewHandler.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\UTFConvert.obj \ $O\Wildcard.obj \ @@ -24,7 +24,8 @@ WIN_OBJS = \ $O\FileFind.obj \ $O\FileIO.obj \ $O\PropVariant.obj \ - $O\Synchronization.obj + $O\Synchronization.obj \ + $O\System.obj \ 7ZIP_COMMON_OBJS = \ $O\InBuffer.obj \ @@ -36,6 +37,7 @@ WIN_OBJS = \ $O\LSBFDecoder.obj \ $O\LSBFEncoder.obj \ $O\MethodId.obj \ + $O\MethodProps.obj \ $O\MemBlocks.obj \ $O\OffsetStream.obj \ $O\OutBuffer.obj \ @@ -45,6 +47,7 @@ WIN_OBJS = \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ AR_OBJS = \ $O\ArchiveExports.obj \ @@ -59,6 +62,7 @@ AR_COMMON_OBJS = \ $O\ItemNameUtils.obj \ $O\MultiStream.obj \ $O\OutStreamWithCRC.obj \ + $O\HandlerOut.obj \ $O\ParseProperties.obj \ diff --git a/CPP/7zip/Bundles/Format7zR/makefile b/CPP/7zip/Bundles/Format7zR/makefile index 3175e7f2..972c6eb1 100755 --- a/CPP/7zip/Bundles/Format7zR/makefile +++ b/CPP/7zip/Bundles/Format7zR/makefile @@ -10,10 +10,10 @@ COMMON_OBJS = \ $O\CRC.obj \ $O\IntToString.obj \ $O\NewHandler.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -21,7 +21,8 @@ WIN_OBJS = \ $O\FileFind.obj \ $O\FileIO.obj \ $O\PropVariant.obj \ - $O\Synchronization.obj + $O\Synchronization.obj \ + $O\System.obj \ 7ZIP_COMMON_OBJS = \ $O\CreateCoder.obj \ @@ -31,11 +32,13 @@ WIN_OBJS = \ $O\LimitedStreams.obj \ $O\LockedStream.obj \ $O\MethodId.obj \ + $O\MethodProps.obj \ $O\OutBuffer.obj \ $O\ProgressUtils.obj \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ AR_OBJS = \ $O\ArchiveExports.obj \ @@ -45,6 +48,7 @@ AR_COMMON_OBJS = \ $O\CoderMixer2.obj \ $O\CoderMixer2MT.obj \ $O\CrossThreadProgress.obj \ + $O\HandlerOut.obj \ $O\InStreamWithCRC.obj \ $O\ItemNameUtils.obj \ $O\OutStreamWithCRC.obj \ diff --git a/CPP/7zip/Bundles/SFXCon/Main.cpp b/CPP/7zip/Bundles/SFXCon/Main.cpp index c3122cd1..9084d9d7 100755 --- a/CPP/7zip/Bundles/SFXCon/Main.cpp +++ b/CPP/7zip/Bundles/SFXCon/Main.cpp @@ -9,7 +9,7 @@ #include "Common/Wildcard.h" #include "Common/StringConvert.h" #include "Common/MyCom.h" -#include "Common/Exception.h" +#include "Common/MyException.h" #include "Windows/FileDir.h" #include "Windows/FileName.h" diff --git a/CPP/7zip/Bundles/SFXCon/SFXCon.dsp b/CPP/7zip/Bundles/SFXCon/SFXCon.dsp index abf7f22c..163b9298 100755 --- a/CPP/7zip/Bundles/SFXCon/SFXCon.dsp +++ b/CPP/7zip/Bundles/SFXCon/SFXCon.dsp @@ -512,51 +512,51 @@ SOURCE=..\..\..\Common\IntToString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.h +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdInStream.cpp +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdInStream.h +SOURCE=..\..\..\Common\MyVector.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdOutStream.cpp +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdOutStream.h +SOURCE=..\..\..\Common\NewHandler.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\StdInStream.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\StdInStream.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.cpp +SOURCE=..\..\..\Common\StdOutStream.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.h +SOURCE=..\..\..\Common\StdOutStream.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp +SOURCE=..\..\..\Common\StringConvert.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.h +SOURCE=..\..\..\Common\StringConvert.h # End Source File # Begin Source File @@ -674,6 +674,14 @@ SOURCE=..\..\Common\StreamUtils.cpp SOURCE=..\..\Common\StreamUtils.h # End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.h +# End Source File # End Group # Begin Group "UI" diff --git a/CPP/7zip/Bundles/SFXCon/makefile b/CPP/7zip/Bundles/SFXCon/makefile index 33bd52c4..b6c13088 100755 --- a/CPP/7zip/Bundles/SFXCon/makefile +++ b/CPP/7zip/Bundles/SFXCon/makefile @@ -23,9 +23,9 @@ COMMON_OBJS = \ $O\NewHandler.obj \ $O\StdInStream.obj \ $O\StdOutStream.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -51,6 +51,7 @@ WIN_OBJS = \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ UI_COMMON_OBJS = \ $O\ArchiveExtractCallback.obj \ diff --git a/CPP/7zip/Bundles/SFXSetup/ExtractCallback.h b/CPP/7zip/Bundles/SFXSetup/ExtractCallback.h index f3880890..b85dce42 100755 --- a/CPP/7zip/Bundles/SFXSetup/ExtractCallback.h +++ b/CPP/7zip/Bundles/SFXSetup/ExtractCallback.h @@ -5,7 +5,6 @@ #include "resource.h" -#include "Common/String.h" #include "Windows/ResourceString.h" #include "../../Archive/IArchive.h" diff --git a/CPP/7zip/Bundles/SFXSetup/ExtractEngine.h b/CPP/7zip/Bundles/SFXSetup/ExtractEngine.h index a042270b..e2f7518b 100755 --- a/CPP/7zip/Bundles/SFXSetup/ExtractEngine.h +++ b/CPP/7zip/Bundles/SFXSetup/ExtractEngine.h @@ -3,7 +3,6 @@ #ifndef __EXTRACTENGINE_H #define __EXTRACTENGINE_H -#include "Common/String.h" #include "../../UI/GUI/OpenCallbackGUI.h" #include "../../UI/Common/LoadCodecs.h" diff --git a/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp b/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp index b09dce22..528275fd 100755 --- a/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp +++ b/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp @@ -341,51 +341,51 @@ SOURCE=..\..\..\Common\IntToString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.h +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\MyVector.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.cpp +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.h +SOURCE=..\..\..\Common\NewHandler.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\TextConfig.cpp +SOURCE=..\..\..\Common\StringConvert.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\TextConfig.h +SOURCE=..\..\..\Common\StringConvert.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\UTFConvert.cpp +SOURCE=..\..\..\Common\TextConfig.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\UTFConvert.h +SOURCE=..\..\..\Common\TextConfig.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp +SOURCE=..\..\..\Common\UTFConvert.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.h +SOURCE=..\..\..\Common\UTFConvert.h # End Source File # Begin Source File @@ -583,6 +583,14 @@ SOURCE=..\..\Common\StreamUtils.cpp SOURCE=..\..\Common\StreamUtils.h # End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.h +# End Source File # End Group # Begin Group "UI" diff --git a/CPP/7zip/Bundles/SFXSetup/makefile b/CPP/7zip/Bundles/SFXSetup/makefile index a93d0379..e773ba41 100755 --- a/CPP/7zip/Bundles/SFXSetup/makefile +++ b/CPP/7zip/Bundles/SFXSetup/makefile @@ -20,11 +20,11 @@ COMMON_OBJS = \ $O\CRC.obj \ $O\IntToString.obj \ $O\NewHandler.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\TextConfig.obj \ $O\UTFConvert.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -54,6 +54,7 @@ WIN_CTRL_OBJS = \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ UI_COMMON_OBJS = \ $O\ArchiveOpenCallback.obj \ diff --git a/CPP/7zip/Bundles/SFXWin/SFXWin.dsp b/CPP/7zip/Bundles/SFXWin/SFXWin.dsp index 06c0020e..23bdf2de 100755 --- a/CPP/7zip/Bundles/SFXWin/SFXWin.dsp +++ b/CPP/7zip/Bundles/SFXWin/SFXWin.dsp @@ -550,6 +550,14 @@ SOURCE=..\..\Common\StreamUtils.cpp SOURCE=..\..\Common\StreamUtils.h # End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\VirtThread.h +# End Source File # End Group # Begin Group "File Manager" @@ -712,35 +720,35 @@ SOURCE=..\..\..\Common\IntToString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.h +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\MyVector.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.cpp +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.h +SOURCE=..\..\..\Common\NewHandler.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp +SOURCE=..\..\..\Common\StringConvert.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.h +SOURCE=..\..\..\Common\StringConvert.h # End Source File # Begin Source File diff --git a/CPP/7zip/Bundles/SFXWin/makefile b/CPP/7zip/Bundles/SFXWin/makefile index a7e52be2..aab98921 100755 --- a/CPP/7zip/Bundles/SFXWin/makefile +++ b/CPP/7zip/Bundles/SFXWin/makefile @@ -19,9 +19,9 @@ COMMON_OBJS = \ $O\CommandLineParser.obj \ $O\IntToString.obj \ $O\NewHandler.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -54,6 +54,7 @@ WIN_CTRL_OBJS = \ $O\StreamBinder.obj \ $O\StreamObjects.obj \ $O\StreamUtils.obj \ + $O\VirtThread.obj \ UI_COMMON_OBJS = \ $O\ArchiveExtractCallback.obj \ diff --git a/CPP/7zip/Common/CreateCoder.h b/CPP/7zip/Common/CreateCoder.h index 9b2f3869..49f1552a 100755 --- a/CPP/7zip/Common/CreateCoder.h +++ b/CPP/7zip/Common/CreateCoder.h @@ -4,7 +4,7 @@ #define __CREATECODER_H #include "Common/MyCom.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "../ICoder.h" #include "MethodId.h" diff --git a/CPP/7zip/Common/FilePathAutoRename.h b/CPP/7zip/Common/FilePathAutoRename.h index 99323094..3ef87f48 100755 --- a/CPP/7zip/Common/FilePathAutoRename.h +++ b/CPP/7zip/Common/FilePathAutoRename.h @@ -3,7 +3,7 @@ #ifndef __FILEPATHAUTORENAME_H #define __FILEPATHAUTORENAME_H -#include "Common/String.h" +#include "Common/MyString.h" bool AutoRenamePath(UString &fullProcessedPath); diff --git a/CPP/7zip/Common/FilterCoder.cpp b/CPP/7zip/Common/FilterCoder.cpp index 9b019c7d..76d022d2 100755 --- a/CPP/7zip/Common/FilterCoder.cpp +++ b/CPP/7zip/Common/FilterCoder.cpp @@ -238,6 +238,18 @@ STDMETHODIMP CFilterCoder::WriteCoderProperties(ISequentialOutStream *outStream) { return _writeCoderProperties->WriteCoderProperties(outStream); } + +/* +STDMETHODIMP CFilterCoder::ResetSalt() +{ + return _CryptoResetSalt->ResetSalt(); +} +*/ + +STDMETHODIMP CFilterCoder::ResetInitVector() +{ + return _CryptoResetInitVector->ResetInitVector(); +} #endif STDMETHODIMP CFilterCoder::SetDecoderProperties2(const Byte *data, UInt32 size) diff --git a/CPP/7zip/Common/FilterCoder.h b/CPP/7zip/Common/FilterCoder.h index 36334364..1b9b29de 100755 --- a/CPP/7zip/Common/FilterCoder.h +++ b/CPP/7zip/Common/FilterCoder.h @@ -26,6 +26,8 @@ class CFilterCoder: #endif #ifndef EXTRACT_ONLY public ICompressWriteCoderProperties, + // public ICryptoResetSalt, + public ICryptoResetInitVector, #endif public ICompressSetDecoderProperties2, public CMyUnknownImp @@ -53,6 +55,8 @@ protected: CMyComPtr<ICryptoSetPassword> _setPassword; #ifndef EXTRACT_ONLY CMyComPtr<ICompressWriteCoderProperties> _writeCoderProperties; + // CMyComPtr<ICryptoResetSalt> _CryptoResetSalt; + CMyComPtr<ICryptoResetInitVector> _CryptoResetInitVector; #endif CMyComPtr<ICompressSetDecoderProperties2> _setDecoderProperties; public: @@ -82,6 +86,8 @@ public: #ifndef EXTRACT_ONLY MY_QUERYINTERFACE_ENTRY_AG(ICompressWriteCoderProperties, Filter, _writeCoderProperties) + // MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetSalt, Filter, _CryptoResetSalt) + MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetInitVector, Filter, _CryptoResetInitVector) #endif MY_QUERYINTERFACE_ENTRY_AG(ICompressSetDecoderProperties2, Filter, _setDecoderProperties) @@ -105,6 +111,8 @@ public: #endif #ifndef EXTRACT_ONLY STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); + // STDMETHOD(ResetSalt)(); + STDMETHOD(ResetInitVector)(); #endif STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); }; diff --git a/CPP/7zip/Common/InBuffer.h b/CPP/7zip/Common/InBuffer.h index 057caa16..05fc77e5 100755 --- a/CPP/7zip/Common/InBuffer.h +++ b/CPP/7zip/Common/InBuffer.h @@ -5,13 +5,12 @@ #include "../IStream.h" #include "../../Common/MyCom.h" +#include "../../Common/MyException.h" #ifndef _NO_EXCEPTIONS -class CInBufferException +struct CInBufferException: public CSystemException { -public: - HRESULT ErrorCode; - CInBufferException(HRESULT errorCode): ErrorCode(errorCode) {} + CInBufferException(HRESULT errorCode): CSystemException(errorCode) {} }; #endif diff --git a/CPP/7zip/Common/MemBlocks.h b/CPP/7zip/Common/MemBlocks.h index b93f6398..de7138ed 100755 --- a/CPP/7zip/Common/MemBlocks.h +++ b/CPP/7zip/Common/MemBlocks.h @@ -9,7 +9,7 @@ extern "C" } #include "Common/Types.h" -#include "Common/Vector.h" +#include "Common/MyVector.h" #include "Windows/Synchronization.h" diff --git a/CPP/7zip/Common/MethodId.cpp b/CPP/7zip/Common/MethodId.cpp index 1eed8fc1..b797b685 100755 --- a/CPP/7zip/Common/MethodId.cpp +++ b/CPP/7zip/Common/MethodId.cpp @@ -3,7 +3,7 @@ #include "StdAfx.h" #include "MethodId.h" -#include "../../Common/String.h" +#include "../../Common/MyString.h" static inline wchar_t GetHex(Byte value) { diff --git a/CPP/7zip/Common/MethodProps.cpp b/CPP/7zip/Common/MethodProps.cpp new file mode 100755 index 00000000..52f5511f --- /dev/null +++ b/CPP/7zip/Common/MethodProps.cpp @@ -0,0 +1,96 @@ +// MethodProps.cpp + +#include "StdAfx.h" + +#include "MethodProps.h" +#include "../../Common/MyCom.h" + +static UInt64 k_LZMA = 0x030101; +// static UInt64 k_LZMA2 = 0x030102; + +HRESULT SetMethodProperties(const CMethod &method, const UInt64 *inSizeForReduce, IUnknown *coder) +{ + bool tryReduce = false; + UInt32 reducedDictionarySize = 1 << 10; + if (inSizeForReduce != 0 && (method.Id == k_LZMA /* || methodFull.MethodID == k_LZMA2 */)) + { + for (;;) + { + const UInt32 step = (reducedDictionarySize >> 1); + if (reducedDictionarySize >= *inSizeForReduce) + { + tryReduce = true; + break; + } + reducedDictionarySize += step; + if (reducedDictionarySize >= *inSizeForReduce) + { + tryReduce = true; + break; + } + if (reducedDictionarySize >= ((UInt32)3 << 30)) + break; + reducedDictionarySize += step; + } + } + + { + int numProperties = method.Properties.Size(); + CMyComPtr<ICompressSetCoderProperties> setCoderProperties; + coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties); + if (setCoderProperties == NULL) + { + if (numProperties != 0) + return E_INVALIDARG; + } + else + { + CRecordVector<PROPID> propIDs; + NWindows::NCOM::CPropVariant *values = new NWindows::NCOM::CPropVariant[numProperties]; + HRESULT res = S_OK; + try + { + for (int i = 0; i < numProperties; i++) + { + const CProp &prop = method.Properties[i]; + propIDs.Add(prop.Id); + NWindows::NCOM::CPropVariant &value = values[i]; + value = prop.Value; + // if (tryReduce && prop.Id == NCoderPropID::kDictionarySize && value.vt == VT_UI4 && reducedDictionarySize < value.ulVal) + if (tryReduce) + if (prop.Id == NCoderPropID::kDictionarySize) + if (value.vt == VT_UI4) + if (reducedDictionarySize < value.ulVal) + value.ulVal = reducedDictionarySize; + } + CMyComPtr<ICompressSetCoderProperties> setCoderProperties; + coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties); + res = setCoderProperties->SetCoderProperties(&propIDs.Front(), values, numProperties); + } + catch(...) + { + delete []values; + throw; + } + delete []values; + RINOK(res); + } + } + + /* + CMyComPtr<ICompressWriteCoderProperties> writeCoderProperties; + coder->QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties); + if (writeCoderProperties != NULL) + { + CSequentialOutStreamImp *outStreamSpec = new CSequentialOutStreamImp; + CMyComPtr<ISequentialOutStream> outStream(outStreamSpec); + outStreamSpec->Init(); + RINOK(writeCoderProperties->WriteCoderProperties(outStream)); + size_t size = outStreamSpec->GetSize(); + filterProps.SetCapacity(size); + memmove(filterProps, outStreamSpec->GetBuffer(), size); + } + */ + return S_OK; +} + diff --git a/CPP/7zip/Common/MethodProps.h b/CPP/7zip/Common/MethodProps.h new file mode 100755 index 00000000..7ffa8e4a --- /dev/null +++ b/CPP/7zip/Common/MethodProps.h @@ -0,0 +1,41 @@ +// MethodProps.h + +#ifndef __7Z_METHOD_PROPS_H +#define __7Z_METHOD_PROPS_H + +#include "MethodId.h" + +#include "../../Windows/PropVariant.h" +#include "../../Common/MyVector.h" +#include "../ICoder.h" + +struct CProp +{ + PROPID Id; + NWindows::NCOM::CPropVariant Value; +}; + +struct CMethod +{ + CMethodId Id; + CObjectVector<CProp> Properties; +}; + +struct CMethodsMode +{ + CObjectVector<CMethod> Methods; + #ifdef COMPRESS_MT + UInt32 NumThreads; + #endif + + CMethodsMode() + #ifdef COMPRESS_MT + : NumThreads(1) + #endif + {} + bool IsEmpty() const { return Methods.IsEmpty() ; } +}; + +HRESULT SetMethodProperties(const CMethod &method, const UInt64 *inSizeForReduce, IUnknown *coder); + +#endif diff --git a/CPP/7zip/Common/OutBuffer.h b/CPP/7zip/Common/OutBuffer.h index 0ce54e21..e99dbf2a 100755 --- a/CPP/7zip/Common/OutBuffer.h +++ b/CPP/7zip/Common/OutBuffer.h @@ -5,12 +5,12 @@ #include "../IStream.h" #include "../../Common/MyCom.h" +#include "../../Common/MyException.h" #ifndef _NO_EXCEPTIONS -struct COutBufferException -{ - HRESULT ErrorCode; - COutBufferException(HRESULT errorCode): ErrorCode(errorCode) {} +struct COutBufferException: public CSystemException +{ + COutBufferException(HRESULT errorCode): CSystemException(errorCode) {} }; #endif @@ -28,7 +28,6 @@ protected: bool _overDict; HRESULT FlushPart(); - void FlushWithCheck(); public: #ifdef _NO_EXCEPTIONS HRESULT ErrorCode; @@ -44,6 +43,7 @@ public: void SetStream(ISequentialOutStream *stream); void Init(); HRESULT Flush(); + void FlushWithCheck(); void ReleaseStream() { _stream.Release(); } void WriteByte(Byte b) diff --git a/CPP/7zip/Common/ProgressMt.h b/CPP/7zip/Common/ProgressMt.h index c0776944..e57f1167 100755 --- a/CPP/7zip/Common/ProgressMt.h +++ b/CPP/7zip/Common/ProgressMt.h @@ -4,13 +4,12 @@ #define __PROGRESSMT_H #include "../../Common/MyCom.h" +#include "../../Common/MyVector.h" +#include "../../Windows/Synchronization.h" #include "../ICoder.h" #include "../IProgress.h" -#include "Windows/Synchronization.h" -#include "../../Common/Vector.h" - class CMtCompressProgressMixer { CMyComPtr<ICompressProgressInfo> _progress; diff --git a/CPP/7zip/Common/VirtThread.cpp b/CPP/7zip/Common/VirtThread.cpp new file mode 100755 index 00000000..3567f98e --- /dev/null +++ b/CPP/7zip/Common/VirtThread.cpp @@ -0,0 +1,45 @@ +// VirtThread.cpp + +#include "StdAfx.h" + +#include "VirtThread.h" + +static THREAD_FUNC_DECL CoderThread(void *p) +{ + for (;;) + { + CVirtThread *t = (CVirtThread *)p; + t->StartEvent.Lock(); + if (t->ExitEvent) + return 0; + t->Execute(); + t->FinishedEvent.Set(); + } +} + +HRes CVirtThread::Create() +{ + RINOK(StartEvent.CreateIfNotCreated()); + RINOK(FinishedEvent.CreateIfNotCreated()); + StartEvent.Reset(); + FinishedEvent.Reset(); + ExitEvent = false; + if (Thread.IsCreated()) + return S_OK; + return Thread.Create(CoderThread, this); +} + +void CVirtThread::Start() +{ + ExitEvent = false; + StartEvent.Set(); +} + +CVirtThread::~CVirtThread() +{ + ExitEvent = true; + if (StartEvent.IsCreated()) + StartEvent.Set(); + Thread.Wait(); +} + diff --git a/CPP/7zip/Common/VirtThread.h b/CPP/7zip/Common/VirtThread.h new file mode 100755 index 00000000..62c055b6 --- /dev/null +++ b/CPP/7zip/Common/VirtThread.h @@ -0,0 +1,23 @@ +// VirtThread.h + +#ifndef __VIRTTHREAD_H +#define __VIRTTHREAD_H + +#include "../../Windows/Synchronization.h" +#include "../../Windows/Thread.h" + +struct CVirtThread +{ + NWindows::NSynchronization::CAutoResetEvent StartEvent; + NWindows::NSynchronization::CAutoResetEvent FinishedEvent; + NWindows::CThread Thread; + bool ExitEvent; + + ~CVirtThread(); + HRes Create(); + void Start(); + void WaitFinish() { FinishedEvent.Lock(); } + virtual void Execute() = 0; +}; + +#endif diff --git a/CPP/7zip/Compress/Branch/BCJ2Register.cpp b/CPP/7zip/Compress/Branch/BCJ2Register.cpp index 24855dd7..88ebbac6 100755 --- a/CPP/7zip/Compress/Branch/BCJ2Register.cpp +++ b/CPP/7zip/Compress/Branch/BCJ2Register.cpp @@ -5,9 +5,9 @@ #include "../../Common/RegisterCodec.h" #include "x86_2.h" -static void *CreateCodec() { return (void *)(ICompressCoder2 *)(new CBCJ2_x86_Decoder()); } +static void *CreateCodec() { return (void *)(ICompressCoder2 *)(new NCompress::NBcj2::CDecoder()); } #ifndef EXTRACT_ONLY -static void *CreateCodecOut() { return (void *)(ICompressCoder2 *)(new CBCJ2_x86_Encoder()); } +static void *CreateCodecOut() { return (void *)(ICompressCoder2 *)(new NCompress::NBcj2::CEncoder()); } #else #define CreateCodecOut 0 #endif diff --git a/CPP/7zip/Compress/Branch/x86.cpp b/CPP/7zip/Compress/Branch/x86.cpp index c4d11a75..79d49657 100755 --- a/CPP/7zip/Compress/Branch/x86.cpp +++ b/CPP/7zip/Compress/Branch/x86.cpp @@ -5,10 +5,10 @@ UInt32 CBCJ_x86_Encoder::SubFilter(Byte *data, UInt32 size) { - return ::x86_Convert(data, size, _bufferPos, &_prevMask, &_prevPos, 1); + return (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, 1); } UInt32 CBCJ_x86_Decoder::SubFilter(Byte *data, UInt32 size) { - return ::x86_Convert(data, size, _bufferPos, &_prevMask, &_prevPos, 0); + return (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, 0); } diff --git a/CPP/7zip/Compress/Branch/x86.h b/CPP/7zip/Compress/Branch/x86.h index 39ba5ae5..58176600 100755 --- a/CPP/7zip/Compress/Branch/x86.h +++ b/CPP/7zip/Compress/Branch/x86.h @@ -12,8 +12,7 @@ extern "C" struct CBranch86 { UInt32 _prevMask; - UInt32 _prevPos; - void x86Init() { x86_Convert_Init(_prevMask, _prevPos); } + void x86Init() { x86_Convert_Init(_prevMask); } }; MyClassB(BCJ_x86, 0x01, 3, CBranch86 , diff --git a/CPP/7zip/Compress/Branch/x86_2.cpp b/CPP/7zip/Compress/Branch/x86_2.cpp index 178587b6..61f0c55a 100755 --- a/CPP/7zip/Compress/Branch/x86_2.cpp +++ b/CPP/7zip/Compress/Branch/x86_2.cpp @@ -8,10 +8,12 @@ extern "C" #include "../../../../C/Alloc.h" } -inline bool IsJcc(Byte b0, Byte b1) -{ - return (b0 == 0x0F && (b1 & 0xF0) == 0x80); -} +namespace NCompress { +namespace NBcj2 { + +inline bool IsJcc(Byte b0, Byte b1) { return (b0 == 0x0F && (b1 & 0xF0) == 0x80); } +inline bool IsJ(Byte b0, Byte b1) { return ((b1 & 0xFE) == 0xE8 || IsJcc(b0, b1)); } +inline unsigned GetIndex(Byte b0, Byte b1) { return ((b1 == 0xE8) ? b0 : ((b1 == 0xE9) ? 256 : 257)); } #ifndef EXTRACT_ONLY @@ -22,7 +24,7 @@ static bool inline Test86MSByte(Byte b) return (b == 0 || b == 0xFF); } -bool CBCJ2_x86_Encoder::Create() +bool CEncoder::Create() { if (!_mainStream.Create(1 << 16)) return false; @@ -41,12 +43,12 @@ bool CBCJ2_x86_Encoder::Create() return true; } -CBCJ2_x86_Encoder::~CBCJ2_x86_Encoder() +CEncoder::~CEncoder() { ::MidFree(_buffer); } -HRESULT CBCJ2_x86_Encoder::Flush() +HRESULT CEncoder::Flush() { RINOK(_mainStream.Flush()); RINOK(_callStream.Flush()); @@ -57,7 +59,7 @@ HRESULT CBCJ2_x86_Encoder::Flush() const UInt32 kDefaultLimit = (1 << 24); -HRESULT CBCJ2_x86_Encoder::CodeReal(ISequentialInStream **inStreams, +HRESULT CEncoder::CodeReal(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams, ISequentialOutStream **outStreams, @@ -91,10 +93,8 @@ HRESULT CBCJ2_x86_Encoder::CodeReal(ISequentialInStream **inStreams, _jumpStream.Init(); _rangeEncoder.SetStream(outStreams[3]); _rangeEncoder.Init(); - for (int i = 0; i < 256; i++) - _statusE8Encoder[i].Init(); - _statusE9Encoder.Init(); - _statusJccEncoder.Init(); + for (int i = 0; i < 256 + 2; i++) + _statusEncoder[i].Init(); CCoderReleaser releaser(this); CMyComPtr<ICompressGetSubStreamSize> getSubStreamSize; @@ -135,12 +135,19 @@ HRESULT CBCJ2_x86_Encoder::CodeReal(ISequentialInStream **inStreams, { Byte b = _buffer[bufferPos]; _mainStream.WriteByte(b); + UInt32 index; if (b == 0xE8) - _statusE8Encoder[prevByte].Encode(&_rangeEncoder, 0); + index = prevByte; else if (b == 0xE9) - _statusE9Encoder.Encode(&_rangeEncoder, 0); + index = 256; else if (IsJcc(prevByte, b)) - _statusJccEncoder.Encode(&_rangeEncoder, 0); + index = 257; + else + { + prevByte = b; + continue; + } + _statusEncoder[index].Encode(&_rangeEncoder, 0); prevByte = b; } return Flush(); @@ -153,7 +160,7 @@ HRESULT CBCJ2_x86_Encoder::CodeReal(ISequentialInStream **inStreams, { Byte b = _buffer[bufferPos]; _mainStream.WriteByte(b); - if (b != 0xE8 && b != 0xE9 && !IsJcc(prevByte, b)) + if (!IsJ(prevByte, b)) { bufferPos++; prevByte = b; @@ -209,40 +216,19 @@ HRESULT CBCJ2_x86_Encoder::CodeReal(ISequentialInStream **inStreams, convert = (dest < inSize); else convert = Test86MSByte(nextByte); + unsigned index = GetIndex(prevByte, b); if (convert) { - if (b == 0xE8) - _statusE8Encoder[prevByte].Encode(&_rangeEncoder, 1); - else if (b == 0xE9) - _statusE9Encoder.Encode(&_rangeEncoder, 1); - else - _statusJccEncoder.Encode(&_rangeEncoder, 1); - + _statusEncoder[index].Encode(&_rangeEncoder, 1); bufferPos += 5; - if (b == 0xE8) - { - _callStream.WriteByte((Byte)(dest >> 24)); - _callStream.WriteByte((Byte)(dest >> 16)); - _callStream.WriteByte((Byte)(dest >> 8)); - _callStream.WriteByte((Byte)(dest)); - } - else - { - _jumpStream.WriteByte((Byte)(dest >> 24)); - _jumpStream.WriteByte((Byte)(dest >> 16)); - _jumpStream.WriteByte((Byte)(dest >> 8)); - _jumpStream.WriteByte((Byte)(dest)); - } + COutBuffer &s = (b == 0xE8) ? _callStream : _jumpStream; + for (int i = 24; i >= 0; i -= 8) + s.WriteByte((Byte)(dest >> i)); prevByte = nextByte; } else { - if (b == 0xE8) - _statusE8Encoder[prevByte].Encode(&_rangeEncoder, 0); - else if (b == 0xE9) - _statusE9Encoder.Encode(&_rangeEncoder, 0); - else - _statusJccEncoder.Encode(&_rangeEncoder, 0); + _statusEncoder[index].Encode(&_rangeEncoder, 0); bufferPos++; prevByte = b; } @@ -262,7 +248,7 @@ HRESULT CBCJ2_x86_Encoder::CodeReal(ISequentialInStream **inStreams, } } -STDMETHODIMP CBCJ2_x86_Encoder::Code(ISequentialInStream **inStreams, +STDMETHODIMP CEncoder::Code(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams, ISequentialOutStream **outStreams, @@ -281,7 +267,7 @@ STDMETHODIMP CBCJ2_x86_Encoder::Code(ISequentialInStream **inStreams, #endif -HRESULT CBCJ2_x86_Decoder::CodeReal(ISequentialInStream **inStreams, +HRESULT CDecoder::CodeReal(ISequentialInStream **inStreams, const UInt64 ** /* inSizes */, UInt32 numInStreams, ISequentialOutStream **outStreams, @@ -315,10 +301,8 @@ HRESULT CBCJ2_x86_Decoder::CodeReal(ISequentialInStream **inStreams, _rangeDecoder.Init(); _outStream.Init(); - for (int i = 0; i < 256; i++) - _statusE8Decoder[i].Init(); - _statusE9Decoder.Init(); - _statusJccDecoder.Init(); + for (int i = 0; i < 256 + 2; i++) + _statusDecoder[i].Init(); CCoderReleaser releaser(this); @@ -326,62 +310,38 @@ HRESULT CBCJ2_x86_Decoder::CodeReal(ISequentialInStream **inStreams, UInt32 processedBytes = 0; for (;;) { - if (processedBytes > (1 << 20) && progress != NULL) + if (processedBytes >= (1 << 20) && progress != NULL) { UInt64 nowPos64 = _outStream.GetProcessedSize(); RINOK(progress->SetRatioInfo(NULL, &nowPos64)); processedBytes = 0; } - processedBytes++; - Byte b; - if (!_mainInStream.ReadByte(b)) - return Flush(); - _outStream.WriteByte(b); - if (b != 0xE8 && b != 0xE9 && !IsJcc(prevByte, b)) + UInt32 i; + Byte b = 0; + const UInt32 kBurstSize = (1 << 18); + for (i = 0; i < kBurstSize; i++) { + if (!_mainInStream.ReadByte(b)) + return Flush(); + _outStream.WriteByte(b); + if (IsJ(prevByte, b)) + break; prevByte = b; - continue; } - bool status; - if (b == 0xE8) - status = (_statusE8Decoder[prevByte].Decode(&_rangeDecoder) == 1); - else if (b == 0xE9) - status = (_statusE9Decoder.Decode(&_rangeDecoder) == 1); - else - status = (_statusJccDecoder.Decode(&_rangeDecoder) == 1); - if (status) + processedBytes += i; + if (i == kBurstSize) + continue; + unsigned index = GetIndex(prevByte, b); + if (_statusDecoder[index].Decode(&_rangeDecoder) == 1) { - UInt32 src; - if (b == 0xE8) + UInt32 src = 0; + CInBuffer &s = (b == 0xE8) ? _callStream : _jumpStream; + for (int i = 0; i < 4; i++) { Byte b0; - if(!_callStream.ReadByte(b0)) - return S_FALSE; - src = ((UInt32)b0) << 24; - if(!_callStream.ReadByte(b0)) - return S_FALSE; - src |= ((UInt32)b0) << 16; - if(!_callStream.ReadByte(b0)) - return S_FALSE; - src |= ((UInt32)b0) << 8; - if(!_callStream.ReadByte(b0)) - return S_FALSE; - src |= ((UInt32)b0); - } - else - { - Byte b0; - if(!_jumpStream.ReadByte(b0)) - return S_FALSE; - src = ((UInt32)b0) << 24; - if(!_jumpStream.ReadByte(b0)) - return S_FALSE; - src |= ((UInt32)b0) << 16; - if(!_jumpStream.ReadByte(b0)) - return S_FALSE; - src |= ((UInt32)b0) << 8; - if(!_jumpStream.ReadByte(b0)) + if(!s.ReadByte(b0)) return S_FALSE; + src <<= 8; src |= ((UInt32)b0); } UInt32 dest = src - (UInt32(_outStream.GetProcessedSize()) + 4) ; @@ -397,7 +357,7 @@ HRESULT CBCJ2_x86_Decoder::CodeReal(ISequentialInStream **inStreams, } } -STDMETHODIMP CBCJ2_x86_Decoder::Code(ISequentialInStream **inStreams, +STDMETHODIMP CDecoder::Code(ISequentialInStream **inStreams, const UInt64 **inSizes, UInt32 numInStreams, ISequentialOutStream **outStreams, @@ -410,6 +370,9 @@ STDMETHODIMP CBCJ2_x86_Decoder::Code(ISequentialInStream **inStreams, return CodeReal(inStreams, inSizes, numInStreams, outStreams, outSizes,numOutStreams, progress); } + catch(const CInBufferException &e) { return e.ErrorCode; } catch(const COutBufferException &e) { return e.ErrorCode; } catch(...) { return S_FALSE; } } + +}} diff --git a/CPP/7zip/Compress/Branch/x86_2.h b/CPP/7zip/Compress/Branch/x86_2.h index 3d34eb8d..2e4a5267 100755 --- a/CPP/7zip/Compress/Branch/x86_2.h +++ b/CPP/7zip/Compress/Branch/x86_2.h @@ -7,38 +7,28 @@ #include "../RangeCoder/RangeCoderBit.h" #include "../../ICoder.h" -// {23170F69-40C1-278B-0303-010100000100} -#define MyClass2_a(Name, id, subId, encodingId) \ -DEFINE_GUID(CLSID_CCompressConvert ## Name, \ -0x23170F69, 0x40C1, 0x278B, 0x03, 0x03, id, subId, 0x00, 0x00, encodingId, 0x00); - -#define MyClass_a(Name, id, subId) \ -MyClass2_a(Name ## _Encoder, id, subId, 0x01) \ -MyClass2_a(Name ## _Decoder, id, subId, 0x00) - -MyClass_a(BCJ2_x86, 0x01, 0x1B) +namespace NCompress { +namespace NBcj2 { const int kNumMoveBits = 5; #ifndef EXTRACT_ONLY -class CBCJ2_x86_Encoder: +class CEncoder: public ICompressCoder2, public CMyUnknownImp { Byte *_buffer; public: - CBCJ2_x86_Encoder(): _buffer(0) {}; - ~CBCJ2_x86_Encoder(); + CEncoder(): _buffer(0) {}; + ~CEncoder(); bool Create(); COutBuffer _mainStream; COutBuffer _callStream; COutBuffer _jumpStream; NCompress::NRangeCoder::CEncoder _rangeEncoder; - NCompress::NRangeCoder::CBitEncoder<kNumMoveBits> _statusE8Encoder[256]; - NCompress::NRangeCoder::CBitEncoder<kNumMoveBits> _statusE9Encoder; - NCompress::NRangeCoder::CBitEncoder<kNumMoveBits> _statusJccEncoder; + NCompress::NRangeCoder::CBitEncoder<kNumMoveBits> _statusEncoder[256 + 2]; HRESULT Flush(); void ReleaseStreams() @@ -51,9 +41,9 @@ public: class CCoderReleaser { - CBCJ2_x86_Encoder *_coder; + CEncoder *_coder; public: - CCoderReleaser(CBCJ2_x86_Encoder *coder): _coder(coder) {} + CCoderReleaser(CEncoder *coder): _coder(coder) {} ~CCoderReleaser() { _coder->ReleaseStreams(); } }; @@ -79,7 +69,7 @@ public: #endif -class CBCJ2_x86_Decoder: +class CDecoder: public ICompressCoder2, public CMyUnknownImp { @@ -88,9 +78,7 @@ public: CInBuffer _callStream; CInBuffer _jumpStream; NCompress::NRangeCoder::CDecoder _rangeDecoder; - NCompress::NRangeCoder::CBitDecoder<kNumMoveBits> _statusE8Decoder[256]; - NCompress::NRangeCoder::CBitDecoder<kNumMoveBits> _statusE9Decoder; - NCompress::NRangeCoder::CBitDecoder<kNumMoveBits> _statusJccDecoder; + NCompress::NRangeCoder::CBitDecoder<kNumMoveBits> _statusDecoder[256 + 2]; COutBuffer _outStream; @@ -106,9 +94,9 @@ public: HRESULT Flush() { return _outStream.Flush(); } class CCoderReleaser { - CBCJ2_x86_Decoder *_coder; + CDecoder *_coder; public: - CCoderReleaser(CBCJ2_x86_Decoder *coder): _coder(coder) {} + CCoderReleaser(CDecoder *coder): _coder(coder) {} ~CCoderReleaser() { _coder->ReleaseStreams(); } }; @@ -130,4 +118,6 @@ public: ICompressProgressInfo *progress); }; +}} + #endif diff --git a/CPP/7zip/Compress/Copy/CopyCoder.cpp b/CPP/7zip/Compress/Copy/CopyCoder.cpp index 141bcf3f..b9af74db 100755 --- a/CPP/7zip/Compress/Copy/CopyCoder.cpp +++ b/CPP/7zip/Compress/Copy/CopyCoder.cpp @@ -52,5 +52,11 @@ STDMETHODIMP CCopyCoder::Code(ISequentialInStream *inStream, return S_OK; } +STDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value) +{ + *value = TotalSize; + return S_OK; +} + } diff --git a/CPP/7zip/Compress/Copy/CopyCoder.h b/CPP/7zip/Compress/Copy/CopyCoder.h index d2a26a89..d4530697 100755 --- a/CPP/7zip/Compress/Copy/CopyCoder.h +++ b/CPP/7zip/Compress/Copy/CopyCoder.h @@ -10,6 +10,7 @@ namespace NCompress { class CCopyCoder: public ICompressCoder, + public ICompressGetInStreamProcessedSize, public CMyUnknownImp { Byte *_buffer; @@ -18,12 +19,13 @@ public: CCopyCoder(): TotalSize(0) , _buffer(0) {}; ~CCopyCoder(); - MY_UNKNOWN_IMP + MY_UNKNOWN_IMP1(ICompressGetInStreamProcessedSize) STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); }; } diff --git a/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsp b/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsp index 9cea4cb1..39fee934 100755 --- a/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsp +++ b/CPP/7zip/Compress/LZMA_Alone/AloneLZMA.dsp @@ -237,6 +237,14 @@ SOURCE=..\..\..\Windows\Synchronization.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\System.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\Thread.h # End Source File # End Group @@ -277,51 +285,51 @@ SOURCE=..\..\..\Common\MyCom.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\MyWindows.h +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.h +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\MyVector.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\MyWindows.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.cpp +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.h +SOURCE=..\..\..\Common\NewHandler.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringToInt.cpp +SOURCE=..\..\..\Common\StringConvert.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringToInt.h +SOURCE=..\..\..\Common\StringConvert.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Types.h +SOURCE=..\..\..\Common\StringToInt.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp +SOURCE=..\..\..\Common\StringToInt.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.h +SOURCE=..\..\..\Common\Types.h # End Source File # End Group # Begin Group "7zip Common" diff --git a/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp b/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp index 69a06207..90c122fc 100755 --- a/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp +++ b/CPP/7zip/Compress/LZMA_Alone/LzmaAlone.cpp @@ -29,7 +29,7 @@ #include "LzmaRam.h" #ifdef COMPRESS_MF_MT -#include "Windows/System.h" +#include "../../../Windows/System.h" #endif extern "C" @@ -92,7 +92,7 @@ static const CSwitchForm kSwitchForms[] = { L"EOS", NSwitchType::kSimple, false }, { L"SI", NSwitchType::kSimple, false }, { L"SO", NSwitchType::kSimple, false }, - { L"F86", NSwitchType::kSimple, false } + { L"F86", NSwitchType::kPostChar, false, 0, 0, L"+" } }; static const int kNumSwitches = sizeof(kSwitchForms) / sizeof(kSwitchForms[0]); @@ -159,7 +159,7 @@ int main2(int n, const char *args[]) g_IsNT = IsItWindowsNT(); #endif - fprintf(stderr, "\nLZMA 4.45 Copyright (c) 1999-2007 Igor Pavlov 2007-04-03\n"); + fprintf(stderr, "\nLZMA 4.48 Copyright (c) 1999-2007 Igor Pavlov 2007-06-24\n"); if (n == 1) { @@ -335,7 +335,7 @@ int main2(int n, const char *args[]) if (!dictionaryIsDefined) dictionary = 1 << 23; int res = LzmaRamEncode(inBuffer, inSize, outBuffer, outSize, &outSizeProcessed, - dictionary, SZ_FILTER_AUTO); + dictionary, parser[NKey::kFilter86].PostCharIndex == 0 ? SZ_FILTER_YES : SZ_FILTER_AUTO); if (res != 0) { fprintf(stderr, "\nEncoder error = %d\n", (int)res); diff --git a/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp b/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp index b0f01099..124f559b 100755 --- a/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp +++ b/CPP/7zip/Compress/LZMA_Alone/LzmaBench.cpp @@ -37,12 +37,12 @@ extern "C" #include "../../ICoder.h" #ifdef BENCH_MT -#include "Windows/Thread.h" -#include "Windows/Synchronization.h" +#include "../../../Windows/Thread.h" +#include "../../../Windows/Synchronization.h" #endif #ifdef EXTERNAL_LZMA -#include "Windows/PropVariant.h" +#include "../../../Windows/PropVariant.h" #else #include "../LZMA/LZMADecoder.h" #include "../LZMA/LZMAEncoder.h" diff --git a/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp b/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp index fef5a9ad..e55b4bc7 100755 --- a/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp +++ b/CPP/7zip/Compress/LZMA_Alone/LzmaBenchCon.cpp @@ -6,10 +6,10 @@ #include "LzmaBench.h" #include "LzmaBenchCon.h" -#include "Common/IntToString.h" +#include "../../../Common/IntToString.h" #if defined(BENCH_MT) || defined(_WIN32) -#include "Windows/System.h" +#include "../../../Windows/System.h" #endif #ifdef BREAK_HANDLER diff --git a/CPP/7zip/Compress/LZMA_Alone/LzmaRam.cpp b/CPP/7zip/Compress/LZMA_Alone/LzmaRam.cpp index 31ca1c74..b86d1ea9 100755 --- a/CPP/7zip/Compress/LZMA_Alone/LzmaRam.cpp +++ b/CPP/7zip/Compress/LZMA_Alone/LzmaRam.cpp @@ -169,10 +169,9 @@ int LzmaRamEncode( return SZ_RAM_E_OUTOFMEMORY; memmove(filteredStream, inBuffer, inSize); } - UInt32 _prevMask; - UInt32 _prevPos; - x86_Convert_Init(_prevMask, _prevPos); - x86_Convert(filteredStream, (UInt32)inSize, 0, &_prevMask, &_prevPos, 1); + UInt32 x86State; + x86_Convert_Init(x86State); + x86_Convert(filteredStream, (SizeT)inSize, 0, &x86State, 1); } size_t minSize = 0; diff --git a/CPP/7zip/Compress/LZMA_Alone/LzmaRamDecode.c b/CPP/7zip/Compress/LZMA_Alone/LzmaRamDecode.c index 0767ba21..29f798be 100755 --- a/CPP/7zip/Compress/LZMA_Alone/LzmaRamDecode.c +++ b/CPP/7zip/Compress/LZMA_Alone/LzmaRamDecode.c @@ -70,10 +70,9 @@ int LzmaRamDecompress( *outSizeProcessed = (size_t)outSizeProcessedLoc; if (useFilter == 1) { - UInt32 _prevMask; - UInt32 _prevPos; - x86_Convert_Init(_prevMask, _prevPos); - x86_Convert(outBuffer, (UInt32)outSizeProcessedLoc, 0, &_prevMask, &_prevPos, 0); + UInt32 x86State; + x86_Convert_Init(x86State); + x86_Convert(outBuffer, (SizeT)outSizeProcessedLoc, 0, &x86State, 0); } return 0; } diff --git a/CPP/7zip/Compress/LZMA_Alone/makefile b/CPP/7zip/Compress/LZMA_Alone/makefile index b7e6ca0e..16e76376 100755 --- a/CPP/7zip/Compress/LZMA_Alone/makefile +++ b/CPP/7zip/Compress/LZMA_Alone/makefile @@ -1,5 +1,5 @@ PROG = lzma.exe -CFLAGS = $(CFLAGS) -I ../../../ \ +CFLAGS = $(CFLAGS) \ -DCOMPRESS_MF_MT \ -DBENCH_MT \ @@ -53,10 +53,13 @@ COMMON_OBJS = \ $O\CommandLineParser.obj \ $O\CRC.obj \ $O\IntToString.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ - $O\Vector.obj + $O\MyVector.obj + +WIN_OBJS = \ + $O\System.obj 7ZIP_COMMON_OBJS = \ $O\InBuffer.obj \ @@ -79,6 +82,7 @@ OBJS = \ $(LZMA_OBJS) \ $(LZMA_OPT_OBJS) \ $(COMMON_OBJS) \ + $(WIN_OBJS) \ $(7ZIP_COMMON_OBJS) \ $(LZ_OBJS) \ $(C_OBJS) \ @@ -108,6 +112,8 @@ $(LZMA_OPT_OBJS): ../LZMA/$(*B).cpp $(COMPL_O2) $(COMMON_OBJS): ../../../Common/$(*B).cpp $(COMPL) +$(WIN_OBJS): ../../../Windows/$(*B).cpp + $(COMPL) $(7ZIP_COMMON_OBJS): ../../Common/$(*B).cpp $(COMPL) $(LZ_OBJS): ../LZ/$(*B).cpp diff --git a/CPP/7zip/Compress/LZMA_Alone/makefile.gcc b/CPP/7zip/Compress/LZMA_Alone/makefile.gcc index 7696021e..4fed05e6 100755 --- a/CPP/7zip/Compress/LZMA_Alone/makefile.gcc +++ b/CPP/7zip/Compress/LZMA_Alone/makefile.gcc @@ -3,7 +3,20 @@ CXX = g++ -O2 -Wall CXX_C = gcc -O2 -Wall LIB = -lm RM = rm -f -CFLAGS = -c -I ../../../ +CFLAGS = -c + +ifdef SystemDrive +IS_MINGW = 1 +endif + +ifdef IS_MINGW +FILE_IO =FileIO +FILE_IO_2 =Windows/$(FILE_IO) +LIB2 = -luuid +else +FILE_IO =C_FileIO +FILE_IO_2 =Common/$(FILE_IO) +endif OBJS = \ LzmaAlone.o \ @@ -18,14 +31,14 @@ OBJS = \ OutBuffer.o \ FileStreams.o \ StreamUtils.o \ - C_FileIO.o \ + $(FILE_IO).o \ CommandLineParser.o \ CRC.o \ IntToString.o \ - String.o \ + MyString.o \ StringConvert.o \ StringToInt.o \ - Vector.o \ + MyVector.o \ 7zCrc.o \ Alloc.o \ BranchX86.o \ @@ -37,7 +50,7 @@ OBJS = \ all: $(PROG) $(PROG): $(OBJS) - $(CXX) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIB) + $(CXX) -o $(PROG) $(LDFLAGS) $(OBJS) $(LIB) $(LIB2) LzmaAlone.o: LzmaAlone.cpp $(CXX) $(CFLAGS) LzmaAlone.cpp @@ -75,8 +88,9 @@ FileStreams.o: ../../Common/FileStreams.cpp StreamUtils.o: ../../Common/StreamUtils.cpp $(CXX) $(CFLAGS) ../../Common/StreamUtils.cpp -C_FileIO.o: ../../../Common/C_FileIO.cpp - $(CXX) $(CFLAGS) ../../../Common/C_FileIO.cpp +$(FILE_IO).o: ../../../$(FILE_IO_2).cpp + $(CXX) $(CFLAGS) ../../../$(FILE_IO_2).cpp + CommandLineParser.o: ../../../Common/CommandLineParser.cpp $(CXX) $(CFLAGS) ../../../Common/CommandLineParser.cpp @@ -90,8 +104,8 @@ MyWindows.o: ../../../Common/MyWindows.cpp IntToString.o: ../../../Common/IntToString.cpp $(CXX) $(CFLAGS) ../../../Common/IntToString.cpp -String.o: ../../../Common/String.cpp - $(CXX) $(CFLAGS) ../../../Common/String.cpp +MyString.o: ../../../Common/MyString.cpp + $(CXX) $(CFLAGS) ../../../Common/MyString.cpp StringConvert.o: ../../../Common/StringConvert.cpp $(CXX) $(CFLAGS) ../../../Common/StringConvert.cpp @@ -99,8 +113,8 @@ StringConvert.o: ../../../Common/StringConvert.cpp StringToInt.o: ../../../Common/StringToInt.cpp $(CXX) $(CFLAGS) ../../../Common/StringToInt.cpp -Vector.o: ../../../Common/Vector.cpp - $(CXX) $(CFLAGS) ../../../Common/Vector.cpp +MyVector.o: ../../../Common/MyVector.cpp + $(CXX) $(CFLAGS) ../../../Common/MyVector.cpp 7zCrc.o: ../../../../C/7zCrc.c $(CXX_C) $(CFLAGS) ../../../../C/7zCrc.c diff --git a/CPP/7zip/Compress/Rar/Rar3Vm.h b/CPP/7zip/Compress/Rar/Rar3Vm.h index cc8bbcd7..99a4f624 100755 --- a/CPP/7zip/Compress/Rar/Rar3Vm.h +++ b/CPP/7zip/Compress/Rar/Rar3Vm.h @@ -7,7 +7,7 @@ #define __RAR3VM_H #include "Common/Types.h" -#include "Common/Vector.h" +#include "Common/MyVector.h" #define RARVM_STANDARD_FILTERS #if defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || defined(__i386__) || defined(__x86_64__) // || defined(_M_IA64) || defined(__ia64__) diff --git a/CPP/7zip/Crypto/7zAES/7zAES.cpp b/CPP/7zip/Crypto/7zAES/7zAES.cpp index ae9854e4..d8d86fab 100755 --- a/CPP/7zip/Crypto/7zAES/7zAES.cpp +++ b/CPP/7zip/Crypto/7zAES/7zAES.cpp @@ -1,4 +1,4 @@ -// 7z_AES.cpp +// 7zAES.cpp #include "StdAfx.h" @@ -8,9 +8,12 @@ #include "../../Common/StreamUtils.h" #include "../AES/MyAES.h" #include "../Hash/Sha256.h" - #include "7zAES.h" +#ifndef EXTRACT_ONLY +#include "../Hash/RandGen.h" +#endif + using namespace NWindows; namespace NCrypto { @@ -89,7 +92,8 @@ static CKeyInfoCache g_GlobalKeyCache(32); static NSynchronization::CCriticalSection g_GlobalKeyCacheCriticalSection; CBase::CBase(): - _cachedKeys(16) + _cachedKeys(16), + _ivSize(0) { for (int i = 0; i < sizeof(_iv); i++) _iv[i] = 0; @@ -111,40 +115,31 @@ void CBase::CalculateDigest() } } +#ifndef EXTRACT_ONLY /* -static void GetRandomData(Byte *data) +STDMETHODIMP CEncoder::ResetSalt() { - // probably we don't need truly random. - // it's enough to prevent dictionary attack; - // but it gives some info about time when compressing - // was made. - UInt64 tempValue; - SYSTEMTIME systemTime; - FILETIME fileTime; - ::GetSystemTime(&systemTime); - ::SystemTimeToFileTime(&systemTime, &fileTime); - tempValue = *(const UInt64 *)&fileTime; - LARGE_INTEGER counter; - ::QueryPerformanceCounter(&counter); - tempValue += *(const UInt64 *)&counter; - tempValue += (UInt64)(GetTickCount()) << 32; - *(UInt64 *)data = tempValue; + _key.SaltSize = 4; + g_RandomGenerator.Generate(_key.Salt, _key.SaltSize); + return S_OK; } */ +STDMETHODIMP CEncoder::ResetInitVector() +{ + _ivSize = 8; + g_RandomGenerator.Generate(_iv, _ivSize); + return S_OK; +} + STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) { - _key.Init(); - for (UInt32 i = 0; i < sizeof(_iv); i++) + // _key.Init(); + for (UInt32 i = _ivSize; i < sizeof(_iv); i++) _iv[i] = 0; - _key.SaltSize = 0; - - // _key.SaltSize = 8; - // GetRandomData(_key.Salt); - - int ivSize = 0; + UInt32 ivSize = _ivSize; // _key.NumCyclesPower = 0x3F; _key.NumCyclesPower = 18; @@ -170,6 +165,14 @@ STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) return S_OK; } +HRESULT CEncoder::CreateFilter() +{ + _aesFilter = new CAES_CBC_Encoder; + return S_OK; +} + +#endif + STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) { _key.Init(); @@ -229,12 +232,6 @@ STDMETHODIMP_(UInt32) CBaseCoder::Filter(Byte *data, UInt32 size) return _aesFilter->Filter(data, size); } -HRESULT CEncoder::CreateFilter() -{ - _aesFilter = new CAES_CBC_Encoder; - return S_OK; -} - HRESULT CDecoder::CreateFilter() { _aesFilter = new CAES_CBC_Decoder; diff --git a/CPP/7zip/Crypto/7zAES/7zAES.h b/CPP/7zip/Crypto/7zAES/7zAES.h index e8cedccf..ce14e2a1 100755 --- a/CPP/7zip/Crypto/7zAES/7zAES.h +++ b/CPP/7zip/Crypto/7zAES/7zAES.h @@ -6,7 +6,7 @@ #include "Common/MyCom.h" #include "Common/Types.h" #include "Common/Buffer.h" -#include "Common/Vector.h" +#include "Common/MyVector.h" #include "../../ICoder.h" #include "../../IPassword.h" @@ -55,7 +55,7 @@ class CBase protected: CKeyInfo _key; Byte _iv[16]; - // int _ivSize; + UInt32 _ivSize; void CalculateDigest(); CBase(); }; @@ -80,17 +80,26 @@ public: STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); }; +#ifndef EXTRACT_ONLY + class CEncoder: public CBaseCoder, - public ICompressWriteCoderProperties + public ICompressWriteCoderProperties, + // public ICryptoResetSalt, + public ICryptoResetInitVector { virtual HRESULT CreateFilter(); public: - MY_UNKNOWN_IMP2( + MY_UNKNOWN_IMP3( ICryptoSetPassword, - ICompressWriteCoderProperties) + ICompressWriteCoderProperties, + // ICryptoResetSalt, + ICryptoResetInitVector) STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); + // STDMETHOD(ResetSalt)(); + STDMETHOD(ResetInitVector)(); }; +#endif class CDecoder: public CBaseCoder, diff --git a/CPP/7zip/Crypto/WzAES/WzAES.h b/CPP/7zip/Crypto/WzAES/WzAES.h index 81ca3f4c..10df3045 100755 --- a/CPP/7zip/Crypto/WzAES/WzAES.h +++ b/CPP/7zip/Crypto/WzAES/WzAES.h @@ -16,7 +16,7 @@ specified in password Based File Encryption Utility: #include "Common/MyCom.h" #include "Common/Buffer.h" -#include "Common/Vector.h" +#include "Common/MyVector.h" #include "../../ICoder.h" #include "../../IPassword.h" diff --git a/CPP/7zip/FileManager/ExtractCallback.h b/CPP/7zip/FileManager/ExtractCallback.h index 7bf8864e..5cf8d635 100755 --- a/CPP/7zip/FileManager/ExtractCallback.h +++ b/CPP/7zip/FileManager/ExtractCallback.h @@ -4,7 +4,7 @@ #define __EXTRACTCALLBACK_H #include "../UI/Agent/IFolderArchive.h" -#include "Common/String.h" +#include "Common/MyString.h" #ifdef _SFX #include "Resource/ProgressDialog/ProgressDialog.h" diff --git a/CPP/7zip/FileManager/FM.dsp b/CPP/7zip/FileManager/FM.dsp index 5265a961..e39ce3af 100755 --- a/CPP/7zip/FileManager/FM.dsp +++ b/CPP/7zip/FileManager/FM.dsp @@ -1027,6 +1027,22 @@ SOURCE=..\..\Common\MyCom.h # End Source File # Begin Source File +SOURCE=..\..\Common\MyString.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MyString.h +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MyVector.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Common\MyVector.h +# End Source File +# Begin Source File + SOURCE=..\..\Common\NewHandler.cpp # End Source File # Begin Source File @@ -1059,14 +1075,6 @@ SOURCE=..\..\Common\StdOutStream.h # End Source File # Begin Source File -SOURCE=..\..\Common\String.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\Common\String.h -# End Source File -# Begin Source File - SOURCE=..\..\Common\StringConvert.cpp # End Source File # Begin Source File @@ -1103,14 +1111,6 @@ SOURCE=..\..\Common\UTFConvert.h # End Source File # Begin Source File -SOURCE=..\..\Common\Vector.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\Common\Vector.h -# End Source File -# Begin Source File - SOURCE=..\..\Common\Wildcard.cpp # End Source File # Begin Source File diff --git a/CPP/7zip/FileManager/FSDrives.h b/CPP/7zip/FileManager/FSDrives.h index 496e8fc1..47afa0cf 100755 --- a/CPP/7zip/FileManager/FSDrives.h +++ b/CPP/7zip/FileManager/FSDrives.h @@ -3,7 +3,7 @@ #ifndef __FSDRIVES_H #define __FSDRIVES_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Types.h" #include "Common/MyCom.h" #include "Windows/FileFind.h" diff --git a/CPP/7zip/FileManager/FSFolder.h b/CPP/7zip/FileManager/FSFolder.h index 4641c018..898aff2c 100755 --- a/CPP/7zip/FileManager/FSFolder.h +++ b/CPP/7zip/FileManager/FSFolder.h @@ -3,7 +3,7 @@ #ifndef __FSFOLDER_H #define __FSFOLDER_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/MyCom.h" #include "Windows/FileFind.h" #include "Windows/PropVariant.h" diff --git a/CPP/7zip/FileManager/FormatUtils.h b/CPP/7zip/FileManager/FormatUtils.h index f7e9b193..35536871 100755 --- a/CPP/7zip/FileManager/FormatUtils.h +++ b/CPP/7zip/FileManager/FormatUtils.h @@ -4,7 +4,7 @@ #define __FORMATUTILS_H #include "Common/Types.h" -#include "Common/String.h" +#include "Common/MyString.h" UString NumberToString(UInt64 number); diff --git a/CPP/7zip/FileManager/HelpUtils.h b/CPP/7zip/FileManager/HelpUtils.h index b993f09b..2a7b85af 100755 --- a/CPP/7zip/FileManager/HelpUtils.h +++ b/CPP/7zip/FileManager/HelpUtils.h @@ -3,7 +3,7 @@ #ifndef __HELPUTILS_H #define __HELPUTILS_H -#include "Common/String.h" +#include "Common/MyString.h" void ShowHelpWindow(HWND hwnd, LPCWSTR topicFile); diff --git a/CPP/7zip/FileManager/LangUtils.cpp b/CPP/7zip/FileManager/LangUtils.cpp index decff306..f41e764e 100755 --- a/CPP/7zip/FileManager/LangUtils.cpp +++ b/CPP/7zip/FileManager/LangUtils.cpp @@ -134,10 +134,32 @@ bool SplidID(const UString &id, WORD &primID, WORD &subID) return (*end == 0); } +typedef LANGID (WINAPI *GetUserDefaultUILanguageP)(); + void FindMatchLang(UString &shortName) { shortName.Empty(); - LANGID langID = GetUserDefaultLangID(); + + LANGID SystemDefaultLangID = GetSystemDefaultLangID(); // Lang for non-Unicode in XP64 + LANGID UserDefaultLangID = GetUserDefaultLangID(); // Standarts and formats in XP64 + + if (SystemDefaultLangID != UserDefaultLangID) + return; + LANGID langID = UserDefaultLangID; + /* + LANGID SystemDefaultUILanguage; // english in XP64 + LANGID UserDefaultUILanguage; // english in XP64 + + GetUserDefaultUILanguageP fn = (GetUserDefaultUILanguageP)GetProcAddress( + GetModuleHandle("kernel32"), "GetUserDefaultUILanguage"); + if (fn != NULL) + UserDefaultUILanguage = fn(); + fn = (GetUserDefaultUILanguageP)GetProcAddress( + GetModuleHandle("kernel32"), "GetSystemDefaultUILanguage"); + if (fn != NULL) + SystemDefaultUILanguage = fn(); + */ + WORD primLang = (WORD)(PRIMARYLANGID(langID)); WORD subLang = (WORD)(SUBLANGID(langID)); CObjectVector<CLangEx> langs; diff --git a/CPP/7zip/FileManager/NetFolder.h b/CPP/7zip/FileManager/NetFolder.h index f23c7e4e..acc7cad2 100755 --- a/CPP/7zip/FileManager/NetFolder.h +++ b/CPP/7zip/FileManager/NetFolder.h @@ -3,7 +3,7 @@ #ifndef __NETFOLDER_H #define __NETFOLDER_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Buffer.h" #include "Common/MyCom.h" #include "Windows/PropVariant.h" diff --git a/CPP/7zip/FileManager/OpenCallback.h b/CPP/7zip/FileManager/OpenCallback.h index 853c0e44..d7e9a5ed 100755 --- a/CPP/7zip/FileManager/OpenCallback.h +++ b/CPP/7zip/FileManager/OpenCallback.h @@ -3,7 +3,7 @@ #ifndef __OPENCALLBACK_H #define __OPENCALLBACK_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/MyCom.h" #include "Windows/FileFind.h" diff --git a/CPP/7zip/FileManager/PanelItems.cpp b/CPP/7zip/FileManager/PanelItems.cpp index 16c8d29a..07d10a76 100755 --- a/CPP/7zip/FileManager/PanelItems.cpp +++ b/CPP/7zip/FileManager/PanelItems.cpp @@ -2,7 +2,6 @@ #include "StdAfx.h" -#include "Common/String.h" #include "Common/StringConvert.h" #include "Windows/PropVariant.h" diff --git a/CPP/7zip/FileManager/PhysDriveFolder.h b/CPP/7zip/FileManager/PhysDriveFolder.h index db339af4..550b76b4 100755 --- a/CPP/7zip/FileManager/PhysDriveFolder.h +++ b/CPP/7zip/FileManager/PhysDriveFolder.h @@ -3,7 +3,7 @@ #ifndef __PHYSDRIVEFOLDER_H #define __PHYSDRIVEFOLDER_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/MyCom.h" #include "IFolder.h" diff --git a/CPP/7zip/FileManager/PluginInterface.h b/CPP/7zip/FileManager/PluginInterface.h index 249f5644..7bef6950 100755 --- a/CPP/7zip/FileManager/PluginInterface.h +++ b/CPP/7zip/FileManager/PluginInterface.h @@ -3,7 +3,7 @@ #ifndef __PLUGININTERFACE_H #define __PLUGININTERFACE_H -#include "Common/String.h" +#include "Common/MyString.h" // {23170F69-40C1-278D-0000-000100010000} DEFINE_GUID(IID_IInitContextMenu, diff --git a/CPP/7zip/FileManager/ProgramLocation.h b/CPP/7zip/FileManager/ProgramLocation.h index 8a8dcf7d..38317b45 100755 --- a/CPP/7zip/FileManager/ProgramLocation.h +++ b/CPP/7zip/FileManager/ProgramLocation.h @@ -3,7 +3,7 @@ #ifndef __PROGRAMLOCATION_H #define __PROGRAMLOCATION_H -#include "Common/String.h" +#include "Common/MyString.h" bool GetProgramFolderPath(UString &folder); // normalized diff --git a/CPP/7zip/FileManager/PropertyName.h b/CPP/7zip/FileManager/PropertyName.h index c99fe933..413d2343 100755 --- a/CPP/7zip/FileManager/PropertyName.h +++ b/CPP/7zip/FileManager/PropertyName.h @@ -3,7 +3,7 @@ #ifndef __PROPERTYNAME_H #define __PROPERTYNAME_H -#include "Common/String.h" +#include "Common/MyString.h" UString GetNameOfProperty(PROPID propID); diff --git a/CPP/7zip/FileManager/RegistryAssociations.h b/CPP/7zip/FileManager/RegistryAssociations.h index 91613f79..c1a64c96 100755 --- a/CPP/7zip/FileManager/RegistryAssociations.h +++ b/CPP/7zip/FileManager/RegistryAssociations.h @@ -3,8 +3,7 @@ #ifndef __REGISTRYASSOCIATIONS_H #define __REGISTRYASSOCIATIONS_H -#include "Common/String.h" -#include "Common/Vector.h" +#include "Common/MyString.h" namespace NRegistryAssociations { diff --git a/CPP/7zip/FileManager/RegistryPlugins.h b/CPP/7zip/FileManager/RegistryPlugins.h index 4a30857c..55f9ebbc 100755 --- a/CPP/7zip/FileManager/RegistryPlugins.h +++ b/CPP/7zip/FileManager/RegistryPlugins.h @@ -3,8 +3,7 @@ #ifndef __REGISTRYPLUGINS_H #define __REGISTRYPLUGINS_H -#include "Common/Vector.h" -#include "Common/String.h" +#include "Common/MyString.h" enum EPluginType { diff --git a/CPP/7zip/FileManager/Resource/ListViewDialog/ListViewDialog.cpp b/CPP/7zip/FileManager/Resource/ListViewDialog/ListViewDialog.cpp index ca7b7935..e6a6779e 100755 --- a/CPP/7zip/FileManager/Resource/ListViewDialog/ListViewDialog.cpp +++ b/CPP/7zip/FileManager/Resource/ListViewDialog/ListViewDialog.cpp @@ -3,8 +3,6 @@ #include "StdAfx.h" #include "ListViewDialog.h" -#include "Common/Vector.h" - #ifdef LANG #include "../../LangUtils.h" static CIDLangPair kIDLangPairs[] = diff --git a/CPP/7zip/FileManager/RootFolder.h b/CPP/7zip/FileManager/RootFolder.h index 16bac250..d49f4d12 100755 --- a/CPP/7zip/FileManager/RootFolder.h +++ b/CPP/7zip/FileManager/RootFolder.h @@ -3,7 +3,7 @@ #ifndef __ROOTFOLDER_H #define __ROOTFOLDER_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Windows/PropVariant.h" diff --git a/CPP/7zip/FileManager/SplitUtils.h b/CPP/7zip/FileManager/SplitUtils.h index fe359f04..755c707c 100755 --- a/CPP/7zip/FileManager/SplitUtils.h +++ b/CPP/7zip/FileManager/SplitUtils.h @@ -3,7 +3,7 @@ #ifndef __SPLITUTILS_H #define __SPLITUTILS_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Types.h" #include "Windows/Control/ComboBox.h" diff --git a/CPP/7zip/FileManager/StringUtils.h b/CPP/7zip/FileManager/StringUtils.h index 376a3024..7f72b764 100755 --- a/CPP/7zip/FileManager/StringUtils.h +++ b/CPP/7zip/FileManager/StringUtils.h @@ -3,7 +3,7 @@ #ifndef __STRINGUTILS_H #define __STRINGUTILS_H -#include "Common/String.h" +#include "Common/MyString.h" void SplitStringToTwoStrings(const UString &src, UString &dest1, UString &dest2); diff --git a/CPP/7zip/FileManager/SysIconUtils.h b/CPP/7zip/FileManager/SysIconUtils.h index 51294751..3b6c6c2e 100755 --- a/CPP/7zip/FileManager/SysIconUtils.h +++ b/CPP/7zip/FileManager/SysIconUtils.h @@ -3,7 +3,7 @@ #ifndef __SYSICONUTILS_H #define __SYSICONUTILS_H -#include "Common/String.h" +#include "Common/MyString.h" struct CExtIconPair { diff --git a/CPP/7zip/FileManager/TextPairs.h b/CPP/7zip/FileManager/TextPairs.h index 247a92d9..b75d9c72 100755 --- a/CPP/7zip/FileManager/TextPairs.h +++ b/CPP/7zip/FileManager/TextPairs.h @@ -3,8 +3,7 @@ #ifndef __COMMON_TEXTPAIRS_H #define __COMMON_TEXTPAIRS_H -#include "Common/Vector.h" -#include "Common/String.h" +#include "Common/MyString.h" struct CTextPair { diff --git a/CPP/7zip/FileManager/UpdateCallback100.h b/CPP/7zip/FileManager/UpdateCallback100.h index 4cce5b52..0163010b 100755 --- a/CPP/7zip/FileManager/UpdateCallback100.h +++ b/CPP/7zip/FileManager/UpdateCallback100.h @@ -4,7 +4,7 @@ #define __UPDATE_CALLBACK100_H #include "Common/MyCom.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "../UI/Agent/IFolderArchive.h" #include "Resource/ProgressDialog2/ProgressDialog.h" diff --git a/CPP/7zip/FileManager/ViewSettings.h b/CPP/7zip/FileManager/ViewSettings.h index 4894a6f9..4af0b991 100755 --- a/CPP/7zip/FileManager/ViewSettings.h +++ b/CPP/7zip/FileManager/ViewSettings.h @@ -3,8 +3,7 @@ #ifndef __VIEWSETTINGS_H #define __VIEWSETTINGS_H -#include "Common/Vector.h" -#include "Common/String.h" +#include "Common/MyString.h" struct CColumnInfo { diff --git a/CPP/7zip/FileManager/makefile b/CPP/7zip/FileManager/makefile index 3a15cf2e..3a561121 100755 --- a/CPP/7zip/FileManager/makefile +++ b/CPP/7zip/FileManager/makefile @@ -59,12 +59,12 @@ COMMON_OBJS = \ $O\Random.obj \ $O\StdInStream.obj \ $O\StdOutStream.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ $O\TextConfig.obj \ $O\UTFConvert.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ diff --git a/CPP/7zip/Guid.txt b/CPP/7zip/Guid.txt index fd91e292..bead1f83 100755 --- a/CPP/7zip/Guid.txt +++ b/CPP/7zip/Guid.txt @@ -35,6 +35,8 @@ 60 ICompressCodecsInfo 61 ISetCompressCodecsInfo 80 ICryptoProperties +88 ICryptoResetSalt +8C ICryptoResetInitVector 90 ICryptoSetPassword A0 ICryptoSetCRC diff --git a/CPP/7zip/ICoder.h b/CPP/7zip/ICoder.h index e7de64b1..0c10068e 100755 --- a/CPP/7zip/ICoder.h +++ b/CPP/7zip/ICoder.h @@ -146,6 +146,18 @@ CODER_INTERFACE(ICryptoProperties, 0x80) STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE; }; +/* +CODER_INTERFACE(ICryptoResetSalt, 0x88) +{ + STDMETHOD(ResetSalt)() PURE; +}; +*/ + +CODER_INTERFACE(ICryptoResetInitVector, 0x8C) +{ + STDMETHOD(ResetInitVector)() PURE; +}; + CODER_INTERFACE(ICryptoSetPassword, 0x90) { STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE; diff --git a/CPP/7zip/MyVersion.h b/CPP/7zip/MyVersion.h index 722a2451..911dfc15 100755 --- a/CPP/7zip/MyVersion.h +++ b/CPP/7zip/MyVersion.h @@ -1,8 +1,8 @@ #define MY_VER_MAJOR 4 -#define MY_VER_MINOR 47 +#define MY_VER_MINOR 48 #define MY_VER_BUILD 0 -#define MY_VERSION "4.47 beta" -#define MY_7ZIP_VERSION "7-Zip 4.47 beta" -#define MY_DATE "2007-05-27" +#define MY_VERSION "4.48 beta" +#define MY_7ZIP_VERSION "7-Zip 4.48 beta" +#define MY_DATE "2007-06-26" #define MY_COPYRIGHT "Copyright (c) 1999-2007 Igor Pavlov" #define MY_VERSION_COPYRIGHT_DATE MY_VERSION " " MY_COPYRIGHT " " MY_DATE diff --git a/CPP/7zip/UI/Agent/Agent.cpp b/CPP/7zip/UI/Agent/Agent.cpp index 25cc42e4..528abb53 100755 --- a/CPP/7zip/UI/Agent/Agent.cpp +++ b/CPP/7zip/UI/Agent/Agent.cpp @@ -49,6 +49,8 @@ void CAgentFolder::LoadFolder(CProxyFolder *folder) STDMETHODIMP CAgentFolder::LoadItems() { + if (!_agentSpec->_archiveLink.IsOpen) + return E_FAIL; _items.Clear(); if (_flatMode) LoadFolder(_proxyFolderItem); diff --git a/CPP/7zip/UI/Agent/AgentProxy.h b/CPP/7zip/UI/Agent/AgentProxy.h index 9402cfdd..70f47f40 100755 --- a/CPP/7zip/UI/Agent/AgentProxy.h +++ b/CPP/7zip/UI/Agent/AgentProxy.h @@ -3,7 +3,7 @@ #ifndef __AGENT_PROXY_H #define __AGENT_PROXY_H -#include "Common/String.h" +#include "Common/MyString.h" #include "../../Archive/IArchive.h" diff --git a/CPP/7zip/UI/Client7z/Client7z.dsp b/CPP/7zip/UI/Client7z/Client7z.dsp index b574bdb7..542e2852 100755 --- a/CPP/7zip/UI/Client7z/Client7z.dsp +++ b/CPP/7zip/UI/Client7z/Client7z.dsp @@ -167,35 +167,35 @@ SOURCE=..\..\..\Common\IntToString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.h +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\MyVector.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.cpp +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.h +SOURCE=..\..\..\Common\NewHandler.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp +SOURCE=..\..\..\Common\StringConvert.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.h +SOURCE=..\..\..\Common\StringConvert.h # End Source File # Begin Source File diff --git a/CPP/7zip/UI/Client7z/makefile b/CPP/7zip/UI/Client7z/makefile index 4650c293..6c806267 100755 --- a/CPP/7zip/UI/Client7z/makefile +++ b/CPP/7zip/UI/Client7z/makefile @@ -8,10 +8,10 @@ CONSOLE_OBJS = \ COMMON_OBJS = \ $O\IntToString.obj \ $O\NewHandler.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ diff --git a/CPP/7zip/UI/Common/ArchiveCommandLine.cpp b/CPP/7zip/UI/Common/ArchiveCommandLine.cpp index 17b04e12..d16d6166 100755 --- a/CPP/7zip/UI/Common/ArchiveCommandLine.cpp +++ b/CPP/7zip/UI/Common/ArchiveCommandLine.cpp @@ -24,6 +24,14 @@ #include "SortUtils.h" #include "EnumDirItems.h" +#if _MSC_VER >= 1400 +#define MY_isatty_fileno(x) _isatty(_fileno(x)) +#else +#define MY_isatty_fileno(x) isatty(fileno(x)) +#endif + +#define MY_IS_TERMINAL(x) (MY_isatty_fileno(x) != 0); + using namespace NCommandLineParser; using namespace NWindows; using namespace NFile; @@ -681,9 +689,9 @@ void CArchiveCommandLineParser::Parse1(const UStringVector &commandStrings, ThrowUserErrorException(); } - options.IsInTerminal = (isatty(fileno(stdin)) != 0); - options.IsStdOutTerminal = (isatty(fileno(stdout)) != 0); - options.IsStdErrTerminal = (isatty(fileno(stderr)) != 0); + options.IsInTerminal = MY_IS_TERMINAL(stdin); + options.IsStdOutTerminal = MY_IS_TERMINAL(stdout); + options.IsStdErrTerminal = MY_IS_TERMINAL(stderr); options.StdOutMode = parser[NKey::kStdOut].ThereIs; options.EnableHeaders = !parser[NKey::kDisableHeaders].ThereIs; options.HelpMode = parser[NKey::kHelp1].ThereIs || parser[NKey::kHelp2].ThereIs || parser[NKey::kHelp3].ThereIs; diff --git a/CPP/7zip/UI/Common/ArchiveExtractCallback.h b/CPP/7zip/UI/Common/ArchiveExtractCallback.h index 4fd63a53..489cdcdb 100755 --- a/CPP/7zip/UI/Common/ArchiveExtractCallback.h +++ b/CPP/7zip/UI/Common/ArchiveExtractCallback.h @@ -6,7 +6,7 @@ #include "../../Archive/IArchive.h" #include "IFileExtractCallback.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/MyCom.h" #include "../../Common/FileStreams.h" diff --git a/CPP/7zip/UI/Common/ArchiveName.h b/CPP/7zip/UI/Common/ArchiveName.h index 6b001a5a..9513fb2b 100755 --- a/CPP/7zip/UI/Common/ArchiveName.h +++ b/CPP/7zip/UI/Common/ArchiveName.h @@ -3,7 +3,7 @@ #ifndef __ARCHIVENAME_H #define __ARCHIVENAME_H -#include "Common/String.h" +#include "Common/MyString.h" UString CreateArchiveName(const UString &srcName, bool fromPrev, bool keepName); diff --git a/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp b/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp index 1d2944d8..e54214be 100755 --- a/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp +++ b/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp @@ -15,6 +15,8 @@ using namespace NWindows; STDMETHODIMP COpenCallbackImp::SetTotal(const UInt64 *files, const UInt64 *bytes) { COM_TRY_BEGIN + if (!Callback) + return S_OK; return Callback->SetTotal(files, bytes); COM_TRY_END } @@ -22,6 +24,8 @@ STDMETHODIMP COpenCallbackImp::SetTotal(const UInt64 *files, const UInt64 *bytes STDMETHODIMP COpenCallbackImp::SetCompleted(const UInt64 *files, const UInt64 *bytes) { COM_TRY_BEGIN + if (!Callback) + return S_OK; return Callback->SetTotal(files, bytes); COM_TRY_END } @@ -96,7 +100,10 @@ STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, IInStream **inStre COM_TRY_BEGIN if (_subArchiveMode) return S_FALSE; - RINOK(Callback->CheckBreak()); + if (Callback) + { + RINOK(Callback->CheckBreak()); + } *inStream = NULL; UString fullPath = _folderPrefix + name; if (!NFile::NFind::FindFile(fullPath, _fileInfo)) @@ -120,6 +127,8 @@ STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, IInStream **inStre STDMETHODIMP COpenCallbackImp::CryptoGetTextPassword(BSTR *password) { COM_TRY_BEGIN + if (!Callback) + return E_NOTIMPL; return Callback->CryptoGetTextPassword(password); COM_TRY_END } diff --git a/CPP/7zip/UI/Common/ArchiveOpenCallback.h b/CPP/7zip/UI/Common/ArchiveOpenCallback.h index 454873ad..304c2048 100755 --- a/CPP/7zip/UI/Common/ArchiveOpenCallback.h +++ b/CPP/7zip/UI/Common/ArchiveOpenCallback.h @@ -3,7 +3,7 @@ #ifndef __ARCHIVE_OPEN_CALLBACK_H #define __ARCHIVE_OPEN_CALLBACK_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/MyCom.h" #include "Windows/FileFind.h" @@ -75,6 +75,8 @@ private: public: UStringVector FileNames; IOpenCallbackUI *Callback; + + COpenCallbackImp(): Callback(NULL) {} void Init(const UString &folderPrefix, const UString &fileName) { _folderPrefix = folderPrefix; diff --git a/CPP/7zip/UI/Common/CompressCall.h b/CPP/7zip/UI/Common/CompressCall.h index db7e3647..2bb1c7be 100755 --- a/CPP/7zip/UI/Common/CompressCall.h +++ b/CPP/7zip/UI/Common/CompressCall.h @@ -3,7 +3,7 @@ #ifndef __COMPRESSCALL_H #define __COMPRESSCALL_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Windows/Synchronization.h" HRESULT MyCreateProcess(const UString ¶ms, diff --git a/CPP/7zip/UI/Common/DefaultName.h b/CPP/7zip/UI/Common/DefaultName.h index ff6330fa..a702cb0f 100755 --- a/CPP/7zip/UI/Common/DefaultName.h +++ b/CPP/7zip/UI/Common/DefaultName.h @@ -3,7 +3,7 @@ #ifndef __DEFAULTNAME_H #define __DEFAULTNAME_H -#include "Common/String.h" +#include "Common/MyString.h" UString GetDefaultName2(const UString &fileName, const UString &extension, const UString &addSubExtension); diff --git a/CPP/7zip/UI/Common/DirItem.h b/CPP/7zip/UI/Common/DirItem.h index 9537071c..89bd4cd3 100755 --- a/CPP/7zip/UI/Common/DirItem.h +++ b/CPP/7zip/UI/Common/DirItem.h @@ -3,7 +3,7 @@ #ifndef __DIR_ITEM_H #define __DIR_ITEM_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Types.h" struct CDirItem diff --git a/CPP/7zip/UI/Common/ExtractingFilePath.h b/CPP/7zip/UI/Common/ExtractingFilePath.h index 0ae9e9b8..efc8a0e4 100755 --- a/CPP/7zip/UI/Common/ExtractingFilePath.h +++ b/CPP/7zip/UI/Common/ExtractingFilePath.h @@ -3,7 +3,7 @@ #ifndef __EXTRACTINGFILEPATH_H #define __EXTRACTINGFILEPATH_H -#include "Common/String.h" +#include "Common/MyString.h" UString GetCorrectFileName(const UString &path); UString GetCorrectPath(const UString &path); diff --git a/CPP/7zip/UI/Common/IFileExtractCallback.h b/CPP/7zip/UI/Common/IFileExtractCallback.h index 6268f758..466b1e62 100755 --- a/CPP/7zip/UI/Common/IFileExtractCallback.h +++ b/CPP/7zip/UI/Common/IFileExtractCallback.h @@ -3,7 +3,7 @@ #ifndef __IFILEEXTRACTCALLBACK_H #define __IFILEEXTRACTCALLBACK_H -#include "Common/String.h" +#include "Common/MyString.h" namespace NOverwriteAnswer { diff --git a/CPP/7zip/UI/Common/LoadCodecs.h b/CPP/7zip/UI/Common/LoadCodecs.h index 28cc7dad..231680b5 100755 --- a/CPP/7zip/UI/Common/LoadCodecs.h +++ b/CPP/7zip/UI/Common/LoadCodecs.h @@ -5,7 +5,7 @@ #include "../../../Common/Types.h" #include "../../../Common/MyCom.h" -#include "../../../Common/String.h" +#include "../../../Common/MyString.h" #include "../../../Common/Buffer.h" #include "../../ICoder.h" diff --git a/CPP/7zip/UI/Common/OpenArchive.cpp b/CPP/7zip/UI/Common/OpenArchive.cpp index 0f73890f..795b86e7 100755 --- a/CPP/7zip/UI/Common/OpenArchive.cpp +++ b/CPP/7zip/UI/Common/OpenArchive.cpp @@ -81,12 +81,12 @@ HRESULT IsArchiveItemAnti(IInArchive *archive, UInt32 index, bool &result) // Static-SFX (for Linux) can be big. const UInt64 kMaxCheckStartPosition = 1 << 22; -HRESULT ReOpenArchive(IInArchive *archive, const UString &fileName) +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, NULL); + return archive->Open(inStream, &kMaxCheckStartPosition, openArchiveCallback); } #ifndef _SFX @@ -305,13 +305,11 @@ HRESULT OpenArchive( return S_OK; } -HRESULT MyOpenArchive( - CCodecs *codecs, - const UString &archiveName, - IInArchive **archive, UString &defaultItemName, IOpenCallbackUI *openCallbackUI) +static void SetCallback(const UString &archiveName, + IOpenCallbackUI *openCallbackUI, CMyComPtr<IArchiveOpenCallback> &openCallback) { COpenCallbackImp *openCallbackSpec = new COpenCallbackImp; - CMyComPtr<IArchiveOpenCallback> openCallback = openCallbackSpec; + openCallback = openCallbackSpec; openCallbackSpec->Callback = openCallbackUI; UString fullName; @@ -320,7 +318,15 @@ HRESULT MyOpenArchive( openCallbackSpec->Init( fullName.Left(fileNamePartStartIndex), fullName.Mid(fileNamePartStartIndex)); +} +HRESULT MyOpenArchive( + CCodecs *codecs, + const UString &archiveName, + IInArchive **archive, UString &defaultItemName, IOpenCallbackUI *openCallbackUI) +{ + CMyComPtr<IArchiveOpenCallback> openCallback; + SetCallback(archiveName, openCallbackUI, openCallback); int formatInfo; return OpenArchive(codecs, archiveName, archive, formatInfo, defaultItemName, openCallback); } @@ -367,11 +373,13 @@ HRESULT CArchiveLink::Close() RINOK(Archive1->Close()); if (Archive0 != 0) RINOK(Archive0->Close()); + IsOpen = false; return S_OK; } void CArchiveLink::Release() { + IsOpen = false; Archive1.Release(); Archive0.Release(); } @@ -382,11 +390,13 @@ HRESULT OpenArchive( CArchiveLink &archiveLink, IArchiveOpenCallback *openCallback) { - return OpenArchive(codecs, archiveName, + HRESULT res = OpenArchive(codecs, 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, @@ -394,18 +404,27 @@ HRESULT MyOpenArchive(CCodecs *codecs, CArchiveLink &archiveLink, IOpenCallbackUI *openCallbackUI) { - return MyOpenArchive(codecs, archiveName, + HRESULT res = MyOpenArchive(codecs, archiveName, &archiveLink.Archive0, &archiveLink.Archive1, archiveLink.DefaultItemName0, archiveLink.DefaultItemName1, archiveLink.VolumePaths, openCallbackUI); + archiveLink.IsOpen = (res == S_OK); + return res; } HRESULT ReOpenArchive(CCodecs *codecs, CArchiveLink &archiveLink, const UString &fileName) { if (archiveLink.GetNumLevels() > 1) return E_NOTIMPL; + if (archiveLink.GetNumLevels() == 0) return MyOpenArchive(codecs, fileName, archiveLink, 0); - return ReOpenArchive(archiveLink.GetArchive(), fileName); + + CMyComPtr<IArchiveOpenCallback> openCallback; + SetCallback(fileName, NULL, openCallback); + + HRESULT res = ReOpenArchive(archiveLink.GetArchive(), fileName, openCallback); + archiveLink.IsOpen = (res == S_OK); + return res; } diff --git a/CPP/7zip/UI/Common/OpenArchive.h b/CPP/7zip/UI/Common/OpenArchive.h index ebd89ceb..a857b9de 100755 --- a/CPP/7zip/UI/Common/OpenArchive.h +++ b/CPP/7zip/UI/Common/OpenArchive.h @@ -3,7 +3,7 @@ #ifndef __OPENARCHIVE_H #define __OPENARCHIVE_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Windows/FileFind.h" #include "../../Archive/IArchive.h" @@ -51,7 +51,7 @@ HRESULT OpenArchive( IArchiveOpenCallback *openArchiveCallback); -HRESULT ReOpenArchive(IInArchive *archive, const UString &fileName); +HRESULT ReOpenArchive(IInArchive *archive, const UString &fileName, IArchiveOpenCallback *openArchiveCallback); HRESULT MyOpenArchive( CCodecs *codecs, @@ -94,6 +94,9 @@ struct CArchiveLink return result; } + bool IsOpen; + + CArchiveLink(): IsOpen(false) {}; IInArchive *GetArchive() { return Archive1 != 0 ? Archive1: Archive0; } UString GetDefaultItemName() { return Archive1 != 0 ? DefaultItemName1: DefaultItemName0; } diff --git a/CPP/7zip/UI/Common/PropIDUtils.cpp b/CPP/7zip/UI/Common/PropIDUtils.cpp index 8869e565..76596883 100755 --- a/CPP/7zip/UI/Common/PropIDUtils.cpp +++ b/CPP/7zip/UI/Common/PropIDUtils.cpp @@ -32,8 +32,7 @@ static void ConvertUInt32ToHex(UInt32 value, wchar_t *s) s[8] = L'\0'; } -UString ConvertPropertyToString(const PROPVARIANT &propVariant, - PROPID propID, bool full) +UString ConvertPropertyToString(const PROPVARIANT &propVariant, PROPID propID, bool full) { switch(propID) { diff --git a/CPP/7zip/UI/Common/PropIDUtils.h b/CPP/7zip/UI/Common/PropIDUtils.h index aa540885..1d820976 100755 --- a/CPP/7zip/UI/Common/PropIDUtils.h +++ b/CPP/7zip/UI/Common/PropIDUtils.h @@ -3,9 +3,8 @@ #ifndef __PROPIDUTILS_H #define __PROPIDUTILS_H -#include "Common/String.h" +#include "Common/MyString.h" -UString ConvertPropertyToString(const PROPVARIANT &aPropVariant, - PROPID aPropID, bool aFull = true); +UString ConvertPropertyToString(const PROPVARIANT &propVariant, PROPID propID, bool full = true); #endif diff --git a/CPP/7zip/UI/Common/Property.h b/CPP/7zip/UI/Common/Property.h index 57e7b452..9fd340cb 100755 --- a/CPP/7zip/UI/Common/Property.h +++ b/CPP/7zip/UI/Common/Property.h @@ -3,7 +3,7 @@ #ifndef __PROPERTY_H #define __PROPERTY_H -#include "Common/String.h" +#include "Common/MyString.h" struct CProperty { diff --git a/CPP/7zip/UI/Common/SetProperties.cpp b/CPP/7zip/UI/Common/SetProperties.cpp index 6c92a847..b1434ace 100755 --- a/CPP/7zip/UI/Common/SetProperties.cpp +++ b/CPP/7zip/UI/Common/SetProperties.cpp @@ -5,7 +5,7 @@ #include "SetProperties.h" #include "Windows/PropVariant.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/StringToInt.h" #include "Common/MyCom.h" diff --git a/CPP/7zip/UI/Common/SortUtils.cpp b/CPP/7zip/UI/Common/SortUtils.cpp index 54d88adc..616472ff 100755 --- a/CPP/7zip/UI/Common/SortUtils.cpp +++ b/CPP/7zip/UI/Common/SortUtils.cpp @@ -77,4 +77,4 @@ void SortStrings(const UStringVector &src, UStringVector &dest) for (int i = 0; i < indices.Size(); i++) dest.Add(src[indices[i]]); } -*/
\ No newline at end of file +*/ diff --git a/CPP/7zip/UI/Common/SortUtils.h b/CPP/7zip/UI/Common/SortUtils.h index b30bc6ca..2fb8ddef 100755 --- a/CPP/7zip/UI/Common/SortUtils.h +++ b/CPP/7zip/UI/Common/SortUtils.h @@ -3,7 +3,7 @@ #ifndef __SORTUTLS_H #define __SORTUTLS_H -#include "Common/String.h" +#include "Common/MyString.h" void SortStringsToIndices(const UStringVector &strings, CIntVector &indices); // void SortStrings(const UStringVector &src, UStringVector &dest); diff --git a/CPP/7zip/UI/Common/TempFiles.h b/CPP/7zip/UI/Common/TempFiles.h index 173713a0..eb474a76 100755 --- a/CPP/7zip/UI/Common/TempFiles.h +++ b/CPP/7zip/UI/Common/TempFiles.h @@ -3,7 +3,7 @@ #ifndef __TEMPFILES_H #define __TEMPFILES_H -#include "Common/String.h" +#include "Common/MyString.h" class CTempFiles { diff --git a/CPP/7zip/UI/Common/UpdateCallback.h b/CPP/7zip/UI/Common/UpdateCallback.h index cc4e2649..31e42e33 100755 --- a/CPP/7zip/UI/Common/UpdateCallback.h +++ b/CPP/7zip/UI/Common/UpdateCallback.h @@ -4,7 +4,7 @@ #define __UPDATECALLBACK_H #include "Common/MyCom.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "../../IPassword.h" diff --git a/CPP/7zip/UI/Common/ZipRegistry.h b/CPP/7zip/UI/Common/ZipRegistry.h index fcb0cce4..753287d9 100755 --- a/CPP/7zip/UI/Common/ZipRegistry.h +++ b/CPP/7zip/UI/Common/ZipRegistry.h @@ -3,7 +3,7 @@ #ifndef __ZIPREGISTRY_H #define __ZIPREGISTRY_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Types.h" #include "ExtractMode.h" diff --git a/CPP/7zip/UI/Console/Console.dsp b/CPP/7zip/UI/Console/Console.dsp index 64cac741..e68c34dc 100755 --- a/CPP/7zip/UI/Console/Console.dsp +++ b/CPP/7zip/UI/Console/Console.dsp @@ -308,6 +308,14 @@ SOURCE=..\..\..\Windows\Registry.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\System.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Windows\System.h +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\Time.h # End Source File # End Group @@ -364,35 +372,43 @@ SOURCE=..\..\..\Common\MyCom.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.h +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdInStream.cpp +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdInStream.h +SOURCE=..\..\..\Common\MyVector.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdOutStream.cpp +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdOutStream.h +SOURCE=..\..\..\Common\NewHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StdInStream.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\StdInStream.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\StdOutStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StdOutStream.h # End Source File # Begin Source File @@ -420,14 +436,6 @@ SOURCE=..\..\..\Common\UTFConvert.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\Common\Vector.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\Wildcard.cpp # End Source File # Begin Source File diff --git a/CPP/7zip/UI/Console/ExtractCallbackConsole.h b/CPP/7zip/UI/Console/ExtractCallbackConsole.h index 5b45106a..bf81a803 100755 --- a/CPP/7zip/UI/Console/ExtractCallbackConsole.h +++ b/CPP/7zip/UI/Console/ExtractCallbackConsole.h @@ -3,7 +3,7 @@ #ifndef __EXTRACTCALLBACKCONSOLE_H #define __EXTRACTCALLBACKCONSOLE_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/StdOutStream.h" #include "../../Common/FileStreams.h" #include "../../IPassword.h" diff --git a/CPP/7zip/UI/Console/Main.cpp b/CPP/7zip/UI/Console/Main.cpp index 4f0061b2..97c117ce 100755 --- a/CPP/7zip/UI/Console/Main.cpp +++ b/CPP/7zip/UI/Console/Main.cpp @@ -5,7 +5,7 @@ #include "Common/MyInitGuid.h" #include "Common/CommandLineParser.h" -#include "Common/Exception.h" +#include "Common/MyException.h" #include "Common/IntToString.h" #include "Common/ListFileUtils.h" #include "Common/StdInStream.h" diff --git a/CPP/7zip/UI/Console/MainAr.cpp b/CPP/7zip/UI/Console/MainAr.cpp index 75fae190..fd42e4f6 100755 --- a/CPP/7zip/UI/Console/MainAr.cpp +++ b/CPP/7zip/UI/Console/MainAr.cpp @@ -8,7 +8,7 @@ #include "Common/StdOutStream.h" #include "Common/NewHandler.h" -#include "Common/Exception.h" +#include "Common/MyException.h" #include "Common/StringConvert.h" #include "../Common/ExitCode.h" diff --git a/CPP/7zip/UI/Console/PercentPrinter.cpp b/CPP/7zip/UI/Console/PercentPrinter.cpp index d6324303..47aafd73 100755 --- a/CPP/7zip/UI/Console/PercentPrinter.cpp +++ b/CPP/7zip/UI/Console/PercentPrinter.cpp @@ -3,7 +3,7 @@ #include "StdAfx.h" #include "Common/IntToString.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "PercentPrinter.h" diff --git a/CPP/7zip/UI/Console/UpdateCallbackConsole.h b/CPP/7zip/UI/Console/UpdateCallbackConsole.h index 2fcb891b..ca7cc742 100755 --- a/CPP/7zip/UI/Console/UpdateCallbackConsole.h +++ b/CPP/7zip/UI/Console/UpdateCallbackConsole.h @@ -3,7 +3,7 @@ #ifndef __UPDATECALLBACKCONSOLE_H #define __UPDATECALLBACKCONSOLE_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/StdOutStream.h" #include "PercentPrinter.h" #include "../Common/Update.h" diff --git a/CPP/7zip/UI/Console/makefile b/CPP/7zip/UI/Console/makefile index 02abe851..bd3b7a4e 100755 --- a/CPP/7zip/UI/Console/makefile +++ b/CPP/7zip/UI/Console/makefile @@ -28,11 +28,11 @@ COMMON_OBJS = \ $O\NewHandler.obj \ $O\StdInStream.obj \ $O\StdOutStream.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ $O\UTFConvert.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -46,6 +46,7 @@ WIN_OBJS = \ $O\PropVariant.obj \ $O\PropVariantConversions.obj \ $O\Registry.obj \ + $O\System.obj \ 7ZIP_COMMON_OBJS = \ $O\FilePathAutoRename.obj \ diff --git a/CPP/7zip/UI/Explorer/ContextMenu.h b/CPP/7zip/UI/Explorer/ContextMenu.h index 60970a22..9ab80dfd 100755 --- a/CPP/7zip/UI/Explorer/ContextMenu.h +++ b/CPP/7zip/UI/Explorer/ContextMenu.h @@ -7,7 +7,7 @@ DEFINE_GUID(CLSID_CZipContextMenu, 0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00); -#include "Common/String.h" +#include "Common/MyString.h" #include "../../FileManager/PluginInterface.h" #include "../../FileManager/MyCom2.h" diff --git a/CPP/7zip/UI/Explorer/Explorer.dsp b/CPP/7zip/UI/Explorer/Explorer.dsp index 3fbf3064..586d9aae 100755 --- a/CPP/7zip/UI/Explorer/Explorer.dsp +++ b/CPP/7zip/UI/Explorer/Explorer.dsp @@ -569,35 +569,43 @@ SOURCE=..\..\..\Common\MyCom.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.h +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Random.cpp +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\Random.h +SOURCE=..\..\..\Common\MyVector.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdInStream.cpp +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdInStream.h +SOURCE=..\..\..\Common\NewHandler.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\Random.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\Random.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StdInStream.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\StdInStream.h # End Source File # Begin Source File @@ -637,14 +645,6 @@ SOURCE=..\..\..\Common\UTFConvert.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\Common\Vector.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\Wildcard.cpp # End Source File # Begin Source File diff --git a/CPP/7zip/UI/Explorer/MyMessages.cpp b/CPP/7zip/UI/Explorer/MyMessages.cpp index 61d2429d..a29581be 100755 --- a/CPP/7zip/UI/Explorer/MyMessages.cpp +++ b/CPP/7zip/UI/Explorer/MyMessages.cpp @@ -3,8 +3,6 @@ #include "StdAfx.h" #include "MyMessages.h" -#include "Common/String.h" -#include "Common/StringConvert.h" #include "Windows/Error.h" #include "Windows/ResourceString.h" diff --git a/CPP/7zip/UI/Explorer/MyMessages.h b/CPP/7zip/UI/Explorer/MyMessages.h index 1a96f569..5bd63cc4 100755 --- a/CPP/7zip/UI/Explorer/MyMessages.h +++ b/CPP/7zip/UI/Explorer/MyMessages.h @@ -3,7 +3,7 @@ #ifndef __MYMESSAGES_H #define __MYMESSAGES_H -#include "Common/String.h" +#include "Common/MyString.h" void MyMessageBox(HWND window, LPCWSTR message); diff --git a/CPP/7zip/UI/Explorer/makefile b/CPP/7zip/UI/Explorer/makefile index cf6321fa..f208988b 100755 --- a/CPP/7zip/UI/Explorer/makefile +++ b/CPP/7zip/UI/Explorer/makefile @@ -21,12 +21,12 @@ COMMON_OBJS = \ $O\NewHandler.obj \ $O\Random.obj \ $O\StdInStream.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ $O\TextConfig.obj \ $O\UTFConvert.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ diff --git a/CPP/7zip/UI/Far/ExtractEngine.h b/CPP/7zip/UI/Far/ExtractEngine.h index 57c04f76..ee17ff55 100755 --- a/CPP/7zip/UI/Far/ExtractEngine.h +++ b/CPP/7zip/UI/Far/ExtractEngine.h @@ -4,7 +4,7 @@ #define __EXTRACTENGINE_H #include "Common/MyCom.h" -#include "Common/String.h" +#include "Common/MyString.h" #include "../../IPassword.h" #include "../Agent/IFolderArchive.h" diff --git a/CPP/7zip/UI/Far/Far.dsp b/CPP/7zip/UI/Far/Far.dsp index 327574dd..2cddd717 100755 --- a/CPP/7zip/UI/Far/Far.dsp +++ b/CPP/7zip/UI/Far/Far.dsp @@ -126,35 +126,35 @@ SOURCE=..\..\..\Common\IntToString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.h +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\MyVector.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.cpp +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StringConvert.h +SOURCE=..\..\..\Common\NewHandler.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp +SOURCE=..\..\..\Common\StringConvert.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.h +SOURCE=..\..\..\Common\StringConvert.h # End Source File # Begin Source File diff --git a/CPP/7zip/UI/Far/FarUtils.h b/CPP/7zip/UI/Far/FarUtils.h index 4fba193d..4e2f83cd 100755 --- a/CPP/7zip/UI/Far/FarUtils.h +++ b/CPP/7zip/UI/Far/FarUtils.h @@ -4,8 +4,6 @@ #define __FARUTILS_H #include "FarPlugin.h" -#include "Common/String.h" -#include "Common/Vector.h" #include "Windows/Registry.h" namespace NFar { diff --git a/CPP/7zip/UI/Far/OverwriteDialog.cpp b/CPP/7zip/UI/Far/OverwriteDialog.cpp index 1594a350..4fbcbc9f 100755 --- a/CPP/7zip/UI/Far/OverwriteDialog.cpp +++ b/CPP/7zip/UI/Far/OverwriteDialog.cpp @@ -6,7 +6,6 @@ #include "OverwriteDialog.h" -#include "Common/String.h" #include "Common/StringConvert.h" #include "Windows/FileName.h" diff --git a/CPP/7zip/UI/Far/OverwriteDialog.h b/CPP/7zip/UI/Far/OverwriteDialog.h index ff1a480e..6ff4590a 100755 --- a/CPP/7zip/UI/Far/OverwriteDialog.h +++ b/CPP/7zip/UI/Far/OverwriteDialog.h @@ -3,7 +3,7 @@ #ifndef OVERWRITEDIALOG_H #define OVERWRITEDIALOG_H -#include "Common/String.h" +#include "Common/MyString.h" namespace NOverwriteDialog { diff --git a/CPP/7zip/UI/Far/ProgressBox.h b/CPP/7zip/UI/Far/ProgressBox.h index 8721b456..9e6f671a 100755 --- a/CPP/7zip/UI/Far/ProgressBox.h +++ b/CPP/7zip/UI/Far/ProgressBox.h @@ -3,7 +3,7 @@ #ifndef __PROGRESSBOX_H #define __PROGRESSBOX_H -#include "Common/String.h" +#include "Common/MyString.h" #include "Common/Types.h" class CMessageBox diff --git a/CPP/7zip/UI/Far/UpdateCallback100.h b/CPP/7zip/UI/Far/UpdateCallback100.h index d66137cc..87c55dc3 100755 --- a/CPP/7zip/UI/Far/UpdateCallback100.h +++ b/CPP/7zip/UI/Far/UpdateCallback100.h @@ -3,7 +3,6 @@ #ifndef __UPDATECALLBACK100_H #define __UPDATECALLBACK100_H -#include "Common/String.h" #include "Common/MyCom.h" #include "../Agent/IFolderArchive.h" diff --git a/CPP/7zip/UI/Far/makefile b/CPP/7zip/UI/Far/makefile index 142226a4..2e22d862 100755 --- a/CPP/7zip/UI/Far/makefile +++ b/CPP/7zip/UI/Far/makefile @@ -22,10 +22,10 @@ FAR_OBJS = \ COMMON_OBJS = \ $O\IntToString.obj \ $O\NewHandler.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ diff --git a/CPP/7zip/UI/GUI/GUI.cpp b/CPP/7zip/UI/GUI/GUI.cpp index 2d401fc8..4f06ff93 100755 --- a/CPP/7zip/UI/GUI/GUI.cpp +++ b/CPP/7zip/UI/GUI/GUI.cpp @@ -12,7 +12,7 @@ extern "C" #include "Common/NewHandler.h" #include "Common/StringConvert.h" #include "Common/CommandLineParser.h" -#include "Common/Exception.h" +#include "Common/MyException.h" #include "Windows/COM.h" #include "Windows/FileMapping.h" diff --git a/CPP/7zip/UI/GUI/GUI.dsp b/CPP/7zip/UI/GUI/GUI.dsp index 9586eebf..54e70732 100755 --- a/CPP/7zip/UI/GUI/GUI.dsp +++ b/CPP/7zip/UI/GUI/GUI.dsp @@ -735,27 +735,35 @@ SOURCE=..\..\..\Common\ListFileUtils.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.cpp +SOURCE=..\..\..\Common\MyString.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\NewHandler.h +SOURCE=..\..\..\Common\MyString.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdInStream.cpp +SOURCE=..\..\..\Common\MyVector.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\StdInStream.h +SOURCE=..\..\..\Common\MyVector.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\NewHandler.cpp # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.cpp +SOURCE=..\..\..\Common\NewHandler.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\String.h +SOURCE=..\..\..\Common\StdInStream.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\..\Common\StdInStream.h # End Source File # Begin Source File @@ -791,14 +799,6 @@ SOURCE=..\..\..\Common\UTFConvert.h # End Source File # Begin Source File -SOURCE=..\..\..\Common\Vector.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\Common\Vector.h -# End Source File -# Begin Source File - SOURCE=..\..\..\Common\Wildcard.cpp # End Source File # Begin Source File @@ -959,6 +959,10 @@ SOURCE=..\..\..\Windows\Synchronization.h # End Source File # Begin Source File +SOURCE=..\..\..\Windows\System.cpp +# End Source File +# Begin Source File + SOURCE=..\..\..\Windows\System.h # End Source File # Begin Source File diff --git a/CPP/7zip/UI/GUI/Resource/BenchmarkDialog/BenchmarkDialog.cpp b/CPP/7zip/UI/GUI/Resource/BenchmarkDialog/BenchmarkDialog.cpp index 894faefb..f9a78472 100755 --- a/CPP/7zip/UI/GUI/Resource/BenchmarkDialog/BenchmarkDialog.cpp +++ b/CPP/7zip/UI/GUI/Resource/BenchmarkDialog/BenchmarkDialog.cpp @@ -4,7 +4,7 @@ #include "Common/IntToString.h" #include "Common/StringToInt.h" -#include "Common/Exception.h" +#include "Common/MyException.h" #include "Windows/Thread.h" #include "Windows/Error.h" #include "Windows/System.h" diff --git a/CPP/7zip/UI/GUI/makefile b/CPP/7zip/UI/GUI/makefile index cd1536fe..cc672b46 100755 --- a/CPP/7zip/UI/GUI/makefile +++ b/CPP/7zip/UI/GUI/makefile @@ -26,12 +26,12 @@ COMMON_OBJS = \ $O\ListFileUtils.obj \ $O\NewHandler.obj \ $O\StdInStream.obj \ - $O\String.obj \ + $O\MyString.obj \ $O\StringConvert.obj \ $O\StringToInt.obj \ $O\TextConfig.obj \ $O\UTFConvert.obj \ - $O\Vector.obj \ + $O\MyVector.obj \ $O\Wildcard.obj \ WIN_OBJS = \ @@ -49,6 +49,7 @@ WIN_OBJS = \ $O\ResourceString.obj \ $O\Shell.obj \ $O\Synchronization.obj \ + $O\System.obj \ $O\Window.obj \ WIN_CTRL_OBJS = \ |