• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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