master
  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
 81PSSTDAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc,
 82                                     PROPVAR_CHANGE_FLAGS flags, VARTYPE vt);
 83PSSTDAPI InitPropVariantFromGUIDAsString(REFGUID guid, PROPVARIANT *ppropvar);
 84PSSTDAPI InitVariantFromFileTime(const FILETIME *ft, VARIANT *var);
 85PSSTDAPI InitVariantFromGUIDAsString(REFGUID guid, VARIANT *pvar);
 86PSSTDAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *ppropvar);
 87PSSTDAPI InitPropVariantFromCLSID(REFCLSID clsid, PROPVARIANT *ppropvar);
 88PSSTDAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar);
 89PSSTDAPI PropVariantToGUID(const PROPVARIANT *ppropvar, GUID *guid);
 90PSSTDAPI VariantToGUID(const VARIANT *pvar, GUID *guid);
 91PSSTDAPI_(INT) PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2,
 92                                PROPVAR_COMPARE_UNIT uint, PROPVAR_COMPARE_FLAGS flags);
 93PSSTDAPI InitPropVariantFromFileTime(const FILETIME *pftIn, PROPVARIANT *ppropvar);
 94PSSTDAPI InitPropVariantFromStringVector(PCWSTR *strs, ULONG count, PROPVARIANT *ppropvar);
 95
 96PSSTDAPI PropVariantToDouble(REFPROPVARIANT propvarIn, double *ret);
 97PSSTDAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret);
 98PSSTDAPI PropVariantToInt32(REFPROPVARIANT propvarIn, LONG *ret);
 99PSSTDAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret);
100PSSTDAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret);
101PSSTDAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret);
102PSSTDAPI_(ULONG) PropVariantToUInt32WithDefault(REFPROPVARIANT propvarIn, ULONG uLDefault);
103PSSTDAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret);
104PSSTDAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, WINBOOL *ret);
105PSSTDAPI PropVariantToBSTR(REFPROPVARIANT propvar, BSTR *bstr);
106PSSTDAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb);
107PSSTDAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch);
108PSSTDAPI_(PCWSTR) PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault);
109PSSTDAPI_(PCWSTR) VariantToStringWithDefault(const VARIANT *pvar, LPCWSTR pszDefault);
110PSSTDAPI VariantToString(REFVARIANT var, PWSTR ret, UINT cch);
111
112PSSTDAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret);
113
114PSSTDAPI PropVariantToVariant(const PROPVARIANT *propvar, VARIANT *var);
115PSSTDAPI VariantToPropVariant(const VARIANT* var, PROPVARIANT* propvar);
116
117PSSTDAPI PropVariantGetStringElem(const PROPVARIANT *propvar, ULONG idx, WCHAR **ret);
118
119#ifdef __cplusplus
120
121HRESULT InitPropVariantFromBoolean(WINBOOL fVal, PROPVARIANT *ppropvar);
122HRESULT InitPropVariantFromInt16(SHORT nVal, PROPVARIANT *ppropvar);
123HRESULT InitPropVariantFromUInt16(USHORT uiVal, PROPVARIANT *ppropvar);
124HRESULT InitPropVariantFromInt32(LONG lVal, PROPVARIANT *ppropvar);
125HRESULT InitPropVariantFromUInt32(ULONG ulVal, PROPVARIANT *ppropvar);
126HRESULT InitPropVariantFromInt64(LONGLONG llVal, PROPVARIANT *ppropvar);
127HRESULT InitPropVariantFromUInt64(ULONGLONG ullVal, PROPVARIANT *ppropvar);
128HRESULT InitPropVariantFromDouble(DOUBLE dblVal, PROPVARIANT *ppropvar);
129HRESULT InitPropVariantFromString(PCWSTR psz, PROPVARIANT *ppropvar);
130HRESULT InitPropVariantFromGUIDAsBuffer(REFGUID guid, PROPVARIANT *ppropvar);
131WINBOOL IsPropVariantVector(REFPROPVARIANT propvar);
132WINBOOL IsPropVariantString(REFPROPVARIANT propvar);
133
134#ifndef NO_PROPVAR_INLINES
135
136inline HRESULT InitPropVariantFromBoolean(WINBOOL fVal, PROPVARIANT *ppropvar)
137{
138    ppropvar->vt = VT_BOOL;
139    ppropvar->boolVal = fVal ? VARIANT_TRUE : VARIANT_FALSE;
140    return S_OK;
141}
142
143inline HRESULT InitPropVariantFromInt16(SHORT nVal, PROPVARIANT *ppropvar)
144{
145    ppropvar->vt = VT_I2;
146    ppropvar->iVal = nVal;
147    return S_OK;
148}
149
150inline HRESULT InitPropVariantFromUInt16(USHORT uiVal, PROPVARIANT *ppropvar)
151{
152    ppropvar->vt = VT_UI2;
153    ppropvar->uiVal = uiVal;
154    return S_OK;
155}
156
157inline HRESULT InitPropVariantFromInt32(LONG lVal, PROPVARIANT *ppropvar)
158{
159    ppropvar->vt = VT_I4;
160    ppropvar->lVal = lVal;
161    return S_OK;
162}
163
164inline HRESULT InitPropVariantFromUInt32(ULONG ulVal, PROPVARIANT *ppropvar)
165{
166    ppropvar->vt = VT_UI4;
167    ppropvar->ulVal = ulVal;
168    return S_OK;
169}
170
171inline HRESULT InitPropVariantFromInt64(LONGLONG llVal, PROPVARIANT *ppropvar)
172{
173    ppropvar->vt = VT_I8;
174    ppropvar->hVal.QuadPart = llVal;
175    return S_OK;
176}
177
178inline HRESULT InitPropVariantFromUInt64(ULONGLONG ullVal, PROPVARIANT *ppropvar)
179{
180    ppropvar->vt = VT_UI8;
181    ppropvar->uhVal.QuadPart = ullVal;
182    return S_OK;
183}
184
185inline HRESULT InitPropVariantFromDouble(DOUBLE dblVal, PROPVARIANT *ppropvar)
186{
187    ppropvar->vt = VT_R8;
188    ppropvar->dblVal = dblVal;
189    return S_OK;
190}
191
192inline HRESULT InitPropVariantFromString(PCWSTR psz, PROPVARIANT *ppropvar)
193{
194    HRESULT hres;
195
196    hres = SHStrDupW(psz, &ppropvar->pwszVal);
197    if(SUCCEEDED(hres))
198        ppropvar->vt = VT_LPWSTR;
199    else
200        PropVariantInit(ppropvar);
201
202    return hres;
203}
204
205inline HRESULT InitPropVariantFromGUIDAsBuffer(REFGUID guid, PROPVARIANT *ppropvar)
206{
207#ifdef __cplusplus
208    return InitPropVariantFromBuffer(&guid, sizeof(GUID), ppropvar);
209#else
210    return InitPropVariantFromBuffer(guid, sizeof(GUID), ppropvar);
211#endif
212}
213
214inline WINBOOL IsPropVariantVector(REFPROPVARIANT propvar)
215{
216    return (propvar.vt & (VT_ARRAY | VT_VECTOR));
217}
218
219inline WINBOOL IsPropVariantString(REFPROPVARIANT propvar)
220{
221    return (PropVariantToStringWithDefault(propvar, NULL) != NULL);
222}
223
224#endif /* NO_PROPVAR_INLINES */
225#endif /* __cplusplus */
226
227PSSTDAPI StgSerializePropVariant(const PROPVARIANT *ppropvar, SERIALIZEDPROPERTYVALUE **ppprop, ULONG *pcb);
228PSSTDAPI StgDeserializePropVariant(const SERIALIZEDPROPERTYVALUE *pprop, ULONG cbmax, PROPVARIANT *ppropvar);
229
230#ifdef __cplusplus
231}
232#endif
233
234#endif /* __WINE_PROPVARUTIL_H */