https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a93b822da23477d28518d…
commit a93b822da23477d28518d23bd582bcdf0da494c1
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Sat Nov 23 12:08:50 2019 +0100
Commit: Amine Khaldi <amine.khaldi(a)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