xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/SetProperties.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // SetProperties.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/MyCom.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyString.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "../../Archive/IArchive.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "SetProperties.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
16*f6dc9357SAndroid Build Coastguard Worker using namespace NCOM;
17*f6dc9357SAndroid Build Coastguard Worker 
ParseNumberString(const UString & s,NCOM::CPropVariant & prop)18*f6dc9357SAndroid Build Coastguard Worker static void ParseNumberString(const UString &s, NCOM::CPropVariant &prop)
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker   const wchar_t *end;
21*f6dc9357SAndroid Build Coastguard Worker   const UInt64 result = ConvertStringToUInt64(s, &end);
22*f6dc9357SAndroid Build Coastguard Worker   if (*end != 0 || s.IsEmpty())
23*f6dc9357SAndroid Build Coastguard Worker     prop = s;
24*f6dc9357SAndroid Build Coastguard Worker   else if (result <= (UInt32)0xFFFFFFFF)
25*f6dc9357SAndroid Build Coastguard Worker     prop = (UInt32)result;
26*f6dc9357SAndroid Build Coastguard Worker   else
27*f6dc9357SAndroid Build Coastguard Worker     prop = result;
28*f6dc9357SAndroid Build Coastguard Worker }
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker struct CPropPropetiesVector
32*f6dc9357SAndroid Build Coastguard Worker {
33*f6dc9357SAndroid Build Coastguard Worker   CPropVariant *values;
CPropPropetiesVectorCPropPropetiesVector34*f6dc9357SAndroid Build Coastguard Worker   CPropPropetiesVector(unsigned num)
35*f6dc9357SAndroid Build Coastguard Worker   {
36*f6dc9357SAndroid Build Coastguard Worker     values = new CPropVariant[num];
37*f6dc9357SAndroid Build Coastguard Worker   }
~CPropPropetiesVectorCPropPropetiesVector38*f6dc9357SAndroid Build Coastguard Worker   ~CPropPropetiesVector()
39*f6dc9357SAndroid Build Coastguard Worker   {
40*f6dc9357SAndroid Build Coastguard Worker     delete []values;
41*f6dc9357SAndroid Build Coastguard Worker   }
42*f6dc9357SAndroid Build Coastguard Worker };
43*f6dc9357SAndroid Build Coastguard Worker 
44*f6dc9357SAndroid Build Coastguard Worker 
SetProperties(IUnknown * unknown,const CObjectVector<CProperty> & properties)45*f6dc9357SAndroid Build Coastguard Worker HRESULT SetProperties(IUnknown *unknown, const CObjectVector<CProperty> &properties)
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker   if (properties.IsEmpty())
48*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
49*f6dc9357SAndroid Build Coastguard Worker   Z7_DECL_CMyComPtr_QI_FROM(
50*f6dc9357SAndroid Build Coastguard Worker       ISetProperties,
51*f6dc9357SAndroid Build Coastguard Worker       setProperties, unknown)
52*f6dc9357SAndroid Build Coastguard Worker   if (!setProperties)
53*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker   UStringVector realNames;
56*f6dc9357SAndroid Build Coastguard Worker   CPropPropetiesVector values(properties.Size());
57*f6dc9357SAndroid Build Coastguard Worker   {
58*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
59*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < properties.Size(); i++)
60*f6dc9357SAndroid Build Coastguard Worker     {
61*f6dc9357SAndroid Build Coastguard Worker       const CProperty &property = properties[i];
62*f6dc9357SAndroid Build Coastguard Worker       NCOM::CPropVariant propVariant;
63*f6dc9357SAndroid Build Coastguard Worker       UString name = property.Name;
64*f6dc9357SAndroid Build Coastguard Worker       if (property.Value.IsEmpty())
65*f6dc9357SAndroid Build Coastguard Worker       {
66*f6dc9357SAndroid Build Coastguard Worker         if (!name.IsEmpty())
67*f6dc9357SAndroid Build Coastguard Worker         {
68*f6dc9357SAndroid Build Coastguard Worker           const wchar_t c = name.Back();
69*f6dc9357SAndroid Build Coastguard Worker           if (c == L'-')
70*f6dc9357SAndroid Build Coastguard Worker             propVariant = false;
71*f6dc9357SAndroid Build Coastguard Worker           else if (c == L'+')
72*f6dc9357SAndroid Build Coastguard Worker             propVariant = true;
73*f6dc9357SAndroid Build Coastguard Worker           if (propVariant.vt != VT_EMPTY)
74*f6dc9357SAndroid Build Coastguard Worker             name.DeleteBack();
75*f6dc9357SAndroid Build Coastguard Worker         }
76*f6dc9357SAndroid Build Coastguard Worker       }
77*f6dc9357SAndroid Build Coastguard Worker       else
78*f6dc9357SAndroid Build Coastguard Worker         ParseNumberString(property.Value, propVariant);
79*f6dc9357SAndroid Build Coastguard Worker       realNames.Add(name);
80*f6dc9357SAndroid Build Coastguard Worker       values.values[i] = propVariant;
81*f6dc9357SAndroid Build Coastguard Worker     }
82*f6dc9357SAndroid Build Coastguard Worker     CRecordVector<const wchar_t *> names;
83*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < realNames.Size(); i++)
84*f6dc9357SAndroid Build Coastguard Worker       names.Add((const wchar_t *)realNames[i]);
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker     return setProperties->SetProperties(names.ConstData(), values.values, names.Size());
87*f6dc9357SAndroid Build Coastguard Worker   }
88*f6dc9357SAndroid Build Coastguard Worker }
89