aboutsummaryrefslogtreecommitdiff
path: root/CPP/Windows/PropVariantUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/Windows/PropVariantUtils.cpp')
-rw-r--r--CPP/Windows/PropVariantUtils.cpp161
1 files changed, 161 insertions, 0 deletions
diff --git a/CPP/Windows/PropVariantUtils.cpp b/CPP/Windows/PropVariantUtils.cpp
new file mode 100644
index 0000000..6daee83
--- /dev/null
+++ b/CPP/Windows/PropVariantUtils.cpp
@@ -0,0 +1,161 @@
1// PropVariantUtils.cpp
2
3#include "StdAfx.h"
4
5#include "../Common/IntToString.h"
6
7#include "PropVariantUtils.h"
8
9using namespace NWindows;
10
11static void AddHex(AString &s, UInt32 v)
12{
13 char sz[16];
14 sz[0] = '0';
15 sz[1] = 'x';
16 ConvertUInt32ToHex(v, sz + 2);
17 s += sz;
18}
19
20
21AString TypePairToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 value)
22{
23 char sz[16];
24 const char *p = NULL;
25 for (unsigned i = 0; i < num; i++)
26 {
27 const CUInt32PCharPair &pair = pairs[i];
28 if (pair.Value == value)
29 p = pair.Name;
30 }
31 if (!p)
32 {
33 ConvertUInt32ToString(value, sz);
34 p = sz;
35 }
36 return (AString)p;
37}
38
39void PairToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 value, NCOM::CPropVariant &prop)
40{
41 prop = TypePairToString(pairs, num, value);
42}
43
44
45AString TypeToString(const char * const table[], unsigned num, UInt32 value)
46{
47 char sz[16];
48 const char *p = NULL;
49 if (value < num)
50 p = table[value];
51 if (!p)
52 {
53 ConvertUInt32ToString(value, sz);
54 p = sz;
55 }
56 return (AString)p;
57}
58
59void TypeToProp(const char * const table[], unsigned num, UInt32 value, NWindows::NCOM::CPropVariant &prop)
60{
61 char sz[16];
62 const char *p = NULL;
63 if (value < num)
64 p = table[value];
65 if (!p)
66 {
67 ConvertUInt32ToString(value, sz);
68 p = sz;
69 }
70 prop = p;
71}
72
73
74AString FlagsToString(const char * const *names, unsigned num, UInt32 flags)
75{
76 AString s;
77 for (unsigned i = 0; i < num; i++)
78 {
79 UInt32 flag = (UInt32)1 << i;
80 if ((flags & flag) != 0)
81 {
82 const char *name = names[i];
83 if (name && name[0] != 0)
84 {
85 s.Add_OptSpaced(name);
86 flags &= ~flag;
87 }
88 }
89 }
90 if (flags != 0)
91 {
92 s.Add_Space_if_NotEmpty();
93 AddHex(s, flags);
94 }
95 return s;
96}
97
98AString FlagsToString(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags)
99{
100 AString s;
101 for (unsigned i = 0; i < num; i++)
102 {
103 const CUInt32PCharPair &p = pairs[i];
104 UInt32 flag = (UInt32)1 << (unsigned)p.Value;
105 if ((flags & flag) != 0)
106 {
107 if (p.Name[0] != 0)
108 s.Add_OptSpaced(p.Name);
109 }
110 flags &= ~flag;
111 }
112 if (flags != 0)
113 {
114 s.Add_Space_if_NotEmpty();
115 AddHex(s, flags);
116 }
117 return s;
118}
119
120void FlagsToProp(const char * const *names, unsigned num, UInt32 flags, NCOM::CPropVariant &prop)
121{
122 prop = FlagsToString(names, num, flags);
123}
124
125void FlagsToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags, NCOM::CPropVariant &prop)
126{
127 prop = FlagsToString(pairs, num, flags);
128}
129
130
131static AString Flags64ToString(const CUInt32PCharPair *pairs, unsigned num, UInt64 flags)
132{
133 AString s;
134 for (unsigned i = 0; i < num; i++)
135 {
136 const CUInt32PCharPair &p = pairs[i];
137 UInt64 flag = (UInt64)1 << (unsigned)p.Value;
138 if ((flags & flag) != 0)
139 {
140 if (p.Name[0] != 0)
141 s.Add_OptSpaced(p.Name);
142 }
143 flags &= ~flag;
144 }
145 if (flags != 0)
146 {
147 {
148 char sz[32];
149 sz[0] = '0';
150 sz[1] = 'x';
151 ConvertUInt64ToHex(flags, sz + 2);
152 s.Add_OptSpaced(sz);
153 }
154 }
155 return s;
156}
157
158void Flags64ToProp(const CUInt32PCharPair *pairs, unsigned num, UInt64 flags, NCOM::CPropVariant &prop)
159{
160 prop = Flags64ToString(pairs, num, flags);
161}