1 /*
2 * Copyright 2008 James Hawkins for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #ifndef __WINE_PROPVARUTIL_H
20 #define __WINE_PROPVARUTIL_H
21
22 #include <shtypes.h>
23 #include <shlwapi.h>
24
25 #ifndef PSSTDAPI
26 #ifdef _PROPSYS_
27 #define PSSTDAPI STDAPI
28 #define PSSTDAPI_(type) STDAPI_(type)
29 #else
30 #define PSSTDAPI DECLSPEC_IMPORT STDAPI
31 #define PSSTDAPI_(type) DECLSPEC_IMPORT STDAPI_(type)
32 #endif
33 #endif
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 enum tagPROPVAR_CHANGE_FLAGS
40 {
41 PVCHF_DEFAULT = 0x00000000,
42 PVCHF_NOVALUEPROP = 0x00000001,
43 PVCHF_ALPHABOOL = 0x00000002,
44 PVCHF_NOUSEROVERRIDE = 0x00000004,
45 PVCHF_LOCALBOOL = 0x00000008,
46 PVCHF_NOHEXSTRING = 0x00000010,
47 };
48
49 typedef int PROPVAR_CHANGE_FLAGS;
50
51 enum tagPROPVAR_COMPARE_UNIT
52 {
53 PVCU_DEFAULT = 0x00000000,
54 PVCU_SECOND = 0x00000001,
55 PVCU_MINUTE = 0x00000002,
56 PVCU_HOUR = 0x00000003,
57 PVCU_DAY = 0x00000004,
58 PVCU_MONTH = 0x00000005,
59 PVCU_YEAR = 0x00000006,
60 };
61
62 typedef int PROPVAR_COMPARE_UNIT;
63
64 enum tagPROPVAR_COMPARE_FLAGS
65 {
66 PVCF_DEFAULT = 0x00000000,
67 PVCF_TREATEMPTYASGREATERTHAN = 0x00000001,
68 PVCF_USESTRCMP = 0x00000002,
69 PVCF_USESTRCMPC = 0x00000004,
70 PVCF_USESTRCMPI = 0x00000008,
71 PVCF_USESTRCMPIC = 0x00000010,
72 };
73
74 typedef int PROPVAR_COMPARE_FLAGS;
75
76 PSSTDAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc,
77 PROPVAR_CHANGE_FLAGS flags, VARTYPE vt);
78 PSSTDAPI InitPropVariantFromGUIDAsString(REFGUID guid, PROPVARIANT *ppropvar);
79 PSSTDAPI InitVariantFromFileTime(const FILETIME *ft, VARIANT *var);
80 PSSTDAPI InitVariantFromGUIDAsString(REFGUID guid, VARIANT *pvar);
81 PSSTDAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *ppropvar);
82 PSSTDAPI InitPropVariantFromCLSID(REFCLSID clsid, PROPVARIANT *ppropvar);
83 PSSTDAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar);
84 PSSTDAPI PropVariantToGUID(const PROPVARIANT *ppropvar, GUID *guid);
85 PSSTDAPI VariantToGUID(const VARIANT *pvar, GUID *guid);
86 PSSTDAPI_(INT) PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2,
87 PROPVAR_COMPARE_UNIT uint, PROPVAR_COMPARE_FLAGS flags);
88 PSSTDAPI InitPropVariantFromFileTime(const FILETIME *pftIn, PROPVARIANT *ppropvar);
89 PSSTDAPI InitPropVariantFromStringVector(PCWSTR *strs, ULONG count, PROPVARIANT *ppropvar);
90
91 PSSTDAPI PropVariantToDouble(REFPROPVARIANT propvarIn, double *ret);
92 PSSTDAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret);
93 PSSTDAPI PropVariantToInt32(REFPROPVARIANT propvarIn, LONG *ret);
94 PSSTDAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret);
95 PSSTDAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret);
96 PSSTDAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret);
97 PSSTDAPI_(ULONG) PropVariantToUInt32WithDefault(REFPROPVARIANT propvarIn, ULONG uLDefault);
98 PSSTDAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret);
99 PSSTDAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret);
100 PSSTDAPI PropVariantToBSTR(REFPROPVARIANT propvar, BSTR *bstr);
101 PSSTDAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb);
102 PSSTDAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch);
103 PSSTDAPI_(PCWSTR) PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault);
104 PSSTDAPI_(PCWSTR) VariantToStringWithDefault(const VARIANT *pvar, LPCWSTR pszDefault);
105 PSSTDAPI VariantToString(REFVARIANT var, PWSTR ret, UINT cch);
106
107 PSSTDAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret);
108
109 PSSTDAPI PropVariantToVariant(const PROPVARIANT *propvar, VARIANT *var);
110 PSSTDAPI VariantToPropVariant(const VARIANT* var, PROPVARIANT* propvar);
111
112 #ifdef __cplusplus
113
114 HRESULT InitPropVariantFromBoolean(BOOL fVal, PROPVARIANT *ppropvar);
115 HRESULT InitPropVariantFromInt16(SHORT nVal, PROPVARIANT *ppropvar);
116 HRESULT InitPropVariantFromUInt16(USHORT uiVal, PROPVARIANT *ppropvar);
117 HRESULT InitPropVariantFromInt32(LONG lVal, PROPVARIANT *ppropvar);
118 HRESULT InitPropVariantFromUInt32(ULONG ulVal, PROPVARIANT *ppropvar);
119 HRESULT InitPropVariantFromInt64(LONGLONG llVal, PROPVARIANT *ppropvar);
120 HRESULT InitPropVariantFromUInt64(ULONGLONG ullVal, PROPVARIANT *ppropvar);
121 HRESULT InitPropVariantFromDouble(DOUBLE dblVal, PROPVARIANT *ppropvar);
122 HRESULT InitPropVariantFromString(PCWSTR psz, PROPVARIANT *ppropvar);
123 HRESULT InitPropVariantFromGUIDAsBuffer(REFGUID guid, PROPVARIANT *ppropvar);
124 BOOL IsPropVariantVector(REFPROPVARIANT propvar);
125 BOOL IsPropVariantString(REFPROPVARIANT propvar);
126
127 #ifndef NO_PROPVAR_INLINES
128
InitPropVariantFromBoolean(BOOL fVal,PROPVARIANT * ppropvar)129 inline HRESULT InitPropVariantFromBoolean(BOOL fVal, PROPVARIANT *ppropvar)
130 {
131 ppropvar->vt = VT_BOOL;
132 ppropvar->boolVal = fVal ? VARIANT_TRUE : VARIANT_FALSE;
133 return S_OK;
134 }
135
InitPropVariantFromInt16(SHORT nVal,PROPVARIANT * ppropvar)136 inline HRESULT InitPropVariantFromInt16(SHORT nVal, PROPVARIANT *ppropvar)
137 {
138 ppropvar->vt = VT_I2;
139 ppropvar->iVal = nVal;
140 return S_OK;
141 }
142
InitPropVariantFromUInt16(USHORT uiVal,PROPVARIANT * ppropvar)143 inline HRESULT InitPropVariantFromUInt16(USHORT uiVal, PROPVARIANT *ppropvar)
144 {
145 ppropvar->vt = VT_UI2;
146 ppropvar->uiVal = uiVal;
147 return S_OK;
148 }
149
InitPropVariantFromInt32(LONG lVal,PROPVARIANT * ppropvar)150 inline HRESULT InitPropVariantFromInt32(LONG lVal, PROPVARIANT *ppropvar)
151 {
152 ppropvar->vt = VT_I4;
153 ppropvar->lVal = lVal;
154 return S_OK;
155 }
156
InitPropVariantFromUInt32(ULONG ulVal,PROPVARIANT * ppropvar)157 inline HRESULT InitPropVariantFromUInt32(ULONG ulVal, PROPVARIANT *ppropvar)
158 {
159 ppropvar->vt = VT_UI4;
160 ppropvar->ulVal = ulVal;
161 return S_OK;
162 }
163
InitPropVariantFromInt64(LONGLONG llVal,PROPVARIANT * ppropvar)164 inline HRESULT InitPropVariantFromInt64(LONGLONG llVal, PROPVARIANT *ppropvar)
165 {
166 ppropvar->vt = VT_I8;
167 ppropvar->hVal.QuadPart = llVal;
168 return S_OK;
169 }
170
InitPropVariantFromUInt64(ULONGLONG ullVal,PROPVARIANT * ppropvar)171 inline HRESULT InitPropVariantFromUInt64(ULONGLONG ullVal, PROPVARIANT *ppropvar)
172 {
173 ppropvar->vt = VT_UI8;
174 ppropvar->uhVal.QuadPart = ullVal;
175 return S_OK;
176 }
177
InitPropVariantFromDouble(DOUBLE dblVal,PROPVARIANT * ppropvar)178 inline HRESULT InitPropVariantFromDouble(DOUBLE dblVal, PROPVARIANT *ppropvar)
179 {
180 ppropvar->vt = VT_R8;
181 ppropvar->dblVal = dblVal;
182 return S_OK;
183 }
184
InitPropVariantFromString(PCWSTR psz,PROPVARIANT * ppropvar)185 inline HRESULT InitPropVariantFromString(PCWSTR psz, PROPVARIANT *ppropvar)
186 {
187 HRESULT hres;
188
189 hres = SHStrDupW(psz, &ppropvar->pwszVal);
190 if(SUCCEEDED(hres))
191 ppropvar->vt = VT_LPWSTR;
192 else
193 PropVariantInit(ppropvar);
194
195 return hres;
196 }
197
InitPropVariantFromGUIDAsBuffer(REFGUID guid,PROPVARIANT * ppropvar)198 inline HRESULT InitPropVariantFromGUIDAsBuffer(REFGUID guid, PROPVARIANT *ppropvar)
199 {
200 return InitPropVariantFromBuffer(&guid, sizeof(GUID), ppropvar);
201 }
202
IsPropVariantVector(REFPROPVARIANT propvar)203 inline BOOL IsPropVariantVector(REFPROPVARIANT propvar)
204 {
205 return (propvar.vt & (VT_ARRAY | VT_VECTOR));
206 }
207
IsPropVariantString(REFPROPVARIANT propvar)208 inline BOOL IsPropVariantString(REFPROPVARIANT propvar)
209 {
210 return (PropVariantToStringWithDefault(propvar, NULL) != NULL);
211 }
212
213 #endif /* NO_PROPVAR_INLINES */
214 #endif /* __cplusplus */
215
216 PSSTDAPI StgSerializePropVariant(const PROPVARIANT *ppropvar, SERIALIZEDPROPERTYVALUE **ppprop, ULONG *pcb);
217 PSSTDAPI StgDeserializePropVariant(const SERIALIZEDPROPERTYVALUE *pprop, ULONG cbmax, PROPVARIANT *ppropvar);
218
219 #ifdef __cplusplus
220 }
221 #endif
222
223 #endif /* __WINE_PROPVARUTIL_H */
224