From: Piotr Caban piotr@codeweavers.com
--- dlls/ole32/stg_prop.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/dlls/ole32/stg_prop.c b/dlls/ole32/stg_prop.c index be16c98b9c6..3446ec9dafd 100644 --- a/dlls/ole32/stg_prop.c +++ b/dlls/ole32/stg_prop.c @@ -1354,6 +1354,11 @@ static HRESULT propertystorage_read_scalar(PROPVARIANT *prop, const struct read_ *offset += sizeof(UINT64); TRACE("Read ulong long %s\n", wine_dbgstr_longlong(prop->uhVal.QuadPart)); break; + case VT_R4: + hr = buffer_read_len(buffer, *offset, &prop->fltVal, sizeof(prop->fltVal)); + *offset += sizeof(prop->fltVal); + TRACE("Read float %f\n", prop->fltVal); + break; case VT_R8: hr = buffer_read_len(buffer, *offset, &prop->dblVal, sizeof(prop->dblVal)); *offset += sizeof(prop->dblVal);
From: Piotr Caban piotr@codeweavers.com
--- dlls/ole32/stg_prop.c | 32 +++++++++++++++----------------- dlls/ole32/tests/stg_prop.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 19 deletions(-)
diff --git a/dlls/ole32/stg_prop.c b/dlls/ole32/stg_prop.c index 3446ec9dafd..ee28d6b6898 100644 --- a/dlls/ole32/stg_prop.c +++ b/dlls/ole32/stg_prop.c @@ -539,7 +539,8 @@ static HRESULT WINAPI IPropertyStorage_fnReadMultiple( PROPVARIANT rgpropvar[]) { PropertyStorage_impl *This = impl_from_IPropertyStorage(iface); - HRESULT hr = S_OK; + HRESULT hr = S_FALSE; + PROPVARIANT *prop; ULONG i;
TRACE("%p, %lu, %p, %p\n", iface, cpspec, rgpspec, rgpropvar); @@ -554,12 +555,7 @@ static HRESULT WINAPI IPropertyStorage_fnReadMultiple( PropVariantInit(&rgpropvar[i]); if (rgpspec[i].ulKind == PRSPEC_LPWSTR) { - PROPVARIANT *prop = PropertyStorage_FindPropertyByName(This, - rgpspec[i].lpwstr); - - if (prop) - PropertyStorage_PropVariantCopy(&rgpropvar[i], prop, GetACP(), - This->codePage); + prop = PropertyStorage_FindPropertyByName(This, rgpspec[i].lpwstr); } else { @@ -568,24 +564,26 @@ static HRESULT WINAPI IPropertyStorage_fnReadMultiple( case PID_CODEPAGE: rgpropvar[i].vt = VT_I2; rgpropvar[i].iVal = This->codePage; + prop = NULL; + hr = S_OK; break; case PID_LOCALE: rgpropvar[i].vt = VT_I4; rgpropvar[i].lVal = This->locale; + prop = NULL; + hr = S_OK; break; default: - { - PROPVARIANT *prop = PropertyStorage_FindProperty(This, - rgpspec[i].propid); - - if (prop) - PropertyStorage_PropVariantCopy(&rgpropvar[i], prop, - GetACP(), This->codePage); - else - hr = S_FALSE; - } + prop = PropertyStorage_FindProperty(This, rgpspec[i].propid); + break; } } + + if (prop) + { + PropertyStorage_PropVariantCopy(&rgpropvar[i], prop, GetACP(), This->codePage); + hr = S_OK; + } } LeaveCriticalSection(&This->cs); return hr; diff --git a/dlls/ole32/tests/stg_prop.c b/dlls/ole32/tests/stg_prop.c index 128de9fc72e..17f361d57ef 100644 --- a/dlls/ole32/tests/stg_prop.c +++ b/dlls/ole32/tests/stg_prop.c @@ -40,8 +40,8 @@ static void testPropsHelper(IPropertySetStorage **propSetStorage) IStorage *storage = NULL; IStream *stream = NULL; IPropertyStorage *propertyStorage = NULL; - PROPSPEC spec; - PROPVARIANT var; + PROPSPEC spec, spec2[2]; + PROPVARIANT var, var2[2]; CLIPDATA clipdata; unsigned char clipcontent[] = "foobar"; GUID anyOldGuid = { 0x12345678,0xdead,0xbeef, { @@ -179,6 +179,31 @@ static void testPropsHelper(IPropertySetStorage **propSetStorage) var.vt, var.pszVal); PropVariantClear(&var);
+ /* test read with some missing properties */ + spec2[0].ulKind = PRSPEC_PROPID; + spec2[0].propid = PID_FIRST_USABLE; + spec2[1].ulKind = PRSPEC_PROPID; + spec2[1].propid = 0xdead; + var2[0].vt = VT_BSTR; + var2[1].vt = VT_BSTR; + hr = IPropertyStorage_ReadMultiple(propertyStorage, 2, spec2, var2); + ok(hr == S_OK, "ReadMultiple failed: 0x%08lx\n", hr); + ok(var2[0].vt == VT_I4, "got type %d\n", var2[0].vt); + ok(var2[0].lVal == 1, "got value %ld\n", var2[0].lVal); + ok(var2[1].vt == VT_EMPTY, "got type %d\n", var2[1].vt); + + spec2[0].ulKind = PRSPEC_LPWSTR; + spec2[0].lpwstr = propName; + spec2[1].ulKind = PRSPEC_LPWSTR; + spec2[1].lpwstr = (WCHAR *)L"non-existing"; + var2[0].vt = VT_BSTR; + var2[1].vt = VT_BSTR; + hr = IPropertyStorage_ReadMultiple(propertyStorage, 2, spec2, var2); + ok(hr == S_OK, "ReadMultiple failed: 0x%08lx\n", hr); + ok(var2[0].vt == VT_I4, "got type %d\n", var2[0].vt); + ok(var2[0].lVal == 2, "got value %ld\n", var2[0].lVal); + ok(var2[1].vt == VT_EMPTY, "got type %d\n", var2[1].vt); + /* read clipboard format */ spec.ulKind = PRSPEC_PROPID; spec.propid = PIDSI_THUMBNAIL;
From: Piotr Caban piotr@codeweavers.com
--- dlls/ole32/stg_prop.c | 10 ++++++---- dlls/ole32/tests/stg_prop.c | 1 - 2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/dlls/ole32/stg_prop.c b/dlls/ole32/stg_prop.c index ee28d6b6898..5c86de027b1 100644 --- a/dlls/ole32/stg_prop.c +++ b/dlls/ole32/stg_prop.c @@ -2660,8 +2660,8 @@ static HRESULT PropertyStorage_ConstructFromStream(IStream *stm, return hr; }
-static HRESULT PropertyStorage_ConstructEmpty(IStream *stm, - REFFMTID rfmtid, DWORD grfFlags, DWORD grfMode, IPropertyStorage** pps) +static HRESULT PropertyStorage_ConstructEmpty(IStream *stm, REFFMTID rfmtid, + const CLSID *clsid, DWORD grfFlags, DWORD grfMode, IPropertyStorage** pps) { PropertyStorage_impl *ps; HRESULT hr; @@ -2670,6 +2670,8 @@ static HRESULT PropertyStorage_ConstructEmpty(IStream *stm, hr = PropertyStorage_BaseConstruct(stm, rfmtid, grfMode, &ps); if (SUCCEEDED(hr)) { + if (clsid) + ps->clsid = *clsid; ps->format = 0; ps->grfFlags = grfFlags; if (ps->grfFlags & PROPSETFLAG_CASE_SENSITIVE) @@ -2976,7 +2978,7 @@ static HRESULT WINAPI IPropertySetStorage_fnCreate( if (FAILED(r)) goto end;
- r = PropertyStorage_ConstructEmpty(stm, rfmtid, grfFlags, grfMode, ppprstg); + r = PropertyStorage_ConstructEmpty(stm, rfmtid, pclsid, grfFlags, grfMode, ppprstg);
IStream_Release( stm );
@@ -3162,7 +3164,7 @@ HRESULT WINAPI StgCreatePropStg(IUnknown *unk, REFFMTID fmt, const CLSID *clsid, if (FAILED(r)) goto end;
- r = PropertyStorage_ConstructEmpty(stm, fmt, flags, + r = PropertyStorage_ConstructEmpty(stm, fmt, clsid, flags, STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, prop_stg);
IStream_Release( stm ); diff --git a/dlls/ole32/tests/stg_prop.c b/dlls/ole32/tests/stg_prop.c index 17f361d57ef..1b08833adbe 100644 --- a/dlls/ole32/tests/stg_prop.c +++ b/dlls/ole32/tests/stg_prop.c @@ -755,7 +755,6 @@ static void test_propertyset_storage_enum(void)
hr = IPropertyStorage_Stat(prop_storage, &psstg); ok(hr == S_OK, "Failed to get prop storage stats, hr %#lx.\n", hr); - todo_wine ok(IsEqualCLSID(&psstg.clsid, &IID_IUnknown), "Unexpected storage clsid %s.\n", wine_dbgstr_guid(&psstg.clsid));
hr = IPropertySetStorage_Enum(ps_storage, NULL);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=151035
Your paranoid android.
=== debian11b (64 bit WoW report) ===
wmvcore: wmvcore.c:2824: Test succeeded inside todo block: Got pts 2780000.