| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- // Windows/PropVariant.cpp
- #include "StdAfx.h"
- #include "PropVariant.h"
- #include "../Common/Defs.h"
- namespace NWindows {
- namespace NCOM {
- CPropVariant::CPropVariant(const PROPVARIANT& varSrc)
- {
- vt = VT_EMPTY;
- InternalCopy(&varSrc);
- }
- CPropVariant::CPropVariant(const CPropVariant& varSrc)
- {
- vt = VT_EMPTY;
- InternalCopy(&varSrc);
- }
- CPropVariant::CPropVariant(BSTR bstrSrc)
- {
- vt = VT_EMPTY;
- *this = bstrSrc;
- }
- CPropVariant::CPropVariant(LPCOLESTR lpszSrc)
- {
- vt = VT_EMPTY;
- *this = lpszSrc;
- }
- CPropVariant& CPropVariant::operator=(const CPropVariant& varSrc)
- {
- InternalCopy(&varSrc);
- return *this;
- }
- CPropVariant& CPropVariant::operator=(const PROPVARIANT& varSrc)
- {
- InternalCopy(&varSrc);
- return *this;
- }
- CPropVariant& CPropVariant::operator=(BSTR bstrSrc)
- {
- *this = (LPCOLESTR)bstrSrc;
- return *this;
- }
- CPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc)
- {
- InternalClear();
- vt = VT_BSTR;
- wReserved1 = 0;
- bstrVal = ::SysAllocString(lpszSrc);
- if (bstrVal == NULL && lpszSrc != NULL)
- {
- vt = VT_ERROR;
- scode = E_OUTOFMEMORY;
- }
- return *this;
- }
- CPropVariant& CPropVariant::operator=(bool bSrc)
- {
- if (vt != VT_BOOL)
- {
- InternalClear();
- vt = VT_BOOL;
- }
- boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
- return *this;
- }
- CPropVariant& CPropVariant::operator=(UInt32 value)
- {
- if (vt != VT_UI4)
- {
- InternalClear();
- vt = VT_UI4;
- }
- ulVal = value;
- return *this;
- }
- CPropVariant& CPropVariant::operator=(UInt64 value)
- {
- if (vt != VT_UI8)
- {
- InternalClear();
- vt = VT_UI8;
- }
- uhVal.QuadPart = value;
- return *this;
- }
- CPropVariant& CPropVariant::operator=(const FILETIME &value)
- {
- if (vt != VT_FILETIME)
- {
- InternalClear();
- vt = VT_FILETIME;
- }
- filetime = value;
- return *this;
- }
- CPropVariant& CPropVariant::operator=(Int32 value)
- {
- if (vt != VT_I4)
- {
- InternalClear();
- vt = VT_I4;
- }
- lVal = value;
-
- return *this;
- }
- CPropVariant& CPropVariant::operator=(Byte value)
- {
- if (vt != VT_UI1)
- {
- InternalClear();
- vt = VT_UI1;
- }
- bVal = value;
- return *this;
- }
- CPropVariant& CPropVariant::operator=(Int16 value)
- {
- if (vt != VT_I2)
- {
- InternalClear();
- vt = VT_I2;
- }
- iVal = value;
- return *this;
- }
- /*
- CPropVariant& CPropVariant::operator=(LONG value)
- {
- if (vt != VT_I4)
- {
- InternalClear();
- vt = VT_I4;
- }
- lVal = value;
- return *this;
- }
- */
- static HRESULT MyPropVariantClear(PROPVARIANT *propVariant)
- {
- switch(propVariant->vt)
- {
- case VT_UI1:
- case VT_I1:
- case VT_I2:
- case VT_UI2:
- case VT_BOOL:
- case VT_I4:
- case VT_UI4:
- case VT_R4:
- case VT_INT:
- case VT_UINT:
- case VT_ERROR:
- case VT_FILETIME:
- case VT_UI8:
- case VT_R8:
- case VT_CY:
- case VT_DATE:
- propVariant->vt = VT_EMPTY;
- propVariant->wReserved1 = 0;
- return S_OK;
- }
- return ::VariantClear((VARIANTARG *)propVariant);
- }
- HRESULT CPropVariant::Clear()
- {
- return MyPropVariantClear(this);
- }
- HRESULT CPropVariant::Copy(const PROPVARIANT* pSrc)
- {
- ::VariantClear((tagVARIANT *)this);
- switch(pSrc->vt)
- {
- case VT_UI1:
- case VT_I1:
- case VT_I2:
- case VT_UI2:
- case VT_BOOL:
- case VT_I4:
- case VT_UI4:
- case VT_R4:
- case VT_INT:
- case VT_UINT:
- case VT_ERROR:
- case VT_FILETIME:
- case VT_UI8:
- case VT_R8:
- case VT_CY:
- case VT_DATE:
- memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT));
- return S_OK;
- }
- return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)(pSrc));
- }
- HRESULT CPropVariant::Attach(PROPVARIANT* pSrc)
- {
- HRESULT hr = Clear();
- if (FAILED(hr))
- return hr;
- memcpy(this, pSrc, sizeof(PROPVARIANT));
- pSrc->vt = VT_EMPTY;
- return S_OK;
- }
- HRESULT CPropVariant::Detach(PROPVARIANT* pDest)
- {
- HRESULT hr = MyPropVariantClear(pDest);
- if (FAILED(hr))
- return hr;
- memcpy(pDest, this, sizeof(PROPVARIANT));
- vt = VT_EMPTY;
- return S_OK;
- }
- HRESULT CPropVariant::InternalClear()
- {
- HRESULT hr = Clear();
- if (FAILED(hr))
- {
- vt = VT_ERROR;
- scode = hr;
- }
- return hr;
- }
- void CPropVariant::InternalCopy(const PROPVARIANT* pSrc)
- {
- HRESULT hr = Copy(pSrc);
- if (FAILED(hr))
- {
- vt = VT_ERROR;
- scode = hr;
- }
- }
- int CPropVariant::Compare(const CPropVariant &a)
- {
- if(vt != a.vt)
- return 0; // it's mean some bug
- switch (vt)
- {
- case VT_EMPTY:
- return 0;
-
- /*
- case VT_I1:
- return MyCompare(cVal, a.cVal);
- */
- case VT_UI1:
- return MyCompare(bVal, a.bVal);
- case VT_I2:
- return MyCompare(iVal, a.iVal);
- case VT_UI2:
- return MyCompare(uiVal, a.uiVal);
-
- case VT_I4:
- return MyCompare(lVal, a.lVal);
- /*
- case VT_INT:
- return MyCompare(intVal, a.intVal);
- */
- case VT_UI4:
- return MyCompare(ulVal, a.ulVal);
- /*
- case VT_UINT:
- return MyCompare(uintVal, a.uintVal);
- */
- case VT_I8:
- return MyCompare(hVal.QuadPart, a.hVal.QuadPart);
- case VT_UI8:
- return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart);
- case VT_BOOL:
- return -MyCompare(boolVal, a.boolVal);
- case VT_FILETIME:
- return ::CompareFileTime(&filetime, &a.filetime);
- case VT_BSTR:
- return 0; // Not implemented
- // return MyCompare(aPropVarint.cVal);
- default:
- return 0;
- }
- }
- }}
|