Mercurial > hg > ucis.core
diff Xml/Socket.cs @ 0:3ab940a0c7a0
Initial commit
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 11 Sep 2012 16:28:53 +0200 |
parents | |
children | 3bfb3ee64362 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Xml/Socket.cs Tue Sep 11 16:28:53 2012 +0200 @@ -0,0 +1,197 @@ +using System; +using System.Text; +using System.IO; +using System.Xml; + +namespace UCIS.Xml { + public class XmlSocket : XmlWriter { + protected Stream pStream; + protected XmlWriter pWriter; + protected XmlReaderSettings pXMLReaderSettings;// = new XmlReaderSettings(); + + public Stream BaseStream { get { return pStream; } } + + public override XmlWriterSettings Settings { get { return WriterSettings; } } + public XmlWriterSettings WriterSettings { get; private set; } + public XmlReaderSettings ReaderSettings { get { return pXMLReaderSettings; } } + + public XmlSocket(Stream Stream, Encoding Encoding) { + WriterSettings = new XmlWriterSettings(); + WriterSettings.ConformanceLevel = ConformanceLevel.Document; + WriterSettings.NewLineHandling = NewLineHandling.Entitize; + WriterSettings.OmitXmlDeclaration = true; + WriterSettings.CheckCharacters = false; + WriterSettings.Encoding = Encoding; + WriterSettings.CloseOutput = false; + + pXMLReaderSettings = new XmlReaderSettings(); + pXMLReaderSettings.ConformanceLevel = ConformanceLevel.Document; + pXMLReaderSettings.CloseInput = true; + pXMLReaderSettings.IgnoreComments = true; + pXMLReaderSettings.IgnoreProcessingInstructions = true; + pXMLReaderSettings.IgnoreWhitespace = true; + pXMLReaderSettings.ValidationType = ValidationType.None; + pXMLReaderSettings.ValidationFlags = System.Xml.Schema.XmlSchemaValidationFlags.None; + pXMLReaderSettings.CheckCharacters = false; + + pStream = Stream; + } + public XmlSocket(Stream Stream) : this(Stream, new UTF8NoPreamble()) { } + + public virtual MemoryStream ReadRawDocument() { + MemoryStream Buffer = new MemoryStream(); + byte[] ByteBuffer = new byte[1]; + int ByteCount = 0; + while (true) { + ByteCount = pStream.Read(ByteBuffer, 0, 1); + if (ByteCount == 0) { + throw new EndOfStreamException(); + } else if (ByteBuffer[0] == 0) { + if (Buffer.Length > 0) break; + } else { + Buffer.WriteByte(ByteBuffer[0]); + } + } + Buffer.Flush(); + Buffer.Seek(0, SeekOrigin.Begin); + + return Buffer; + } + public virtual XmlDocument ReadDocument() { + MemoryStream Buffer = ReadRawDocument(); + try { + XmlDocument Doc = new XmlDocument(); + XmlReader XMLReader = XmlReader.Create(Buffer, pXMLReaderSettings); + Doc.Load(XMLReader); + XMLReader.Close(); + return Doc; + } catch (Exception ex) { + Buffer.Seek(0, SeekOrigin.Begin); + throw new IOException("Could not parse XML document: \"" + Encoding.UTF8.GetString(Buffer.ToArray()) + "\"", ex); + } + } + + protected virtual void CreateWriter() { + pWriter = XmlWriter.Create(pStream, WriterSettings); + } + protected virtual void CloseWriter() { + pWriter.Flush(); + pWriter.Close(); + pStream.WriteByte(0); + pStream.Flush(); + } + public override void Flush() { + if (pWriter != null) { + pWriter.Flush(); + } else { + pStream.Flush(); + } + } + public override void Close() { + if (pWriter != null) { + pWriter.Close(); + pWriter = null; + } + pStream.Close(); + } + + public void WriteDocument(XmlDocument Document) { + CreateWriter(); + Document.WriteTo(pWriter); + CloseWriter(); + } + + public virtual void WriteRawDocument(string data) { + byte[] Buffer = WriterSettings.Encoding.GetBytes(data); + pStream.Write(Buffer, 0, Buffer.Length); + pStream.WriteByte(0); + pStream.Flush(); + } + + public override void WriteStartDocument() { + CreateWriter(); + pWriter.WriteStartDocument(); + } + public override void WriteStartDocument(bool standalone) { + CreateWriter(); + pWriter.WriteStartDocument(standalone); + } + public override void WriteEndDocument() { + pWriter.WriteEndDocument(); + CloseWriter(); + } + public void WriteDocumentString(string localName, string value) { + WriteStartDocument(); + WriteElementString(localName, value); + WriteEndDocument(); + } + + public override System.Xml.WriteState WriteState { + get { + if (pWriter != null) { + return pWriter.WriteState; + } else { + return WriteState.Start; + } + } + } + + public override string LookupPrefix(string ns) { + return pWriter.LookupPrefix(ns); + } + public override void WriteBase64(byte[] buffer, int index, int count) { + pWriter.WriteBase64(buffer, index, count); + } + public override void WriteCData(string text) { + pWriter.WriteCData(text); + } + public override void WriteCharEntity(char ch) { + pWriter.WriteCharEntity(ch); + } + public override void WriteChars(char[] buffer, int index, int count) { + pWriter.WriteChars(buffer, index, count); + } + public override void WriteComment(string text) { + pWriter.WriteComment(text); + } + public override void WriteDocType(string name, string pubid, string sysid, string subset) { + pWriter.WriteDocType(name, pubid, sysid, subset); + } + public override void WriteEndAttribute() { + pWriter.WriteEndAttribute(); + } + public override void WriteEndElement() { + pWriter.WriteEndElement(); + } + public override void WriteEntityRef(string name) { + pWriter.WriteEntityRef(name); + } + public override void WriteFullEndElement() { + pWriter.WriteFullEndElement(); + } + public override void WriteProcessingInstruction(string name, string text) { + pWriter.WriteProcessingInstruction(name, text); + } + public override void WriteRaw(char[] buffer, int index, int count) { + pWriter.WriteRaw(buffer, index, count); + } + public override void WriteRaw(string data) { + pWriter.WriteRaw(data); + } + public override void WriteStartAttribute(string prefix, string localName, string ns) { + pWriter.WriteStartAttribute(prefix, localName, ns); + } + public override void WriteStartElement(string prefix, string localName, string ns) { + pWriter.WriteStartElement(prefix, localName, ns); + } + public override void WriteString(string text) { + pWriter.WriteString(text); + } + public override void WriteSurrogateCharEntity(char lowChar, char highChar) { + pWriter.WriteSurrogateCharEntity(lowChar, highChar); + } + public override void WriteWhitespace(string ws) { + pWriter.WriteWhitespace(ws); + } + } +}