2003-07-26 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / System.Xml / XmlDocumentType.cs
1 //\r
2 // System.Xml.XmlDocumentType.cs\r
3 //\r
4 // Author: Duncan Mak (duncan@ximian.com)\r
5 //         Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)\r
6 //\r
7 // (C) Ximian, Inc.\r
8 //\r
9 using System;\r
10 using System.Collections;\r
11 using Mono.Xml;\r
12 \r
13 namespace System.Xml\r
14 {\r
15         public class XmlDocumentType  : XmlLinkedNode\r
16         {\r
17                 // Fields\r
18                 string name;            // name of the document type\r
19                 string publicId;        // public identifier on the DOCTYPE\r
20                 string systemId;        // system identifier on the DOCTYPE\r
21                 string internalSubset;  // value of the DTD internal subset\r
22                 internal XmlNamedNodeMap entities;\r
23                 internal XmlNamedNodeMap notations;\r
24                 DTDObjectModel dtd;\r
25 \r
26                 // Constructor\r
27                 protected internal XmlDocumentType (string name, string publicId,\r
28                                                     string systemId, string internalSubset,\r
29                                                     XmlDocument doc)\r
30                         : base (doc)\r
31                 {\r
32                         this.name = name;\r
33                         this.publicId = publicId;\r
34                         this.systemId = systemId;\r
35                         this.internalSubset = internalSubset;\r
36 \r
37                         XmlTextReader xtr = new XmlTextReader ("", XmlNodeType.Document, null);\r
38                         xtr.GenerateDTDObjectModel (name, publicId, systemId, internalSubset);\r
39                         this.dtd = xtr.DTD;\r
40 \r
41                         ImportFromDTD ();\r
42                 }\r
43 \r
44                 internal XmlDocumentType (XmlTextReader reader, XmlDocument doc)\r
45                         : base (doc)\r
46                 {\r
47                         this.name = reader.Name;\r
48                         this.publicId = reader ["PUBLIC"];\r
49                         this.systemId = reader ["SYSTEM"];\r
50                         this.internalSubset = reader.Value;\r
51                         this.dtd = reader.DTD;\r
52 \r
53                         ImportFromDTD ();\r
54                 }\r
55 \r
56                 private void ImportFromDTD ()\r
57                 {\r
58                         entities = new XmlNamedNodeMap (this);\r
59                         notations = new XmlNamedNodeMap (this);\r
60 \r
61                         foreach (DTDEntityDeclaration decl in DTD.EntityDecls.Values) {
62                                 XmlNode n = new XmlEntity (decl.Name, decl.NotationName,
63                                         decl.PublicId, decl.SystemId, OwnerDocument);
64                                 // FIXME: Value is more complex, similar to Attribute.
65                                 n.insertBeforeIntern (OwnerDocument.CreateTextNode (decl.EntityValue), null);
66                                 entities.Nodes.Add (n);
67                         }
68                         foreach (DTDNotationDeclaration decl in DTD.NotationDecls.Values) {
69                                 XmlNode n = new XmlNotation (decl.LocalName, decl.Prefix,
70                                         decl.PublicId, decl.SystemId, OwnerDocument);
71                                 notations.Nodes.Add (n);
72                         }
73                 }\r
74 \r
75                 // Properties\r
76                 internal DTDObjectModel DTD {\r
77                         get { return dtd; }\r
78                 }\r
79 \r
80                 public XmlNamedNodeMap Entities\r
81                 {\r
82                         get { return entities; }\r
83                 }\r
84                         \r
85                 public string InternalSubset\r
86                 {\r
87                         get { return internalSubset; }\r
88                 }\r
89 \r
90                 public override bool IsReadOnly\r
91                 {\r
92                         get { return true; } // always return true\r
93                 }\r
94 \r
95                 public override string LocalName\r
96                 {\r
97                         get { return name; }\r
98                 }\r
99 \r
100                 public override string Name\r
101                 {\r
102                         get { return name; }\r
103                 }\r
104 \r
105                 public override XmlNodeType NodeType\r
106                 {\r
107                         get { return XmlNodeType.DocumentType; }\r
108                 }\r
109 \r
110                 public XmlNamedNodeMap Notations\r
111                 {\r
112                         get { return notations; }\r
113                 }\r
114 \r
115                 public string PublicId\r
116                 {\r
117                         get { return publicId; }\r
118                 }\r
119 \r
120                 public string SystemId\r
121                 {\r
122                         get { return systemId; }\r
123                 }\r
124 \r
125                 // Methods\r
126                 public override XmlNode CloneNode (bool deep)\r
127                 {\r
128                         // deep is ignored\r
129                         return new XmlDocumentType (name, publicId, systemId,\r
130                                                     internalSubset, OwnerDocument);\r
131                 }\r
132                 \r
133                 public override void WriteContentTo (XmlWriter w)\r
134                 {\r
135                         // No effect\r
136                 }\r
137 \r
138                 public override void WriteTo (XmlWriter w)\r
139                 {\r
140                         w.WriteDocType (name, publicId, systemId, internalSubset);\r
141                 }\r
142         }\r
143 }\r