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