Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- 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;
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/ole32/itemmoniker.c | 46 ++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 28 deletions(-)
diff --git a/dlls/ole32/itemmoniker.c b/dlls/ole32/itemmoniker.c index c37d7a87c5..79fb293c38 100644 --- a/dlls/ole32/itemmoniker.c +++ b/dlls/ole32/itemmoniker.c @@ -771,45 +771,35 @@ static HRESULT WINAPI ItemMonikerImpl_GetDisplayName(IMoniker* iface, /****************************************************************************** * ItemMoniker_ParseDisplayName ******************************************************************************/ -static HRESULT WINAPI ItemMonikerImpl_ParseDisplayName(IMoniker* iface, - IBindCtx* pbc, - IMoniker* pmkToLeft, - LPOLESTR pszDisplayName, - ULONG* pchEaten, - IMoniker** ppmkOut) +static HRESULT WINAPI ItemMonikerImpl_ParseDisplayName(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, + LPOLESTR displayname, ULONG *eaten, IMoniker **ppmkOut) { ItemMonikerImpl *This = impl_from_IMoniker(iface); - IOleItemContainer* poic=0; - IParseDisplayName* ppdn=0; + IOleItemContainer *container; + IParseDisplayName *parser; LPOLESTR displayName; - HRESULT res; - - TRACE("%s\n", debugstr_w(pszDisplayName)); + HRESULT hr;
- /* If pmkToLeft is NULL, this method returns MK_E_SYNTAX */ - if (pmkToLeft==NULL) + TRACE("%p, %p, %p, %s, %p, %p.\n", iface, pbc, pmkToLeft, debugstr_w(displayname), eaten, ppmkOut);
+ if (!pmkToLeft) return MK_E_SYNTAX;
- else{ - /* Otherwise, the method calls IMoniker::BindToObject on the pmkToLeft parameter, requesting an */ - /* IParseDisplayName interface pointer to the object identified by the moniker, and passes the display */ - /* name to IParseDisplayName::ParseDisplayName */ - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); - - if (SUCCEEDED(res)){ - - res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,&IID_IParseDisplayName,(void**)&ppdn); + 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, + &IID_IParseDisplayName, (void **)&parser);
- res=IMoniker_GetDisplayName(iface,pbc,NULL,&displayName); + hr = IMoniker_GetDisplayName(iface,pbc,NULL,&displayName);
- res=IParseDisplayName_ParseDisplayName(ppdn,pbc,displayName,pchEaten,ppmkOut); + hr = IParseDisplayName_ParseDisplayName(parser, pbc, displayName, eaten, ppmkOut);
- IOleItemContainer_Release(poic); - IParseDisplayName_Release(ppdn); - } + IOleItemContainer_Release(container); + IParseDisplayName_Release(parser); } - return res; + + return hr; }
/******************************************************************************