2003-01-26 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / System.Xml / XmlAttribute.cs
index bc33caff47918e7a51fe5a9dcd3060e7f0106375..167a9b18abaa60b57bf42f77ff0c7ad41b2a06ba 100644 (file)
@@ -8,6 +8,8 @@
 //
 
 using System;
+using System.Text;
+using System.Xml.XPath;
 
 namespace System.Xml
 {
@@ -15,11 +17,12 @@ namespace System.Xml
        {
                #region Fields
 
-               private XmlElement ownerElement;
                private XmlLinkedNode lastChild;
                private string localName;
                private string namespaceURI;
                private string prefix;
+               internal bool isDefault;
+               private XmlElement ownerElement;
 
                #endregion
 
@@ -32,6 +35,8 @@ namespace System.Xml
                        string namespaceURI, 
                        XmlDocument doc) : base (doc)
                {
+                       // What to be recognized is: xml:space, xml:lang, xml:base, and
+                       // xmlns and xmlns:* (when XmlDocument.Namespaces = true only)
                        this.prefix = prefix;
                        this.localName = localName;
                        this.namespaceURI = namespaceURI;
@@ -43,22 +48,34 @@ namespace System.Xml
 
                public override string BaseURI {
                        get {
-                               return ownerElement.BaseURI;
+                               return OwnerElement.BaseURI;
                        }
                }
 
-               [MonoTODO]
                public override string InnerText {
                        get {
-                               throw new NotImplementedException ();
-                       }
+                               StringBuilder builder = new StringBuilder ();
+                               AppendChildValues (this, builder);
+                               return builder.ToString ();
+                        }
 
                        set {
-                               throw new NotImplementedException ();
+                               Value = value;
                        }
                }
 
-               [MonoTODO ("Setter.")]
+               private void AppendChildValues (XmlNode parent, StringBuilder builder)
+               {
+                       XmlNode node = parent.FirstChild;
+                       
+                       while (node != null) {
+                               builder.Append (node.Value);
+                               AppendChildValues (node, builder);
+                               node = node.NextSibling;
+                        }
+                }
+               
+               [MonoTODO ("Setter is incomplete(XmlTextReader.ReadAttribute is incomplete;No resolution for xml:lang/space")]
                public override string InnerXml {
                        get {
                                // Not sure why this is an override.  Passing through for now.
@@ -66,7 +83,13 @@ namespace System.Xml
                        }
 
                        set {
-                               throw new NotImplementedException ();
+                               XmlNamespaceManager nsmgr = ConstructNamespaceManager ();
+                               XmlParserContext ctx = new XmlParserContext (OwnerDocument.NameTable, nsmgr, XmlLang, this.XmlSpace);
+                               XmlTextReader xtr = OwnerDocument.ReusableReader;
+                               xtr.SetReaderContext (BaseURI, ctx);
+                               xtr.SetReaderFragment (new System.IO.StringReader ("'" + value.Replace ("'", "&apos;") + "'"), XmlNodeType.Attribute);
+
+                               OwnerDocument.ReadAttributeNodeValue (xtr, this);
                        }
                }
 
@@ -94,6 +117,12 @@ namespace System.Xml
                        }
                }
 
+               internal override XPathNodeType XPathNodeType {
+                       get {
+                               return XPathNodeType.Attribute;
+                       }
+               }
+
                public override XmlDocument OwnerDocument {
                        get {
                                return base.OwnerDocument;
@@ -106,19 +135,31 @@ namespace System.Xml
                        }
                }
 
-               [MonoTODO]
                public override XmlNode ParentNode {
                        get {
+                               // It always returns null (by specification).
                                return null;
                        }
                }
 
-               [MonoTODO]
+               [MonoTODO("setter incomplete (name character check, format check, wrong prefix&nsURI)")]
                // We gotta do more in the set block here
                // We need to do the proper tests and throw
                // the correct Exceptions
+               //
+               // Wrong cases are: (1)check readonly, (2)check character validity,
+               // (3)check format validity, (4)this is attribute and qualifiedName != "xmlns"
+               // (5)when argument is 'xml' or 'xmlns' and namespaceURI doesn't match
                public override string Prefix {
                        set {
+                               if(IsReadOnly)
+                                       throw new XmlException ("This node is readonly.");
+
+                               XmlNamespaceManager nsmgr = ConstructNamespaceManager ();
+                               string nsuri = nsmgr.LookupNamespace (value);
+                               if(nsuri == null)
+                                       throw new XmlException ("Namespace URI not found for this prefix");
+
                                prefix = value;
                        }
                        
@@ -127,10 +168,10 @@ namespace System.Xml
                        }
                }
 
-               [MonoTODO]
+               [MonoTODO("There are no code which sets 'specified = true', so this logic is without checking.")]
                public virtual bool Specified {
                        get {
-                               throw new NotImplementedException ();
+                               return !isDefault;
                        }
                }
 
@@ -151,6 +192,14 @@ namespace System.Xml
                        }
                }
 
+               internal override string XmlLang {
+                       get { return OwnerElement.XmlLang; }
+               }
+
+               internal override XmlSpace XmlSpace {
+                       get { return OwnerElement.XmlSpace; }
+               }
+
                #endregion
 
                #region Methods
@@ -169,9 +218,9 @@ namespace System.Xml
                        return node;
                }
 
-               internal void SetOwnerElement (XmlElement ownerElement)
-               {
-                       this.ownerElement = ownerElement;
+               // Parent of XmlAttribute must be null
+               internal void SetOwnerElement (XmlElement el) {
+                       ownerElement = el;
                }
 
                public override void WriteContentTo (XmlWriter w)