00001
00002
00003
00004
00005 #include "StdAfx.h"
00006
00007 #include "PropVariant.h"
00008
00009 #include "Defs.h"
00010
00011 namespace NWindows {
00012 namespace NCOM {
00013
00014 CPropVariant::CPropVariant(const PROPVARIANT& varSrc)
00015 {
00016 vt = VT_EMPTY;
00017 InternalCopy(&varSrc);
00018 }
00019
00020 CPropVariant::CPropVariant(const CPropVariant& varSrc)
00021 {
00022 vt = VT_EMPTY;
00023 InternalCopy(&varSrc);
00024 }
00025
00026 CPropVariant::CPropVariant(BSTR bstrSrc)
00027 {
00028 vt = VT_EMPTY;
00029 *this = bstrSrc;
00030 }
00031
00032 CPropVariant::CPropVariant(LPCOLESTR lpszSrc)
00033 {
00034 vt = VT_EMPTY;
00035 *this = lpszSrc;
00036 }
00037
00038 CPropVariant& CPropVariant::operator=(const CPropVariant& varSrc)
00039 {
00040 InternalCopy(&varSrc);
00041 return *this;
00042 }
00043 CPropVariant& CPropVariant::operator=(const PROPVARIANT& varSrc)
00044 {
00045 InternalCopy(&varSrc);
00046 return *this;
00047 }
00048
00049 CPropVariant& CPropVariant::operator=(BSTR bstrSrc)
00050 {
00051 *this = (LPCOLESTR)bstrSrc;
00052 return *this;
00053 }
00054
00055 CPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc)
00056 {
00057 InternalClear();
00058 vt = VT_BSTR;
00059 bstrVal = ::SysAllocString(lpszSrc);
00060 if (bstrVal == NULL && lpszSrc != NULL)
00061 {
00062 vt = VT_ERROR;
00063 scode = E_OUTOFMEMORY;
00064 }
00065 return *this;
00066 }
00067
00068 CPropVariant& CPropVariant::operator=(bool bSrc)
00069 {
00070 if (vt != VT_BOOL)
00071 {
00072 InternalClear();
00073 vt = VT_BOOL;
00074 }
00075 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
00076 return *this;
00077 }
00078
00079 CPropVariant& CPropVariant::operator=(UInt32 value)
00080 {
00081 if (vt != VT_UI4)
00082 {
00083 InternalClear();
00084 vt = VT_UI4;
00085 }
00086 ulVal = value;
00087 return *this;
00088 }
00089
00090 CPropVariant& CPropVariant::operator=(UInt64 value)
00091 {
00092 if (vt != VT_UI8)
00093 {
00094 InternalClear();
00095 vt = VT_UI8;
00096 }
00097 uhVal.QuadPart = value;
00098 return *this;
00099 }
00100
00101 CPropVariant& CPropVariant::operator=(const FILETIME &value)
00102 {
00103 if (vt != VT_FILETIME)
00104 {
00105 InternalClear();
00106 vt = VT_FILETIME;
00107 }
00108 filetime = value;
00109 return *this;
00110 }
00111
00112 CPropVariant& CPropVariant::operator=(Int32 value)
00113 {
00114 if (vt != VT_I4)
00115 {
00116 InternalClear();
00117 vt = VT_I4;
00118 }
00119 lVal = value;
00120
00121 return *this;
00122 }
00123
00124 CPropVariant& CPropVariant::operator=(Byte value)
00125 {
00126 if (vt != VT_UI1)
00127 {
00128 InternalClear();
00129 vt = VT_UI1;
00130 }
00131 bVal = value;
00132 return *this;
00133 }
00134
00135 CPropVariant& CPropVariant::operator=(Int16 value)
00136 {
00137 if (vt != VT_I2)
00138 {
00139 InternalClear();
00140 vt = VT_I2;
00141 }
00142 iVal = value;
00143 return *this;
00144 }
00145
00146 static HRESULT MyPropVariantClear(PROPVARIANT *propVariant)
00147 {
00148 switch(propVariant->vt)
00149 {
00150 case VT_UI1:
00151 case VT_I1:
00152 case VT_I2:
00153 case VT_UI2:
00154 case VT_BOOL:
00155 case VT_I4:
00156 case VT_UI4:
00157 case VT_R4:
00158 case VT_INT:
00159 case VT_UINT:
00160 case VT_ERROR:
00161 case VT_FILETIME:
00162 case VT_UI8:
00163 case VT_R8:
00164 case VT_CY:
00165 case VT_DATE:
00166 propVariant->vt = VT_EMPTY;
00167 return S_OK;
00168 }
00169 return ::VariantClear((VARIANTARG *)propVariant);
00170 }
00171
00172 HRESULT CPropVariant::Clear()
00173 {
00174 return MyPropVariantClear(this);
00175 }
00176
00177 HRESULT CPropVariant::Copy(const PROPVARIANT* pSrc)
00178 {
00179 ::VariantClear((tagVARIANT *)this);
00180 switch(pSrc->vt)
00181 {
00182 case VT_UI1:
00183 case VT_I1:
00184 case VT_I2:
00185 case VT_UI2:
00186 case VT_BOOL:
00187 case VT_I4:
00188 case VT_UI4:
00189 case VT_R4:
00190 case VT_INT:
00191 case VT_UINT:
00192 case VT_ERROR:
00193 case VT_FILETIME:
00194 case VT_UI8:
00195 case VT_R8:
00196 case VT_CY:
00197 case VT_DATE:
00198 memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT));
00199 return S_OK;
00200 }
00201 return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)(pSrc));
00202 }
00203
00204 HRESULT CPropVariant::Attach(PROPVARIANT* pSrc)
00205 {
00206 HRESULT hr = Clear();
00207 if (FAILED(hr))
00208 return hr;
00209 memcpy(this, pSrc, sizeof(PROPVARIANT));
00210 pSrc->vt = VT_EMPTY;
00211 return S_OK;
00212 }
00213
00214 HRESULT CPropVariant::Detach(PROPVARIANT* pDest)
00215 {
00216 HRESULT hr = MyPropVariantClear(pDest);
00217 if (FAILED(hr))
00218 return hr;
00219 memcpy(pDest, this, sizeof(PROPVARIANT));
00220 vt = VT_EMPTY;
00221 return S_OK;
00222 }
00223
00224 HRESULT CPropVariant::InternalClear()
00225 {
00226 HRESULT hr = Clear();
00227 if (FAILED(hr))
00228 {
00229 vt = VT_ERROR;
00230 scode = hr;
00231 }
00232 return hr;
00233 }
00234
00235 void CPropVariant::InternalCopy(const PROPVARIANT* pSrc)
00236 {
00237 HRESULT hr = Copy(pSrc);
00238 if (FAILED(hr))
00239 {
00240 vt = VT_ERROR;
00241 scode = hr;
00242 }
00243 }
00244
00245 int CPropVariant::Compare(const CPropVariant &a)
00246 {
00247 if(vt != a.vt)
00248 return 0;
00249 switch (vt)
00250 {
00251 case VT_EMPTY:
00252 return 0;
00253
00254
00255 case VT_UI1:
00256 return MyCompare(bVal, a.bVal);
00257
00258 case VT_I2:
00259 return MyCompare(iVal, a.iVal);
00260 case VT_UI2:
00261 return MyCompare(uiVal, a.uiVal);
00262
00263 case VT_I4:
00264 return MyCompare(lVal, a.lVal);
00265
00266 case VT_UI4:
00267 return MyCompare(ulVal, a.ulVal);
00268
00269 case VT_I8:
00270 return MyCompare(hVal.QuadPart, a.hVal.QuadPart);
00271 case VT_UI8:
00272 return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart);
00273
00274 case VT_BOOL:
00275 return -MyCompare(boolVal, a.boolVal);
00276
00277 case VT_FILETIME:
00278 return ::CompareFileTime(&filetime, &a.filetime);
00279 case VT_BSTR:
00280 return 0;
00281
00282
00283 default:
00284 return 0;
00285 }
00286 }
00287
00288 }}