https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a93b822da23477d28518d2...
commit a93b822da23477d28518d23bd582bcdf0da494c1 Author: Amine Khaldi amine.khaldi@reactos.org AuthorDate: Sat Nov 23 12:08:50 2019 +0100 Commit: Amine Khaldi amine.khaldi@reactos.org CommitDate: Sat Nov 23 12:08:50 2019 +0100
[PROPSYS] Sync with Wine Staging 4.18. CORE-16441 --- dll/win32/propsys/precomp.h | 4 +- dll/win32/propsys/propstore.c | 2 - dll/win32/propsys/propsys.spec | 8 +-- dll/win32/propsys/propsys_main.c | 20 +++++-- dll/win32/propsys/propvar.c | 117 +++++++++++++++++++++++++++++++++------ media/doc/README.WINE | 2 +- 6 files changed, 120 insertions(+), 33 deletions(-)
diff --git a/dll/win32/propsys/precomp.h b/dll/win32/propsys/precomp.h index 74eabdd3cfc..1f432757e3a 100644 --- a/dll/win32/propsys/precomp.h +++ b/dll/win32/propsys/precomp.h @@ -2,8 +2,6 @@ #ifndef _PROPSYS_PRECOMP_H_ #define _PROPSYS_PRECOMP_H_
-#include <wine/config.h> - #include <stdarg.h>
#define WIN32_NO_STATUS @@ -15,11 +13,11 @@
#include <windef.h> #include <winbase.h> +#include <winnls.h> #include <objbase.h> #include <propsys.h>
#include <wine/debug.h> -#include <wine/unicode.h>
#include "propsys_private.h"
diff --git a/dll/win32/propsys/propstore.c b/dll/win32/propsys/propstore.c index 9c848fcaba6..6212f293123 100644 --- a/dll/win32/propsys/propstore.c +++ b/dll/win32/propsys/propstore.c @@ -19,7 +19,6 @@ */
#define COBJMACROS -#include "config.h"
#include <stdarg.h>
@@ -29,7 +28,6 @@ #include "rpcproxy.h" #include "propsys.h" #include "wine/debug.h" -#include "wine/unicode.h" #include "wine/list.h"
#include "initguid.h" diff --git a/dll/win32/propsys/propsys.spec b/dll/win32/propsys/propsys.spec index f4960063938..19e16aedc1e 100644 --- a/dll/win32/propsys/propsys.spec +++ b/dll/win32/propsys/propsys.spec @@ -66,7 +66,7 @@ @ stub PSCoerceToCanonicalValue @ stub PSCreateAdapterFromPropertyStore @ stub PSCreateDelayedMultiplexPropertyStore -@ stub PSCreateMemoryPropertyStore +@ stdcall PSCreateMemoryPropertyStore(ptr ptr) @ stub PSCreateMultiplexPropertyStore @ stub PSCreatePropertyChangeArray @ stub PSCreatePropertyStoreFromObject @@ -112,8 +112,8 @@ @ stub PropVariantToBooleanVector @ stub PropVariantToBooleanVectorAlloc @ stub PropVariantToBooleanWithDefault -@ stub PropVariantToBuffer -@ stub PropVariantToDouble +@ stdcall PropVariantToBuffer(ptr ptr long) +@ stdcall PropVariantToDouble(ptr ptr) @ stub PropVariantToDoubleVector @ stub PropVariantToDoubleVectorAlloc @ stub PropVariantToDoubleWithDefault @@ -134,7 +134,7 @@ @ stub PropVariantToInt64VectorAlloc @ stub PropVariantToInt64WithDefault @ stub PropVariantToStrRet -@ stub PropVariantToString +@ stdcall PropVariantToString(ptr ptr long) @ stdcall PropVariantToStringAlloc(ptr ptr) @ stub PropVariantToStringVector @ stub PropVariantToStringVectorAlloc diff --git a/dll/win32/propsys/propsys_main.c b/dll/win32/propsys/propsys_main.c index 1dbaee433f6..6f7dc8a397c 100644 --- a/dll/win32/propsys/propsys_main.c +++ b/dll/win32/propsys/propsys_main.c @@ -20,9 +20,11 @@ */
#define COBJMACROS -#include "config.h"
#include <stdarg.h> +#ifdef __REACTOS__ +#include <wchar.h> +#endif
#include "windef.h" #include "winbase.h" @@ -30,7 +32,6 @@ #include "rpcproxy.h" #include "propsys.h" #include "wine/debug.h" -#include "wine/unicode.h"
#include "propsys_private.h"
@@ -307,7 +308,7 @@ HRESULT WINAPI PSStringFromPropertyKey(REFPROPERTYKEY pkey, LPWSTR psz, UINT cch return E_NOT_SUFFICIENT_BUFFER; }
- sprintfW(psz, guid_fmtW, pkey->fmtid.Data1, pkey->fmtid.Data2, + swprintf(psz, guid_fmtW, pkey->fmtid.Data1, pkey->fmtid.Data2, pkey->fmtid.Data3, pkey->fmtid.Data4[0], pkey->fmtid.Data4[1], pkey->fmtid.Data4[2], pkey->fmtid.Data4[3], pkey->fmtid.Data4[4], pkey->fmtid.Data4[5], pkey->fmtid.Data4[6], pkey->fmtid.Data4[7]); @@ -317,11 +318,11 @@ HRESULT WINAPI PSStringFromPropertyKey(REFPROPERTYKEY pkey, LPWSTR psz, UINT cch *p++ = ' '; cch -= GUIDSTRING_MAX - 1 + 1;
- len = sprintfW(pidW, pid_fmtW, pkey->pid); + len = swprintf(pidW, pid_fmtW, pkey->pid);
if (cch >= len + 1) { - strcpyW(p, pidW); + lstrcpyW(p, pidW); return S_OK; } else @@ -497,7 +498,7 @@ HRESULT WINAPI PSPropertyKeyFromString(LPCWSTR pszString, PROPERTYKEY *pkey) }
/* Overflow is not checked. */ - while (isdigitW(*pszString)) + while (iswdigit(*pszString)) { pkey->pid *= 10; pkey->pid += (*pszString - '0'); @@ -509,3 +510,10 @@ HRESULT WINAPI PSPropertyKeyFromString(LPCWSTR pszString, PROPERTYKEY *pkey)
return S_OK; } + +HRESULT WINAPI PSCreateMemoryPropertyStore(REFIID riid, void **ppv) +{ + TRACE("(%s, %p)\n", debugstr_guid(riid), ppv); + + return PropertyStore_CreateInstance(NULL, riid, ppv); +} diff --git a/dll/win32/propsys/propvar.c b/dll/win32/propsys/propvar.c index 05ded2e154e..f03dc148435 100644 --- a/dll/win32/propsys/propvar.c +++ b/dll/win32/propsys/propvar.c @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "config.h" -#include "wine/port.h"
#include <stdarg.h> #include <stdio.h> @@ -34,9 +32,9 @@ #include "winuser.h" #include "shlobj.h" #include "propvarutil.h" +#include "strsafe.h"
#include "wine/debug.h" -#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(propsys);
@@ -123,12 +121,18 @@ static HRESULT PROPVAR_ConvertNumber(REFPROPVARIANT pv, int dest_bits, case VT_BSTR: { WCHAR *end; - *res = strtolW(pv->u.pwszVal, &end, 0); + *res = wcstol(pv->u.pwszVal, &end, 0); if (pv->u.pwszVal == end) return DISP_E_TYPEMISMATCH; src_signed = *res < 0; break; } + case VT_R8: + { + src_signed = TRUE; + *res = pv->u.dblVal; + break; + } default: FIXME("unhandled vt %d\n", pv->vt); return E_NOTIMPL; @@ -155,6 +159,18 @@ static HRESULT PROPVAR_ConvertNumber(REFPROPVARIANT pv, int dest_bits, return S_OK; }
+HRESULT WINAPI PropVariantToDouble(REFPROPVARIANT propvarIn, double *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("(%p, %p)\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 64, TRUE, &res); + if (SUCCEEDED(hr)) *ret = (double)res; + return hr; +} + HRESULT WINAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret) { LONGLONG res; @@ -187,7 +203,7 @@ HRESULT WINAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret) TRACE("%p,%p\n", propvarIn, ret);
hr = PROPVAR_ConvertNumber(propvarIn, 64, TRUE, &res); - if (SUCCEEDED(hr)) *ret = (LONGLONG)res; + if (SUCCEEDED(hr)) *ret = res; return hr; }
@@ -287,6 +303,56 @@ HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret) return hr; }
+HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb) +{ + HRESULT hr = S_OK; + + TRACE("(%p, %p, %d)\n", propvarIn, ret, cb); + + switch(propvarIn->vt) + { + case VT_VECTOR|VT_UI1: + if(cb > propvarIn->u.caub.cElems) + return E_FAIL; + memcpy(ret, propvarIn->u.caub.pElems, cb); + break; + case VT_ARRAY|VT_UI1: + FIXME("Unsupported type: VT_ARRAY|VT_UI1\n"); + hr = E_NOTIMPL; + break; + default: + WARN("Unexpected type: %x\n", propvarIn->vt); + hr = E_INVALIDARG; + } + + return hr; +} + + +HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch) +{ + HRESULT hr; + WCHAR *stringW = NULL; + + TRACE("(%p, %p, %d)\n", propvarIn, ret, cch); + + ret[0] = '\0'; + + if(!cch) + return E_INVALIDARG; + + hr = PropVariantToStringAlloc(propvarIn, &stringW); + if(SUCCEEDED(hr)) + { + if(lstrlenW(stringW) >= cch) + hr = STRSAFE_E_INSUFFICIENT_BUFFER; + lstrcpynW(ret, stringW, cch); + CoTaskMemFree(stringW); + } + + return hr; +} + HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret) { WCHAR *res = NULL; @@ -296,6 +362,7 @@ HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret)
switch(propvarIn->vt) { + case VT_EMPTY: case VT_NULL: res = CoTaskMemAlloc(1*sizeof(WCHAR)); res[0] = '\0'; @@ -517,7 +584,7 @@ static void PROPVAR_GUIDToWSTR(REFGUID guid, WCHAR *str) '-','%','0','2','X','%','0','2','X','-','%','0','2','X','%','0','2','X','%','0','2','X', '%','0','2','X','%','0','2','X','%','0','2','X','}',0};
- sprintfW(str, format, guid->Data1, guid->Data2, guid->Data3, + swprintf(str, format, guid->Data1, guid->Data2, guid->Data3, guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); } @@ -694,7 +761,10 @@ HRESULT WINAPI PropVariantToGUID(const PROPVARIANT *ppropvar, GUID *guid) case VT_BSTR: return PROPVAR_WCHARToGUID(ppropvar->u.bstrVal, SysStringLen(ppropvar->u.bstrVal), guid); case VT_LPWSTR: - return PROPVAR_WCHARToGUID(ppropvar->u.pwszVal, strlenW(ppropvar->u.pwszVal), guid); + return PROPVAR_WCHARToGUID(ppropvar->u.pwszVal, lstrlenW(ppropvar->u.pwszVal), guid); + case VT_CLSID: + memcpy(guid, ppropvar->u.puuid, sizeof(*ppropvar->u.puuid)); + return S_OK;
default: FIXME("unsupported vt: %d\n", ppropvar->vt); @@ -734,6 +804,9 @@ static BOOL isemptyornull(const PROPVARIANT *propvar) } return i == propvar->u.parray->cDims; } + if (propvar->vt == VT_CLSID) + return !propvar->u.puuid; + /* FIXME: vectors, byrefs, errors? */ return FALSE; } @@ -770,7 +843,7 @@ INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2 else propvar2_converted = propvar2;
-#define CMP_INT_VALUE(var) do { \ +#define CMP_NUM_VALUE(var) do { \ if (propvar1->u.var > propvar2_converted->u.var) \ res = 1; \ else if (propvar1->u.var < propvar2_converted->u.var) \ @@ -782,28 +855,34 @@ INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2 switch (propvar1->vt) { case VT_I1: - CMP_INT_VALUE(cVal); + CMP_NUM_VALUE(cVal); break; case VT_UI1: - CMP_INT_VALUE(bVal); + CMP_NUM_VALUE(bVal); break; case VT_I2: - CMP_INT_VALUE(iVal); + CMP_NUM_VALUE(iVal); break; case VT_UI2: - CMP_INT_VALUE(uiVal); + CMP_NUM_VALUE(uiVal); break; case VT_I4: - CMP_INT_VALUE(lVal); + CMP_NUM_VALUE(lVal); break; case VT_UI4: - CMP_INT_VALUE(uiVal); + CMP_NUM_VALUE(uiVal); break; case VT_I8: - CMP_INT_VALUE(hVal.QuadPart); + CMP_NUM_VALUE(hVal.QuadPart); break; case VT_UI8: - CMP_INT_VALUE(uhVal.QuadPart); + CMP_NUM_VALUE(uhVal.QuadPart); + break; + case VT_R4: + CMP_NUM_VALUE(fltVal); + break; + case VT_R8: + CMP_NUM_VALUE(dblVal); break; case VT_BSTR: case VT_LPWSTR: @@ -820,8 +899,12 @@ INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2 else res = lstrcmpA(propvar1->u.pszVal, propvar2_converted->u.pszVal); break; + case VT_CLSID: + res = memcmp(propvar1->u.puuid, propvar2->u.puuid, sizeof(*propvar1->u.puuid)); + if (res) res = res > 0 ? 1 : -1; + break; default: - FIXME("vartype %d not handled\n", propvar1->vt); + FIXME("vartype %#x not handled\n", propvar1->vt); res = -1; break; } diff --git a/media/doc/README.WINE b/media/doc/README.WINE index b2ba781f32c..2ac9a1e0072 100644 --- a/media/doc/README.WINE +++ b/media/doc/README.WINE @@ -152,7 +152,7 @@ dll/win32/pdh # Synced to WineStaging-4.18 dll/win32/pidgen # Synced to WineStaging-4.18 dll/win32/powrprof # Forked at Wine-1.0rc5 dll/win32/printui # Synced to WineStaging-4.18 -dll/win32/propsys # Synced to WineStaging-4.0 +dll/win32/propsys # Synced to WineStaging-4.18 dll/win32/pstorec # Synced to WineStaging-3.3 dll/win32/qmgr # Synced to WineStaging-4.0 dll/win32/qmgrprxy # Synced to WineStaging-2.9