using System; using System.Collections; using System.Collections.Generic; namespace System.Xml { internal class XmlSimpleDictionaryReader : XmlDictionaryReader, IXmlLineInfo, IXmlNamespaceResolver { XmlDictionary dict; XmlReader reader; XmlDictionaryReader as_dict_reader; IXmlLineInfo as_line_info; OnXmlDictionaryReaderClose onClose; public XmlSimpleDictionaryReader (XmlReader reader) : this (reader, null) { } public XmlSimpleDictionaryReader (XmlReader reader, XmlDictionary dictionary) : this (reader, dictionary, null) { } public XmlSimpleDictionaryReader (XmlReader reader, XmlDictionary dictionary, OnXmlDictionaryReaderClose onClose) { this.reader = reader; this.onClose = onClose; as_line_info = reader as IXmlLineInfo; as_dict_reader = reader as XmlDictionaryReader; if (dictionary == null) dictionary = new XmlDictionary (); dict = dictionary; } #region IXmlLineInfo public int LineNumber { get { return as_line_info != null ? as_line_info.LineNumber : 0; } } public int LinePosition { get { return as_line_info != null ? as_line_info.LinePosition : 0; } } public bool HasLineInfo () { return as_line_info != null ? as_line_info.HasLineInfo () : false; } #endregion #region XmlDictionaryReader public override bool CanCanonicalize { get { return as_dict_reader != null ? as_dict_reader.CanCanonicalize : false; } } public override void EndCanonicalization () { if (as_dict_reader != null) as_dict_reader.EndCanonicalization (); else throw new NotSupportedException (); } // no need to override for GetAttribute(), IndexOfLocalName(), // IsLocalName(), IsNamespaceUri(), IsStartElement() public override bool TryGetLocalNameAsDictionaryString ( out XmlDictionaryString localName) { // FIXME: find out when it returns true. localName = null; return false; // if (!dict.TryLookup (LocalName, out localName)) // return false; // return true; } public override bool TryGetNamespaceUriAsDictionaryString ( out XmlDictionaryString namespaceUri) { // FIXME: find out when it returns true. namespaceUri = null; return false; // if (!dict.TryLookup (NamespaceURI, out namespaceUri)) // return false; // return true; } #endregion #region IXmlNamespaceResolver public IDictionary GetNamespacesInScope ( XmlNamespaceScope scope) { IXmlNamespaceResolver nsr = reader as IXmlNamespaceResolver; return nsr.GetNamespacesInScope (scope); } public string LookupPrefix (string ns) { IXmlNamespaceResolver nsr = reader as IXmlNamespaceResolver; return nsr.LookupPrefix (NameTable.Get (ns)); } #endregion #region XmlReader public override int AttributeCount { get { return reader.AttributeCount; } } public override string BaseURI { get { return reader.BaseURI; } } public override int Depth { get { return reader.Depth; } } public override XmlNodeType NodeType { get { return reader.NodeType; } } public override string Name { get { return reader.Name; } } public override string LocalName { get { return reader.LocalName; } } public override string NamespaceURI { get { return reader.NamespaceURI; } } public override string Prefix { get { return reader.Prefix; } } public override bool HasValue { get { return reader.HasValue; } } public override string Value { get { return reader.Value; } } public override bool IsEmptyElement { get { return reader.IsEmptyElement; } } public override bool IsDefault { get { return reader.IsDefault; } } public override char QuoteChar { get { return reader.QuoteChar; } } public override string XmlLang { get { return reader.XmlLang; } } public override XmlSpace XmlSpace { get { return reader.XmlSpace; } } public override string this [int i] { get { return reader [i]; } } public override string this [string name] { get { return reader [name]; } } public override string this [string localName, string namespaceURI] { get { return reader [localName, namespaceURI]; } } public override bool EOF { get { return reader.EOF; } } public override ReadState ReadState { get { return reader.ReadState; } } public override XmlNameTable NameTable { get { return reader.NameTable; } } public override string GetAttribute (string name) { return reader.GetAttribute (name); } public override string GetAttribute (string localName, string namespaceURI) { return reader.GetAttribute (localName, namespaceURI); } public override string GetAttribute (int i) { return reader.GetAttribute (i); } public override bool MoveToAttribute (string name) { return reader.MoveToAttribute (name); } public override bool MoveToAttribute (string localName, string namespaceURI) { return reader.MoveToAttribute (localName, namespaceURI); } public override void MoveToAttribute (int i) { reader.MoveToAttribute (i); } public override bool MoveToFirstAttribute () { return reader.MoveToFirstAttribute (); } public override bool MoveToNextAttribute () { return reader.MoveToNextAttribute (); } public override bool MoveToElement () { return reader.MoveToElement (); } public override void Close () { reader.Close (); if (onClose != null) onClose (this); } public override bool Read () { if (!reader.Read ()) return false; dict.Add (reader.Prefix); dict.Add (reader.LocalName); dict.Add (reader.NamespaceURI); if (reader.MoveToFirstAttribute ()) { do { dict.Add (reader.Prefix); dict.Add (reader.LocalName); dict.Add (reader.NamespaceURI); dict.Add (reader.Value); } while (reader.MoveToNextAttribute ()); reader.MoveToElement (); } return true; } public override string ReadString () { return reader.ReadString (); } public override string ReadInnerXml () { return reader.ReadInnerXml (); } public override string ReadOuterXml () { return reader.ReadOuterXml (); } public override string LookupNamespace (string prefix) { return reader.LookupNamespace (prefix); } public override void ResolveEntity () { reader.ResolveEntity (); } public override bool ReadAttributeValue () { return reader.ReadAttributeValue (); } #endregion } }