Jacek Caban : mshtml: Added IOleContainer::EnumObjects implementation.

Alexandre Julliard julliard at winehq.org
Thu Jan 19 14:56:54 CST 2012


Module: wine
Branch: master
Commit: 3b80784b63f4ad72f077c44a79b6b8b3bd1b1b1b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3b80784b63f4ad72f077c44a79b6b8b3bd1b1b1b

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jan 19 17:03:37 2012 +0100

mshtml: Added IOleContainer::EnumObjects implementation.

---

 dlls/mshtml/oleobj.c |  111 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 109 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c
index 9f3d75a..261eda3 100644
--- a/dlls/mshtml/oleobj.c
+++ b/dlls/mshtml/oleobj.c
@@ -40,6 +40,102 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
 #define DOCHOST_DOCCANNAVIGATE  0
 
+typedef struct {
+    IEnumUnknown IEnumUnknown_iface;
+    LONG ref;
+} EnumUnknown;
+
+static inline EnumUnknown *impl_from_IEnumUnknown(IEnumUnknown *iface)
+{
+    return CONTAINING_RECORD(iface, EnumUnknown, IEnumUnknown_iface);
+}
+
+static HRESULT WINAPI EnumUnknown_QueryInterface(IEnumUnknown *iface, REFIID riid, void **ppv)
+{
+    EnumUnknown *This = impl_from_IEnumUnknown(iface);
+
+    if(IsEqualGUID(&IID_IUnknown, riid)) {
+        TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
+        *ppv = &This->IEnumUnknown_iface;
+    }else if(IsEqualGUID(&IID_IEnumUnknown, riid)) {
+        TRACE("(%p)->(IID_IEnumUnknown %p)\n", This, ppv);
+        *ppv = &This->IEnumUnknown_iface;
+    }else {
+        WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+        *ppv = NULL;
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*ppv);
+    return S_OK;
+}
+
+static ULONG WINAPI EnumUnknown_AddRef(IEnumUnknown *iface)
+{
+    EnumUnknown *This = impl_from_IEnumUnknown(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI EnumUnknown_Release(IEnumUnknown *iface)
+{
+    EnumUnknown *This = impl_from_IEnumUnknown(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if(!ref)
+        heap_free(This);
+
+    return ref;
+}
+
+static HRESULT WINAPI EnumUnknown_Next(IEnumUnknown *iface, ULONG celt, IUnknown **rgelt, ULONG *pceltFetched)
+{
+    EnumUnknown *This = impl_from_IEnumUnknown(iface);
+
+    TRACE("(%p)->(%u %p %p)\n", This, celt, rgelt, pceltFetched);
+
+    /* FIXME: It's not clear if we should ever return something here */
+    if(pceltFetched)
+        *pceltFetched = 0;
+    return S_FALSE;
+}
+
+static HRESULT WINAPI EnumUnknown_Skip(IEnumUnknown *iface, ULONG celt)
+{
+    EnumUnknown *This = impl_from_IEnumUnknown(iface);
+    FIXME("(%p)->(%u)\n", This, celt);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI EnumUnknown_Reset(IEnumUnknown *iface)
+{
+    EnumUnknown *This = impl_from_IEnumUnknown(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI EnumUnknown_Clone(IEnumUnknown *iface, IEnumUnknown **ppenum)
+{
+    EnumUnknown *This = impl_from_IEnumUnknown(iface);
+    FIXME("(%p)->(%p)\n", This, ppenum);
+    return E_NOTIMPL;
+}
+
+static const IEnumUnknownVtbl EnumUnknownVtbl = {
+    EnumUnknown_QueryInterface,
+    EnumUnknown_AddRef,
+    EnumUnknown_Release,
+    EnumUnknown_Next,
+    EnumUnknown_Skip,
+    EnumUnknown_Reset,
+    EnumUnknown_Clone
+};
+
 /**********************************************************
  * IOleObject implementation
  */
@@ -871,8 +967,19 @@ static HRESULT WINAPI OleContainer_ParseDisplayName(IOleContainer *iface, IBindC
 static HRESULT WINAPI OleContainer_EnumObjects(IOleContainer *iface, DWORD grfFlags, IEnumUnknown **ppenum)
 {
     HTMLDocument *This = impl_from_IOleContainer(iface);
-    FIXME("(%p)->(%x %p)\n", This, grfFlags, ppenum);
-    return E_NOTIMPL;
+    EnumUnknown *ret;
+
+    TRACE("(%p)->(%x %p)\n", This, grfFlags, ppenum);
+
+    ret = heap_alloc(sizeof(*ret));
+    if(!ret)
+        return E_OUTOFMEMORY;
+
+    ret->IEnumUnknown_iface.lpVtbl = &EnumUnknownVtbl;
+    ret->ref = 1;
+
+    *ppenum = &ret->IEnumUnknown_iface;
+    return S_OK;
 }
 
 static HRESULT WINAPI OleContainer_LockContainer(IOleContainer *iface, BOOL fLock)




More information about the wine-cvs mailing list