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