Nikolay Sivov : ole32: Fix bind speed used in BindToObject() of item moniker.
Alexandre Julliard
julliard at winehq.org
Wed Jan 22 14:53:00 CST 2020
Module: wine
Branch: master
Commit: a456e8fff2ad5eecaffe7bdafe8676d84ff70d33
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a456e8fff2ad5eecaffe7bdafe8676d84ff70d33
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Jan 22 12:11:46 2020 +0300
ole32: Fix bind speed used in BindToObject() of item moniker.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ole32/itemmoniker.c | 32 +++++++++++++++++++++-----------
dlls/ole32/tests/moniker.c | 3 ---
2 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/dlls/ole32/itemmoniker.c b/dlls/ole32/itemmoniker.c
index bd6fd6fd87..c37d7a87c5 100644
--- a/dlls/ole32/itemmoniker.c
+++ b/dlls/ole32/itemmoniker.c
@@ -329,6 +329,18 @@ static HRESULT WINAPI ItemMonikerImpl_GetSizeMax(IMoniker* iface, ULARGE_INTEGER
return S_OK;
}
+static DWORD get_bind_speed_from_bindctx(IBindCtx *pbc)
+{
+ DWORD bind_speed = BINDSPEED_INDEFINITE;
+ BIND_OPTS bind_opts;
+
+ bind_opts.cbStruct = sizeof(bind_opts);
+ if (SUCCEEDED(IBindCtx_GetBindOptions(pbc, &bind_opts)) && bind_opts.dwTickCountDeadline)
+ bind_speed = bind_opts.dwTickCountDeadline < 2500 ? BINDSPEED_IMMEDIATE : BINDSPEED_MODERATE;
+
+ return bind_speed;
+}
+
/******************************************************************************
* ItemMoniker_BindToObject
******************************************************************************/
@@ -339,9 +351,8 @@ static HRESULT WINAPI ItemMonikerImpl_BindToObject(IMoniker* iface,
VOID** ppvResult)
{
ItemMonikerImpl *This = impl_from_IMoniker(iface);
- HRESULT res;
- IID refid=IID_IOleItemContainer;
- IOleItemContainer *poic=0;
+ IOleItemContainer *container;
+ HRESULT hr;
TRACE("(%p,%p,%p,%s,%p)\n",iface,pbc,pmkToLeft,debugstr_guid(riid),ppvResult);
@@ -353,16 +364,15 @@ static HRESULT WINAPI ItemMonikerImpl_BindToObject(IMoniker* iface,
*ppvResult=0;
- res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&refid,(void**)&poic);
-
- if (SUCCEEDED(res)){
-
- res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,riid,ppvResult);
-
- IOleItemContainer_Release(poic);
+ hr = IMoniker_BindToObject(pmkToLeft, pbc, NULL, &IID_IOleItemContainer, (void **)&container);
+ if (SUCCEEDED(hr))
+ {
+ hr = IOleItemContainer_GetObject(container, This->itemName, get_bind_speed_from_bindctx(pbc), pbc,
+ riid, ppvResult);
+ IOleItemContainer_Release(container);
}
- return res;
+ return hr;
}
/******************************************************************************
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 9a61be4f47..bbd964e723 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -2105,7 +2105,6 @@ todo_wine
container_moniker = create_test_moniker();
hr = IMoniker_BindToObject(moniker, bindctx, &container_moniker->IMoniker_iface, &IID_IUnknown, (void **)&unknown);
-todo_wine
ok(hr == (0x8bee0000 | BINDSPEED_INDEFINITE), "Unexpected hr %#x.\n", hr);
bind_opts.cbStruct = sizeof(bind_opts);
@@ -2116,14 +2115,12 @@ todo_wine
hr = IBindCtx_SetBindOptions(bindctx, &bind_opts);
ok(hr == S_OK, "Failed to set bind options, hr %#x.\n", hr);
hr = IMoniker_BindToObject(moniker, bindctx, &container_moniker->IMoniker_iface, &IID_IUnknown, (void **)&unknown);
-todo_wine
ok(hr == (0x8bee0000 | BINDSPEED_IMMEDIATE), "Unexpected hr %#x.\n", hr);
bind_opts.dwTickCountDeadline = 2499;
hr = IBindCtx_SetBindOptions(bindctx, &bind_opts);
ok(hr == S_OK, "Failed to set bind options, hr %#x.\n", hr);
hr = IMoniker_BindToObject(moniker, bindctx, &container_moniker->IMoniker_iface, &IID_IUnknown, (void **)&unknown);
-todo_wine
ok(hr == (0x8bee0000 | BINDSPEED_IMMEDIATE), "Unexpected hr %#x.\n", hr);
bind_opts.dwTickCountDeadline = 2500;
More information about the wine-cvs
mailing list