*** empty log message ***
[mono.git] / mcs / class / System.XML / System.Xml / XmlParserContext.cs
index 57bfa643846ca5d8c609e6c3efc433bddc79989b..f21a205d59289c0fee6962730f3dcc3c3084e38f 100644 (file)
@@ -3,11 +3,14 @@
 //
 // Author:
 //   Jason Diamond (jason@injektilo.org)
+//   Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
 //
 // (C) 2001, 2002 Jason Diamond  http://injektilo.org/
+// (C) 2003 Atsushi Enomoto
 //
-
+using System.Collections;
 using System.Text;
+using Mono.Xml;
 
 namespace System.Xml
 {
@@ -72,11 +75,11 @@ namespace System.Xml
                        this (
                                nt,
                                nsMgr,
-                               null,
-                               null,
-                               null,
-                               null,
-                               null,
+                               docTypeName,
+                               pubId,
+                               sysId,
+                               internalSubset,
+                               baseURI,
                                xmlLang,
                                xmlSpace,
                                null
@@ -95,6 +98,26 @@ namespace System.Xml
                        string xmlLang,
                        XmlSpace xmlSpace,
                        Encoding enc)
+                       : this (
+                               nt,
+                               nsMgr,
+                               (docTypeName != null && docTypeName != String.Empty) ?
+                                       new XmlTextReader ("", nt).GenerateDTDObjectModel (
+                                               docTypeName, pubId, sysId, internalSubset) : null,
+                               baseURI,
+                               xmlLang,
+                               xmlSpace,
+                               enc)
+               {
+               }
+
+               internal XmlParserContext (XmlNameTable nt,
+                       XmlNamespaceManager nsMgr,
+                       DTDObjectModel dtd,
+                       string baseURI,
+                       string xmlLang,
+                       XmlSpace xmlSpace,
+                       Encoding enc)
                {
                        if (nt == null)
                                this.nameTable = nsMgr.NameTable;
@@ -102,16 +125,22 @@ namespace System.Xml
                                this.NameTable = nt;
 
                        this.namespaceManager = nsMgr;
-                       this.docTypeName = docTypeName;
-                       this.publicID = pubId;
-                       this.systemID = sysId;
-                       this.internalSubset = internalSubset;
-                       this.baseURI = baseURI != null ? baseURI : String.Empty;
-                       this.xmlLang = xmlLang;
-                       this.xmlSpace = xmlSpace;
+                       if (dtd != null) {
+                               this.docTypeName = dtd.Name;
+                               this.publicID = dtd.PublicId;
+                               this.systemID = dtd.SystemId;
+                               this.internalSubset = dtd.InternalSubset;
+                               this.dtd = dtd;
+                       }
                        this.encoding = enc;
-               }
 
+                       baseURIStack = new Stack ();
+                       xmlLangStack = new Stack ();
+                       xmlSpaceStack = new Stack ();
+                       baseURIStack.Push (baseURI != null ? baseURI : String.Empty);
+                       xmlLangStack.Push (xmlLang);
+                       xmlSpaceStack.Push (xmlSpace);
+               }
                #endregion
 
                #region Fields
@@ -126,28 +155,37 @@ namespace System.Xml
                private string systemID;
                private string xmlLang;
                private XmlSpace xmlSpace;
+               private Stack baseURIStack;
+               private Stack xmlLangStack;
+               private Stack xmlSpaceStack;
+               private DTDObjectModel dtd;
 
                #endregion
 
                #region Properties
 
                public string BaseURI {
-                       get { return baseURI; }
+                       get { return baseURI != null ? baseURI : baseURIStack.Peek () as string; }
                        set { baseURI = value; }
                }
 
                public string DocTypeName {
-                       get { return docTypeName; }
+                       get { return docTypeName != null ? docTypeName : dtd != null ? dtd.Name : null; }
                        set { docTypeName = value; }
                }
 
+               internal DTDObjectModel Dtd {
+                       get { return dtd; }
+                       set { dtd = value; }
+               }
+
                public Encoding Encoding {
                        get { return encoding; }
                        set { encoding = value; }
                }
 
                public string InternalSubset {
-                       get { return internalSubset; }
+                       get { return internalSubset != null ? internalSubset : dtd != null ? dtd.InternalSubset : null; }
                        set { internalSubset = value; }
                }
 
@@ -162,25 +200,47 @@ namespace System.Xml
                }
 
                public string PublicId {
-                       get { return publicID; }
+                       get { return publicID != null ? publicID : dtd != null ? dtd.PublicId : null; }
                        set { publicID = value; }
                }
 
                public string SystemId {
-                       get { return systemID; }
+                       get { return systemID != null ? systemID : dtd != null ? dtd.SystemId : null; }
                        set { systemID = value; }
                }
 
                public string XmlLang {
-                       get { return xmlLang; }
+                       get { return xmlLang != null ? xmlLang : xmlLangStack.Peek () as string; }
                        set { xmlLang = value; }
                }
 
                public XmlSpace XmlSpace {
-                       get { return xmlSpace; }
+                       get { return xmlSpace != XmlSpace.None ? xmlSpace : (XmlSpace) xmlSpaceStack.Peek (); }
                        set { xmlSpace = value; }
                }
 
                #endregion
+
+               #region Methods
+               internal void PushScope ()
+               {
+                       baseURIStack.Push (BaseURI);
+                       xmlLangStack.Push (XmlLang);
+                       xmlSpaceStack.Push (XmlSpace);
+                       baseURI = null;
+                       xmlLang = null;
+                       xmlSpace = XmlSpace.None;
+               }
+
+               internal void PopScope ()
+               {
+                       baseURIStack.Pop ();
+                       xmlLangStack.Pop ();
+                       xmlSpaceStack.Pop ();
+                       baseURI = null;
+                       xmlLang = null;
+                       xmlSpace = XmlSpace.None;
+               }
+               #endregion
        }
 }