2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / System.XML / System.Xml / XmlEntity.cs
index 163dd453e99f1249144688bb03c79dd4422c169f..14c89cb8b428506d0dbb0324828c0789a8264ebc 100755 (executable)
@@ -3,10 +3,34 @@
 //
 // Author:
 //     Duncan Mak  (duncan@ximian.com)
+//     Atsushi Enomoto  (atsushi@ximian.com)
 //
 // (C) Ximian, Inc.
+// (C) 2004 Novell Inc.
 //
 
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+using Mono.Xml;
+
 namespace System.Xml
 {
        public class XmlEntity : XmlNode
@@ -17,7 +41,7 @@ namespace System.Xml
                                    XmlDocument doc)
                        : base (doc)
                {
-                       this.name = name;
+                       this.name = doc.NameTable.Add (name);
                        this.NDATA = NDATA;
                        this.publicId = publicId;
                        this.systemId = systemId;
@@ -33,7 +57,6 @@ namespace System.Xml
                string publicId;
                string systemId;
                string baseUri;
-               XmlLinkedNode lastChild;
 
                #endregion
 
@@ -43,14 +66,13 @@ namespace System.Xml
                        get {  return baseUri; }
                }
 
-               [MonoTODO]
                public override string InnerText {
-                       get { throw new NotImplementedException (); }
+                       get { return base.InnerText; }
                        set { throw new InvalidOperationException ("This operation is not supported."); }
                }
 
                public override string InnerXml {
-                       get { return String.Empty; }
+                       get { return base.InnerXml; }
                        set { throw new InvalidOperationException ("This operation is not supported."); }
                }
 
@@ -58,12 +80,6 @@ namespace System.Xml
                        get { return true; } // always read-only.
                }
 
-               internal protected override XmlLinkedNode LastLinkedChild {
-                       get { return lastChild; }
-
-                       set { lastChild = value; }
-               }
-
                public override string LocalName {
                        get { return name; }
                }
@@ -124,7 +140,36 @@ namespace System.Xml
                {
                        // No effect.
                }
-
+\r
+               internal void SetEntityContent ()\r
+               {\r
+                       if (FirstChild != null)
+                               return;
+
+                       XmlDocumentType doctype = OwnerDocument.DocumentType;
+\r
+                       if (doctype == null)\r
+                               return;\r
+
+                       DTDEntityDeclaration decl = doctype.DTD.EntityDecls [name];
+                       if (decl == null)
+                               return;
+
+                       XmlNamespaceManager nsmgr = this.ConstructNamespaceManager ();
+                       XmlParserContext ctx = new XmlParserContext (OwnerDocument.NameTable, nsmgr,
+                               doctype != null ? doctype.DTD : null,
+                               BaseURI, XmlLang, XmlSpace, null);
+                       XmlTextReader xmlReader = new XmlTextReader (decl.EntityValue, XmlNodeType.Element, ctx);
+                       xmlReader.XmlResolver = OwnerDocument.Resolver;
+
+                       do {
+                               XmlNode n = OwnerDocument.ReadNode (xmlReader);
+                               if(n == null) break;
+                               InsertBefore (n, null, false, false);
+                       } while (true);
+
+                       SetReadOnly (this);
+               }\r
                #endregion
        }
 }