view src/win32/7zip/7z/CPP/Windows/PropVariant.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
line wrap: on
line source
1 // Windows/PropVariant.cpp
3 #include "StdAfx.h"
5 #include "PropVariant.h"
7 #include "../Common/Defs.h"
9 namespace NWindows {
10 namespace NCOM {
12 CPropVariant::CPropVariant(const PROPVARIANT& varSrc)
13 {
14 vt = VT_EMPTY;
15 InternalCopy(&varSrc);
16 }
18 CPropVariant::CPropVariant(const CPropVariant& varSrc)
19 {
20 vt = VT_EMPTY;
21 InternalCopy(&varSrc);
22 }
24 CPropVariant::CPropVariant(BSTR bstrSrc)
25 {
26 vt = VT_EMPTY;
27 *this = bstrSrc;
28 }
30 CPropVariant::CPropVariant(LPCOLESTR lpszSrc)
31 {
32 vt = VT_EMPTY;
33 *this = lpszSrc;
34 }
36 CPropVariant& CPropVariant::operator=(const CPropVariant& varSrc)
37 {
38 InternalCopy(&varSrc);
39 return *this;
40 }
41 CPropVariant& CPropVariant::operator=(const PROPVARIANT& varSrc)
42 {
43 InternalCopy(&varSrc);
44 return *this;
45 }
47 CPropVariant& CPropVariant::operator=(BSTR bstrSrc)
48 {
49 *this = (LPCOLESTR)bstrSrc;
50 return *this;
51 }
53 CPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc)
54 {
55 InternalClear();
56 vt = VT_BSTR;
57 wReserved1 = 0;
58 bstrVal = ::SysAllocString(lpszSrc);
59 if (bstrVal == NULL && lpszSrc != NULL)
60 {
61 vt = VT_ERROR;
62 scode = E_OUTOFMEMORY;
63 }
64 return *this;
65 }
68 CPropVariant& CPropVariant::operator=(bool bSrc)
69 {
70 if (vt != VT_BOOL)
71 {
72 InternalClear();
73 vt = VT_BOOL;
74 }
75 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
76 return *this;
77 }
79 CPropVariant& CPropVariant::operator=(UInt32 value)
80 {
81 if (vt != VT_UI4)
82 {
83 InternalClear();
84 vt = VT_UI4;
85 }
86 ulVal = value;
87 return *this;
88 }
90 CPropVariant& CPropVariant::operator=(UInt64 value)
91 {
92 if (vt != VT_UI8)
93 {
94 InternalClear();
95 vt = VT_UI8;
96 }
97 uhVal.QuadPart = value;
98 return *this;
99 }
101 CPropVariant& CPropVariant::operator=(const FILETIME &value)
102 {
103 if (vt != VT_FILETIME)
104 {
105 InternalClear();
106 vt = VT_FILETIME;
107 }
108 filetime = value;
109 return *this;
110 }
112 CPropVariant& CPropVariant::operator=(Int32 value)
113 {
114 if (vt != VT_I4)
115 {
116 InternalClear();
117 vt = VT_I4;
118 }
119 lVal = value;
121 return *this;
122 }
124 CPropVariant& CPropVariant::operator=(Byte value)
125 {
126 if (vt != VT_UI1)
127 {
128 InternalClear();
129 vt = VT_UI1;
130 }
131 bVal = value;
132 return *this;
133 }
135 CPropVariant& CPropVariant::operator=(Int16 value)
136 {
137 if (vt != VT_I2)
138 {
139 InternalClear();
140 vt = VT_I2;
141 }
142 iVal = value;
143 return *this;
144 }
146 /*
147 CPropVariant& CPropVariant::operator=(LONG value)
148 {
149 if (vt != VT_I4)
150 {
151 InternalClear();
152 vt = VT_I4;
153 }
154 lVal = value;
155 return *this;
156 }
157 */
159 static HRESULT MyPropVariantClear(PROPVARIANT *propVariant)
160 {
161 switch(propVariant->vt)
162 {
163 case VT_UI1:
164 case VT_I1:
165 case VT_I2:
166 case VT_UI2:
167 case VT_BOOL:
168 case VT_I4:
169 case VT_UI4:
170 case VT_R4:
171 case VT_INT:
172 case VT_UINT:
173 case VT_ERROR:
174 case VT_FILETIME:
175 case VT_UI8:
176 case VT_R8:
177 case VT_CY:
178 case VT_DATE:
179 propVariant->vt = VT_EMPTY;
180 propVariant->wReserved1 = 0;
181 return S_OK;
182 }
183 return ::VariantClear((VARIANTARG *)propVariant);
184 }
186 HRESULT CPropVariant::Clear()
187 {
188 return MyPropVariantClear(this);
189 }
191 HRESULT CPropVariant::Copy(const PROPVARIANT* pSrc)
192 {
193 ::VariantClear((tagVARIANT *)this);
194 switch(pSrc->vt)
195 {
196 case VT_UI1:
197 case VT_I1:
198 case VT_I2:
199 case VT_UI2:
200 case VT_BOOL:
201 case VT_I4:
202 case VT_UI4:
203 case VT_R4:
204 case VT_INT:
205 case VT_UINT:
206 case VT_ERROR:
207 case VT_FILETIME:
208 case VT_UI8:
209 case VT_R8:
210 case VT_CY:
211 case VT_DATE:
212 memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT));
213 return S_OK;
214 }
215 return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)(pSrc));
216 }
219 HRESULT CPropVariant::Attach(PROPVARIANT* pSrc)
220 {
221 HRESULT hr = Clear();
222 if (FAILED(hr))
223 return hr;
224 memcpy(this, pSrc, sizeof(PROPVARIANT));
225 pSrc->vt = VT_EMPTY;
226 return S_OK;
227 }
229 HRESULT CPropVariant::Detach(PROPVARIANT* pDest)
230 {
231 HRESULT hr = MyPropVariantClear(pDest);
232 if (FAILED(hr))
233 return hr;
234 memcpy(pDest, this, sizeof(PROPVARIANT));
235 vt = VT_EMPTY;
236 return S_OK;
237 }
239 HRESULT CPropVariant::InternalClear()
240 {
241 HRESULT hr = Clear();
242 if (FAILED(hr))
243 {
244 vt = VT_ERROR;
245 scode = hr;
246 }
247 return hr;
248 }
250 void CPropVariant::InternalCopy(const PROPVARIANT* pSrc)
251 {
252 HRESULT hr = Copy(pSrc);
253 if (FAILED(hr))
254 {
255 vt = VT_ERROR;
256 scode = hr;
257 }
258 }
260 int CPropVariant::Compare(const CPropVariant &a)
261 {
262 if (vt != a.vt)
263 return 0; // it's mean some bug
264 switch (vt)
265 {
266 case VT_EMPTY:
267 return 0;
269 /*
270 case VT_I1:
271 return MyCompare(cVal, a.cVal);
272 */
273 case VT_UI1:
274 return MyCompare(bVal, a.bVal);
276 case VT_I2:
277 return MyCompare(iVal, a.iVal);
278 case VT_UI2:
279 return MyCompare(uiVal, a.uiVal);
281 case VT_I4:
282 return MyCompare(lVal, a.lVal);
283 /*
284 case VT_INT:
285 return MyCompare(intVal, a.intVal);
286 */
287 case VT_UI4:
288 return MyCompare(ulVal, a.ulVal);
289 /*
290 case VT_UINT:
291 return MyCompare(uintVal, a.uintVal);
292 */
293 case VT_I8:
294 return MyCompare(hVal.QuadPart, a.hVal.QuadPart);
295 case VT_UI8:
296 return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart);
298 case VT_BOOL:
299 return -MyCompare(boolVal, a.boolVal);
301 case VT_FILETIME:
302 return ::CompareFileTime(&filetime, &a.filetime);
303 case VT_BSTR:
304 return 0; // Not implemented
305 // return MyCompare(aPropVarint.cVal);
307 default:
308 return 0;
309 }
310 }
312 }}