Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / Archive / DeflateProps.cpp
1 // DeflateProps.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "Windows/PropVariant.h"\r
6 \r
7 #include "Common/ParseProperties.h"\r
8 \r
9 #include "DeflateProps.h"\r
10 \r
11 namespace NArchive {\r
12 \r
13 static const UInt32 kAlgo1 = 0;\r
14 static const UInt32 kAlgo5 = 1;\r
15 \r
16 static const UInt32 kPasses1 = 1;\r
17 static const UInt32 kPasses7 = 3;\r
18 static const UInt32 kPasses9 = 10;\r
19 \r
20 static const UInt32 kFb1 = 32;\r
21 static const UInt32 kFb7 = 64;\r
22 static const UInt32 kFb9 = 128;\r
23 \r
24 void CDeflateProps::Normalize()\r
25 {\r
26   UInt32 level = Level;\r
27   if (level == 0xFFFFFFFF)\r
28     level = 5;\r
29   \r
30   if (Algo == 0xFFFFFFFF)\r
31     Algo = (level >= 5 ?\r
32       kAlgo5 :\r
33       kAlgo1);\r
34 \r
35   if (NumPasses == 0xFFFFFFFF)\r
36     NumPasses =\r
37       (level >= 9 ? kPasses9 :\r
38       (level >= 7 ? kPasses7 :\r
39                     kPasses1));\r
40   if (Fb == 0xFFFFFFFF)\r
41     Fb =\r
42       (level >= 9 ? kFb9 :\r
43       (level >= 7 ? kFb7 :\r
44                     kFb1));\r
45 }\r
46 \r
47 HRESULT CDeflateProps::SetCoderProperties(ICompressSetCoderProperties *setCoderProperties)\r
48 {\r
49   Normalize();\r
50 \r
51   NWindows::NCOM::CPropVariant props[] =\r
52   {\r
53     Algo,\r
54     NumPasses,\r
55     Fb,\r
56     Mc\r
57   };\r
58   PROPID propIDs[] =\r
59   {\r
60     NCoderPropID::kAlgorithm,\r
61     NCoderPropID::kNumPasses,\r
62     NCoderPropID::kNumFastBytes,\r
63     NCoderPropID::kMatchFinderCycles\r
64   };\r
65   int numProps = sizeof(propIDs) / sizeof(propIDs[0]);\r
66   if (!McDefined)\r
67     numProps--;\r
68   return setCoderProperties->SetCoderProperties(propIDs, props, numProps);\r
69 }\r
70 \r
71 HRESULT CDeflateProps::SetProperties(const wchar_t **names, const PROPVARIANT *values, Int32 numProps)\r
72 {\r
73   Init();\r
74   for (int i = 0; i < numProps; i++)\r
75   {\r
76     UString name = names[i];\r
77     name.MakeUpper();\r
78     if (name.IsEmpty())\r
79       return E_INVALIDARG;\r
80     const PROPVARIANT &prop = values[i];\r
81     if (name[0] == L'X')\r
82     {\r
83       UInt32 a = 9;\r
84       RINOK(ParsePropValue(name.Mid(1), prop, a));\r
85       Level = a;\r
86     }\r
87     else if (name.Left(1) == L"A")\r
88     {\r
89       UInt32 a = kAlgo5;\r
90       RINOK(ParsePropValue(name.Mid(1), prop, a));\r
91       Algo = a;\r
92     }\r
93     else if (name.Left(4) == L"PASS")\r
94     {\r
95       UInt32 a = kPasses9;\r
96       RINOK(ParsePropValue(name.Mid(4), prop, a));\r
97       NumPasses = a;\r
98     }\r
99     else if (name.Left(2) == L"FB")\r
100     {\r
101       UInt32 a = kFb9;\r
102       RINOK(ParsePropValue(name.Mid(2), prop, a));\r
103       Fb = a;\r
104     }\r
105     else if (name.Left(2) == L"MC")\r
106     {\r
107       UInt32 a = 0xFFFFFFFF;\r
108       RINOK(ParsePropValue(name.Mid(2), prop, a));\r
109       Mc = a;\r
110       McDefined = true;\r
111     }\r
112     else\r
113       return E_INVALIDARG;\r
114   }\r
115   return S_OK;\r
116 }\r
117 \r
118 }\r