From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlselect.c | 84 ++++++++-------------------------------- 1 file changed, 16 insertions(+), 68 deletions(-)
diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c index 97a47e38762..5e28b573930 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -530,12 +530,8 @@ struct HTMLSelectElement { };
typedef struct { - IEnumVARIANT IEnumVARIANT_iface; - - LONG ref; - + CollectionEnum colenum; ULONG iter; - HTMLSelectElement *elem; } HTMLSelectElementEnum;
static inline HTMLSelectElement *impl_from_IHTMLSelectElement(IHTMLSelectElement *iface) @@ -543,6 +539,11 @@ static inline HTMLSelectElement *impl_from_IHTMLSelectElement(IHTMLSelectElement return CONTAINING_RECORD(iface, HTMLSelectElement, IHTMLSelectElement_iface); }
+static inline HTMLSelectElement *impl_from_DispatchEx(DispatchEx *iface) +{ + return CONTAINING_RECORD(iface, HTMLSelectElement, element.node.event_target.dispex); +} + static HRESULT htmlselect_item(HTMLSelectElement *This, int i, IDispatch **ret) { nsIDOMHTMLOptionsCollection *nscol; @@ -580,57 +581,13 @@ static HRESULT htmlselect_item(HTMLSelectElement *This, int i, IDispatch **ret)
static inline HTMLSelectElementEnum *impl_from_IEnumVARIANT(IEnumVARIANT *iface) { - return CONTAINING_RECORD(iface, HTMLSelectElementEnum, IEnumVARIANT_iface); -} - -static HRESULT WINAPI HTMLSelectElementEnum_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv) -{ - HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); - - TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - - if(IsEqualGUID(riid, &IID_IUnknown)) { - *ppv = &This->IEnumVARIANT_iface; - }else if(IsEqualGUID(riid, &IID_IEnumVARIANT)) { - *ppv = &This->IEnumVARIANT_iface; - }else { - FIXME("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - *ppv = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; -} - -static ULONG WINAPI HTMLSelectElementEnum_AddRef(IEnumVARIANT *iface) -{ - HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; -} - -static ULONG WINAPI HTMLSelectElementEnum_Release(IEnumVARIANT *iface) -{ - HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - if(!ref) { - IHTMLSelectElement_Release(&This->elem->IHTMLSelectElement_iface); - free(This); - } - - return ref; + return CONTAINING_RECORD(iface, HTMLSelectElementEnum, colenum.IEnumVARIANT_iface); }
static HRESULT WINAPI HTMLSelectElementEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) { HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); + HTMLSelectElement *elem = impl_from_DispatchEx(This->colenum.disp); nsresult nsres; HRESULT hres; ULONG num, i; @@ -638,13 +595,13 @@ static HRESULT WINAPI HTMLSelectElementEnum_Next(IEnumVARIANT *iface, ULONG celt
TRACE("(%p)->(%lu %p %p)\n", This, celt, rgVar, pCeltFetched);
- nsres = nsIDOMHTMLSelectElement_GetLength(This->elem->nsselect, &len); + nsres = nsIDOMHTMLSelectElement_GetLength(elem->nsselect, &len); if(NS_FAILED(nsres)) return E_FAIL; num = min(len - This->iter, celt);
for(i = 0; i < num; i++) { - hres = htmlselect_item(This->elem, This->iter + i, &V_DISPATCH(&rgVar[i])); + hres = htmlselect_item(elem, This->iter + i, &V_DISPATCH(&rgVar[i])); if(FAILED(hres)) { while(i--) VariantClear(&rgVar[i]); @@ -662,12 +619,13 @@ static HRESULT WINAPI HTMLSelectElementEnum_Next(IEnumVARIANT *iface, ULONG celt static HRESULT WINAPI HTMLSelectElementEnum_Skip(IEnumVARIANT *iface, ULONG celt) { HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); + HTMLSelectElement *elem = impl_from_DispatchEx(This->colenum.disp); nsresult nsres; UINT32 len;
TRACE("(%p)->(%lu)\n", This, celt);
- nsres = nsIDOMHTMLSelectElement_GetLength(This->elem->nsselect, &len); + nsres = nsIDOMHTMLSelectElement_GetLength(elem->nsselect, &len); if(NS_FAILED(nsres)) return E_FAIL;
@@ -698,9 +656,9 @@ static HRESULT WINAPI HTMLSelectElementEnum_Clone(IEnumVARIANT *iface, IEnumVARI }
static const IEnumVARIANTVtbl HTMLSelectElementEnumVtbl = { - HTMLSelectElementEnum_QueryInterface, - HTMLSelectElementEnum_AddRef, - HTMLSelectElementEnum_Release, + CollectionEnum_QueryInterface, + CollectionEnum_AddRef, + CollectionEnum_Release, HTMLSelectElementEnum_Next, HTMLSelectElementEnum_Skip, HTMLSelectElementEnum_Reset, @@ -1063,14 +1021,9 @@ static HRESULT WINAPI HTMLSelectElement_get__newEnum(IHTMLSelectElement *iface, if(!ret) return E_OUTOFMEMORY;
- ret->IEnumVARIANT_iface.lpVtbl = &HTMLSelectElementEnumVtbl; - ret->ref = 1; ret->iter = 0;
- HTMLSelectElement_AddRef(&This->IHTMLSelectElement_iface); - ret->elem = This; - - *p = (IUnknown*)&ret->IEnumVARIANT_iface; + *p = CollectionEnum_init(&ret->colenum, &This->element.node.event_target.dispex, &HTMLSelectElementEnumVtbl); return S_OK; }
@@ -1154,11 +1107,6 @@ static HRESULT HTMLSelectElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BO return IHTMLSelectElement_get_disabled(&This->IHTMLSelectElement_iface, p); }
-static inline HTMLSelectElement *impl_from_DispatchEx(DispatchEx *iface) -{ - return CONTAINING_RECORD(iface, HTMLSelectElement, element.node.event_target.dispex); -} - static void *HTMLSelectElement_query_interface(DispatchEx *dispex, REFIID riid) { HTMLSelectElement *This = impl_from_DispatchEx(dispex);