Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / Windows / PropVariantUtils.cpp
1 // PropVariantUtils.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "PropVariantUtils.h"\r
6 #include "Common/StringConvert.h"\r
7 #include "Common/IntToString.h"\r
8 \r
9 using namespace NWindows;\r
10 \r
11 static AString GetHex(UInt32 v)\r
12 {\r
13   char sz[32] = { '0', 'x' };\r
14   ConvertUInt64ToString(v, sz + 2, 16);\r
15   return sz;\r
16 }\r
17 \r
18 void StringToProp(const AString &s, NCOM::CPropVariant &prop)\r
19 {\r
20   prop = MultiByteToUnicodeString(s);\r
21 }\r
22 \r
23 void PairToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 value, NCOM::CPropVariant &prop)\r
24 {\r
25   AString s;\r
26   for (unsigned i = 0; i < num; i++)\r
27   {\r
28     const CUInt32PCharPair &p = pairs[i];\r
29     if (p.Value == value)\r
30       s = p.Name;\r
31   }\r
32   if (s.IsEmpty())\r
33     s = GetHex(value);\r
34   StringToProp(s, prop);\r
35 }\r
36 \r
37 AString TypeToString(const char *table[], unsigned num, UInt32 value)\r
38 {\r
39   if (value < num)\r
40     return table[value];\r
41   return GetHex(value);\r
42 }\r
43 \r
44 void TypeToProp(const char *table[], unsigned num, UInt32 value, NCOM::CPropVariant &prop)\r
45 {\r
46   StringToProp(TypeToString(table, num, value), prop);\r
47 }\r
48 \r
49 \r
50 AString FlagsToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags)\r
51 {\r
52   AString s;\r
53   for (unsigned i = 0; i < num; i++)\r
54   {\r
55     const CUInt32PCharPair &p = pairs[i];\r
56     UInt32 flag = (UInt32)1 << (unsigned)p.Value;\r
57     if ((flags & flag) != 0)\r
58     {\r
59       if (!s.IsEmpty())\r
60         s += ' ';\r
61       s += p.Name;\r
62     }\r
63     flags &= ~flag;\r
64   }\r
65   if (flags != 0)\r
66   {\r
67     if (!s.IsEmpty())\r
68       s += ' ';\r
69     s += GetHex(flags);\r
70   }\r
71   return s;\r
72 }\r
73 \r
74 void FlagsToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags, NCOM::CPropVariant &prop)\r
75 {\r
76   StringToProp(FlagsToString(pairs, num, flags), prop);\r
77 }\r
78 \r