Upload 2.0.2
[physicsfs] / lzma / CPP / Windows / PropVariant.cpp
1 // Windows/PropVariant.cpp
2
3 #include "StdAfx.h"
4
5 #include "PropVariant.h"
6
7 #include "../Common/Defs.h"
8
9 namespace NWindows {
10 namespace NCOM {
11
12 CPropVariant::CPropVariant(const PROPVARIANT& varSrc)
13 {
14   vt = VT_EMPTY;
15   InternalCopy(&varSrc);
16 }
17
18 CPropVariant::CPropVariant(const CPropVariant& varSrc)
19 {
20   vt = VT_EMPTY;
21   InternalCopy(&varSrc);
22 }
23
24 CPropVariant::CPropVariant(BSTR bstrSrc)
25 {
26   vt = VT_EMPTY;
27   *this = bstrSrc;
28 }
29
30 CPropVariant::CPropVariant(LPCOLESTR lpszSrc)
31 {
32   vt = VT_EMPTY;
33   *this = lpszSrc;
34 }
35
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 }
46
47 CPropVariant& CPropVariant::operator=(BSTR bstrSrc)
48 {
49   *this = (LPCOLESTR)bstrSrc;
50   return *this;
51 }
52
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 }
66
67
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 }
78
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 }
89
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 }
100
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 }
111
112 CPropVariant& CPropVariant::operator=(Int32 value)
113 {
114   if (vt != VT_I4)
115   {
116     InternalClear();
117     vt = VT_I4;
118   }
119   lVal = value;
120   
121   return *this;
122 }
123
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 }
134
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 }
145
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 */
158
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 }
185
186 HRESULT CPropVariant::Clear() 
187
188   return MyPropVariantClear(this);
189 }
190
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 }
217
218
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 }
228
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 }
238
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 }
249
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 }
259
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;
268     
269     /*
270     case VT_I1:
271       return MyCompare(cVal, a.cVal);
272     */
273     case VT_UI1:
274       return MyCompare(bVal, a.bVal);
275
276     case VT_I2:
277       return MyCompare(iVal, a.iVal);
278     case VT_UI2:
279       return MyCompare(uiVal, a.uiVal);
280     
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);
297
298     case VT_BOOL:    
299       return -MyCompare(boolVal, a.boolVal);
300
301     case VT_FILETIME:
302       return ::CompareFileTime(&filetime, &a.filetime);
303     case VT_BSTR:
304       return 0; // Not implemented 
305       // return MyCompare(aPropVarint.cVal);
306
307     default:
308       return 0;
309   }
310 }
311
312 }}