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 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 136 inline HRESULT InitPropVariantFromInt16(SHORT nVal, PROPVARIANT *ppropvar) 137 { 138 ppropvar->vt = VT_I2; 139 ppropvar->iVal = nVal; 140 return S_OK; 141 } 142 143 inline HRESULT InitPropVariantFromUInt16(USHORT uiVal, PROPVARIANT *ppropvar) 144 { 145 ppropvar->vt = VT_UI2; 146 ppropvar->uiVal = uiVal; 147 return S_OK; 148 } 149 150 inline HRESULT InitPropVariantFromInt32(LONG lVal, PROPVARIANT *ppropvar) 151 { 152 ppropvar->vt = VT_I4; 153 ppropvar->lVal = lVal; 154 return S_OK; 155 } 156 157 inline HRESULT InitPropVariantFromUInt32(ULONG ulVal, PROPVARIANT *ppropvar) 158 { 159 ppropvar->vt = VT_UI4; 160 ppropvar->ulVal = ulVal; 161 return S_OK; 162 } 163 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 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 178 inline HRESULT InitPropVariantFromDouble(DOUBLE dblVal, PROPVARIANT *ppropvar) 179 { 180 ppropvar->vt = VT_R8; 181 ppropvar->dblVal = dblVal; 182 return S_OK; 183 } 184 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 198 inline HRESULT InitPropVariantFromGUIDAsBuffer(REFGUID guid, PROPVARIANT *ppropvar) 199 { 200 return InitPropVariantFromBuffer(&guid, sizeof(GUID), ppropvar); 201 } 202 203 inline BOOL IsPropVariantVector(REFPROPVARIANT propvar) 204 { 205 return (propvar.vt & (VT_ARRAY | VT_VECTOR)); 206 } 207 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