From 20e63dcfd1634352ae8d94b8f985749dc34f65f7 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 15 Jan 2010 00:16:03 +0300 Subject: [PATCH] msxml3: In IXMLElementCollection store pointer to node instead of pointer to children. Collection should be able to track node removal from children list. --- dlls/msxml3/tests/xmlelem.c | 2 +- dlls/msxml3/xmlelem.c | 36 ++++++++++++++++++++++-------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/dlls/msxml3/tests/xmlelem.c b/dlls/msxml3/tests/xmlelem.c index dec14642d4b..bcbae948414 100644 --- a/dlls/msxml3/tests/xmlelem.c +++ b/dlls/msxml3/tests/xmlelem.c @@ -483,7 +483,7 @@ static void test_xmlelem_children(void) length = -1; hr = IXMLElementCollection_get_length(collection, &length); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - todo_wine ok(length == 0, "Expected 0, got %08x\n", length); + ok(length == 0, "Expected 0, got %08x\n", length); IXMLElementCollection_Release(collection); hr = IXMLElement_AddRef(child); diff --git a/dlls/msxml3/xmlelem.c b/dlls/msxml3/xmlelem.c index 8fe24ebfb18..b96df3abf96 100644 --- a/dlls/msxml3/xmlelem.c +++ b/dlls/msxml3/xmlelem.c @@ -316,7 +316,7 @@ static HRESULT WINAPI xmlelem_get_children(IXMLElement *iface, IXMLElementCollec if (!p) return E_INVALIDARG; - return XMLElementCollection_create((IUnknown *)iface, This->node->children, (LPVOID *)p); + return XMLElementCollection_create((IUnknown *)iface, This->node, (LPVOID *)p); } static LONG type_libxml_to_msxml(xmlElementType type) @@ -492,6 +492,19 @@ typedef struct _xmlelem_collection xmlNodePtr current; } xmlelem_collection; +static inline LONG xmlelem_collection_updatelength(xmlelem_collection *collection) +{ + xmlNodePtr ptr = collection->node->children; + + collection->length = 0; + while (ptr) + { + collection->length++; + ptr = ptr->next; + } + return collection->length; +} + static inline xmlelem_collection *impl_from_IXMLElementCollection(IXMLElementCollection *iface) { return (xmlelem_collection *)((char*)iface - FIELD_OFFSET(xmlelem_collection, lpVtbl)); @@ -596,7 +609,7 @@ static HRESULT WINAPI xmlelem_collection_get_length(IXMLElementCollection *iface if (!p) return E_INVALIDARG; - *p = This->length; + *p = xmlelem_collection_updatelength(This); return S_OK; } @@ -618,7 +631,7 @@ static HRESULT WINAPI xmlelem_collection_item(IXMLElementCollection *iface, VARI VARIANT var2, IDispatch **ppDisp) { xmlelem_collection *This = impl_from_IXMLElementCollection(iface); - xmlNodePtr ptr = This->node; + xmlNodePtr ptr = This->node->children; int index, i; TRACE("(%p, %p)\n", iface, ppDisp); @@ -631,6 +644,8 @@ static HRESULT WINAPI xmlelem_collection_item(IXMLElementCollection *iface, VARI index = V_I4(&var1); if (index < 0) return E_INVALIDARG; + + xmlelem_collection_updatelength(This); if (index >= This->length) return E_FAIL; @@ -711,7 +726,7 @@ static HRESULT WINAPI xmlelem_collection_IEnumVARIANT_Reset( IEnumVARIANT *iface) { xmlelem_collection *This = impl_from_IEnumVARIANT(iface); - This->current = This->node; + This->current = This->node->children; return S_OK; } @@ -736,13 +751,12 @@ static const struct IEnumVARIANTVtbl xmlelem_collection_IEnumVARIANTvtbl = static HRESULT XMLElementCollection_create(IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj) { xmlelem_collection *collection; - xmlNodePtr ptr; TRACE("(%p,%p)\n", pUnkOuter, ppObj); *ppObj = NULL; - if (!node) + if (!node->children) return S_FALSE; collection = HeapAlloc(GetProcessHeap(), 0, sizeof (*collection)); @@ -754,14 +768,8 @@ static HRESULT XMLElementCollection_create(IUnknown *pUnkOuter, xmlNodePtr node, collection->ref = 1; collection->length = 0; collection->node = node; - collection->current = node; - - ptr = node; - while (ptr) - { - collection->length++; - ptr = ptr->next; - } + collection->current = node->children; + xmlelem_collection_updatelength(collection); *ppObj = &collection->lpVtbl;