msxml3: In IXMLElementCollection store pointer to node instead of pointer to children.
Collection should be able to track node removal from children list.
This commit is contained in:
parent
7f5cedf70a
commit
20e63dcfd1
|
@ -483,7 +483,7 @@ static void test_xmlelem_children(void)
|
||||||
length = -1;
|
length = -1;
|
||||||
hr = IXMLElementCollection_get_length(collection, &length);
|
hr = IXMLElementCollection_get_length(collection, &length);
|
||||||
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
|
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);
|
IXMLElementCollection_Release(collection);
|
||||||
|
|
||||||
hr = IXMLElement_AddRef(child);
|
hr = IXMLElement_AddRef(child);
|
||||||
|
|
|
@ -316,7 +316,7 @@ static HRESULT WINAPI xmlelem_get_children(IXMLElement *iface, IXMLElementCollec
|
||||||
if (!p)
|
if (!p)
|
||||||
return E_INVALIDARG;
|
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)
|
static LONG type_libxml_to_msxml(xmlElementType type)
|
||||||
|
@ -492,6 +492,19 @@ typedef struct _xmlelem_collection
|
||||||
xmlNodePtr current;
|
xmlNodePtr current;
|
||||||
} xmlelem_collection;
|
} 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)
|
static inline xmlelem_collection *impl_from_IXMLElementCollection(IXMLElementCollection *iface)
|
||||||
{
|
{
|
||||||
return (xmlelem_collection *)((char*)iface - FIELD_OFFSET(xmlelem_collection, lpVtbl));
|
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)
|
if (!p)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
*p = This->length;
|
*p = xmlelem_collection_updatelength(This);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -618,7 +631,7 @@ static HRESULT WINAPI xmlelem_collection_item(IXMLElementCollection *iface, VARI
|
||||||
VARIANT var2, IDispatch **ppDisp)
|
VARIANT var2, IDispatch **ppDisp)
|
||||||
{
|
{
|
||||||
xmlelem_collection *This = impl_from_IXMLElementCollection(iface);
|
xmlelem_collection *This = impl_from_IXMLElementCollection(iface);
|
||||||
xmlNodePtr ptr = This->node;
|
xmlNodePtr ptr = This->node->children;
|
||||||
int index, i;
|
int index, i;
|
||||||
|
|
||||||
TRACE("(%p, %p)\n", iface, ppDisp);
|
TRACE("(%p, %p)\n", iface, ppDisp);
|
||||||
|
@ -631,6 +644,8 @@ static HRESULT WINAPI xmlelem_collection_item(IXMLElementCollection *iface, VARI
|
||||||
index = V_I4(&var1);
|
index = V_I4(&var1);
|
||||||
if (index < 0)
|
if (index < 0)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
xmlelem_collection_updatelength(This);
|
||||||
if (index >= This->length)
|
if (index >= This->length)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
|
@ -711,7 +726,7 @@ static HRESULT WINAPI xmlelem_collection_IEnumVARIANT_Reset(
|
||||||
IEnumVARIANT *iface)
|
IEnumVARIANT *iface)
|
||||||
{
|
{
|
||||||
xmlelem_collection *This = impl_from_IEnumVARIANT(iface);
|
xmlelem_collection *This = impl_from_IEnumVARIANT(iface);
|
||||||
This->current = This->node;
|
This->current = This->node->children;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -736,13 +751,12 @@ static const struct IEnumVARIANTVtbl xmlelem_collection_IEnumVARIANTvtbl =
|
||||||
static HRESULT XMLElementCollection_create(IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj)
|
static HRESULT XMLElementCollection_create(IUnknown *pUnkOuter, xmlNodePtr node, LPVOID *ppObj)
|
||||||
{
|
{
|
||||||
xmlelem_collection *collection;
|
xmlelem_collection *collection;
|
||||||
xmlNodePtr ptr;
|
|
||||||
|
|
||||||
TRACE("(%p,%p)\n", pUnkOuter, ppObj);
|
TRACE("(%p,%p)\n", pUnkOuter, ppObj);
|
||||||
|
|
||||||
*ppObj = NULL;
|
*ppObj = NULL;
|
||||||
|
|
||||||
if (!node)
|
if (!node->children)
|
||||||
return S_FALSE;
|
return S_FALSE;
|
||||||
|
|
||||||
collection = HeapAlloc(GetProcessHeap(), 0, sizeof (*collection));
|
collection = HeapAlloc(GetProcessHeap(), 0, sizeof (*collection));
|
||||||
|
@ -754,14 +768,8 @@ static HRESULT XMLElementCollection_create(IUnknown *pUnkOuter, xmlNodePtr node,
|
||||||
collection->ref = 1;
|
collection->ref = 1;
|
||||||
collection->length = 0;
|
collection->length = 0;
|
||||||
collection->node = node;
|
collection->node = node;
|
||||||
collection->current = node;
|
collection->current = node->children;
|
||||||
|
xmlelem_collection_updatelength(collection);
|
||||||
ptr = node;
|
|
||||||
while (ptr)
|
|
||||||
{
|
|
||||||
collection->length++;
|
|
||||||
ptr = ptr->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
*ppObj = &collection->lpVtbl;
|
*ppObj = &collection->lpVtbl;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue