2002-04-12 Duncan Mak <duncan@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml / XmlAttribute.cs
1 //
2 // System.Xml.XmlAttribute
3 //
4 // Author:
5 //   Jason Diamond (jason@injektilo.org)
6 //
7 // (C) 2002 Jason Diamond  http://injektilo.org/
8 //
9
10 using System;
11
12 namespace System.Xml
13 {
14         public class XmlAttribute : XmlNode
15         {
16                 #region Fields
17
18                 private XmlElement ownerElement;
19                 private XmlLinkedNode lastChild;
20                 private string localName;
21                 private string namespaceURI;
22                 private string prefix;
23
24                 #endregion
25
26                 #region Constructor
27
28                 [MonoTODO("need to set namespaceURI if prefix is recognized built-in ones like xmlns")]
29                 protected internal XmlAttribute (
30                         string prefix, 
31                         string localName, 
32                         string namespaceURI, 
33                         XmlDocument doc) : base (doc)
34                 {
35                         this.prefix = prefix;
36                         this.localName = localName;
37                         this.namespaceURI = namespaceURI;
38                 }
39
40                 #endregion
41
42                 #region Properties
43
44                 [MonoTODO]
45                 public override string BaseURI {
46                         get {
47                                 throw new NotImplementedException ();
48                         }
49                 }
50
51                 [MonoTODO]
52                 public override string InnerText {
53                         get {
54                                 throw new NotImplementedException ();
55                         }
56
57                         set {
58                                 throw new NotImplementedException ();
59                         }
60                 }
61
62                 [MonoTODO ("Setter.")]
63                 public override string InnerXml {
64                         get {
65                                 // Not sure why this is an override.  Passing through for now.
66                                 return base.InnerXml;
67                         }
68
69                         set {
70                                 throw new NotImplementedException ();
71                         }
72                 }
73
74                 public override string LocalName {
75                         get {
76                                 return localName;
77                         }
78                 }
79
80                 public override string Name {
81                         get { 
82                                 return prefix != String.Empty ? prefix + ":" + localName : localName; 
83                         }
84                 }
85
86                 public override string NamespaceURI {
87                         get {
88                                 return namespaceURI;
89                         }
90                 }
91
92                 public override XmlNodeType NodeType {
93                         get {
94                                 return XmlNodeType.Attribute;
95                         }
96                 }
97
98                 public override XmlDocument OwnerDocument {
99                         get {
100                                 return base.OwnerDocument;
101                         }
102                 }
103
104                 public virtual XmlElement OwnerElement {
105                         get {
106                                 return ownerElement;
107                         }
108                 }
109
110                 [MonoTODO]
111                 public override XmlNode ParentNode {
112                         get {
113                                 return null;
114                         }
115                 }
116
117                 [MonoTODO]
118                 // We gotta do more in the set block here
119                 // We need to do the proper tests and throw
120                 // the correct Exceptions
121                 public override string Prefix {
122                         set {
123                                 prefix = value;
124                         }
125                         
126                         get {
127                                 return prefix;
128                         }
129                 }
130
131                 [MonoTODO]
132                 public virtual bool Specified {
133                         get {
134                                 throw new NotImplementedException ();
135                         }
136                 }
137
138                 public override string Value {
139                         get {
140                                 XmlNode firstChild = FirstChild;
141                                 if (firstChild == null)
142                                         return String.Empty;
143                                 return firstChild.Value;
144                         }
145
146                         set {
147                                 XmlNode firstChild = FirstChild;
148                                 if (firstChild == null)
149                                         AppendChild (OwnerDocument.CreateTextNode (value));
150                                 else
151                                         firstChild.Value = value;
152                         }
153                 }
154
155                 #endregion
156
157                 #region Methods
158
159                 public override XmlNode CloneNode (bool deep)
160                 {
161                         XmlNode node = new XmlAttribute (prefix, localName, namespaceURI,
162                                                          OwnerDocument);
163                         if (deep) {
164                                 while ((node != null) && (node.HasChildNodes)) {
165                                         AppendChild (node.NextSibling.CloneNode (true));
166                                         node = node.NextSibling;
167                                 }
168                         }
169
170                         return node;
171                 }
172
173                 internal void SetOwnerElement (XmlElement ownerElement)
174                 {
175                         this.ownerElement = ownerElement;
176                 }
177
178                 public override void WriteContentTo (XmlWriter w)
179                 {
180                         w.WriteString (Value);
181                 }
182
183                 public override void WriteTo (XmlWriter w)
184                 {
185                         w.WriteAttributeString (prefix, localName, namespaceURI, Value);
186                 }
187
188                 #endregion
189
190                 internal override XmlLinkedNode LastLinkedChild {
191                         get { return lastChild; }
192
193                         set { lastChild = value; }
194                 }
195         }
196 }