Robert Shearman : ole: Implement IEnumSTATDATA for the Ole Advise Holder.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 11 05:35:25 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 6e6d24e959edf66a5e46a9a173c7ad2b3805aeac
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=6e6d24e959edf66a5e46a9a173c7ad2b3805aeac

Author: Robert Shearman <rob at codeweavers.com>
Date:   Wed Jan 11 12:09:32 2006 +0100

ole: Implement IEnumSTATDATA for the Ole Advise Holder.
Implement IEnumSTATDATA for the Ole Advise Holder and use it to
implement the Send* functions.

---

 dlls/ole32/oleobj.c |  216 ++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 205 insertions(+), 11 deletions(-)

diff --git a/dlls/ole32/oleobj.c b/dlls/ole32/oleobj.c
index 3943aec..78e1ebc 100644
--- a/dlls/ole32/oleobj.c
+++ b/dlls/ole32/oleobj.c
@@ -50,6 +50,156 @@ typedef struct OleAdviseHolderImpl
 
 } OleAdviseHolderImpl;
 
+static HRESULT EnumOleSTATDATA_Construct(OleAdviseHolderImpl *pOleAdviseHolder, ULONG index, IEnumSTATDATA **ppenum);
+
+typedef struct
+{
+    const IEnumSTATDATAVtbl *lpvtbl;
+    LONG ref;
+
+    ULONG index;
+    OleAdviseHolderImpl *pOleAdviseHolder;
+} EnumOleSTATDATA;
+
+static HRESULT WINAPI EnumOleSTATDATA_QueryInterface(
+    IEnumSTATDATA *iface, REFIID riid, void **ppv)
+{
+    TRACE("(%s, %p)\n", debugstr_guid(riid), ppv);
+    if (IsEqualIID(riid, &IID_IUnknown) ||
+        IsEqualIID(riid, &IID_IEnumSTATDATA))
+    {
+        IUnknown_AddRef(iface);
+        *ppv = iface;
+        return S_OK;
+    }
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI EnumOleSTATDATA_AddRef(
+    IEnumSTATDATA *iface)
+{
+    EnumOleSTATDATA *This = (EnumOleSTATDATA *)iface;
+    TRACE("()\n");
+    return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI EnumOleSTATDATA_Release(
+    IEnumSTATDATA *iface)
+{
+    EnumOleSTATDATA *This = (EnumOleSTATDATA *)iface;
+    LONG refs = InterlockedDecrement(&This->ref);
+    TRACE("()\n");
+    if (!refs)
+    {
+        IOleAdviseHolder_Release((IOleAdviseHolder *)This->pOleAdviseHolder);
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+    return refs;
+}
+
+static HRESULT WINAPI EnumOleSTATDATA_Next(
+    IEnumSTATDATA *iface, ULONG celt, LPSTATDATA rgelt,
+    ULONG *pceltFetched)
+{
+    EnumOleSTATDATA *This = (EnumOleSTATDATA *)iface;
+    HRESULT hr = S_OK;
+
+    TRACE("(%ld, %p, %p)\n", celt, rgelt, pceltFetched);
+
+    if (pceltFetched)
+        *pceltFetched = 0;
+
+    for (; celt; celt--, rgelt++)
+    {
+        while ((This->index < This->pOleAdviseHolder->maxSinks) && 
+               !This->pOleAdviseHolder->arrayOfSinks[This->index])
+        {
+            This->index++;
+        }
+        if (This->index >= This->pOleAdviseHolder->maxSinks)
+        {
+            hr = S_FALSE;
+            break;
+        }
+
+        memset(&rgelt->formatetc, 0, sizeof(rgelt->formatetc));
+        rgelt->advf = 0;
+        rgelt->pAdvSink = This->pOleAdviseHolder->arrayOfSinks[This->index];
+        IAdviseSink_AddRef(rgelt->pAdvSink);
+        rgelt->dwConnection = This->index;
+
+        if (pceltFetched)
+            *pceltFetched++;
+        This->index++;
+    }
+    return hr;
+}
+
+static HRESULT WINAPI EnumOleSTATDATA_Skip(
+    IEnumSTATDATA *iface, ULONG celt)
+{
+    EnumOleSTATDATA *This = (EnumOleSTATDATA *)iface;
+
+    TRACE("(%ld)\n", celt);
+
+    for (; celt; celt--)
+    {
+        while ((This->index < This->pOleAdviseHolder->maxSinks) && 
+               !This->pOleAdviseHolder->arrayOfSinks[This->index])
+        {
+            This->index++;
+        }
+        if (This->index >= This->pOleAdviseHolder->maxSinks)
+            return S_FALSE;
+        This->index++;
+    }
+    return S_OK;
+}
+
+static HRESULT WINAPI EnumOleSTATDATA_Reset(
+    IEnumSTATDATA *iface)
+{
+    EnumOleSTATDATA *This = (EnumOleSTATDATA *)iface;
+
+    TRACE("()\n");
+
+    This->index = 0;
+    return S_OK;
+}
+
+static HRESULT WINAPI EnumOleSTATDATA_Clone(
+    IEnumSTATDATA *iface,
+    IEnumSTATDATA **ppenum)
+{
+    EnumOleSTATDATA *This = (EnumOleSTATDATA *)iface;
+    return EnumOleSTATDATA_Construct(This->pOleAdviseHolder, This->index, ppenum);
+}
+
+static const IEnumSTATDATAVtbl EnumOleSTATDATA_VTable =
+{
+    EnumOleSTATDATA_QueryInterface,
+    EnumOleSTATDATA_AddRef,
+    EnumOleSTATDATA_Release,
+    EnumOleSTATDATA_Next,
+    EnumOleSTATDATA_Skip,
+    EnumOleSTATDATA_Reset,
+    EnumOleSTATDATA_Clone
+};
+
+static HRESULT EnumOleSTATDATA_Construct(OleAdviseHolderImpl *pOleAdviseHolder, ULONG index, IEnumSTATDATA **ppenum)
+{
+    EnumOleSTATDATA *This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
+    if (!This)
+        return E_OUTOFMEMORY;
+    This->lpvtbl = &EnumOleSTATDATA_VTable;
+    This->ref = 1;
+    This->index = index;
+    This->pOleAdviseHolder = pOleAdviseHolder;
+    IOleAdviseHolder_AddRef((IOleAdviseHolder *)pOleAdviseHolder);
+    *ppenum = (IEnumSTATDATA *)&This->lpvtbl;
+    return S_OK;    
+}
+
 /**************************************************************************
  *  OleAdviseHolderImpl_Destructor
  */
@@ -258,11 +408,12 @@ static HRESULT WINAPI
 OleAdviseHolderImpl_EnumAdvise (LPOLEADVISEHOLDER iface, IEnumSTATDATA **ppenumAdvise)
 {
     OleAdviseHolderImpl *This = (OleAdviseHolderImpl *)iface;
-    FIXME("(%p)->(%p)\n", This, ppenumAdvise);
+
+    TRACE("(%p)->(%p)\n", This, ppenumAdvise);
 
     *ppenumAdvise = NULL;
 
-    return S_OK;
+    return EnumOleSTATDATA_Construct(This, 0, ppenumAdvise);
 }
 
 /******************************************************************************
@@ -271,11 +422,25 @@ OleAdviseHolderImpl_EnumAdvise (LPOLEADV
 static HRESULT WINAPI
 OleAdviseHolderImpl_SendOnRename (LPOLEADVISEHOLDER iface, IMoniker *pmk)
 {
-    OleAdviseHolderImpl *This = (OleAdviseHolderImpl *)iface;
-    FIXME("(%p)->(%p)\n", This, pmk);
+    IEnumSTATDATA *pEnum;
+    HRESULT hr;
 
+    TRACE("(%p)->(%p)\n", iface, pmk);
 
-    return S_OK;
+    hr = IOleAdviseHolder_EnumAdvise(iface, &pEnum);
+    if (SUCCEEDED(hr))
+    {
+        STATDATA statdata;
+        while (IEnumSTATDATA_Next(pEnum, 1, &statdata, NULL) == S_OK)
+        {
+            IAdviseSink_OnRename(statdata.pAdvSink, pmk);
+
+            IAdviseSink_Release(statdata.pAdvSink);
+        }
+        IEnumSTATDATA_Release(pEnum);
+    }
+
+    return hr;
 }
 
 /******************************************************************************
@@ -284,10 +449,25 @@ OleAdviseHolderImpl_SendOnRename (LPOLEA
 static HRESULT WINAPI
 OleAdviseHolderImpl_SendOnSave (LPOLEADVISEHOLDER iface)
 {
-    OleAdviseHolderImpl *This = (OleAdviseHolderImpl *)iface;
-    FIXME("(%p)\n", This);
+    IEnumSTATDATA *pEnum;
+    HRESULT hr;
 
-    return S_OK;
+    TRACE("(%p)->()\n", iface);
+
+    hr = IOleAdviseHolder_EnumAdvise(iface, &pEnum);
+    if (SUCCEEDED(hr))
+    {
+        STATDATA statdata;
+        while (IEnumSTATDATA_Next(pEnum, 1, &statdata, NULL) == S_OK)
+        {
+            IAdviseSink_OnSave(statdata.pAdvSink);
+
+            IAdviseSink_Release(statdata.pAdvSink);
+        }
+        IEnumSTATDATA_Release(pEnum);
+    }
+
+    return hr;
 }
 
 /******************************************************************************
@@ -296,11 +476,25 @@ OleAdviseHolderImpl_SendOnSave (LPOLEADV
 static HRESULT WINAPI
 OleAdviseHolderImpl_SendOnClose (LPOLEADVISEHOLDER iface)
 {
-    OleAdviseHolderImpl *This = (OleAdviseHolderImpl *)iface;
-    FIXME("(%p)\n", This);
+    IEnumSTATDATA *pEnum;
+    HRESULT hr;
 
+    TRACE("(%p)->()\n", iface);
 
-    return S_OK;
+    hr = IOleAdviseHolder_EnumAdvise(iface, &pEnum);
+    if (SUCCEEDED(hr))
+    {
+        STATDATA statdata;
+        while (IEnumSTATDATA_Next(pEnum, 1, &statdata, NULL) == S_OK)
+        {
+            IAdviseSink_OnClose(statdata.pAdvSink);
+
+            IAdviseSink_Release(statdata.pAdvSink);
+        }
+        IEnumSTATDATA_Release(pEnum);
+    }
+
+    return hr;
 }
 
 /**************************************************************************




More information about the wine-cvs mailing list