1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.Configuration.Internal;
6 using System.IO;
7 using System.Xml;
8 
9 namespace System.Configuration
10 {
11     // ConfigXmlDocument - the default Xml Document doesn't track line numbers, and line
12     // numbers are necessary to display source on config errors.
13     // These classes wrap corresponding System.Xml types and also carry
14     // the necessary information for reporting filename / line numbers.
15     // Note: these classes will go away if webdata ever decides to incorporate line numbers
16     // into the default XML classes.  This class could also go away if webdata brings back
17     // the UserData property to hang any info off of any node.
18     public sealed class ConfigXmlDocument : XmlDocument, IConfigErrorInfo
19     {
20         XmlTextReader _reader;
21         int _lineOffset;
22         string _filename;
23 
24         int IConfigErrorInfo.LineNumber
25         {
26             get
27             {
28                 if (_reader == null)
29                 {
30                     return 0;
31                 }
32 
33                 if (_lineOffset > 0)
34                 {
35                     return _reader.LineNumber + _lineOffset - 1;
36                 }
37 
38                 return _reader.LineNumber;
39             }
40         }
41 
42         public int LineNumber { get { return ((IConfigErrorInfo)this).LineNumber; } }
43 
44         public string Filename
45         {
46             get { return _filename; }
47         }
48 
49         string IConfigErrorInfo.Filename
50         {
51             get { return _filename; }
52         }
53 
Load(string filename)54         public override void Load(string filename)
55         {
56             _filename = filename;
57             try
58             {
59                 _reader = new XmlTextReader(filename);
60                 _reader.XmlResolver = null;
61                 base.Load(_reader);
62             }
63             finally
64             {
65                 if (_reader != null)
66                 {
67                     _reader.Close();
68                     _reader = null;
69                 }
70             }
71         }
72 
LoadSingleElement(string filename, XmlTextReader sourceReader)73         public void LoadSingleElement(string filename, XmlTextReader sourceReader)
74         {
75             _filename = filename;
76             _lineOffset = sourceReader.LineNumber;
77             string outerXml = sourceReader.ReadOuterXml();
78 
79             try
80             {
81                 _reader = new XmlTextReader(new StringReader(outerXml), sourceReader.NameTable);
82                 base.Load(_reader);
83             }
84             finally
85             {
86                 if (_reader != null)
87                 {
88                     _reader.Close();
89                     _reader = null;
90                 }
91             }
92         }
93 
CreateAttribute(string prefix, string localName, string namespaceUri)94         public override XmlAttribute CreateAttribute(string prefix, string localName, string namespaceUri)
95         {
96             return new ConfigXmlAttribute(_filename, LineNumber, prefix, localName, namespaceUri, this);
97         }
98 
CreateElement(string prefix, string localName, string namespaceUri)99         public override XmlElement CreateElement(string prefix, string localName, string namespaceUri)
100         {
101             return new ConfigXmlElement(_filename, LineNumber, prefix, localName, namespaceUri, this);
102         }
103 
CreateTextNode(string text)104         public override XmlText CreateTextNode(string text)
105         {
106             return new ConfigXmlText(_filename, LineNumber, text, this);
107         }
108 
CreateCDataSection(String data)109         public override XmlCDataSection CreateCDataSection(String data)
110         {
111             return new ConfigXmlCDataSection(_filename, LineNumber, data, this);
112         }
113 
CreateComment(String data)114         public override XmlComment CreateComment(String data)
115         {
116             return new ConfigXmlComment(_filename, LineNumber, data, this);
117         }
118 
CreateSignificantWhitespace(String data)119         public override XmlSignificantWhitespace CreateSignificantWhitespace(String data)
120         {
121             return new ConfigXmlSignificantWhitespace(_filename, LineNumber, data, this);
122         }
123 
CreateWhitespace(String data)124         public override XmlWhitespace CreateWhitespace(String data)
125         {
126             return new ConfigXmlWhitespace(_filename, LineNumber, data, this);
127         }
128     }
129 }
130