// Windows/PropVariant.h #ifndef ZIP7_INC_WINDOWS_PROP_VARIANT_H #define ZIP7_INC_WINDOWS_PROP_VARIANT_H #include "../Common/MyTypes.h" #include "../Common/MyWindows.h" #include "../Common/MyString.h" namespace NWindows { namespace NCOM { BSTR AllocBstrFromAscii(const char *s) throw(); HRESULT PropVariant_Clear(PROPVARIANT *p) throw(); HRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw(); HRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw(); inline void PropVarEm_Set_UInt32(PROPVARIANT *p, UInt32 v) throw() { p->vt = VT_UI4; p->ulVal = v; } inline void PropVarEm_Set_UInt64(PROPVARIANT *p, UInt64 v) throw() { p->vt = VT_UI8; p->uhVal.QuadPart = v; } inline void PropVarEm_Set_FileTime64_Prec(PROPVARIANT *p, UInt64 v, unsigned prec) throw() { p->vt = VT_FILETIME; p->filetime.dwLowDateTime = (DWORD)v; p->filetime.dwHighDateTime = (DWORD)(v >> 32); p->wReserved1 = (WORD)prec; p->wReserved2 = 0; p->wReserved3 = 0; } inline void PropVarEm_Set_Bool(PROPVARIANT *p, bool b) throw() { p->vt = VT_BOOL; p->boolVal = (b ? VARIANT_TRUE : VARIANT_FALSE); } class CPropVariant : public tagPROPVARIANT { // ---------- forbidden functions ---------- CPropVariant(const char *s); // CPropVariant(const UString &s); #ifdef DEBUG_FSTRING_INHERITS_ASTRING CPropVariant(const FString &s); CPropVariant& operator=(const FString &s); #endif public: CPropVariant() { vt = VT_EMPTY; wReserved1 = 0; // wReserved2 = 0; // wReserved3 = 0; // uhVal.QuadPart = 0; bstrVal = NULL; } void Set_FtPrec(unsigned prec) { wReserved1 = (WORD)prec; wReserved2 = 0; wReserved3 = 0; } void SetAsTimeFrom_FT_Prec(const FILETIME &ft, unsigned prec) { operator=(ft); Set_FtPrec(prec); } void SetAsTimeFrom_Ft64_Prec(UInt64 v, unsigned prec) { FILETIME ft; ft.dwLowDateTime = (DWORD)(UInt32)v; ft.dwHighDateTime = (DWORD)(UInt32)(v >> 32); operator=(ft); Set_FtPrec(prec); } void SetAsTimeFrom_FT_Prec_Ns100(const FILETIME &ft, unsigned prec, unsigned ns100) { operator=(ft); wReserved1 = (WORD)prec; wReserved2 = (WORD)ns100; wReserved3 = 0; } unsigned Get_Ns100() const { const unsigned prec = wReserved1; const unsigned ns100 = wReserved2; if (prec == 0 && prec <= k_PropVar_TimePrec_1ns && ns100 < 100 && wReserved3 == 0) return ns100; return 0; } ~CPropVariant() throw(); CPropVariant(const PROPVARIANT &varSrc); CPropVariant(const CPropVariant &varSrc); CPropVariant(BSTR bstrSrc); CPropVariant(LPCOLESTR lpszSrc); CPropVariant(bool bSrc) { vt = VT_BOOL; wReserved1 = 0; boolVal = (bSrc ? VARIANT_TRUE : VARIANT_FALSE); } CPropVariant(Byte value) { vt = VT_UI1; wReserved1 = 0; bVal = value; } private: CPropVariant(UInt16 value); // { vt = VT_UI2; wReserved1 = 0; uiVal = value; } CPropVariant(Int16 value); // { vt = VT_I2; wReserved1 = 0; iVal = value; } CPropVariant(Int32 value); // { vt = VT_I4; wReserved1 = 0; lVal = value; } CPropVariant(Int64 value); // { vt = VT_I8; wReserved1 = 0; hVal.QuadPart = value; } public: CPropVariant(UInt32 value) { vt = VT_UI4; wReserved1 = 0; ulVal = value; } CPropVariant(UInt64 value) { vt = VT_UI8; wReserved1 = 0; uhVal.QuadPart = value; } CPropVariant(const FILETIME &value) { vt = VT_FILETIME; wReserved1 = 0; filetime = value; } CPropVariant& operator=(const CPropVariant &varSrc); CPropVariant& operator=(const PROPVARIANT &varSrc); CPropVariant& operator=(BSTR bstrSrc); CPropVariant& operator=(LPCOLESTR lpszSrc); CPropVariant& operator=(const UString &s); CPropVariant& operator=(const UString2 &s); CPropVariant& operator=(const char *s); CPropVariant& operator=(const AString &s) { return (*this)=(const char *)s; } CPropVariant& operator=(bool bSrc) throw(); CPropVariant& operator=(Byte value) throw(); private: CPropVariant& operator=(Int16 value) throw(); CPropVariant& operator=(UInt16 value) throw(); CPropVariant& operator=(Int32 value) throw(); CPropVariant& operator=(Int64 value) throw(); public: CPropVariant& operator=(UInt32 value) throw(); CPropVariant& operator=(UInt64 value) throw(); CPropVariant& operator=(const FILETIME &value) throw(); void Set_Int32(Int32 value) throw(); void Set_Int64(Int64 value) throw(); BSTR AllocBstr(unsigned numChars); HRESULT Clear() throw(); HRESULT Copy(const PROPVARIANT *pSrc) throw(); HRESULT Attach(PROPVARIANT *pSrc) throw(); HRESULT Detach(PROPVARIANT *pDest) throw(); HRESULT InternalClear() throw(); void InternalCopy(const PROPVARIANT *pSrc); int Compare(const CPropVariant &a) throw(); }; }} #endif