1 // Windows/PropVariant.h
2
3 #ifndef __WINDOWS_PROP_VARIANT_H
4 #define __WINDOWS_PROP_VARIANT_H
5
6 #include "../Common/MyTypes.h"
7 #include "../Common/MyWindows.h"
8 #include "../Common/MyString.h"
9
10 namespace NWindows {
11 namespace NCOM {
12
13 BSTR AllocBstrFromAscii(const char *s) throw();
14
15 HRESULT PropVariant_Clear(PROPVARIANT *p) throw();
16
17 HRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw();
18 HRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw();
19
PropVarEm_Set_UInt32(PROPVARIANT * p,UInt32 v)20 inline void PropVarEm_Set_UInt32(PROPVARIANT *p, UInt32 v) throw()
21 {
22 p->vt = VT_UI4;
23 p->ulVal = v;
24 }
25
PropVarEm_Set_UInt64(PROPVARIANT * p,UInt64 v)26 inline void PropVarEm_Set_UInt64(PROPVARIANT *p, UInt64 v) throw()
27 {
28 p->vt = VT_UI8;
29 p->uhVal.QuadPart = v;
30 }
31
PropVarEm_Set_FileTime64_Prec(PROPVARIANT * p,UInt64 v,unsigned prec)32 inline void PropVarEm_Set_FileTime64_Prec(PROPVARIANT *p, UInt64 v, unsigned prec) throw()
33 {
34 p->vt = VT_FILETIME;
35 p->filetime.dwLowDateTime = (DWORD)v;
36 p->filetime.dwHighDateTime = (DWORD)(v >> 32);
37 p->wReserved1 = (WORD)prec;
38 p->wReserved2 = 0;
39 p->wReserved3 = 0;
40 }
41
PropVarEm_Set_Bool(PROPVARIANT * p,bool b)42 inline void PropVarEm_Set_Bool(PROPVARIANT *p, bool b) throw()
43 {
44 p->vt = VT_BOOL;
45 p->boolVal = (b ? VARIANT_TRUE : VARIANT_FALSE);
46 }
47
48
49 class CPropVariant : public tagPROPVARIANT
50 {
51 // ---------- forbidden functions ----------
52 CPropVariant(const char *s);
53 // CPropVariant(const UString &s);
54 #ifdef DEBUG_FSTRING_INHERITS_ASTRING
55 CPropVariant(const FString &s);
56 CPropVariant& operator=(const FString &s);
57 #endif
58
59 public:
CPropVariant()60 CPropVariant()
61 {
62 vt = VT_EMPTY;
63 wReserved1 = 0;
64 // wReserved2 = 0;
65 // wReserved3 = 0;
66 // uhVal.QuadPart = 0;
67 bstrVal = 0;
68 }
69
70
Set_FtPrec(unsigned prec)71 void Set_FtPrec(unsigned prec)
72 {
73 wReserved1 = (WORD)prec;
74 wReserved2 = 0;
75 wReserved3 = 0;
76 }
77
SetAsTimeFrom_FT_Prec(const FILETIME & ft,unsigned prec)78 void SetAsTimeFrom_FT_Prec(const FILETIME &ft, unsigned prec)
79 {
80 operator=(ft);
81 Set_FtPrec(prec);
82 }
83
SetAsTimeFrom_Ft64_Prec(UInt64 v,unsigned prec)84 void SetAsTimeFrom_Ft64_Prec(UInt64 v, unsigned prec)
85 {
86 FILETIME ft;
87 ft.dwLowDateTime = (DWORD)(UInt32)v;
88 ft.dwHighDateTime = (DWORD)(UInt32)(v >> 32);
89 operator=(ft);
90 Set_FtPrec(prec);
91 }
92
SetAsTimeFrom_FT_Prec_Ns100(const FILETIME & ft,unsigned prec,unsigned ns100)93 void SetAsTimeFrom_FT_Prec_Ns100(const FILETIME &ft, unsigned prec, unsigned ns100)
94 {
95 operator=(ft);
96 wReserved1 = (WORD)prec;
97 wReserved2 = (WORD)ns100;
98 wReserved3 = 0;
99 }
100
Get_Ns100()101 unsigned Get_Ns100() const
102 {
103 const unsigned prec = wReserved1;
104 const unsigned ns100 = wReserved2;
105 if (prec == 0
106 && prec <= k_PropVar_TimePrec_1ns
107 && ns100 < 100
108 && wReserved3 == 0)
109 return ns100;
110 return 0;
111 }
112
113 ~CPropVariant();
114 CPropVariant(const PROPVARIANT &varSrc);
115 CPropVariant(const CPropVariant &varSrc);
116 CPropVariant(BSTR bstrSrc);
117 CPropVariant(LPCOLESTR lpszSrc);
CPropVariant(bool bSrc)118 CPropVariant(bool bSrc) { vt = VT_BOOL; wReserved1 = 0; boolVal = (bSrc ? VARIANT_TRUE : VARIANT_FALSE); }
CPropVariant(Byte value)119 CPropVariant(Byte value) { vt = VT_UI1; wReserved1 = 0; bVal = value; }
120
121 private:
122 CPropVariant(UInt16 value); // { vt = VT_UI2; wReserved1 = 0; uiVal = value; }
123 CPropVariant(Int16 value); // { vt = VT_I2; wReserved1 = 0; iVal = value; }
124 CPropVariant(Int32 value); // { vt = VT_I4; wReserved1 = 0; lVal = value; }
125 CPropVariant(Int64 value); // { vt = VT_I8; wReserved1 = 0; hVal.QuadPart = value; }
126
127 public:
CPropVariant(UInt32 value)128 CPropVariant(UInt32 value) { vt = VT_UI4; wReserved1 = 0; ulVal = value; }
CPropVariant(UInt64 value)129 CPropVariant(UInt64 value) { vt = VT_UI8; wReserved1 = 0; uhVal.QuadPart = value; }
CPropVariant(const FILETIME & value)130 CPropVariant(const FILETIME &value) { vt = VT_FILETIME; wReserved1 = 0; filetime = value; }
131
132 CPropVariant& operator=(const CPropVariant &varSrc);
133 CPropVariant& operator=(const PROPVARIANT &varSrc);
134 CPropVariant& operator=(BSTR bstrSrc);
135 CPropVariant& operator=(LPCOLESTR lpszSrc);
136 CPropVariant& operator=(const UString &s);
137 CPropVariant& operator=(const UString2 &s);
138 CPropVariant& operator=(const char *s);
139 CPropVariant& operator=(const AString &s)
140 { return (*this)=(const char *)s; }
141
142 CPropVariant& operator=(bool bSrc) throw();
143 CPropVariant& operator=(Byte value) throw();
144
145 private:
146 CPropVariant& operator=(Int16 value) throw();
147 CPropVariant& operator=(UInt16 value) throw();
148 CPropVariant& operator=(Int32 value) throw();
149 CPropVariant& operator=(Int64 value) throw();
150
151 public:
152 CPropVariant& operator=(UInt32 value) throw();
153 CPropVariant& operator=(UInt64 value) throw();
154 CPropVariant& operator=(const FILETIME &value) throw();
155
156 void Set_Int32(Int32 value) throw();
157 void Set_Int64(Int64 value) throw();
158
159 BSTR AllocBstr(unsigned numChars);
160
161 HRESULT Clear() throw();
162 HRESULT Copy(const PROPVARIANT *pSrc) throw();
163 HRESULT Attach(PROPVARIANT *pSrc) throw();
164 HRESULT Detach(PROPVARIANT *pDest) throw();
165
166 HRESULT InternalClear() throw();
167 void InternalCopy(const PROPVARIANT *pSrc);
168 int Compare(const CPropVariant &a) throw();
169 };
170
171 }}
172
173 #endif
174