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 WINE_NTSTATUS_DECLARED
26#define WINE_NTSTATUS_DECLARED
27typedef LONG NTSTATUS;
28#endif
29
30#ifndef PSSTDAPI
31#ifdef _PROPSYS_
32#define PSSTDAPI STDAPI
33#define PSSTDAPI_(type) STDAPI_(type)
34#else
35#define PSSTDAPI DECLSPEC_IMPORT STDAPI
36#define PSSTDAPI_(type) DECLSPEC_IMPORT STDAPI_(type)
37#endif
38#endif
39
40#ifdef __cplusplus
41extern "C" {
42#endif
43
44enum tagPROPVAR_CHANGE_FLAGS
45{
46 PVCHF_DEFAULT = 0x00000000,
47 PVCHF_NOVALUEPROP = 0x00000001,
48 PVCHF_ALPHABOOL = 0x00000002,
49 PVCHF_NOUSEROVERRIDE = 0x00000004,
50 PVCHF_LOCALBOOL = 0x00000008,
51 PVCHF_NOHEXSTRING = 0x00000010,
52};
53
54typedef int PROPVAR_CHANGE_FLAGS;
55
56enum tagPROPVAR_COMPARE_UNIT
57{
58 PVCU_DEFAULT = 0x00000000,
59 PVCU_SECOND = 0x00000001,
60 PVCU_MINUTE = 0x00000002,
61 PVCU_HOUR = 0x00000003,
62 PVCU_DAY = 0x00000004,
63 PVCU_MONTH = 0x00000005,
64 PVCU_YEAR = 0x00000006,
65};
66
67typedef int PROPVAR_COMPARE_UNIT;
68
69enum tagPROPVAR_COMPARE_FLAGS
70{
71 PVCF_DEFAULT = 0x00000000,
72 PVCF_TREATEMPTYASGREATERTHAN = 0x00000001,
73 PVCF_USESTRCMP = 0x00000002,
74 PVCF_USESTRCMPC = 0x00000004,
75 PVCF_USESTRCMPI = 0x00000008,
76 PVCF_USESTRCMPIC = 0x00000010,
77};
78
79typedef int PROPVAR_COMPARE_FLAGS;
80
81enum tagPSTIME_FLAGS
82{
83 PSTF_UTC = 0x00000000,
84 PSTF_LOCAL = 0x00000001,
85};
86
87typedef int PSTIME_FLAGS;
88
89PSSTDAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc,
90 PROPVAR_CHANGE_FLAGS flags, VARTYPE vt);
91PSSTDAPI InitPropVariantFromGUIDAsString(REFGUID guid, PROPVARIANT *ppropvar);
92PSSTDAPI InitVariantFromFileTime(const FILETIME *ft, VARIANT *var);
93PSSTDAPI InitVariantFromGUIDAsString(REFGUID guid, VARIANT *pvar);
94PSSTDAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *ppropvar);
95PSSTDAPI InitPropVariantFromCLSID(REFCLSID clsid, PROPVARIANT *ppropvar);
96PSSTDAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar);
97PSSTDAPI VariantToGUID(const VARIANT *pvar, GUID *guid);
98PSSTDAPI_(INT) PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2,
99 PROPVAR_COMPARE_UNIT uint, PROPVAR_COMPARE_FLAGS flags);
100PSSTDAPI InitPropVariantFromFileTime(const FILETIME *pftIn, PROPVARIANT *ppropvar);
101PSSTDAPI InitPropVariantFromStringVector(PCWSTR *strs, ULONG count, PROPVARIANT *ppropvar);
102
103PSSTDAPI PropVariantToDouble(REFPROPVARIANT propvarIn, double *ret);
104PSSTDAPI PropVariantToFileTime(REFPROPVARIANT propvar, PSTIME_FLAGS flags, FILETIME *out);
105PSSTDAPI PropVariantToGUID(REFPROPVARIANT ppropvar, GUID *guid);
106PSSTDAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret);
107PSSTDAPI PropVariantToInt32(REFPROPVARIANT propvarIn, LONG *ret);
108PSSTDAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret);
109PSSTDAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret);
110PSSTDAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret);
111PSSTDAPI PropVariantToUInt32Vector(REFPROPVARIANT propvar, ULONG *buffer, ULONG size, ULONG *count);
112PSSTDAPI_(ULONG) PropVariantToUInt32WithDefault(REFPROPVARIANT propvarIn, ULONG uLDefault);
113PSSTDAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret);
114PSSTDAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, WINBOOL *ret);
115PSSTDAPI PropVariantToBSTR(REFPROPVARIANT propvar, BSTR *bstr);
116PSSTDAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb);
117PSSTDAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch);
118PSSTDAPI_(PCWSTR) PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault);
119PSSTDAPI_(PCWSTR) VariantToStringWithDefault(const VARIANT *pvar, LPCWSTR pszDefault);
120PSSTDAPI VariantToString(REFVARIANT var, PWSTR ret, UINT cch);
121
122PSSTDAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret);
123
124PSSTDAPI PropVariantToVariant(const PROPVARIANT *propvar, VARIANT *var);
125PSSTDAPI VariantToPropVariant(const VARIANT* var, PROPVARIANT* propvar);
126
127PSSTDAPI PropVariantGetStringElem(const PROPVARIANT *propvar, ULONG idx, WCHAR **ret);
128
129#ifdef __cplusplus
130
131HRESULT InitPropVariantFromBoolean(WINBOOL fVal, PROPVARIANT *ppropvar);
132HRESULT InitPropVariantFromInt16(SHORT nVal, PROPVARIANT *ppropvar);
133HRESULT InitPropVariantFromUInt16(USHORT uiVal, PROPVARIANT *ppropvar);
134HRESULT InitPropVariantFromInt32(LONG lVal, PROPVARIANT *ppropvar);
135HRESULT InitPropVariantFromUInt32(ULONG ulVal, PROPVARIANT *ppropvar);
136HRESULT InitPropVariantFromInt64(LONGLONG llVal, PROPVARIANT *ppropvar);
137HRESULT InitPropVariantFromUInt64(ULONGLONG ullVal, PROPVARIANT *ppropvar);
138HRESULT InitPropVariantFromDouble(DOUBLE dblVal, PROPVARIANT *ppropvar);
139HRESULT InitPropVariantFromString(PCWSTR psz, PROPVARIANT *ppropvar);
140HRESULT InitPropVariantFromGUIDAsBuffer(REFGUID guid, PROPVARIANT *ppropvar);
141WINBOOL IsPropVariantVector(REFPROPVARIANT propvar);
142WINBOOL IsPropVariantString(REFPROPVARIANT propvar);
143
144#ifndef NO_PROPVAR_INLINES
145
146inline HRESULT InitPropVariantFromBoolean(WINBOOL fVal, PROPVARIANT *ppropvar)
147{
148 ppropvar->vt = VT_BOOL;
149 ppropvar->boolVal = fVal ? VARIANT_TRUE : VARIANT_FALSE;
150 return S_OK;
151}
152
153inline HRESULT InitPropVariantFromInt16(SHORT nVal, PROPVARIANT *ppropvar)
154{
155 ppropvar->vt = VT_I2;
156 ppropvar->iVal = nVal;
157 return S_OK;
158}
159
160inline HRESULT InitPropVariantFromUInt16(USHORT uiVal, PROPVARIANT *ppropvar)
161{
162 ppropvar->vt = VT_UI2;
163 ppropvar->uiVal = uiVal;
164 return S_OK;
165}
166
167inline HRESULT InitPropVariantFromInt32(LONG lVal, PROPVARIANT *ppropvar)
168{
169 ppropvar->vt = VT_I4;
170 ppropvar->lVal = lVal;
171 return S_OK;
172}
173
174inline HRESULT InitPropVariantFromUInt32(ULONG ulVal, PROPVARIANT *ppropvar)
175{
176 ppropvar->vt = VT_UI4;
177 ppropvar->ulVal = ulVal;
178 return S_OK;
179}
180
181inline HRESULT InitPropVariantFromInt64(LONGLONG llVal, PROPVARIANT *ppropvar)
182{
183 ppropvar->vt = VT_I8;
184 ppropvar->hVal.QuadPart = llVal;
185 return S_OK;
186}
187
188inline HRESULT InitPropVariantFromUInt64(ULONGLONG ullVal, PROPVARIANT *ppropvar)
189{
190 ppropvar->vt = VT_UI8;
191 ppropvar->uhVal.QuadPart = ullVal;
192 return S_OK;
193}
194
195inline HRESULT InitPropVariantFromDouble(DOUBLE dblVal, PROPVARIANT *ppropvar)
196{
197 ppropvar->vt = VT_R8;
198 ppropvar->dblVal = dblVal;
199 return S_OK;
200}
201
202inline HRESULT InitPropVariantFromString(PCWSTR psz, PROPVARIANT *ppropvar)
203{
204 HRESULT hres;
205
206 hres = SHStrDupW(psz, &ppropvar->pwszVal);
207 if(SUCCEEDED(hres))
208 ppropvar->vt = VT_LPWSTR;
209 else
210 PropVariantInit(ppropvar);
211
212 return hres;
213}
214
215inline HRESULT InitPropVariantFromGUIDAsBuffer(REFGUID guid, PROPVARIANT *ppropvar)
216{
217#ifdef __cplusplus
218 return InitPropVariantFromBuffer(&guid, sizeof(GUID), ppropvar);
219#else
220 return InitPropVariantFromBuffer(guid, sizeof(GUID), ppropvar);
221#endif
222}
223
224inline WINBOOL IsPropVariantVector(REFPROPVARIANT propvar)
225{
226 return (propvar.vt & (VT_ARRAY | VT_VECTOR));
227}
228
229inline WINBOOL IsPropVariantString(REFPROPVARIANT propvar)
230{
231 return (PropVariantToStringWithDefault(propvar, NULL) != NULL);
232}
233
234#endif /* NO_PROPVAR_INLINES */
235#endif /* __cplusplus */
236
237PSSTDAPI StgSerializePropVariant(const PROPVARIANT *ppropvar, SERIALIZEDPROPERTYVALUE **ppprop, ULONG *pcb);
238PSSTDAPI StgDeserializePropVariant(const SERIALIZEDPROPERTYVALUE *pprop, ULONG cbmax, PROPVARIANT *ppropvar);
239
240#ifdef __cplusplus
241}
242#endif
243
244#endif /* __WINE_PROPVARUTIL_H */