Robert Shearman : ole32:
Implement CompositeMonikerROTDataImpl_GetComparisonData.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon May 8 09:05:58 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 2a320dbde873bdf2825923b730df6b9b12761341
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=2a320dbde873bdf2825923b730df6b9b12761341
Author: Robert Shearman <rob at codeweavers.com>
Date: Mon May 8 12:37:25 2006 +0100
ole32: Implement CompositeMonikerROTDataImpl_GetComparisonData.
---
dlls/ole32/compositemoniker.c | 91 +++++++++++++++++++++++++++++++++++++++--
1 files changed, 86 insertions(+), 5 deletions(-)
diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c
index 0fd9fd5..778945e 100644
--- a/dlls/ole32/compositemoniker.c
+++ b/dlls/ole32/compositemoniker.c
@@ -1212,14 +1212,95 @@ static ULONG WINAPI CompositeMonikerROTD
}
/******************************************************************************
- * CompositeMonikerIROTData_GetComparaisonData
+ * CompositeMonikerIROTData_GetComparisonData
******************************************************************************/
static HRESULT WINAPI
-CompositeMonikerROTDataImpl_GetComparaisonData(IROTData* iface,
+CompositeMonikerROTDataImpl_GetComparisonData(IROTData* iface,
BYTE* pbData, ULONG cbMax, ULONG* pcbData)
{
- FIXME("(),stub!\n");
- return E_NOTIMPL;
+ IMoniker *This = impl_from_IROTData(iface);
+ IEnumMoniker *pEnumMk;
+ IMoniker *pmk;
+ HRESULT hr;
+
+ TRACE("(%p, %lu, %p)\n", pbData, cbMax, pcbData);
+
+ *pcbData = sizeof(CLSID);
+
+ hr = IMoniker_Enum(This, TRUE, &pEnumMk);
+ if (FAILED(hr)) return hr;
+
+ while(IEnumMoniker_Next(pEnumMk, 1, &pmk, NULL) == S_OK)
+ {
+ IROTData *pROTData;
+ hr = IMoniker_QueryInterface(pmk, &IID_IROTData, (void **)&pROTData);
+ if (FAILED(hr))
+ ERR("moniker doesn't support IROTData interface\n");
+
+ if (SUCCEEDED(hr))
+ {
+ ULONG cbData;
+ hr = IROTData_GetComparisonData(pROTData, NULL, 0, &cbData);
+ IROTData_Release(pROTData);
+ if (SUCCEEDED(hr) || (hr == E_OUTOFMEMORY))
+ {
+ *pcbData += cbData;
+ hr = S_OK;
+ }
+ else
+ ERR("IROTData_GetComparisonData failed with error 0x%08lx\n", hr);
+ }
+
+ IMoniker_Release(pmk);
+
+ if (FAILED(hr))
+ {
+ IEnumMoniker_Release(pEnumMk);
+ return hr;
+ }
+ }
+ if (cbMax < *pcbData)
+ return E_OUTOFMEMORY;
+
+ IEnumMoniker_Reset(pEnumMk);
+
+ memcpy(pbData, &CLSID_CompositeMoniker, sizeof(CLSID));
+ pbData += sizeof(CLSID);
+ cbMax -= sizeof(CLSID);
+
+ while (IEnumMoniker_Next(pEnumMk, 1, &pmk, NULL) == S_OK)
+ {
+ IROTData *pROTData;
+ hr = IMoniker_QueryInterface(pmk, &IID_IROTData, (void **)&pROTData);
+ if (FAILED(hr))
+ ERR("moniker doesn't support IROTData interface\n");
+
+ if (SUCCEEDED(hr))
+ {
+ ULONG cbData;
+ hr = IROTData_GetComparisonData(pROTData, pbData, cbMax, &cbData);
+ IROTData_Release(pROTData);
+ if (SUCCEEDED(hr))
+ {
+ pbData += cbData;
+ cbMax -= cbData;
+ }
+ else
+ ERR("IROTData_GetComparisonData failed with error 0x%08lx\n", hr);
+ }
+
+ IMoniker_Release(pmk);
+
+ if (FAILED(hr))
+ {
+ IEnumMoniker_Release(pEnumMk);
+ return hr;
+ }
+ }
+
+ IEnumMoniker_Release(pEnumMk);
+
+ return S_OK;
}
/******************************************************************************
@@ -1458,7 +1539,7 @@ static const IROTDataVtbl VT_ROTDataImpl
CompositeMonikerROTDataImpl_QueryInterface,
CompositeMonikerROTDataImpl_AddRef,
CompositeMonikerROTDataImpl_Release,
- CompositeMonikerROTDataImpl_GetComparaisonData
+ CompositeMonikerROTDataImpl_GetComparisonData
};
/******************************************************************************
More information about the wine-cvs
mailing list