2002-10-23 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml / XmlWriter.cs
1 //
2 // System.Xml.XmlTextWriter
3 //
4 // Author:
5 //   Kral Ferch <kral_ferch@hotmail.com>
6 //
7 // (C) 2002 Kral Ferch
8 //
9
10 using System;
11
12 namespace System.Xml
13 {
14         public abstract class XmlWriter
15         {
16                 #region Fields
17
18                 protected WriteState ws = WriteState.Start;
19                 protected XmlNamespaceManager namespaceManager = new XmlNamespaceManager (new NameTable ());
20
21                 #endregion
22
23                 #region Constructors
24
25                 protected XmlWriter () { }
26
27                 #endregion
28
29                 #region Properties
30
31                 public abstract WriteState WriteState { get; }
32                 
33                 public abstract string XmlLang { get; }
34
35                 public abstract XmlSpace XmlSpace { get; }
36
37                 #endregion
38
39                 #region Methods
40
41                 public abstract void Close ();
42
43                 public abstract void Flush ();
44
45                 public abstract string LookupPrefix (string ns);
46
47                 [MonoTODO("DTDs must be implemented to use 'defattr' parameter.")]
48                 public virtual void WriteAttributes (XmlReader reader, bool defattr)
49                 {
50                         if(reader == null)
51                                 throw new ArgumentException("null XmlReader specified.", "reader");
52
53                         switch(reader.NodeType)
54                         {
55                                 case XmlNodeType.XmlDeclaration:
56                                         // this method doesn't write "<?xml " and "?>", at least MS .NET Framework as yet.
57                                         XmlDeclaration decl = new XmlDeclaration("1.0", String.Empty, String.Empty, null);
58                                         decl.Value = reader.Value;
59                                         if(decl.Version != null && decl.Version != String.Empty) WriteAttributeString("version", decl.Version);
60                                         if(decl.Encoding != null && decl.Encoding != String.Empty) WriteAttributeString("encoding", decl.Encoding);
61                                         if(decl.Standalone != null && decl.Standalone != String.Empty) WriteAttributeString("standalone", decl.Standalone);
62                                         break;
63                                 case XmlNodeType.Element:
64                                         while (reader.MoveToNextAttribute ()) \r
65                                         {
66                                                 WriteAttributeString(reader.Prefix, reader.LocalName, reader.NamespaceURI, reader.Value);
67                                         }
68                                         break;
69                                 case XmlNodeType.Attribute:
70                                         do
71                                         {
72                                                 WriteAttributeString(reader.Prefix, reader.LocalName, reader.NamespaceURI, reader.Value);
73                                         }
74                                         while (reader.MoveToNextAttribute ()) ;\r
75                                         break;
76                                 default:
77                                         throw new XmlException("NodeType is not one of Element, Attribute, nor XmlDeclaration.");
78                         }
79                 }
80
81                 public void WriteAttributeString (string localName, string value)
82                 {
83                         WriteAttributeString ("", localName, "", value);
84                 }
85
86                 public void WriteAttributeString (string localName, string ns, string value)
87                 {
88                         WriteAttributeString ("", localName, ns, value);
89                 }
90
91                 public void WriteAttributeString (string prefix, string localName, string ns, string value)
92                 {
93                         if ((prefix == "xmlns") || (localName == "xmlns"))
94                           {
95                                 ns = value;
96                                 if (prefix == "xmlns" && namespaceManager.HasNamespace (localName))
97                                         return;
98                                 else if (localName == "xmlns" && namespaceManager.HasNamespace (String.Empty))
99                                         return;
100                           }
101                         
102                         WriteStartAttribute (prefix, localName, ns);
103                         WriteString (value);
104                         WriteEndAttribute ();
105
106                         if ((prefix == "xmlns") || (localName == "xmlns")) 
107                         {
108                                 if (prefix == "xmlns")
109                                         namespaceManager.AddNamespace (localName, ns);
110                                 else
111                                         namespaceManager.AddNamespace ("", ns);
112                         }
113                 }
114
115                 public abstract void WriteBase64 (byte[] buffer, int index, int count);
116
117                 public abstract void WriteBinHex (byte[] buffer, int index, int count);
118
119                 public abstract void WriteCData (string text);
120
121                 public abstract void WriteCharEntity (char ch);
122
123                 public abstract void WriteChars (char[] buffer, int index, int count);
124
125                 public abstract void WriteComment (string text);
126
127                 public abstract void WriteDocType (string name, string pubid, string sysid, string subset);
128
129                 public void WriteElementString (string localName, string value)
130                 {
131                         WriteStartElement(localName);
132                         WriteString(value);
133                         WriteEndElement();
134                 }
135
136                 public void WriteElementString (string localName, string ns, string value)
137                 {
138                         WriteStartElement(localName, ns);
139                         WriteString(value);
140                         WriteEndElement();
141                 }
142
143                 public abstract void WriteEndAttribute ();
144
145                 public abstract void WriteEndDocument ();
146
147                 public abstract void WriteEndElement ();
148
149                 public abstract void WriteEntityRef (string name);
150
151                 public abstract void WriteFullEndElement ();
152
153                 public abstract void WriteName (string name);
154
155                 public abstract void WriteNmToken (string name);
156
157                 [MonoTODO]
158                 public virtual void WriteNode (XmlReader reader, bool defattr)
159                 {
160                         throw new NotImplementedException ();
161                 }
162
163                 public abstract void WriteProcessingInstruction (string name, string text);
164
165                 public abstract void WriteQualifiedName (string localName, string ns);
166
167                 public abstract void WriteRaw (string data);
168
169                 public abstract void WriteRaw (char[] buffer, int index, int count);
170
171                 public void WriteStartAttribute (string localName, string ns)
172                 {
173                         WriteStartAttribute ("", localName, ns);
174                 }
175
176                 public abstract void WriteStartAttribute (string prefix, string localName, string ns);
177
178                 public abstract void WriteStartDocument ();
179
180                 public abstract void WriteStartDocument (bool standalone);
181
182                 public void WriteStartElement (string localName)
183                 {
184                         WriteStartElement (String.Empty, localName, String.Empty);
185                 }
186
187                 public void WriteStartElement (string localName, string ns)
188                 {
189                         WriteStartElement (String.Empty, localName, ns);
190                 }
191
192                 public abstract void WriteStartElement (string prefix, string localName, string ns);
193
194                 public abstract void WriteString (string text);
195
196                 public abstract void WriteSurrogateCharEntity (char lowChar, char highChar);
197
198                 public abstract void WriteWhitespace (string ws);
199
200                 #endregion
201         }
202 }