void DoResolveEntity()
        {
            if (entity != null)
            {
                entity.ResolveEntity();
            }
            else
            {
                if (source.NodeType != XmlNodeType.EntityReference)
                {
                    throw new InvalidOperationException("The current node is not an Entity Reference");
                }
                if (ParserContext.Dtd == null)
                {
                    throw new XmlException(this as IXmlLineInfo, this.BaseURI, String.Format("Cannot resolve entity without DTD: '{0}'", source.Name));
                }
                XmlReader entReader = ParserContext.Dtd.GenerateEntityContentReader(
                    source.Name, ParserContext);
                if (entReader == null)
                {
                    throw new XmlException(this as IXmlLineInfo, this.BaseURI, String.Format("Reference to undeclared entity '{0}'.", source.Name));
                }

                entity = new EntityResolvingXmlReader(
                    entReader, inside_attr);
                entity.CopyProperties(this);
            }
        }
 public override void MoveToAttribute(int i)
 {
     if (entity != null && entity_inside_attr)
     {
         entity.Close();
         entity = null;
     }
     Current.MoveToAttribute(i);
     inside_attr = true;
 }
 public override void MoveToAttribute(int i)
 {
     if (this.entity != null && this.entity_inside_attr)
     {
         this.entity.Close();
         this.entity = null;
     }
     this.Current.MoveToAttribute(i);
     this.inside_attr = true;
 }
 public override bool MoveToElement()
 {
     if (this.entity != null && this.entity_inside_attr)
     {
         this.entity.Close();
         this.entity = null;
     }
     if (!this.Current.MoveToElement())
     {
         return(false);
     }
     this.inside_attr = false;
     return(true);
 }
 public override bool ReadAttributeValue()
 {
     if (this.entity != null && this.entity_inside_attr)
     {
         if (!this.entity.EOF)
         {
             this.entity.Read();
             return(true);
         }
         this.entity.Close();
         this.entity = null;
     }
     return(this.Current.ReadAttributeValue());
 }
 public override bool MoveToElement()
 {
     if (entity != null && entity_inside_attr)
     {
         entity.Close();
         entity = null;
     }
     if (!Current.MoveToElement())
     {
         return(false);
     }
     inside_attr = false;
     return(true);
 }
        public override bool Read()
        {
            if (do_resolve)
            {
                DoResolveEntity();
                do_resolve = false;
            }

            inside_attr = false;

            if (entity != null && (entity_inside_attr || entity.EOF))
            {
                entity.Close();
                entity = null;
            }
            if (entity != null)
            {
                if (entity.Read())
                {
                    return(true);
                }
                if (EntityHandling == EntityHandling.ExpandEntities)
                {
                    // EndEntity must be skipped
                    entity.Close();
                    entity = null;
                    return(Read());
                }
                else
                {
                    return(true);                    // either success or EndEntity
                }
            }
            else
            {
                if (!source.Read())
                {
                    return(false);
                }
                if (EntityHandling == EntityHandling.ExpandEntities &&
                    source.NodeType == XmlNodeType.EntityReference)
                {
                    ResolveEntity();
                    return(Read());
                }
                return(true);
            }
        }
 public override bool ReadAttributeValue()
 {
     if (entity != null && entity_inside_attr)
     {
         if (entity.EOF)
         {
             entity.Close();
             entity = null;
         }
         else
         {
             entity.Read();
             return(true);                    // either success or EndEntity
         }
     }
     return(Current.ReadAttributeValue());
 }
 public override bool MoveToNextAttribute()
 {
     if (this.entity != null && !this.entity_inside_attr)
     {
         return(this.entity.MoveToNextAttribute());
     }
     if (!this.source.MoveToNextAttribute())
     {
         return(false);
     }
     if (this.entity != null && this.entity_inside_attr)
     {
         this.entity.Close();
         this.entity = null;
     }
     this.inside_attr = true;
     return(true);
 }
 public override bool MoveToAttribute(string localName, string namespaceName)
 {
     if (entity != null && !entity_inside_attr)
     {
         return(entity.MoveToAttribute(localName, namespaceName));
     }
     if (!source.MoveToAttribute(localName, namespaceName))
     {
         return(false);
     }
     if (entity != null && entity_inside_attr)
     {
         entity.Close();
         entity = null;
     }
     inside_attr = true;
     return(true);
 }
 public override bool MoveToNextAttribute()
 {
     if (entity != null && !entity_inside_attr)
     {
         return(entity.MoveToNextAttribute());
     }
     if (!source.MoveToNextAttribute())
     {
         return(false);
     }
     if (entity != null && entity_inside_attr)
     {
         entity.Close();
         entity = null;
     }
     inside_attr = true;
     return(true);
 }
 public override bool Read()
 {
     if (this.do_resolve)
     {
         this.DoResolveEntity();
         this.do_resolve = false;
     }
     this.inside_attr = false;
     if (this.entity != null && (this.entity_inside_attr || this.entity.EOF))
     {
         this.entity.Close();
         this.entity = null;
     }
     if (this.entity != null)
     {
         if (this.entity.Read())
         {
             return(true);
         }
         if (this.EntityHandling == EntityHandling.ExpandEntities)
         {
             this.entity.Close();
             this.entity = null;
             return(this.Read());
         }
         return(true);
     }
     else
     {
         if (!this.source.Read())
         {
             return(false);
         }
         if (this.EntityHandling == EntityHandling.ExpandEntities && this.source.NodeType == XmlNodeType.EntityReference)
         {
             this.ResolveEntity();
             return(this.Read());
         }
         return(true);
     }
 }
		// non-overrides

		private void CopyProperties (EntityResolvingXmlReader other)
		{
			context = other.context;
			resolver = other.resolver;
			entity_handling = other.entity_handling;
		}
		public override bool MoveToAttribute (string localName, string namespaceName)
		{
			if (entity != null && !entity_inside_attr)
				return entity.MoveToAttribute (localName, namespaceName);
			if (!source.MoveToAttribute (localName, namespaceName))
				return false;
			if (entity != null && entity_inside_attr) {
				entity.Close ();
				entity = null;
			}
			inside_attr = true;
			return true;
		}
		public override bool MoveToElement ()
		{
			if (entity != null && entity_inside_attr) {
				entity.Close ();
				entity = null;
			}
			if (!Current.MoveToElement ())
				return false;
			inside_attr = false;
			return true;
		}
		public override bool MoveToNextAttribute ()
		{
			if (entity != null && !entity_inside_attr)
				return entity.MoveToNextAttribute ();
			if (!source.MoveToNextAttribute ())
				return false;
			if (entity != null && entity_inside_attr) {
				entity.Close ();
				entity = null;
			}
			inside_attr = true;
			return true;
		}
		public override bool Read ()
		{
			if (do_resolve) {
				DoResolveEntity ();
				do_resolve = false;
			}

			inside_attr = false;

			if (entity != null && (entity_inside_attr || entity.EOF)) {
				entity.Close ();
				entity = null;
			}
			if (entity != null) {
				if (entity.Read ())
					return true;
				if (EntityHandling == EntityHandling.ExpandEntities) {
					// EndEntity must be skipped
					entity.Close ();
					entity = null;
					return Read ();
				}
				else
					return true; // either success or EndEntity
			}
			else {
				if (!source.Read ())
					return false;
				if (EntityHandling == EntityHandling.ExpandEntities
					&& source.NodeType == XmlNodeType.EntityReference) {
					ResolveEntity ();
					return Read ();
				}
				return true;
			}
		}
        // non-overrides

        private void CopyProperties(EntityResolvingXmlReader other)
        {
            context         = other.context;
            resolver        = other.resolver;
            entity_handling = other.entity_handling;
        }
		public override bool ReadAttributeValue ()
		{
			if (entity != null && entity_inside_attr) {
				if (entity.EOF) {
					entity.Close ();
					entity = null;
				}
				else {
					entity.Read ();
					return true; // either success or EndEntity
				}
			}
			return Current.ReadAttributeValue ();
		}
		public override void MoveToAttribute (int i)
		{
			if (entity != null && entity_inside_attr) {
				entity.Close ();
				entity = null;
			}
			Current.MoveToAttribute (i);
			inside_attr = true;
		}
		void DoResolveEntity ()
		{
			if (entity != null)
				entity.ResolveEntity ();
			else {
				if (source.NodeType != XmlNodeType.EntityReference)
					throw new InvalidOperationException ("The current node is not an Entity Reference");
				if (ParserContext.Dtd == null)
					throw new XmlException (this as IXmlLineInfo, this.BaseURI, String.Format ("Cannot resolve entity without DTD: '{0}'", source.Name));
				XmlReader entReader = ParserContext.Dtd.GenerateEntityContentReader (
					source.Name, ParserContext);
				if (entReader == null)
					throw new XmlException (this as IXmlLineInfo, this.BaseURI, String.Format ("Reference to undeclared entity '{0}'.", source.Name));

				entity = new EntityResolvingXmlReader (
					entReader, inside_attr);
				entity.CopyProperties (this);
			}
		}