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 &param, 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 &param = 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