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