1c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com// HandlerOut.cpp 2c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com 3c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com#include "StdAfx.h" 4c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com 5c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com#include "../../../Common/StringToInt.h" 6c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com 7c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com#include "../../../Windows/PropVariant.h" 88dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com 9c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com#ifndef _7ZIP_ST 1078e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com#include "../../../Windows/System.h" 1178e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com#endif 122e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 1378e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com#include "../../ICoder.h" 14fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com 1578e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com#include "../Common/ParseProperties.h" 1647580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com 1778e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com#include "HandlerOut.h" 1878e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com 192e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comusing namespace NWindows; 202e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 2178e17130f396d8b2157116c2504e357192f87ed1caryclark@google.comnamespace NArchive { 2278e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com 23fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comstatic const wchar_t *kCopyMethod = L"Copy"; 2478e17130f396d8b2157116c2504e357192f87ed1caryclark@google.comstatic const wchar_t *kLZMAMethodName = L"LZMA"; 25fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comstatic const wchar_t *kLZMA2MethodName = L"LZMA2"; 2678e17130f396d8b2157116c2504e357192f87ed1caryclark@google.comstatic const wchar_t *kBZip2MethodName = L"BZip2"; 272e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const wchar_t *kPpmdMethodName = L"PPMd"; 282e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const wchar_t *kDeflateMethodName = L"Deflate"; 292e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const wchar_t *kDeflate64MethodName = L"Deflate64"; 30198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com 31fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comstatic const wchar_t *kLzmaMatchFinderX1 = L"HC4"; 3278e17130f396d8b2157116c2504e357192f87ed1caryclark@google.comstatic const wchar_t *kLzmaMatchFinderX5 = L"BT4"; 3378e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com 342e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const UInt32 kLzmaAlgoX1 = 0; 352e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const UInt32 kLzmaAlgoX5 = 1; 3647580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com 3778e17130f396d8b2157116c2504e357192f87ed1caryclark@google.comstatic const UInt32 kLzmaDicSizeX1 = 1 << 16; 3878e17130f396d8b2157116c2504e357192f87ed1caryclark@google.comstatic const UInt32 kLzmaDicSizeX3 = 1 << 20; 392e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const UInt32 kLzmaDicSizeX5 = 1 << 24; 402e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const UInt32 kLzmaDicSizeX7 = 1 << 25; 4178e17130f396d8b2157116c2504e357192f87ed1caryclark@google.comstatic const UInt32 kLzmaDicSizeX9 = 1 << 26; 4278e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com 43fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comstatic const UInt32 kLzmaFastBytesX1 = 32; 4478e17130f396d8b2157116c2504e357192f87ed1caryclark@google.comstatic const UInt32 kLzmaFastBytesX7 = 64; 45fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 4678e17130f396d8b2157116c2504e357192f87ed1caryclark@google.comstatic const UInt32 kPpmdMemSizeX1 = (1 << 22); 472e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const UInt32 kPpmdMemSizeX5 = (1 << 24); 482e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const UInt32 kPpmdMemSizeX7 = (1 << 26); 492e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const UInt32 kPpmdMemSizeX9 = (192 << 20); 50198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com 51fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comstatic const UInt32 kPpmdOrderX1 = 4; 5278e17130f396d8b2157116c2504e357192f87ed1caryclark@google.comstatic const UInt32 kPpmdOrderX5 = 6; 53752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.comstatic const UInt32 kPpmdOrderX7 = 16; 542e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic const UInt32 kPpmdOrderX9 = 32; 552e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 56fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comstatic const UInt32 kDeflateAlgoX1 = 0; 57fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comstatic const UInt32 kDeflateAlgoX5 = 1; 58fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 59fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comstatic const UInt32 kDeflateFastBytesX1 = 32; 60fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comstatic const UInt32 kDeflateFastBytesX7 = 64; 61fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comstatic const UInt32 kDeflateFastBytesX9 = 128; 62fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 636680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.comstatic const UInt32 kDeflatePassesX1 = 1; 64a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const UInt32 kDeflatePassesX7 = 3; 65a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const UInt32 kDeflatePassesX9 = 10; 66a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 6745a8fc6a8b00451f807783f2a6ec640e9bcc7256caryclark@google.comstatic const UInt32 kBZip2NumPassesX1 = 1; 68a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const UInt32 kBZip2NumPassesX7 = 2; 69a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const UInt32 kBZip2NumPassesX9 = 7; 70a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 71a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const UInt32 kBZip2DicSizeX1 = 100000; 72a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const UInt32 kBZip2DicSizeX3 = 500000; 73a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const UInt32 kBZip2DicSizeX5 = 900000; 74198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com 75198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.comstatic const wchar_t *kDefaultMethodName = kLZMAMethodName; 76a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 77a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const wchar_t *kLzmaMatchFinderForHeaders = L"BT2"; 78a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const UInt32 kDictionaryForHeaders = 1 << 20; 79a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const UInt32 kNumFastBytesForHeaders = 273; 80a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic const UInt32 kAlgorithmForHeaders = kLzmaAlgoX5; 81a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 82a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic bool AreEqual(const UString &methodName, const wchar_t *s) 8373ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com { return (methodName.CompareNoCase(s) == 0); } 84a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 85a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.combool COneMethodInfo::IsLzma() const 86a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com{ 87a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com return 88a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com AreEqual(MethodName, kLZMAMethodName) || 89a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com AreEqual(MethodName, kLZMA2MethodName); 9045a8fc6a8b00451f807783f2a6ec640e9bcc7256caryclark@google.com} 91198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com 92a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic inline bool IsBZip2Method(const UString &methodName) 93a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com { return AreEqual(methodName, kBZip2MethodName); } 94a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 95a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic inline bool IsPpmdMethod(const UString &methodName) 96a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com { return AreEqual(methodName, kPpmdMethodName); } 97a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 98a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic inline bool IsDeflateMethod(const UString &methodName) 99a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com{ 100198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com return 101198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com AreEqual(methodName, kDeflateMethodName) || 102c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com AreEqual(methodName, kDeflate64MethodName); 103c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com} 1042e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 1052e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstruct CNameToPropID 106a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com{ 1072e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com PROPID PropID; 108c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com VARTYPE VarType; 109c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com const wchar_t *Name; 110198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com}; 111198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com 112198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.comstatic CNameToPropID g_NameToPropID[] = 113198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com{ 114198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com { NCoderPropID::kBlockSize, VT_UI4, L"C" }, 115198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com { NCoderPropID::kDictionarySize, VT_UI4, L"D" }, 116198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com { NCoderPropID::kUsedMemorySize, VT_UI4, L"MEM" }, 117198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com 118198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com { NCoderPropID::kOrder, VT_UI4, L"O" }, 119198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com { NCoderPropID::kPosStateBits, VT_UI4, L"PB" }, 120198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com { NCoderPropID::kLitContextBits, VT_UI4, L"LC" }, 121198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com { NCoderPropID::kLitPosBits, VT_UI4, L"LP" }, 122198e054b33051a6cd5f606ccbc8d539cefc5631fcaryclark@google.com { NCoderPropID::kEndMarker, VT_BOOL, L"eos" }, 123cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com 124a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com { NCoderPropID::kNumPasses, VT_UI4, L"Pass" }, 125cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com { NCoderPropID::kNumFastBytes, VT_UI4, L"fb" }, 126a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com { NCoderPropID::kMatchFinderCycles, VT_UI4, L"mc" }, 127cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com { NCoderPropID::kAlgorithm, VT_UI4, L"a" }, 128cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com { NCoderPropID::kMatchFinder, VT_BSTR, L"mf" }, 129cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com { NCoderPropID::kNumThreads, VT_UI4, L"mt" }, 130cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com { NCoderPropID::kDefaultProp, VT_UI4, L"" } 131a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com}; 132a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 133a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic bool ConvertProperty(PROPVARIANT srcProp, VARTYPE varType, NCOM::CPropVariant &destProp) 134a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com{ 135a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (varType == srcProp.vt) 136a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com { 1372e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com destProp = srcProp; 1382e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return true; 139a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 140a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (varType == VT_UI1) 141a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com { 142a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (srcProp.vt == VT_UI4) 143a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com { 144a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com UInt32 value = srcProp.ulVal; 145a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (value > 0xFF) 1462e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return false; 1472e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com destProp = (Byte)value; 1486680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com return true; 149a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 1506680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com } 1516680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com else if (varType == VT_BOOL) 1526680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com { 1536680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com bool res; 1546680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com if (SetBoolProperty(res, srcProp) != S_OK) 155a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com return false; 156a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com destProp = res; 157a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com return true; 158a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 159a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com return false; 160a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com} 161a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 162a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic int FindPropIdExact(const UString &name) 163a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com{ 164a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com for (int i = 0; i < sizeof(g_NameToPropID) / sizeof(g_NameToPropID[0]); i++) 165a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (name.CompareNoCase(g_NameToPropID[i].Name) == 0) 166a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com return i; 167a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com return -1; 168a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com} 169a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 1706680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.comstatic int FindPropIdStart(const UString &name) 1716680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com{ 172a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com for (int i = 0; i < sizeof(g_NameToPropID) / sizeof(g_NameToPropID[0]); i++) 1736680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com { 1746680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com UString t = g_NameToPropID[i].Name; 1756680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com if (t.CompareNoCase(name.Left(t.Length())) == 0) 1766680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com return i; 1776680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com } 1786680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com return -1; 1796680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com} 1806680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com 181a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic void SetMethodProp(COneMethodInfo &m, PROPID propID, const NCOM::CPropVariant &value) 182a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com{ 18378e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com for (int j = 0; j < m.Props.Size(); j++) 18478e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com if (m.Props[j].Id == propID) 185a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com return; 186a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com CProp prop; 187a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com prop.Id = propID; 188a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com prop.Value = value; 189a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com m.Props.Add(prop); 190a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com} 191a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 192a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comvoid COutHandler::SetCompressionMethod2(COneMethodInfo &oneMethodInfo 1932e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com #ifndef _7ZIP_ST 1946680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com , UInt32 numThreads 195a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com #endif 196a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com ) 19778e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com{ 19878e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com UInt32 level = _level; 199a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (oneMethodInfo.MethodName.IsEmpty()) 200a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com oneMethodInfo.MethodName = kDefaultMethodName; 201a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 202a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (oneMethodInfo.IsLzma()) 203a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com { 204a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com UInt32 dicSize = 205a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com (level >= 9 ? kLzmaDicSizeX9 : 206a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com (level >= 7 ? kLzmaDicSizeX7 : 207a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com (level >= 5 ? kLzmaDicSizeX5 : 208a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com (level >= 3 ? kLzmaDicSizeX3 : 209a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com kLzmaDicSizeX1)))); 210fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 211fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com UInt32 algo = 212fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com (level >= 5 ? kLzmaAlgoX5 : 213fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com kLzmaAlgoX1); 214fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 215fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com UInt32 fastBytes = 216fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com (level >= 7 ? kLzmaFastBytesX7 : 217fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com kLzmaFastBytesX1); 218fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 219fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com const wchar_t *matchFinder = 220fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com (level >= 5 ? kLzmaMatchFinderX5 : 221fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com kLzmaMatchFinderX1); 222fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 223fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kDictionarySize, dicSize); 224fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kAlgorithm, algo); 225fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kNumFastBytes, fastBytes); 226fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kMatchFinder, matchFinder); 227fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com #ifndef _7ZIP_ST 228fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kNumThreads, numThreads); 229fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com #endif 230fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com } 231fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com else if (IsDeflateMethod(oneMethodInfo.MethodName)) 232fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com { 23378e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com UInt32 fastBytes = 23478e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com (level >= 9 ? kDeflateFastBytesX9 : 23578e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com (level >= 7 ? kDeflateFastBytesX7 : 23678e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com kDeflateFastBytesX1)); 23778e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com 23878e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com UInt32 numPasses = 23978e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com (level >= 9 ? kDeflatePassesX9 : 24078e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com (level >= 7 ? kDeflatePassesX7 : 24178e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com kDeflatePassesX1)); 24278e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com 24378e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com UInt32 algo = 24478e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com (level >= 5 ? kDeflateAlgoX5 : 24578e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com kDeflateAlgoX1); 24678e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com 24778e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kAlgorithm, algo); 24878e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kNumFastBytes, fastBytes); 24978e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kNumPasses, numPasses); 25078e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com } 25178e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com else if (IsBZip2Method(oneMethodInfo.MethodName)) 25278e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com { 25378e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com UInt32 numPasses = 25478e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com (level >= 9 ? kBZip2NumPassesX9 : 25578e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com (level >= 7 ? kBZip2NumPassesX7 : 25678e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com kBZip2NumPassesX1)); 25778e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com 25878e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com UInt32 dicSize = 25978e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com (level >= 5 ? kBZip2DicSizeX5 : 26078e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com (level >= 3 ? kBZip2DicSizeX3 : 26178e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com kBZip2DicSizeX1)); 26278e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com 26378e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kNumPasses, numPasses); 26478e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kDictionarySize, dicSize); 26578e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com #ifndef _7ZIP_ST 26678e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kNumThreads, numThreads); 26778e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com #endif 26878e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com } 26978e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com else if (IsPpmdMethod(oneMethodInfo.MethodName)) 27078e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com { 27178e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com UInt32 useMemSize = 272c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com (level >= 9 ? kPpmdMemSizeX9 : 273c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com (level >= 7 ? kPpmdMemSizeX7 : 274c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com (level >= 5 ? kPpmdMemSizeX5 : 275c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com kPpmdMemSizeX1))); 276c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com 277c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com UInt32 order = 278d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com (level >= 9 ? kPpmdOrderX9 : 279c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com (level >= 7 ? kPpmdOrderX7 : 280c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com (level >= 5 ? kPpmdOrderX5 : 281d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kPpmdOrderX1))); 282c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com 283c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kUsedMemorySize, useMemSize); 284c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com SetMethodProp(oneMethodInfo, NCoderPropID::kOrder, order); 285c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com } 286c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com} 287c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com 288c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.comstatic void SplitParams(const UString &srcString, UStringVector &subStrings) 289c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com{ 290c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com subStrings.Clear(); 291c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com UString name; 292c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com int len = srcString.Length(); 293c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com if (len == 0) 294c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com return; 295c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com for (int i = 0; i < len; i++) 296c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com { 297c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com wchar_t c = srcString[i]; 298c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com if (c == L':') 299c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com { 300c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com subStrings.Add(name); 301c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com name.Empty(); 302c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com } 303c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com else 304c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com name += c; 305c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com } 306d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com subStrings.Add(name); 307c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com} 308c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com 309c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.comstatic void SplitParam(const UString ¶m, UString &name, UString &value) 310c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com{ 311c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com int eqPos = param.Find(L'='); 312c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com if (eqPos >= 0) 313c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com { 314c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com name = param.Left(eqPos); 315c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com value = param.Mid(eqPos + 1); 316c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com return; 317c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com } 318c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com for(int i = 0; i < param.Length(); i++) 319c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com { 320c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com wchar_t c = param[i]; 321c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com if (c >= L'0' && c <= L'9') 322c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com { 323c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com name = param.Left(i); 324c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com value = param.Mid(i); 325c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com return; 326c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com } 327c682590538a27d73489bc91c098e000fdfb07ccfcaryclark@google.com } 328f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com name = param; 329f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com} 330f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com 331f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.comHRESULT COutHandler::SetParam(COneMethodInfo &oneMethodInfo, const UString &name, const UString &value) 332f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com{ 333f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com CProp prop; 334f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com int index = FindPropIdExact(name); 335f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com if (index < 0) 3366680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com return E_INVALIDARG; 3372e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com const CNameToPropID &nameToPropID = g_NameToPropID[index]; 3382e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com prop.Id = nameToPropID.PropID; 339f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com 340f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com if (prop.Id == NCoderPropID::kBlockSize || 341cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com prop.Id == NCoderPropID::kDictionarySize || 342cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com prop.Id == NCoderPropID::kUsedMemorySize) 343f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com { 344f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com UInt32 dicSize; 345f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com RINOK(ParsePropDictionaryValue(value, dicSize)); 346f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com prop.Value = dicSize; 347752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com } 348cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com else 3492e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com { 350cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com NCOM::CPropVariant propValue; 3512e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 352f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com if (nameToPropID.VarType == VT_BSTR) 353f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com propValue = value; 3546680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com else if (nameToPropID.VarType == VT_BOOL) 3556680fb1dc0ca55e5e3ddd41cb26dcd74fce28f6ecaryclark@google.com { 356f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com bool res; 357f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com if (!StringToBool(value, res)) 358f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com return E_INVALIDARG; 359f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com propValue = res; 360a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 361a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com else 362c17972e7acc784553445adc18f608a8c4b1beac8caryclark@google.com { 363a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com UInt32 number; 364a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (ParseStringToUInt32(value, number) == value.Length()) 3652e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com propValue = number; 3662e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com else 3672e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com propValue = value; 368752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com } 3692e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 3702e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com if (!ConvertProperty(propValue, nameToPropID.VarType, prop.Value)) 3712e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return E_INVALIDARG; 3722e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com } 3732e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com oneMethodInfo.Props.Add(prop); 3742e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return S_OK; 3752e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com} 3762e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 3772e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comHRESULT COutHandler::SetParams(COneMethodInfo &oneMethodInfo, const UString &srcString) 3782e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com{ 3792e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com UStringVector params; 3802e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com SplitParams(srcString, params); 3812e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com if (params.Size() > 0) 3822e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com oneMethodInfo.MethodName = params[0]; 3832e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com for (int i = 1; i < params.Size(); i++) 3842e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com { 3852e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com const UString ¶m = params[i]; 3862e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com UString name, value; 38778e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com SplitParam(param, name, value); 38878e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com RINOK(SetParam(oneMethodInfo, name, value)); 38978e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com } 39078e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com return S_OK; 3912e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com} 3922e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 3932e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comHRESULT COutHandler::SetSolidSettings(const UString &s) 394f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com{ 395f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com UString s2 = s; 396f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com s2.MakeUpper(); 3976008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com for (int i = 0; i < s2.Length();) 3986008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com { 3996008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com const wchar_t *start = ((const wchar_t *)s2) + i; 4006008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com const wchar_t *end; 401f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com UInt64 v = ConvertStringToUInt64(start, &end); 4026008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com if (start == end) 4036008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com { 4046008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com if (s2[i++] != 'E') 4056008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com return E_INVALIDARG; 406f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com _solidExtension = true; 4076008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com continue; 4086008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com } 409f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com i += (int)(end - start); 4104917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com if (i == s2.Length()) 411fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com return E_INVALIDARG; 412fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com wchar_t c = s2[i++]; 413a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com switch(c) 414a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com { 415fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com case 'F': 416fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if (v < 1) 417fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com v = 1; 418fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com _numSolidFiles = v; 4196008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com break; 4206008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com case 'B': 4216008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com _numSolidBytes = v; 422cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com _numSolidBytesDefined = true; 423cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com break; 424fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com case 'K': 4256008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com _numSolidBytes = (v << 10); 426fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com _numSolidBytesDefined = true; 427fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com break; 428fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com case 'M': 429fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com _numSolidBytes = (v << 20); 430fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com _numSolidBytesDefined = true; 431fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com break; 4326008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com case 'G': 433fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com _numSolidBytes = (v << 30); 434fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com _numSolidBytesDefined = true; 435fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com break; 436fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com default: 437fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com return E_INVALIDARG; 438fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com } 439fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com } 440fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com return S_OK; 441fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com} 442f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com 443a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comHRESULT COutHandler::SetSolidSettings(const PROPVARIANT &value) 444fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com{ 445fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com bool isSolid; 446fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com switch(value.vt) 447fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com { 448fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com case VT_EMPTY: 449fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com isSolid = true; 450fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com break; 451fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com case VT_BOOL: 452fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com isSolid = (value.boolVal != VARIANT_FALSE); 453a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com break; 454a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com case VT_BSTR: 455a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (StringToBool(value.bstrVal, isSolid)) 456fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com break; 457fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com return SetSolidSettings(value.bstrVal); 458a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com default: 459a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com return E_INVALIDARG; 460fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com } 461fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if (isSolid) 462a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com InitSolid(); 463a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com else 464a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com _numSolidFiles = 1; 465a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com return S_OK; 466a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com} 467a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 468a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comvoid COutHandler::Init() 469a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com{ 470a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com _removeSfxBlock = false; 471a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com _compressHeaders = true; 472a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com _encryptHeadersSpecified = false; 473a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com _encryptHeaders = false; 474a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 475cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com WriteCTime = false; 476fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com WriteATime = false; 477fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com WriteMTime = true; 478fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 479fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com #ifndef _7ZIP_ST 480fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com _numThreads = NSystem::GetNumberOfProcessors(); 481a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com #endif 482fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 48378e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com _level = 5; 48478e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com _autoFilter = true; 48578e17130f396d8b2157116c2504e357192f87ed1caryclark@google.com _volumeMode = false; 486a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com _crcSize = 4; 487a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com InitSolid(); 488fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com} 489fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 490fb173424e915e696a73067d616ce4f39a407261acaryclark@google.comvoid COutHandler::BeforeSetProperty() 491fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com{ 492fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com Init(); 493fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com #ifndef _7ZIP_ST 494fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com numProcessors = NSystem::GetNumberOfProcessors(); 495fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com #endif 496fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 497fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com mainDicSize = 0xFFFFFFFF; 498fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com mainDicMethodIndex = 0xFFFFFFFF; 499a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com minNumber = 0; 500fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com _crcSize = 4; 501fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com} 502a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 5036008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.comHRESULT COutHandler::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value) 504fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com{ 505fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com UString name = nameSpec; 506fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com name.MakeUpper(); 507fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if (name.IsEmpty()) 5086008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com return E_INVALIDARG; 5096008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com 5106008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com if (name[0] == 'X') 511fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com { 5126008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com name.Delete(0); 5136008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com _level = 9; 5146008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com return ParsePropValue(name, value, _level); 5154917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com } 5164917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com 5174917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com if (name[0] == L'S') 5184917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com { 5194917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com name.Delete(0); 5204917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com if (name.IsEmpty()) 5214917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com return SetSolidSettings(value); 5224917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com if (value.vt != VT_EMPTY) 5234917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com return E_INVALIDARG; 524fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com return SetSolidSettings(name); 525fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com } 526fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 527fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if (name == L"CRC") 528fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com { 529fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com _crcSize = 4; 530fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com name.Delete(0, 3); 531fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com return ParsePropValue(name, value, _crcSize); 532fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com } 533fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com 534fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com UInt32 number; 535fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com int index = ParseStringToUInt32(name, number); 536fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com UString realName = name.Mid(index); 537fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if (index == 0) 538fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com { 539fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if(name.Left(2).CompareNoCase(L"MT") == 0) 540fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com { 541fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com #ifndef _7ZIP_ST 542fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com RINOK(ParseMtProp(name.Mid(2), value, numProcessors, _numThreads)); 543a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com #endif 544fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com return S_OK; 545fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com } 546fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if (name.CompareNoCase(L"RSFX") == 0) return SetBoolProperty(_removeSfxBlock, value); 547fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if (name.CompareNoCase(L"F") == 0) return SetBoolProperty(_autoFilter, value); 548fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if (name.CompareNoCase(L"HC") == 0) return SetBoolProperty(_compressHeaders, value); 5494917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com if (name.CompareNoCase(L"HCF") == 0) 550cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com { 551fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com bool compressHeadersFull = true; 552fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com RINOK(SetBoolProperty(compressHeadersFull, value)); 553fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if (!compressHeadersFull) 554cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com return E_INVALIDARG; 555cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com return S_OK; 556fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com } 557fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com if (name.CompareNoCase(L"HE") == 0) 558fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com { 559fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com RINOK(SetBoolProperty(_encryptHeaders, value)); 560fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com _encryptHeadersSpecified = true; 561fb173424e915e696a73067d616ce4f39a407261acaryclark@google.com return S_OK; 5626008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com } 5636008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com if (name.CompareNoCase(L"TC") == 0) return SetBoolProperty(WriteCTime, value); 5646008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com if (name.CompareNoCase(L"TA") == 0) return SetBoolProperty(WriteATime, value); 5654917f17bf6bd8bff7f4b03717dcb02561cf227c9caryclark@google.com if (name.CompareNoCase(L"TM") == 0) return SetBoolProperty(WriteMTime, value); 5666008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com if (name.CompareNoCase(L"V") == 0) return SetBoolProperty(_volumeMode, value); 567f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com number = 0; 568752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com } 569cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com if (number > 10000) 570cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com return E_FAIL; 571cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com if (number < minNumber) 572cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com return E_INVALIDARG; 573cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com number -= minNumber; 574cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com for(int j = _methods.Size(); j <= (int)number; j++) 575cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com { 576cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com COneMethodInfo oneMethodInfo; 577cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com _methods.Add(oneMethodInfo); 578cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com } 579cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com 580cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com COneMethodInfo &oneMethodInfo = _methods[number]; 5812e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com 5822e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com if (realName.Length() == 0) 5832e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com { 5842e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com if (value.vt != VT_BSTR) 5852e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return E_INVALIDARG; 586cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com 587cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com RINOK(SetParams(oneMethodInfo, value.bstrVal)); 588cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com } 5892e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com else 5902e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com { 5912e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com int index = FindPropIdStart(realName); 5922e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com if (index < 0) 5932e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return E_INVALIDARG; 594cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com const CNameToPropID &nameToPropID = g_NameToPropID[index]; 595cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com CProp prop; 596cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com prop.Id = nameToPropID.PropID; 597cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com 598cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com if (prop.Id == NCoderPropID::kBlockSize || 599cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com prop.Id == NCoderPropID::kDictionarySize || 600cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com prop.Id == NCoderPropID::kUsedMemorySize) 601cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com { 6022e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com UInt32 dicSize; 603cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com RINOK(ParsePropDictionaryValue(realName.Mid(MyStringLen(nameToPropID.Name)), value, dicSize)); 604cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com prop.Value = dicSize; 6052e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com if (number <= mainDicMethodIndex) 606cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com mainDicSize = dicSize; 607cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com } 608cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com else 6092e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com { 6102e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com int index = FindPropIdExact(realName); 6112e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com if (index < 0) 6122e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return E_INVALIDARG; 613cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com const CNameToPropID &nameToPropID = g_NameToPropID[index]; 614d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com prop.Id = nameToPropID.PropID; 615cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com if (!ConvertProperty(value, nameToPropID.VarType, prop.Value)) 616cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com return E_INVALIDARG; 6172e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com } 6182e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com oneMethodInfo.Props.Add(prop); 6192e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com } 6202e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com return S_OK; 621cef7e3fc4bc6223ab0e42ed754e2a09028479c0bcaryclark@google.com} 622f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com 623f8b000d7ae32ac9bb67c8e33cae500cac7407d26caryclark@google.com} 6246008c656f90026a3b434938454fd2b67cf135e0acaryclark@google.com