Jacek Caban : mshtml: Added IHTMLElementCollection:: get__newEnum implementation.
Alexandre Julliard
julliard at winehq.org
Mon Apr 21 12:36:55 CDT 2014
Module: wine
Branch: master
Commit: f7635f17b3cabf81b05ad948a107a8810a4f31ab
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f7635f17b3cabf81b05ad948a107a8810a4f31ab
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Apr 21 13:48:23 2014 +0200
mshtml: Added IHTMLElementCollection::get__newEnum implementation.
---
dlls/mshtml/htmlelemcol.c | 139 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 137 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlelemcol.c b/dlls/mshtml/htmlelemcol.c
index 102a438..e9cd1af 100644
--- a/dlls/mshtml/htmlelemcol.c
+++ b/dlls/mshtml/htmlelemcol.c
@@ -42,6 +42,15 @@ typedef struct {
} HTMLElementCollection;
typedef struct {
+ IEnumVARIANT IEnumVARIANT_iface;
+
+ LONG ref;
+
+ ULONG iter;
+ HTMLElementCollection *col;
+} HTMLElementCollectionEnum;
+
+typedef struct {
HTMLElement **buf;
DWORD len;
DWORD size;
@@ -86,6 +95,117 @@ static inline BOOL is_elem_node(nsIDOMNode *node)
return type == ELEMENT_NODE || type == COMMENT_NODE;
}
+static inline HTMLElementCollectionEnum *impl_from_IEnumVARIANT(IEnumVARIANT *iface)
+{
+ return CONTAINING_RECORD(iface, HTMLElementCollectionEnum, IEnumVARIANT_iface);
+}
+
+static HRESULT WINAPI HTMLElementCollectionEnum_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
+{
+ HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface);
+
+ if(IsEqualGUID(riid, &IID_IUnknown)) {
+ TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
+ *ppv = &This->IEnumVARIANT_iface;
+ }else if(IsEqualGUID(riid, &IID_IEnumVARIANT)) {
+ TRACE("(%p)->(IID_IEnumVARIANT %p)\n", This, ppv);
+ *ppv = &This->IEnumVARIANT_iface;
+ }else {
+ FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI HTMLElementCollectionEnum_AddRef(IEnumVARIANT *iface)
+{
+ HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface);
+ LONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) ref=%d\n", This, ref);
+
+ return ref;
+}
+
+static ULONG WINAPI HTMLElementCollectionEnum_Release(IEnumVARIANT *iface)
+{
+ HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface);
+ LONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) ref=%d\n", This, ref);
+
+ if(!ref) {
+ IHTMLElementCollection_Release(&This->col->IHTMLElementCollection_iface);
+ heap_free(This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI HTMLElementCollectionEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
+{
+ HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface);
+ ULONG fetched = 0;
+
+ TRACE("(%p)->(%d %p %p)\n", This, celt, rgVar, pCeltFetched);
+
+ while(This->iter+fetched < This->col->len && fetched < celt) {
+ V_VT(rgVar+fetched) = VT_DISPATCH;
+ V_DISPATCH(rgVar+fetched) = (IDispatch*)&This->col->elems[This->iter+fetched]->IHTMLElement_iface;
+ IDispatch_AddRef(V_DISPATCH(rgVar+fetched));
+ fetched++;
+ }
+
+ This->iter += fetched;
+ *pCeltFetched = fetched;
+ return fetched == celt ? S_OK : S_FALSE;
+}
+
+static HRESULT WINAPI HTMLElementCollectionEnum_Skip(IEnumVARIANT *iface, ULONG celt)
+{
+ HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface);
+
+ TRACE("(%p)->(%d)\n", This, celt);
+
+ if(This->iter + celt > This->col->len) {
+ This->iter = This->col->len;
+ return S_FALSE;
+ }
+
+ This->iter += celt;
+ return S_OK;
+}
+
+static HRESULT WINAPI HTMLElementCollectionEnum_Reset(IEnumVARIANT *iface)
+{
+ HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface);
+
+ TRACE("(%p)->()\n", This);
+
+ This->iter = 0;
+ return S_OK;
+}
+
+static HRESULT WINAPI HTMLElementCollectionEnum_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
+{
+ HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface);
+ FIXME("(%p)->(%p)\n", This, ppEnum);
+ return E_NOTIMPL;
+}
+
+static const IEnumVARIANTVtbl HTMLElementCollectionEnumVtbl = {
+ HTMLElementCollectionEnum_QueryInterface,
+ HTMLElementCollectionEnum_AddRef,
+ HTMLElementCollectionEnum_Release,
+ HTMLElementCollectionEnum_Next,
+ HTMLElementCollectionEnum_Skip,
+ HTMLElementCollectionEnum_Reset,
+ HTMLElementCollectionEnum_Clone
+};
+
static inline HTMLElementCollection *impl_from_IHTMLElementCollection(IHTMLElementCollection *iface)
{
return CONTAINING_RECORD(iface, HTMLElementCollection, IHTMLElementCollection_iface);
@@ -210,8 +330,23 @@ static HRESULT WINAPI HTMLElementCollection_get__newEnum(IHTMLElementCollection
IUnknown **p)
{
HTMLElementCollection *This = impl_from_IHTMLElementCollection(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ HTMLElementCollectionEnum *ret;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ ret = heap_alloc(sizeof(*ret));
+ if(!ret)
+ return E_OUTOFMEMORY;
+
+ ret->IEnumVARIANT_iface.lpVtbl = &HTMLElementCollectionEnumVtbl;
+ ret->ref = 1;
+ ret->iter = 0;
+
+ IHTMLElementCollection_AddRef(&This->IHTMLElementCollection_iface);
+ ret->col = This;
+
+ *p = (IUnknown*)&ret->IEnumVARIANT_iface;
+ return S_OK;
}
static BOOL is_elem_id(HTMLElement *elem, LPCWSTR name)
More information about the wine-cvs
mailing list