1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// Windows/PropVariant.cpp
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h"
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../Common/Defs.h"
6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "PropVariant.h"
8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
9baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NWindows {
10baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NCOM {
11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw()
13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  p->bstrVal = ::SysAllocStringLen(0, numChars);
15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (!p->bstrVal)
16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    p->vt = VT_ERROR;
18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    p->scode = E_OUTOFMEMORY;
19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return E_OUTOFMEMORY;
20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  p->vt = VT_BSTR;
22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw()
26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  UINT len = (UINT)strlen(s);
28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  p->bstrVal = ::SysAllocStringLen(0, len);
29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (!p->bstrVal)
30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    p->vt = VT_ERROR;
32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    p->scode = E_OUTOFMEMORY;
33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return E_OUTOFMEMORY;
34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  p->vt = VT_BSTR;
36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  BSTR dest = p->bstrVal;
37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  for (UINT i = 0; i <= len; i++)
38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    dest[i] = s[i];
39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return S_OK;
40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
42baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant::CPropVariant(const PROPVARIANT &varSrc)
43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  vt = VT_EMPTY;
45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  InternalCopy(&varSrc);
46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
48baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant::CPropVariant(const CPropVariant &varSrc)
49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  vt = VT_EMPTY;
51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  InternalCopy(&varSrc);
52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
54baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant::CPropVariant(BSTR bstrSrc)
55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  vt = VT_EMPTY;
57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  *this = bstrSrc;
58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
60baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant::CPropVariant(LPCOLESTR lpszSrc)
61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  vt = VT_EMPTY;
63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  *this = lpszSrc;
64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
66baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant& CPropVariant::operator=(const CPropVariant &varSrc)
67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  InternalCopy(&varSrc);
69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return *this;
70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
71baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant& CPropVariant::operator=(const PROPVARIANT &varSrc)
72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  InternalCopy(&varSrc);
74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return *this;
75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
77baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant& CPropVariant::operator=(BSTR bstrSrc)
78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  *this = (LPCOLESTR)bstrSrc;
80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return *this;
81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
83baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic const char *kMemException = "out of memory";
84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
85baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc)
86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  InternalClear();
88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  vt = VT_BSTR;
89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  wReserved1 = 0;
90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  bstrVal = ::SysAllocString(lpszSrc);
91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (!bstrVal && lpszSrc)
92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    throw kMemException;
94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    // vt = VT_ERROR;
95baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    // scode = E_OUTOFMEMORY;
96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return *this;
98baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
99baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
100baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant& CPropVariant::operator=(const char *s)
101baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  InternalClear();
103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  vt = VT_BSTR;
104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  wReserved1 = 0;
105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UINT len = (UINT)strlen(s);
106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bstrVal = ::SysAllocStringLen(0, len);
107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (!bstrVal)
108baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
109baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    throw kMemException;
110baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    // vt = VT_ERROR;
111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    // scode = E_OUTOFMEMORY;
112baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
113baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  else
114baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
115baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    for (UINT i = 0; i <= len; i++)
116baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      bstrVal[i] = s[i];
117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
118baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return *this;
119baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
120baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCPropVariant& CPropVariant::operator=(bool bSrc) throw()
122baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
123baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (vt != VT_BOOL)
124baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
125baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    InternalClear();
126baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    vt = VT_BOOL;
127baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
128baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
129baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return *this;
130baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
131baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
132cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyBSTR CPropVariant::AllocBstr(unsigned numChars)
133cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
134cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (vt != VT_EMPTY)
135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    InternalClear();
136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  vt = VT_BSTR;
137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  wReserved1 = 0;
138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  bstrVal = ::SysAllocStringLen(0, numChars);
139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (!bstrVal)
140cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
141cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    throw kMemException;
142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    // vt = VT_ERROR;
143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    // scode = E_OUTOFMEMORY;
144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
145cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return bstrVal;
146cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
148baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define SET_PROP_FUNC(type, id, dest) \
149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  CPropVariant& CPropVariant::operator=(type value) throw() \
150baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  { if (vt != id) { InternalClear(); vt = id; } \
151baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    dest = value; return *this; }
152baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
153baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSET_PROP_FUNC(Byte, VT_UI1, bVal)
154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// SET_PROP_FUNC(Int16, VT_I2, iVal)
155baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSET_PROP_FUNC(Int32, VT_I4, lVal)
156baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSET_PROP_FUNC(UInt32, VT_UI4, ulVal)
157baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSET_PROP_FUNC(UInt64, VT_UI8, uhVal.QuadPart)
158cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySET_PROP_FUNC(Int64, VT_I8, hVal.QuadPart)
159baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSET_PROP_FUNC(const FILETIME &, VT_FILETIME, filetime)
160baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
161cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT PropVariant_Clear(PROPVARIANT *prop) throw()
162baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
163cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  switch (prop->vt)
164baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
165cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    case VT_EMPTY:
166baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI1:
167baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_I1:
168baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_I2:
169baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI2:
170baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_BOOL:
171baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_I4:
172baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI4:
173baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_R4:
174baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_INT:
175baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UINT:
176baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_ERROR:
177baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_FILETIME:
178baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI8:
179baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_R8:
180baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_CY:
181baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_DATE:
182baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      prop->vt = VT_EMPTY;
183baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      prop->wReserved1 = 0;
184cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      prop->wReserved2 = 0;
185cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      prop->wReserved3 = 0;
186cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      prop->uhVal.QuadPart = 0;
187baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return S_OK;
188baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
189baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return ::VariantClear((VARIANTARG *)prop);
190cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // return ::PropVariantClear(prop);
191cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  // PropVariantClear can clear VT_BLOB.
192baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
193baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
194cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CPropVariant::Clear() throw()
195baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
196cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (vt == VT_EMPTY)
197cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return S_OK;
198cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return PropVariant_Clear(this);
199baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
200baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
201cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CPropVariant::Copy(const PROPVARIANT* pSrc) throw()
202baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
203baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  ::VariantClear((tagVARIANT *)this);
204baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  switch(pSrc->vt)
205baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
206baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI1:
207baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_I1:
208baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_I2:
209baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI2:
210baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_BOOL:
211baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_I4:
212baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI4:
213baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_R4:
214baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_INT:
215baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UINT:
216baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_ERROR:
217baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_FILETIME:
218baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI8:
219baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_R8:
220baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_CY:
221baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_DATE:
222baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT));
223baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return S_OK;
224baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
225baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)const_cast<PROPVARIANT *>(pSrc));
226baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
227baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
228baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
229cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CPropVariant::Attach(PROPVARIANT *pSrc) throw()
230baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
231baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  HRESULT hr = Clear();
232baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (FAILED(hr))
233baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return hr;
234baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  memcpy(this, pSrc, sizeof(PROPVARIANT));
235baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  pSrc->vt = VT_EMPTY;
236baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
237baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
238baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
239cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CPropVariant::Detach(PROPVARIANT *pDest) throw()
240baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
241cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (pDest->vt != VT_EMPTY)
242cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
243cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    HRESULT hr = PropVariant_Clear(pDest);
244cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (FAILED(hr))
245cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return hr;
246cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
247baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  memcpy(pDest, this, sizeof(PROPVARIANT));
248baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  vt = VT_EMPTY;
249baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return S_OK;
250baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
251baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
252cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CPropVariant::InternalClear() throw()
253baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
254cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (vt == VT_EMPTY)
255cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    return S_OK;
256baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  HRESULT hr = Clear();
257baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (FAILED(hr))
258baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
259baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    vt = VT_ERROR;
260baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    scode = hr;
261baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
262baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return hr;
263baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
264baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
265baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid CPropVariant::InternalCopy(const PROPVARIANT *pSrc)
266baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
267baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  HRESULT hr = Copy(pSrc);
268baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (FAILED(hr))
269baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
270baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    if (hr == E_OUTOFMEMORY)
271baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      throw kMemException;
272baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    vt = VT_ERROR;
273baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    scode = hr;
274baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
275baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
276baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
277cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint CPropVariant::Compare(const CPropVariant &a) throw()
278baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
279baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (vt != a.vt)
280baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return MyCompare(vt, a.vt);
281baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  switch (vt)
282baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
283baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_EMPTY: return 0;
284baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    // case VT_I1: return MyCompare(cVal, a.cVal);
285baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI1: return MyCompare(bVal, a.bVal);
286baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_I2: return MyCompare(iVal, a.iVal);
287baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI2: return MyCompare(uiVal, a.uiVal);
288baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_I4: return MyCompare(lVal, a.lVal);
289baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI4: return MyCompare(ulVal, a.ulVal);
290baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    // case VT_UINT: return MyCompare(uintVal, a.uintVal);
291baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_I8: return MyCompare(hVal.QuadPart, a.hVal.QuadPart);
292baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_UI8: return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart);
293baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_BOOL: return -MyCompare(boolVal, a.boolVal);
294baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case VT_FILETIME: return ::CompareFileTime(&filetime, &a.filetime);
295cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    case VT_BSTR: return 0; // Not implemented
296baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    default: return 0;
297baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
298baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
299baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
300baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}}
301