static HRESULT WINAPI xmlelem_collection_item(IXMLElementCollection *iface, VARIANT var1, VARIANT var2, IDispatch **ppDisp) { xmlelem_collection *This = impl_from_IXMLElementCollection(iface); xmlNodePtr ptr = This->node; int index, i; TRACE("(%p, %p)\n", iface, ppDisp); if (!ppDisp) return E_INVALIDARG; *ppDisp = NULL; index = V_I4(&var1); if (index < 0) return E_INVALIDARG; if (index >= This->length) return E_FAIL; for (i = 0; i < index; i++) ptr = ptr->next; return XMLElement_create((IUnknown *)iface, ptr, (LPVOID *)ppDisp); }
static HRESULT WINAPI xmlelem_collection_IEnumVARIANT_Next( IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *fetched) { xmlelem_collection *This = impl_from_IEnumVARIANT(iface); xmlNodePtr ptr = This->current; TRACE("(%p)->(%d %p %p)\n", This, celt, rgVar, fetched); if (!rgVar) return E_INVALIDARG; /* FIXME: handle celt */ if (fetched) *fetched = 1; if (This->current) This->current = This->current->next; else { V_VT(rgVar) = VT_EMPTY; if (fetched) *fetched = 0; return S_FALSE; } V_VT(rgVar) = VT_DISPATCH; return XMLElement_create(ptr, (LPVOID *)&V_DISPATCH(rgVar), FALSE); }
static HRESULT WINAPI xmlelem_collection_item(IXMLElementCollection *iface, VARIANT var1, VARIANT var2, IDispatch **ppDisp) { xmlelem_collection *This = impl_from_IXMLElementCollection(iface); xmlNodePtr ptr = This->node->children; int index, i; TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&var1), debugstr_variant(&var2), ppDisp); if (!ppDisp) return E_INVALIDARG; *ppDisp = NULL; index = V_I4(&var1); if (index < 0) return E_INVALIDARG; xmlelem_collection_updatelength(This); if (index >= This->length) return E_FAIL; for (i = 0; i < index; i++) ptr = ptr->next; return XMLElement_create(ptr, (LPVOID *)ppDisp, FALSE); }
static HRESULT WINAPI xmldoc_createElement(IXMLDocument *iface, VARIANT vType, VARIANT var1, IXMLElement **ppElem) { xmlNodePtr node; static const xmlChar empty[] = "\0"; TRACE("(%p)->(%s %s %p)\n", iface, debugstr_variant(&vType), debugstr_variant(&var1), ppElem); if (!ppElem) return E_INVALIDARG; *ppElem = NULL; if (V_VT(&vType) != VT_I4) return E_INVALIDARG; if(type_msxml_to_libxml(V_I4(&vType)) == -1) return E_NOTIMPL; node = xmlNewNode(NULL, empty); node->type = type_msxml_to_libxml(V_I4(&vType)); /* FIXME: create xmlNodePtr based on vType and var1 */ return XMLElement_create((IUnknown *)iface, node, (LPVOID *)ppElem, TRUE); }
static HRESULT WINAPI xmlelem_get_parent(IXMLElement *iface, IXMLElement **parent) { xmlelem *This = impl_from_IXMLElement(iface); TRACE("(%p, %p)\n", iface, parent); if (!parent) return E_INVALIDARG; *parent = NULL; if (!This->node->parent) return S_FALSE; return XMLElement_create((IUnknown *)iface, This->node->parent, (LPVOID *)parent); }
static HRESULT WINAPI xmldoc_get_root(IXMLDocument *iface, IXMLElement **p) { xmldoc *This = impl_from_IXMLDocument(iface); xmlNodePtr root; TRACE("(%p, %p)\n", iface, p); if (!p) return E_INVALIDARG; *p = NULL; if (!(root = xmlDocGetRootElement(This->xmldoc))) return E_FAIL; return XMLElement_create((IUnknown *)This, root, (LPVOID *)p, FALSE); }
static HRESULT WINAPI xmlelem_collection_IEnumVARIANT_Next( IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) { xmlelem_collection *This = impl_from_IEnumVARIANT(iface); xmlNodePtr ptr = This->current; TRACE("(%p, %d, %p, %p)\n", iface, celt, rgVar, pCeltFetched); if (!rgVar) return E_INVALIDARG; /* FIXME: handle celt */ if (pCeltFetched) *pCeltFetched = 1; This->current = This->current->next; V_VT(rgVar) = VT_DISPATCH; return XMLElement_create((IUnknown *)iface, ptr, (LPVOID *)&V_DISPATCH(rgVar)); }