internal static XmlNode GetCached(IntPtr ptr) { XmlNode retval=null; #if DEBUG if(!XmlNodeCache.IsCached(ptr)) { throw new Exception("Node not registered ..."); } #endif //retval=(XmlNode)(Native._xmlNodeGetCached(ptr)); retval = new XmlNode(Native._xmlNodeGetCached(ptr)); return retval; }
public XmlNode AddChild(XmlNode child) { // clear the cache as this /might/ be freed ! // I ain't taking no chances. (wild wild west) if(this.GetFirstChild()!=null) { throw new Exception("Cannot add more that one child to a XmlDoc"); } if(child.ElementType==XmlElementType.XML_TEXT_NODE) XmlNodeCache.Uncache(child.DeSerialize()); IntPtr retval=Native._xmlAddChild(dataPtr,child.DeSerialize()); if(retval == IntPtr.Zero) { throw new Exception("New node Could not be linked in !"); } return XmlNodeFactory.NewNode(retval); }
public XmlNode AddChild(XmlNode child) { if(child.ElementType == XmlElementType.XML_DOCUMENT_NODE) { throw new Exception("Document nodes cannot be added anywhere !"); } // clear the cache as this /might/ be freed ! // I don't take no chances. (wild wild west) if(child.ElementType == XmlElementType.XML_TEXT_NODE) XmlNodeCache.Uncache(child.DeSerialize()); IntPtr retval=Native._xmlAddChild(dataPtr,child.DeSerialize()); if(retval == IntPtr.Zero) { throw new Exception("New node Could not be linked in !"); } return XmlNodeFactory.NewNode(retval); }
public static XmlNode NewNode(IntPtr ptr) { XmlNode retval; /* * TODO: find a way to debug .... * * Also fix pnet's switch bug so that this works ! * try #define INCLUDE_TODO and running this */ if(ptr==IntPtr.Zero) { return null; //should I throw an exception here ? } if(XmlNodeCache.IsCached(ptr)) { return XmlNodeCache.GetCached(ptr); } /* * I wish I could write macros for the following code :( * identical code .... yuck ! */ switch(Native._xmlNodeGetElementType(ptr)) { case XmlElementType.XML_ELEMENT_UNDEF: throw new Exception("Impossible !"); break; case XmlElementType.XML_ELEMENT_NODE: retval=new XmlElement(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; case XmlElementType.XML_ATTRIBUTE_NODE: retval=new XmlAttr(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; case XmlElementType.XML_TEXT_NODE: retval=new XmlText(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; case XmlElementType.XML_CDATA_SECTION_NODE: retval=new XmlCData(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_ENTITY_REF_NODE: goto default; /*TODO*/ case XmlElementType.XML_ENTITY_NODE: goto default; case XmlElementType.XML_PI_NODE: retval=new XmlPI(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; case XmlElementType.XML_COMMENT_NODE: retval=new XmlComment(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; case XmlElementType.XML_DOCUMENT_NODE: retval=new XmlDoc(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_DOCUMENT_TYPE_NODE: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_DOCUMENT_FRAG_NODE: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_NOTATION_NODE: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_HTML_DOCUMENT_NODE: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_DTD_NODE: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_ELEMENT_DECL: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_ATTRIBUTE_DECL: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_ENTITY_DECL: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_NAMESPACE_DECL: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_XINCLUDE_START: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; /*TODO*/ case XmlElementType.XML_XINCLUDE_END: retval=new XmlNode(ptr); XmlNodeCache.Cache(ptr,retval); return retval; break; default: throw new Exception("Unexpected error !"); } //we never get here ! return null; }
internal static bool Cache(IntPtr ptr,XmlNode node) { return Native._xmlNodeCache(ptr,node.DataPtr); }