static HRESULT WINAPI dom_pi_removeChild( IXMLDOMProcessingInstruction *iface, IXMLDOMNode* domNode, IXMLDOMNode** oldNode) { dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); return IXMLDOMNode_removeChild( This->node, domNode, oldNode ); }
static HRESULT WINAPI domtext_removeChild( IXMLDOMText *iface, IXMLDOMNode* domNode, IXMLDOMNode** oldNode) { domtext *This = impl_from_IXMLDOMText( iface ); return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(&This->node), domNode, oldNode ); }
static HRESULT WINAPI entityref_removeChild( IXMLDOMEntityReference *iface, IXMLDOMNode* domNode, IXMLDOMNode** oldNode) { entityref *This = impl_from_IXMLDOMEntityReference( iface ); return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(&This->node), domNode, oldNode ); }
static HRESULT WINAPI domcdata_removeChild( IXMLDOMCDATASection *iface, IXMLDOMNode* domNode, IXMLDOMNode** oldNode) { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(&This->node), domNode, oldNode ); }
static HRESULT WINAPI domcomment_removeChild( IXMLDOMComment *iface, IXMLDOMNode* domNode, IXMLDOMNode** oldNode) { domcomment *This = impl_from_IXMLDOMComment( iface ); return IXMLDOMNode_removeChild( This->node, domNode, oldNode ); }
static HRESULT WINAPI domattr_removeChild( IXMLDOMAttribute *iface, IXMLDOMNode* domNode, IXMLDOMNode** oldNode) { domattr *This = impl_from_IXMLDOMAttribute( iface ); return IXMLDOMNode_removeChild( This->node, domNode, oldNode ); }
HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT *ref_child, IXMLDOMNode **ret) { IXMLDOMNode *before = NULL; xmlnode *node_obj; int refcount = 0; xmlDocPtr doc; HRESULT hr; if(!new_child) return E_INVALIDARG; node_obj = get_node_obj(new_child); if(!node_obj) return E_FAIL; switch(V_VT(ref_child)) { case VT_EMPTY: case VT_NULL: break; case VT_UNKNOWN: case VT_DISPATCH: if (V_UNKNOWN(ref_child)) { hr = IUnknown_QueryInterface(V_UNKNOWN(ref_child), &IID_IXMLDOMNode, (void**)&before); if(FAILED(hr)) return hr; } break; default: FIXME("refChild var type %x\n", V_VT(ref_child)); return E_FAIL; } TRACE("new child %p, This->node %p\n", node_obj->node, This->node); if(!node_obj->node->parent) if(xmldoc_remove_orphan(node_obj->node->doc, node_obj->node) != S_OK) WARN("%p is not an orphan of %p\n", node_obj->node, node_obj->node->doc); refcount = xmlnode_get_inst_cnt(node_obj); if(before) { xmlnode *before_node_obj = get_node_obj(before); IXMLDOMNode_Release(before); if(!before_node_obj) return E_FAIL; /* unlink from current parent first */ if(node_obj->parent) { hr = IXMLDOMNode_removeChild(node_obj->parent, node_obj->iface, NULL); if (hr == S_OK) xmldoc_remove_orphan(node_obj->node->doc, node_obj->node); } doc = node_obj->node->doc; /* refs count including subtree */ if (doc != before_node_obj->node->doc) refcount = xmlnode_get_inst_cnt(node_obj); if (refcount) xmldoc_add_refs(before_node_obj->node->doc, refcount); xmlAddPrevSibling(before_node_obj->node, node_obj->node); if (refcount) xmldoc_release_refs(doc, refcount); node_obj->parent = This->parent; } else { /* unlink from current parent first */ if(node_obj->parent) { hr = IXMLDOMNode_removeChild(node_obj->parent, node_obj->iface, NULL); if (hr == S_OK) xmldoc_remove_orphan(node_obj->node->doc, node_obj->node); } doc = node_obj->node->doc; if (doc != This->node->doc) refcount = xmlnode_get_inst_cnt(node_obj); if (refcount) xmldoc_add_refs(This->node->doc, refcount); /* xmlAddChild doesn't unlink node from previous parent */ xmlUnlinkNode(node_obj->node); xmlAddChild(This->node, node_obj->node); if (refcount) xmldoc_release_refs(doc, refcount); node_obj->parent = This->iface; } if(ret) { IXMLDOMNode_AddRef(new_child); *ret = new_child; } TRACE("ret S_OK\n"); return S_OK; }