Module: wine Branch: refs/heads/master Commit: ae62ab039f4a1594aadf820b62084945f90d1066 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=ae62ab039f4a1594aadf820b...
Author: Robert Shearman rob@codeweavers.com Date: Mon May 8 15:55:40 2006 +0100
ole32: Implement several class moniker functions using the description provided on MSDN.
---
dlls/ole32/classmoniker.c | 58 +++++++++++++++++++++++++++++++++++--------- dlls/ole32/tests/moniker.c | 3 -- 2 files changed, 46 insertions(+), 15 deletions(-)
diff --git a/dlls/ole32/classmoniker.c b/dlls/ole32/classmoniker.c index 74a0952..afdf48a 100644 --- a/dlls/ole32/classmoniker.c +++ b/dlls/ole32/classmoniker.c @@ -242,8 +242,33 @@ static HRESULT WINAPI ClassMoniker_BindT REFIID riid, VOID** ppvResult) { - FIXME("(%p,%p,%p,%p)\n", pbc, pmkToLeft, riid, ppvResult); - return E_NOTIMPL; + ClassMoniker *This = (ClassMoniker *)iface; + BIND_OPTS2 bindopts; + IClassActivator *pActivator; + HRESULT hr; + + TRACE("(%p,%p,%p,%p)\n", pbc, pmkToLeft, riid, ppvResult); + + bindopts.cbStruct = sizeof(bindopts); + IBindCtx_GetBindOptions(pbc, (BIND_OPTS *)&bindopts); + + if (!pmkToLeft) + return CoGetClassObject(&This->clsid, bindopts.dwClassContext, NULL, + riid, ppvResult); + else + { + hr = IMoniker_BindToObject(pmkToLeft, pbc, NULL, &IID_IClassActivator, + (void **)&pActivator); + if (FAILED(hr)) return hr; + + hr = IClassActivator_GetClassObject(pActivator, &This->clsid, + bindopts.dwClassContext, + bindopts.locale, riid, ppvResult); + + IClassActivator_Release(pActivator); + + return hr; + } }
/****************************************************************************** @@ -255,8 +280,8 @@ static HRESULT WINAPI ClassMoniker_BindT REFIID riid, VOID** ppvResult) { - FIXME("(%p,%p,%p,%p)\n",pbc, pmkToLeft, riid, ppvResult); - return E_NOTIMPL; + TRACE("(%p,%p,%p,%p)\n",pbc, pmkToLeft, riid, ppvResult); + return ClassMoniker_BindToObject(iface, pbc, pmkToLeft, riid, ppvResult); }
/****************************************************************************** @@ -424,8 +449,9 @@ static HRESULT WINAPI ClassMoniker_IsRun IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning) { - FIXME("(%p, %p, %p)\n", pbc, pmkToLeft, pmkNewlyRunning); + TRACE("(%p, %p, %p)\n", pbc, pmkToLeft, pmkNewlyRunning);
+ /* as in native */ return E_NOTIMPL; }
@@ -437,8 +463,9 @@ static HRESULT WINAPI ClassMoniker_GetTi IMoniker* pmkToLeft, FILETIME* pItemTime) { - FIXME("(%p, %p, %p)\n", pbc, pmkToLeft, pItemTime); - return E_NOTIMPL; + TRACE("(%p, %p, %p)\n", pbc, pmkToLeft, pItemTime); + + return MK_E_UNAVAILABLE; }
/****************************************************************************** @@ -463,18 +490,25 @@ static HRESULT WINAPI ClassMoniker_Commo
TRACE("(%p, %p)\n", pmkOther, ppmkPrefix);
+ *ppmkPrefix = NULL; + IMoniker_IsSystemMoniker(pmkOther, &mkSys);
/* If the other moniker is an class moniker that is equal to this moniker, this method sets *ppmkPrefix */ /* to this moniker and returns MK_S_US */
- if((mkSys == MKSYS_CLASSMONIKER) && (IMoniker_IsEqual(iface, pmkOther) == S_OK) ){ - - *ppmkPrefix = iface; + if (mkSys == MKSYS_CLASSMONIKER) + { + if (IMoniker_IsEqual(iface, pmkOther) == S_OK) + { + *ppmkPrefix = iface;
- IMoniker_AddRef(iface); + IMoniker_AddRef(iface);
- return MK_S_US; + return MK_S_US; + } + else + return MK_E_NOPREFIX; } else /* otherwise, the method calls the MonikerCommonPrefixWith function. This function correctly handles */ diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c index 14dcda3..6ae8cf1 100644 --- a/dlls/ole32/tests/moniker.c +++ b/dlls/ole32/tests/moniker.c @@ -523,16 +523,13 @@ static void test_class_moniker(void) ok(hr == E_NOTIMPL, "IMoniker_IsRunning should return E_NOTIMPL, not 0x%08lx\n", hr);
hr = IMoniker_GetTimeOfLastChange(moniker, bindctx, NULL, &filetime); - todo_wine ok(hr == MK_E_UNAVAILABLE, "IMoniker_GetTimeOfLastChange should return MK_E_UNAVAILABLE, not 0x%08lx\n", hr);
hr = IMoniker_BindToObject(moniker, bindctx, NULL, &IID_IUnknown, (void **)&unknown); - todo_wine ok_ole_success(hr, IMoniker_BindToStorage); IUnknown_Release(unknown);
hr = IMoniker_BindToStorage(moniker, bindctx, NULL, &IID_IUnknown, (void **)&unknown); - todo_wine ok_ole_success(hr, IMoniker_BindToStorage); IUnknown_Release(unknown);