From: Oleg T. <he...@us...> - 2004-10-19 16:26:05
|
Update of /cvsroot/mvp-xml/XInclude/v1/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19600/v1/src Modified Files: XIncludingReader.cs Log Message: XInclude Test Suite updated Index: XIncludingReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/XInclude/v1/src/XIncludingReader.cs,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- XIncludingReader.cs 18 Oct 2004 19:31:24 -0000 1.11 +++ XIncludingReader.cs 19 Oct 2004 16:24:55 -0000 1.12 @@ -44,11 +44,9 @@ //Current reader private XmlReader _reader; //Stack of readers - private Stack _readers; - //Stack of Base URIs - to prevent circular inclusion - private Stack _baseURIs; + private Stack _readers; //Top base URI - private Uri _topBaseUri; + private Uri _topBaseUri; //Top-level included item flag private bool _topLevel; //One top-level element has been included already @@ -142,6 +140,7 @@ #region XmlReader's overriden members + /// <summary>See <see cref="XmlReader.AttributeCount"/></summary> public override int AttributeCount { get @@ -155,11 +154,13 @@ } } + /// <summary>See <see cref="XmlReader.BaseURI"/></summary> public override string BaseURI { get { return _reader.BaseURI; } } + /// <summary>See <see cref="XmlReader.HasValue"/></summary> public override bool HasValue { get @@ -177,6 +178,7 @@ } } + /// <summary>See <see cref="XmlReader.IsDefault"/></summary> public override bool IsDefault { get @@ -195,6 +197,7 @@ } } + /// <summary>See <see cref="XmlReader.Name"/></summary> public override string Name { get @@ -214,6 +217,7 @@ } } + /// <summary>See <see cref="XmlReader.LocalName"/></summary> public override string LocalName { get @@ -233,6 +237,7 @@ } } + /// <summary>See <see cref="XmlReader.NamespaceURI"/></summary> public override string NamespaceURI { get @@ -251,11 +256,13 @@ } } + /// <summary>See <see cref="XmlReader.NameTable"/></summary> public override XmlNameTable NameTable { get{ return _nameTable; } } + /// <summary>See <see cref="XmlReader.NodeType"/></summary> public override XmlNodeType NodeType { get @@ -274,6 +281,7 @@ } } + /// <summary>See <see cref="XmlReader.Prefix"/></summary> public override string Prefix { get @@ -292,6 +300,7 @@ } } + /// <summary>See <see cref="XmlReader.QuoteChar"/></summary> public override char QuoteChar { get @@ -307,6 +316,7 @@ } } + /// <summary>See <see cref="XmlReader.Close"/></summary> public override void Close() { _reader.Close(); @@ -318,21 +328,25 @@ } } + /// <summary>See <see cref="XmlReader.Depth"/></summary> public override int Depth { get { return _reader.Depth; } } + /// <summary>See <see cref="XmlReader.EOF"/></summary> public override bool EOF { get { return _reader.EOF; } } + /// <summary>See <see cref="XmlReader.GetAttribute"/></summary> public override string GetAttribute(int i) { return _reader.GetAttribute(i); } + /// <summary>See <see cref="XmlReader.GetAttribute"/></summary> public override string GetAttribute(string name) { if (_topLevel && @@ -345,6 +359,7 @@ return _reader.GetAttribute(name); } + /// <summary>See <see cref="XmlReader.GetAttribute"/></summary> public override string GetAttribute(string name, string namespaceURI) { if (_topLevel && @@ -359,21 +374,25 @@ return _reader.GetAttribute(name, namespaceURI); } + /// <summary>See <see cref="XmlReader.IsEmptyElement"/></summary> public override bool IsEmptyElement { get { return _reader.IsEmptyElement; } } + /// <summary>See <see cref="XmlReader.LookupNamespace"/></summary> public override String LookupNamespace(String prefix) { return _reader.LookupNamespace(prefix); } - + + /// <summary>See <see cref="XmlReader.MoveToAttribute"/></summary> public override void MoveToAttribute(int i) { _reader.MoveToAttribute(i); } + /// <summary>See <see cref="XmlReader.MoveToAttribute"/></summary> public override bool MoveToAttribute(string name) { if (_topLevel && @@ -392,6 +411,7 @@ return _reader.MoveToAttribute(name); } + /// <summary>See <see cref="XmlReader.MoveToAttribute"/></summary> public override bool MoveToAttribute(string name, string ns) { if (_topLevel && @@ -412,11 +432,13 @@ return _reader.MoveToAttribute(name, ns); } + /// <summary>See <see cref="XmlReader.MoveToElement"/></summary> public override bool MoveToElement() { return _reader.MoveToElement(); } + /// <summary>See <see cref="XmlReader.MoveToFirstAttribute"/></summary> public override bool MoveToFirstAttribute() { bool res = _reader.MoveToFirstAttribute(); @@ -426,9 +448,10 @@ return true; } else - return _reader.MoveToFirstAttribute(); + return res; } + /// <summary>See <see cref="XmlReader.MoveToNextAttribute"/></summary> public override bool MoveToNextAttribute() { bool res = _reader.MoveToNextAttribute(); @@ -467,6 +490,7 @@ return res; } + /// <summary>See <see cref="XmlReader.ReadAttributeValue"/></summary> public override bool ReadAttributeValue() { switch (_state) @@ -476,46 +500,59 @@ return true; case XIncludingReaderState.ExposingXmlBaseAttrValue: return false; + case XIncludingReaderState.ExposingXmlLangAttr: + _state = XIncludingReaderState.ExposingXmlLangAttrValue; + return true; + case XIncludingReaderState.ExposingXmlLangAttrValue: + return false; default: return _reader.ReadAttributeValue(); } } + /// <summary>See <see cref="XmlReader.ReadState"/></summary> public override ReadState ReadState { get { return _reader.ReadState; } } + /// <summary>See <see cref="XmlReader.Item"/></summary> public override String this [int i] { get { return GetAttribute(i); } } + /// <summary>See <see cref="XmlReader.Item"/></summary> public override string this [string name] { get { return GetAttribute(name); } } + /// <summary>See <see cref="XmlReader.Item"/></summary> public override string this [string name, string namespaceURI] { get { return GetAttribute(name, namespaceURI); } } + /// <summary>See <see cref="XmlReader.ResolveEntity"/></summary> public override void ResolveEntity() { _reader.ResolveEntity(); } + /// <summary>See <see cref="XmlReader.XmlLang"/></summary> public override string XmlLang { get { return _reader.XmlLang; } } + /// <summary>See <see cref="XmlReader.XmlSpace"/></summary> public override XmlSpace XmlSpace { get { return _reader.XmlSpace; } } + /// <summary>See <see cref="XmlReader.Value"/></summary> public override string Value { get @@ -526,9 +563,8 @@ case XIncludingReaderState.ExposingXmlBaseAttrValue: if (_reader.BaseURI == String.Empty) { - //Stupid reader - Uri baseUri = (Uri)_baseURIs.Peek(); - return baseUri.AbsoluteUri; + //No Base URI? Use previous one's. + return ((XmlReader)_readers.Peek()).BaseURI; } if (_relativeBaseUri) { @@ -537,12 +573,16 @@ } else return _reader.BaseURI; + case XIncludingReaderState.ExposingXmlLangAttr: + case XIncludingReaderState.ExposingXmlLangAttrValue: + return _reader.XmlLang; default: return _reader.Value; } } } + /// <summary>See <see cref="XmlReader.ReadInnerXml"/></summary> public override string ReadInnerXml() { switch (_state) @@ -551,11 +591,16 @@ return _reader.BaseURI; case XIncludingReaderState.ExposingXmlBaseAttrValue: return String.Empty; + case XIncludingReaderState.ExposingXmlLangAttr: + return _reader.XmlLang; + case XIncludingReaderState.ExposingXmlLangAttrValue: + return String.Empty; default: return _reader.ReadInnerXml(); } } + /// <summary>See <see cref="XmlReader.ReadOuterXml"/></summary> public override string ReadOuterXml() { switch (_state) @@ -564,11 +609,16 @@ return @"xml:base="" + _reader.BaseURI + @"""; case XIncludingReaderState.ExposingXmlBaseAttrValue: return String.Empty; + case XIncludingReaderState.ExposingXmlLangAttr: + return @"xml:lang="" + _reader.XmlLang + @"""; + case XIncludingReaderState.ExposingXmlLangAttrValue: + return String.Empty; default: return _reader.ReadOuterXml(); } } + /// <summary>See <see cref="XmlReader.ReadString"/></summary> public override string ReadString() { switch (_state) @@ -577,11 +627,16 @@ return String.Empty; case XIncludingReaderState.ExposingXmlBaseAttrValue: return _reader.BaseURI; + case XIncludingReaderState.ExposingXmlLangAttr: + return String.Empty; + case XIncludingReaderState.ExposingXmlLangAttrValue: + return _reader.XmlLang; default: return _reader.ReadString(); } } + /// <summary>See <see cref="XmlReader.Read"/></summary> public override bool Read() { //Read internal reader @@ -684,9 +739,7 @@ if (_topLevel) _topLevel = false; if (_readers.Count > 0) - { - //Pop BaseURI - _baseURIs.Pop(); + { _reader.Close(); //Pop previous reader _reader = (XmlReader)_readers.Pop(); @@ -743,13 +796,14 @@ private void Init() { _keywords = new XIncludeKeywords(NameTable); - _baseURIs = new Stack(); - _topBaseUri = new Uri(_reader.BaseURI); - _baseURIs.Push(_topBaseUri); + _topBaseUri = new Uri(_reader.BaseURI); _readers = new Stack(); _state = XIncludingReaderState.Default; } + /// <summary> + /// Checks if given reader is positioned on a xi:include element. + /// </summary> private bool IsIncludeElement(XmlReader r) { if ( @@ -763,6 +817,11 @@ return false; } + /// <summary> + /// /// Checks if given reader is positioned on a xi:fallback element. + /// </summary> + /// <param name="r"></param> + /// <returns></returns> private bool IsFallbackElement(XmlReader r) { if ( @@ -776,6 +835,9 @@ return false; } + /// <summary> + /// Fetches resource by URI. + /// </summary> internal static Stream GetResource(string href, Uri includeLocation, string accept, string acceptLanguage, out WebResponse response) { @@ -866,9 +928,7 @@ WebResponse wRes; Stream stream = GetResource(href, includeLocation, _reader.GetAttribute(_keywords.Accept), - _reader.GetAttribute(_keywords.AcceptLanguage), out wRes); - //Push new base URI to the stack - _baseURIs.Push(includeLocation); + _reader.GetAttribute(_keywords.AcceptLanguage), out wRes); //Push current reader to the stack _readers.Push(_reader); if (xpointer != null) @@ -908,9 +968,7 @@ //Unsupported type throw new ResourceException(SR.GetString( "CustomXmlResolverReturnedUnsupportedType", - resource.GetType().ToString())); - //Push new base URI to the stack - _baseURIs.Push(includeLocation); + resource.GetType().ToString())); //Push current reader to the stack _readers.Push(_reader); if (xpointer != null) @@ -926,8 +984,6 @@ //Include document as text string encoding = GetAttribute(_keywords.Encoding); Uri includeLocation = ResolveHref(href); - //Push new base URI to the stack - _baseURIs.Push(includeLocation); //Push current reader to the stack _readers.Push(_reader); _reader = new TextIncludingReader(includeLocation, encoding, @@ -951,7 +1007,7 @@ } /// <summary> - /// Resolves include locatation. + /// Resolves include location. /// </summary> /// <param name="href">href value</param> /// <returns>Include location.</returns> @@ -973,19 +1029,14 @@ { throw new ResourceException(SR.GetString("UnresolvableURI", href), e); } - //Check circular inclusion - if (_baseURIs.Contains(includeLocation)) - { - IXmlLineInfo li = _reader as IXmlLineInfo; - if (li != null && li.HasLineInfo()) - { - throw new CircularInclusionException(includeLocation, - BaseURI.ToString(), - li.LineNumber, li.LinePosition); - } - else - throw new CircularInclusionException(includeLocation); - } + //Check circular inclusion + if (new Uri(_reader.BaseURI).Equals(includeLocation)) + ThrowCircularInclusionError(_reader, includeLocation); + foreach (XmlReader r in _readers) + { + if (new Uri(r.BaseURI).Equals(includeLocation)) + ThrowCircularInclusionError(_reader, includeLocation); + } return includeLocation; } @@ -1138,6 +1189,31 @@ } } // CheckAndSkipContent() + /// <summary> + /// Throws CircularInclusionException. + /// </summary> + private void ThrowCircularInclusionError(XmlReader reader, Uri url) + { + IXmlLineInfo li = reader as IXmlLineInfo; + if (li != null && li.HasLineInfo()) + { + throw new CircularInclusionException(url, + BaseURI.ToString(), + li.LineNumber, li.LinePosition); + } + else + throw new CircularInclusionException(url); + } + + /// <summary> + /// Compares two languages as per IETF RFC 3066. + /// </summary> + private bool AreTheSameLangs(string lang1, string lang2) + { + //TODO: Wise comparison? + return lang1 == lang2; + } + #endregion } } |