ole32/composite: Reimplement Reduce().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
5855196be9
commit
f95fe051f0
|
@ -408,76 +408,43 @@ static HRESULT WINAPI CompositeMonikerImpl_BindToStorage(IMoniker *iface, IBindC
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
static HRESULT WINAPI CompositeMonikerImpl_Reduce(IMoniker *iface, IBindCtx *pbc, DWORD howfar,
|
||||||
* CompositeMoniker_Reduce
|
IMoniker **toleft, IMoniker **reduced)
|
||||||
******************************************************************************/
|
|
||||||
static HRESULT WINAPI
|
|
||||||
CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar,
|
|
||||||
IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
|
|
||||||
{
|
{
|
||||||
HRESULT res;
|
CompositeMonikerImpl *moniker = impl_from_IMoniker(iface);
|
||||||
IMoniker *tempMk,*antiMk,*rightMostMk,*leftReducedComposedMk,*rightMostReducedMk;
|
IMoniker *m, *reduced_left, *reduced_right;
|
||||||
IEnumMoniker *enumMoniker;
|
BOOL was_reduced;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("(%p,%p,%d,%p,%p)\n",iface,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced);
|
TRACE("%p, %p, %d, %p, %p.\n", iface, pbc, howfar, toleft, reduced);
|
||||||
|
|
||||||
if (ppmkReduced==NULL)
|
if (!pbc || !reduced)
|
||||||
return E_POINTER;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
/* This method recursively calls Reduce for each of its component monikers. */
|
if (FAILED(hr = IMoniker_Reduce(moniker->left, pbc, howfar, NULL, &reduced_left)))
|
||||||
|
return hr;
|
||||||
|
|
||||||
if (ppmkToLeft==NULL){
|
m = moniker->left;
|
||||||
|
if (FAILED(hr = IMoniker_Reduce(moniker->right, pbc, howfar, &m, &reduced_right)))
|
||||||
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
{
|
||||||
IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
|
IMoniker_Release(reduced_left);
|
||||||
IEnumMoniker_Release(enumMoniker);
|
return hr;
|
||||||
|
|
||||||
CreateAntiMoniker(&antiMk);
|
|
||||||
IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
|
|
||||||
IMoniker_Release(antiMk);
|
|
||||||
|
|
||||||
res = IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,&tempMk, ppmkReduced);
|
|
||||||
IMoniker_Release(tempMk);
|
|
||||||
IMoniker_Release(rightMostMk);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
else if (*ppmkToLeft==NULL)
|
|
||||||
|
|
||||||
return IMoniker_Reduce(iface,pbc,dwReduceHowFar,NULL,ppmkReduced);
|
if ((was_reduced = (reduced_left != moniker->left || reduced_right != moniker->right)))
|
||||||
|
{
|
||||||
else{
|
hr = CreateGenericComposite(reduced_left, reduced_right, reduced);
|
||||||
|
|
||||||
/* separate the composite moniker in to left and right moniker */
|
|
||||||
IMoniker_Enum(iface,FALSE,&enumMoniker);
|
|
||||||
IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL);
|
|
||||||
IEnumMoniker_Release(enumMoniker);
|
|
||||||
|
|
||||||
CreateAntiMoniker(&antiMk);
|
|
||||||
IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
|
|
||||||
IMoniker_Release(antiMk);
|
|
||||||
|
|
||||||
/* If any of the components reduces itself, the method returns S_OK and passes back a composite */
|
|
||||||
/* of the reduced components */
|
|
||||||
if (IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,NULL,&rightMostReducedMk) &&
|
|
||||||
IMoniker_Reduce(rightMostMk,pbc,dwReduceHowFar,&tempMk,&leftReducedComposedMk) ){
|
|
||||||
IMoniker_Release(tempMk);
|
|
||||||
IMoniker_Release(rightMostMk);
|
|
||||||
|
|
||||||
return CreateGenericComposite(leftReducedComposedMk,rightMostReducedMk,ppmkReduced);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
/* If no reduction occurred, the method passes back the same moniker and returns MK_S_REDUCED_TO_SELF.*/
|
|
||||||
IMoniker_Release(tempMk);
|
|
||||||
IMoniker_Release(rightMostMk);
|
|
||||||
|
|
||||||
IMoniker_AddRef(iface);
|
|
||||||
|
|
||||||
*ppmkReduced=iface;
|
|
||||||
|
|
||||||
return MK_S_REDUCED_TO_SELF;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*reduced = iface;
|
||||||
|
IMoniker_AddRef(*reduced);
|
||||||
|
}
|
||||||
|
|
||||||
|
IMoniker_Release(reduced_left);
|
||||||
|
IMoniker_Release(reduced_right);
|
||||||
|
|
||||||
|
return was_reduced ? hr : MK_S_REDUCED_TO_SELF;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI CompositeMonikerImpl_ComposeWith(IMoniker *iface, IMoniker *right,
|
static HRESULT WINAPI CompositeMonikerImpl_ComposeWith(IMoniker *iface, IMoniker *right,
|
||||||
|
|
|
@ -3439,7 +3439,6 @@ todo_wine
|
||||||
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
hr = IMoniker_GetTimeOfLastChange(moniker, bindctx, moniker1, &ft);
|
hr = IMoniker_GetTimeOfLastChange(moniker, bindctx, moniker1, &ft);
|
||||||
todo_wine
|
|
||||||
ok(hr == MK_E_NOTBINDABLE, "Unexpected hr %#x.\n", hr);
|
ok(hr == MK_E_NOTBINDABLE, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
hr = IRunningObjectTable_Revoke(rot, cookie);
|
hr = IRunningObjectTable_Revoke(rot, cookie);
|
||||||
|
@ -3629,6 +3628,24 @@ todo_wine {
|
||||||
|
|
||||||
IMoniker_Release(moniker);
|
IMoniker_Release(moniker);
|
||||||
|
|
||||||
|
/* Reduce() */
|
||||||
|
hr = create_moniker_from_desc("CI1I2", &moniker);
|
||||||
|
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = IMoniker_Reduce(moniker, NULL, MKRREDUCE_ALL, NULL, NULL);
|
||||||
|
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
|
||||||
|
hr = IMoniker_Reduce(moniker, bindctx, MKRREDUCE_ALL, NULL, NULL);
|
||||||
|
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
|
||||||
|
hr = IMoniker_Reduce(moniker, NULL, MKRREDUCE_ALL, NULL, &moniker2);
|
||||||
|
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = IMoniker_Reduce(moniker, bindctx, MKRREDUCE_ALL, NULL, &moniker2);
|
||||||
|
ok(hr == MK_S_REDUCED_TO_SELF, "Unexpected hr %#x.\n", hr);
|
||||||
|
ok(moniker2 == moniker, "Unexpected object.\n");
|
||||||
|
IMoniker_Release(moniker2);
|
||||||
|
|
||||||
|
IMoniker_Release(moniker);
|
||||||
|
|
||||||
IBindCtx_Release(bindctx);
|
IBindCtx_Release(bindctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue