xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Common/HandlerOut.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // HandlerOut.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../Common/ParseProperties.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "HandlerOut.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
12*f6dc9357SAndroid Build Coastguard Worker 
ParseSizeString(const wchar_t * s,const PROPVARIANT & prop,UInt64 percentsBase,UInt64 & res)13*f6dc9357SAndroid Build Coastguard Worker bool ParseSizeString(const wchar_t *s, const PROPVARIANT &prop, UInt64 percentsBase, UInt64 &res)
14*f6dc9357SAndroid Build Coastguard Worker {
15*f6dc9357SAndroid Build Coastguard Worker   if (*s == 0)
16*f6dc9357SAndroid Build Coastguard Worker   {
17*f6dc9357SAndroid Build Coastguard Worker     switch (prop.vt)
18*f6dc9357SAndroid Build Coastguard Worker     {
19*f6dc9357SAndroid Build Coastguard Worker       case VT_UI4: res = prop.ulVal; return true;
20*f6dc9357SAndroid Build Coastguard Worker       case VT_UI8: res = prop.uhVal.QuadPart; return true;
21*f6dc9357SAndroid Build Coastguard Worker       case VT_BSTR:
22*f6dc9357SAndroid Build Coastguard Worker         s = prop.bstrVal;
23*f6dc9357SAndroid Build Coastguard Worker         break;
24*f6dc9357SAndroid Build Coastguard Worker       default: return false;
25*f6dc9357SAndroid Build Coastguard Worker     }
26*f6dc9357SAndroid Build Coastguard Worker   }
27*f6dc9357SAndroid Build Coastguard Worker   else if (prop.vt != VT_EMPTY)
28*f6dc9357SAndroid Build Coastguard Worker     return false;
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker   bool percentMode = false;
31*f6dc9357SAndroid Build Coastguard Worker   {
32*f6dc9357SAndroid Build Coastguard Worker     const wchar_t c = *s;
33*f6dc9357SAndroid Build Coastguard Worker     if (MyCharLower_Ascii(c) == 'p')
34*f6dc9357SAndroid Build Coastguard Worker     {
35*f6dc9357SAndroid Build Coastguard Worker       percentMode = true;
36*f6dc9357SAndroid Build Coastguard Worker       s++;
37*f6dc9357SAndroid Build Coastguard Worker     }
38*f6dc9357SAndroid Build Coastguard Worker   }
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker   const wchar_t *end;
41*f6dc9357SAndroid Build Coastguard Worker   const UInt64 v = ConvertStringToUInt64(s, &end);
42*f6dc9357SAndroid Build Coastguard Worker   if (s == end)
43*f6dc9357SAndroid Build Coastguard Worker     return false;
44*f6dc9357SAndroid Build Coastguard Worker   const wchar_t c = *end;
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker   if (percentMode)
47*f6dc9357SAndroid Build Coastguard Worker   {
48*f6dc9357SAndroid Build Coastguard Worker     if (c != 0)
49*f6dc9357SAndroid Build Coastguard Worker       return false;
50*f6dc9357SAndroid Build Coastguard Worker     res = Calc_From_Val_Percents(percentsBase, v);
51*f6dc9357SAndroid Build Coastguard Worker     return true;
52*f6dc9357SAndroid Build Coastguard Worker   }
53*f6dc9357SAndroid Build Coastguard Worker 
54*f6dc9357SAndroid Build Coastguard Worker   if (c == 0)
55*f6dc9357SAndroid Build Coastguard Worker   {
56*f6dc9357SAndroid Build Coastguard Worker     res = v;
57*f6dc9357SAndroid Build Coastguard Worker     return true;
58*f6dc9357SAndroid Build Coastguard Worker   }
59*f6dc9357SAndroid Build Coastguard Worker   if (end[1] != 0)
60*f6dc9357SAndroid Build Coastguard Worker     return false;
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker   if (c == '%')
63*f6dc9357SAndroid Build Coastguard Worker   {
64*f6dc9357SAndroid Build Coastguard Worker     res = Calc_From_Val_Percents(percentsBase, v);
65*f6dc9357SAndroid Build Coastguard Worker     return true;
66*f6dc9357SAndroid Build Coastguard Worker   }
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker   unsigned numBits;
69*f6dc9357SAndroid Build Coastguard Worker   switch (MyCharLower_Ascii(c))
70*f6dc9357SAndroid Build Coastguard Worker   {
71*f6dc9357SAndroid Build Coastguard Worker     case 'b': numBits =  0; break;
72*f6dc9357SAndroid Build Coastguard Worker     case 'k': numBits = 10; break;
73*f6dc9357SAndroid Build Coastguard Worker     case 'm': numBits = 20; break;
74*f6dc9357SAndroid Build Coastguard Worker     case 'g': numBits = 30; break;
75*f6dc9357SAndroid Build Coastguard Worker     case 't': numBits = 40; break;
76*f6dc9357SAndroid Build Coastguard Worker     default: return false;
77*f6dc9357SAndroid Build Coastguard Worker   }
78*f6dc9357SAndroid Build Coastguard Worker   const UInt64 val2 = v << numBits;
79*f6dc9357SAndroid Build Coastguard Worker   if ((val2 >> numBits) != v)
80*f6dc9357SAndroid Build Coastguard Worker     return false;
81*f6dc9357SAndroid Build Coastguard Worker   res = val2;
82*f6dc9357SAndroid Build Coastguard Worker   return true;
83*f6dc9357SAndroid Build Coastguard Worker }
84*f6dc9357SAndroid Build Coastguard Worker 
SetCommonProperty(const UString & name,const PROPVARIANT & value,HRESULT & hres)85*f6dc9357SAndroid Build Coastguard Worker bool CCommonMethodProps::SetCommonProperty(const UString &name, const PROPVARIANT &value, HRESULT &hres)
86*f6dc9357SAndroid Build Coastguard Worker {
87*f6dc9357SAndroid Build Coastguard Worker   hres = S_OK;
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker   if (name.IsPrefixedBy_Ascii_NoCase("mt"))
90*f6dc9357SAndroid Build Coastguard Worker   {
91*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_ST
92*f6dc9357SAndroid Build Coastguard Worker     _numThreads = _numProcessors;
93*f6dc9357SAndroid Build Coastguard Worker     _numThreads_WasForced = false;
94*f6dc9357SAndroid Build Coastguard Worker     hres = ParseMtProp2(name.Ptr(2), value, _numThreads, _numThreads_WasForced);
95*f6dc9357SAndroid Build Coastguard Worker     // "mt" means "_numThreads_WasForced = false" here
96*f6dc9357SAndroid Build Coastguard Worker     #endif
97*f6dc9357SAndroid Build Coastguard Worker     return true;
98*f6dc9357SAndroid Build Coastguard Worker   }
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker   if (name.IsPrefixedBy_Ascii_NoCase("memuse"))
101*f6dc9357SAndroid Build Coastguard Worker   {
102*f6dc9357SAndroid Build Coastguard Worker     UInt64 v;
103*f6dc9357SAndroid Build Coastguard Worker     if (!ParseSizeString(name.Ptr(6), value, _memAvail, v))
104*f6dc9357SAndroid Build Coastguard Worker       hres = E_INVALIDARG;
105*f6dc9357SAndroid Build Coastguard Worker     _memUsage_Decompress = v;
106*f6dc9357SAndroid Build Coastguard Worker     _memUsage_Compress = v;
107*f6dc9357SAndroid Build Coastguard Worker     _memUsage_WasSet = true;
108*f6dc9357SAndroid Build Coastguard Worker     return true;
109*f6dc9357SAndroid Build Coastguard Worker   }
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker   return false;
112*f6dc9357SAndroid Build Coastguard Worker }
113*f6dc9357SAndroid Build Coastguard Worker 
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_EXTRACT_ONLY
116*f6dc9357SAndroid Build Coastguard Worker 
SetMethodProp32(CMethodProps & m,PROPID propID,UInt32 value)117*f6dc9357SAndroid Build Coastguard Worker static void SetMethodProp32(CMethodProps &m, PROPID propID, UInt32 value)
118*f6dc9357SAndroid Build Coastguard Worker {
119*f6dc9357SAndroid Build Coastguard Worker   if (m.FindProp(propID) < 0)
120*f6dc9357SAndroid Build Coastguard Worker     m.AddProp32(propID, value);
121*f6dc9357SAndroid Build Coastguard Worker }
122*f6dc9357SAndroid Build Coastguard Worker 
SetGlobalLevelTo(COneMethodInfo & oneMethodInfo) const123*f6dc9357SAndroid Build Coastguard Worker void CMultiMethodProps::SetGlobalLevelTo(COneMethodInfo &oneMethodInfo) const
124*f6dc9357SAndroid Build Coastguard Worker {
125*f6dc9357SAndroid Build Coastguard Worker   UInt32 level = _level;
126*f6dc9357SAndroid Build Coastguard Worker   if (level != (UInt32)(Int32)-1)
127*f6dc9357SAndroid Build Coastguard Worker     SetMethodProp32(oneMethodInfo, NCoderPropID::kLevel, (UInt32)level);
128*f6dc9357SAndroid Build Coastguard Worker }
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
131*f6dc9357SAndroid Build Coastguard Worker 
SetMethodProp32_Replace(CMethodProps & m,PROPID propID,UInt32 value)132*f6dc9357SAndroid Build Coastguard Worker static void SetMethodProp32_Replace(CMethodProps &m, PROPID propID, UInt32 value)
133*f6dc9357SAndroid Build Coastguard Worker {
134*f6dc9357SAndroid Build Coastguard Worker   const int i = m.FindProp(propID);
135*f6dc9357SAndroid Build Coastguard Worker   if (i >= 0)
136*f6dc9357SAndroid Build Coastguard Worker   {
137*f6dc9357SAndroid Build Coastguard Worker     NWindows::NCOM::CPropVariant &val = m.Props[(unsigned)i].Value;
138*f6dc9357SAndroid Build Coastguard Worker     val = (UInt32)value;
139*f6dc9357SAndroid Build Coastguard Worker     return;
140*f6dc9357SAndroid Build Coastguard Worker   }
141*f6dc9357SAndroid Build Coastguard Worker   m.AddProp32(propID, value);
142*f6dc9357SAndroid Build Coastguard Worker }
143*f6dc9357SAndroid Build Coastguard Worker 
SetMethodThreadsTo_IfNotFinded(CMethodProps & oneMethodInfo,UInt32 numThreads)144*f6dc9357SAndroid Build Coastguard Worker void CMultiMethodProps::SetMethodThreadsTo_IfNotFinded(CMethodProps &oneMethodInfo, UInt32 numThreads)
145*f6dc9357SAndroid Build Coastguard Worker {
146*f6dc9357SAndroid Build Coastguard Worker   SetMethodProp32(oneMethodInfo, NCoderPropID::kNumThreads, numThreads);
147*f6dc9357SAndroid Build Coastguard Worker }
148*f6dc9357SAndroid Build Coastguard Worker 
SetMethodThreadsTo_Replace(CMethodProps & oneMethodInfo,UInt32 numThreads)149*f6dc9357SAndroid Build Coastguard Worker void CMultiMethodProps::SetMethodThreadsTo_Replace(CMethodProps &oneMethodInfo, UInt32 numThreads)
150*f6dc9357SAndroid Build Coastguard Worker {
151*f6dc9357SAndroid Build Coastguard Worker   SetMethodProp32_Replace(oneMethodInfo, NCoderPropID::kNumThreads, numThreads);
152*f6dc9357SAndroid Build Coastguard Worker }
153*f6dc9357SAndroid Build Coastguard Worker 
154*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_ST
155*f6dc9357SAndroid Build Coastguard Worker 
156*f6dc9357SAndroid Build Coastguard Worker 
InitMulti()157*f6dc9357SAndroid Build Coastguard Worker void CMultiMethodProps::InitMulti()
158*f6dc9357SAndroid Build Coastguard Worker {
159*f6dc9357SAndroid Build Coastguard Worker   _level = (UInt32)(Int32)-1;
160*f6dc9357SAndroid Build Coastguard Worker   _analysisLevel = -1;
161*f6dc9357SAndroid Build Coastguard Worker   _crcSize = 4;
162*f6dc9357SAndroid Build Coastguard Worker   _autoFilter = true;
163*f6dc9357SAndroid Build Coastguard Worker }
164*f6dc9357SAndroid Build Coastguard Worker 
Init()165*f6dc9357SAndroid Build Coastguard Worker void CMultiMethodProps::Init()
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker   InitCommon();
168*f6dc9357SAndroid Build Coastguard Worker   InitMulti();
169*f6dc9357SAndroid Build Coastguard Worker   _methods.Clear();
170*f6dc9357SAndroid Build Coastguard Worker   _filterMethod.Clear();
171*f6dc9357SAndroid Build Coastguard Worker }
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker 
SetProperty(const wchar_t * nameSpec,const PROPVARIANT & value)174*f6dc9357SAndroid Build Coastguard Worker HRESULT CMultiMethodProps::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value)
175*f6dc9357SAndroid Build Coastguard Worker {
176*f6dc9357SAndroid Build Coastguard Worker   UString name = nameSpec;
177*f6dc9357SAndroid Build Coastguard Worker   name.MakeLower_Ascii();
178*f6dc9357SAndroid Build Coastguard Worker   if (name.IsEmpty())
179*f6dc9357SAndroid Build Coastguard Worker     return E_INVALIDARG;
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker   if (name[0] == 'x')
182*f6dc9357SAndroid Build Coastguard Worker   {
183*f6dc9357SAndroid Build Coastguard Worker     name.Delete(0);
184*f6dc9357SAndroid Build Coastguard Worker     _level = 9;
185*f6dc9357SAndroid Build Coastguard Worker     return ParsePropToUInt32(name, value, _level);
186*f6dc9357SAndroid Build Coastguard Worker   }
187*f6dc9357SAndroid Build Coastguard Worker 
188*f6dc9357SAndroid Build Coastguard Worker   if (name.IsPrefixedBy_Ascii_NoCase("yx"))
189*f6dc9357SAndroid Build Coastguard Worker   {
190*f6dc9357SAndroid Build Coastguard Worker     name.Delete(0, 2);
191*f6dc9357SAndroid Build Coastguard Worker     UInt32 v = 9;
192*f6dc9357SAndroid Build Coastguard Worker     RINOK(ParsePropToUInt32(name, value, v))
193*f6dc9357SAndroid Build Coastguard Worker     _analysisLevel = (int)v;
194*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
195*f6dc9357SAndroid Build Coastguard Worker   }
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker   if (name.IsPrefixedBy_Ascii_NoCase("crc"))
198*f6dc9357SAndroid Build Coastguard Worker   {
199*f6dc9357SAndroid Build Coastguard Worker     name.Delete(0, 3);
200*f6dc9357SAndroid Build Coastguard Worker     _crcSize = 4;
201*f6dc9357SAndroid Build Coastguard Worker     return ParsePropToUInt32(name, value, _crcSize);
202*f6dc9357SAndroid Build Coastguard Worker   }
203*f6dc9357SAndroid Build Coastguard Worker 
204*f6dc9357SAndroid Build Coastguard Worker   {
205*f6dc9357SAndroid Build Coastguard Worker     HRESULT hres;
206*f6dc9357SAndroid Build Coastguard Worker     if (SetCommonProperty(name, value, hres))
207*f6dc9357SAndroid Build Coastguard Worker       return hres;
208*f6dc9357SAndroid Build Coastguard Worker   }
209*f6dc9357SAndroid Build Coastguard Worker 
210*f6dc9357SAndroid Build Coastguard Worker   UInt32 number;
211*f6dc9357SAndroid Build Coastguard Worker   const unsigned index = ParseStringToUInt32(name, number);
212*f6dc9357SAndroid Build Coastguard Worker   const UString realName = name.Ptr(index);
213*f6dc9357SAndroid Build Coastguard Worker   if (index == 0)
214*f6dc9357SAndroid Build Coastguard Worker   {
215*f6dc9357SAndroid Build Coastguard Worker     if (name.IsEqualTo("f"))
216*f6dc9357SAndroid Build Coastguard Worker     {
217*f6dc9357SAndroid Build Coastguard Worker       const HRESULT res = PROPVARIANT_to_bool(value, _autoFilter);
218*f6dc9357SAndroid Build Coastguard Worker       if (res == S_OK)
219*f6dc9357SAndroid Build Coastguard Worker         return res;
220*f6dc9357SAndroid Build Coastguard Worker       if (value.vt != VT_BSTR)
221*f6dc9357SAndroid Build Coastguard Worker         return E_INVALIDARG;
222*f6dc9357SAndroid Build Coastguard Worker       return _filterMethod.ParseMethodFromPROPVARIANT(UString(), value);
223*f6dc9357SAndroid Build Coastguard Worker     }
224*f6dc9357SAndroid Build Coastguard Worker     number = 0;
225*f6dc9357SAndroid Build Coastguard Worker   }
226*f6dc9357SAndroid Build Coastguard Worker   if (number > 64)
227*f6dc9357SAndroid Build Coastguard Worker     return E_INVALIDARG;
228*f6dc9357SAndroid Build Coastguard Worker   for (unsigned j = _methods.Size(); j <= number; j++)
229*f6dc9357SAndroid Build Coastguard Worker     _methods.AddNew();
230*f6dc9357SAndroid Build Coastguard Worker   return _methods[number].ParseMethodFromPROPVARIANT(realName, value);
231*f6dc9357SAndroid Build Coastguard Worker }
232*f6dc9357SAndroid Build Coastguard Worker 
233*f6dc9357SAndroid Build Coastguard Worker 
234*f6dc9357SAndroid Build Coastguard Worker 
Init()235*f6dc9357SAndroid Build Coastguard Worker void CSingleMethodProps::Init()
236*f6dc9357SAndroid Build Coastguard Worker {
237*f6dc9357SAndroid Build Coastguard Worker   InitCommon();
238*f6dc9357SAndroid Build Coastguard Worker   InitSingle();
239*f6dc9357SAndroid Build Coastguard Worker   Clear();
240*f6dc9357SAndroid Build Coastguard Worker }
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker 
SetProperty(const wchar_t * name2,const PROPVARIANT & value)243*f6dc9357SAndroid Build Coastguard Worker HRESULT CSingleMethodProps::SetProperty(const wchar_t *name2, const PROPVARIANT &value)
244*f6dc9357SAndroid Build Coastguard Worker {
245*f6dc9357SAndroid Build Coastguard Worker   // processed = false;
246*f6dc9357SAndroid Build Coastguard Worker   UString name = name2;
247*f6dc9357SAndroid Build Coastguard Worker   name.MakeLower_Ascii();
248*f6dc9357SAndroid Build Coastguard Worker   if (name.IsEmpty())
249*f6dc9357SAndroid Build Coastguard Worker     return E_INVALIDARG;
250*f6dc9357SAndroid Build Coastguard Worker   if (name.IsPrefixedBy_Ascii_NoCase("x"))
251*f6dc9357SAndroid Build Coastguard Worker   {
252*f6dc9357SAndroid Build Coastguard Worker     UInt32 a = 9;
253*f6dc9357SAndroid Build Coastguard Worker     RINOK(ParsePropToUInt32(name.Ptr(1), value, a))
254*f6dc9357SAndroid Build Coastguard Worker     _level = a;
255*f6dc9357SAndroid Build Coastguard Worker     AddProp_Level(a);
256*f6dc9357SAndroid Build Coastguard Worker     // processed = true;
257*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
258*f6dc9357SAndroid Build Coastguard Worker   }
259*f6dc9357SAndroid Build Coastguard Worker   {
260*f6dc9357SAndroid Build Coastguard Worker     HRESULT hres;
261*f6dc9357SAndroid Build Coastguard Worker     if (SetCommonProperty(name, value, hres))
262*f6dc9357SAndroid Build Coastguard Worker     {
263*f6dc9357SAndroid Build Coastguard Worker       // processed = true;
264*f6dc9357SAndroid Build Coastguard Worker       return S_OK;
265*f6dc9357SAndroid Build Coastguard Worker     }
266*f6dc9357SAndroid Build Coastguard Worker   }
267*f6dc9357SAndroid Build Coastguard Worker   RINOK(ParseMethodFromPROPVARIANT(name, value))
268*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
269*f6dc9357SAndroid Build Coastguard Worker }
270*f6dc9357SAndroid Build Coastguard Worker 
271*f6dc9357SAndroid Build Coastguard Worker 
SetProperties(const wchar_t * const * names,const PROPVARIANT * values,UInt32 numProps)272*f6dc9357SAndroid Build Coastguard Worker HRESULT CSingleMethodProps::SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps)
273*f6dc9357SAndroid Build Coastguard Worker {
274*f6dc9357SAndroid Build Coastguard Worker   Init();
275*f6dc9357SAndroid Build Coastguard Worker 
276*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 0; i < numProps; i++)
277*f6dc9357SAndroid Build Coastguard Worker   {
278*f6dc9357SAndroid Build Coastguard Worker     RINOK(SetProperty(names[i], values[i]))
279*f6dc9357SAndroid Build Coastguard Worker   }
280*f6dc9357SAndroid Build Coastguard Worker 
281*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
282*f6dc9357SAndroid Build Coastguard Worker }
283*f6dc9357SAndroid Build Coastguard Worker 
284*f6dc9357SAndroid Build Coastguard Worker #endif
285*f6dc9357SAndroid Build Coastguard Worker 
286*f6dc9357SAndroid Build Coastguard Worker 
PROPVARIANT_to_BoolPair(const PROPVARIANT & prop,CBoolPair & dest)287*f6dc9357SAndroid Build Coastguard Worker static HRESULT PROPVARIANT_to_BoolPair(const PROPVARIANT &prop, CBoolPair &dest)
288*f6dc9357SAndroid Build Coastguard Worker {
289*f6dc9357SAndroid Build Coastguard Worker   RINOK(PROPVARIANT_to_bool(prop, dest.Val))
290*f6dc9357SAndroid Build Coastguard Worker   dest.Def = true;
291*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
292*f6dc9357SAndroid Build Coastguard Worker }
293*f6dc9357SAndroid Build Coastguard Worker 
Parse(const UString & name,const PROPVARIANT & prop,bool & processed)294*f6dc9357SAndroid Build Coastguard Worker HRESULT CHandlerTimeOptions::Parse(const UString &name, const PROPVARIANT &prop, bool &processed)
295*f6dc9357SAndroid Build Coastguard Worker {
296*f6dc9357SAndroid Build Coastguard Worker   processed = true;
297*f6dc9357SAndroid Build Coastguard Worker   if (name.IsEqualTo_Ascii_NoCase("tm")) { return PROPVARIANT_to_BoolPair(prop, Write_MTime); }
298*f6dc9357SAndroid Build Coastguard Worker   if (name.IsEqualTo_Ascii_NoCase("ta")) { return PROPVARIANT_to_BoolPair(prop, Write_ATime); }
299*f6dc9357SAndroid Build Coastguard Worker   if (name.IsEqualTo_Ascii_NoCase("tc")) { return PROPVARIANT_to_BoolPair(prop, Write_CTime); }
300*f6dc9357SAndroid Build Coastguard Worker   if (name.IsPrefixedBy_Ascii_NoCase("tp"))
301*f6dc9357SAndroid Build Coastguard Worker   {
302*f6dc9357SAndroid Build Coastguard Worker     UInt32 v = 0;
303*f6dc9357SAndroid Build Coastguard Worker     RINOK(ParsePropToUInt32(name.Ptr(2), prop, v))
304*f6dc9357SAndroid Build Coastguard Worker     Prec = v;
305*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
306*f6dc9357SAndroid Build Coastguard Worker   }
307*f6dc9357SAndroid Build Coastguard Worker   processed = false;
308*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
309*f6dc9357SAndroid Build Coastguard Worker }
310*f6dc9357SAndroid Build Coastguard Worker 
311*f6dc9357SAndroid Build Coastguard Worker }
312