2008-12-06 Ivan N. Zlatev <contact@i-nz.net>
[mono.git] / mcs / class / System.Configuration / System.Configuration / Configuration.cs
index eb3c14e40c4d0c2800833bd5f68c00ebd9250efa..4ec8e5ad01e6654a4390ce51ad131a37f68ee0aa 100644 (file)
@@ -216,11 +216,11 @@ namespace System.Configuration {
                                        rootSectionGroup.Initialize (this, rootGroup);
                                }
                                return rootSectionGroup;
-                       }                        
+                       }
                }
 
                public ConfigurationSectionGroupCollection SectionGroups {
-                       get { return RootSectionGroup.SectionGroups; }                        
+                       get { return RootSectionGroup.SectionGroups; }
                }
 
                public ConfigurationSectionCollection Sections {
@@ -265,19 +265,28 @@ namespace System.Configuration {
                                ds.SectionHandler = secObj as IConfigurationSectionHandler;
                                sec = ds;
                        }
+                       sec.Configuration = this;
 
-                       ConfigurationSection parentSection = parent != null ? parent.GetSectionInstance (config, true) : null;
+                       ConfigurationSection parentSection = null;
+                       if (parent != null) {
+                               parentSection = parent.GetSectionInstance (config, true);
+                               sec.SectionInformation.SetParentSection (parentSection);
+                       }
+                       sec.SectionInformation.ConfigFilePath = FilePath;
 
+                       sec.ConfigContext = system.Host.CreateDeprecatedConfigContext(configPath);
+                       
                        string xml = data as string;
-                       if (xml == null && parentSection != null)
-                               xml = parentSection.RawXml;
                        sec.RawXml = xml;
                        sec.Reset (parentSection);
 
                        if (xml != null && xml == data) {
-                               XmlTextReader r = new XmlTextReader (new StringReader (xml));
+                               XmlTextReader r = new ConfigXmlTextReader (new StringReader (xml), FilePath);
                                sec.DeserializeSection (r);
                                r.Close ();
+
+                               if (!String.IsNullOrEmpty (sec.SectionInformation.ConfigSource) && !String.IsNullOrEmpty (FilePath))
+                                       sec.DeserializeConfigSource (Path.GetDirectoryName (FilePath));
                        }
                        
                        elementData [config] = sec;
@@ -318,10 +327,10 @@ namespace System.Configuration {
                                object ctx = sec.SectionInformation.AllowExeDefinition != ConfigurationAllowExeDefinition.MachineToApplication ? (object) sec.SectionInformation.AllowExeDefinition : (object) sec.SectionInformation.AllowDefinition;
                                throw new ConfigurationErrorsException ("The section <" + name + "> can't be defined in this configuration file (the allowed definition context is '" + ctx + "').");
                        }
-                                               
+
                        if (sec.SectionInformation.Type == null)
                                sec.SectionInformation.Type = system.Host.GetConfigTypeName (sec.GetType ());
-                       
+
                        SectionInfo section = new SectionInfo (name, sec.SectionInformation);
                        section.StreamName = streamName;
                        section.ConfigHost = system.Host;
@@ -387,7 +396,7 @@ namespace System.Configuration {
                [MonoInternalNote ("Detect if file has changed")]
                public void SaveAs (string filename, ConfigurationSaveMode mode, bool forceUpdateAll)
                {
-                       string dir = Path.GetDirectoryName (filename);
+                       string dir = Path.GetDirectoryName (Path.GetFullPath (filename));
                        if (!Directory.Exists (dir))
                                Directory.CreateDirectory (dir);
                        Save (new FileStream (filename, FileMode.OpenOrCreate, FileAccess.Write), mode, forceUpdateAll);
@@ -440,27 +449,23 @@ namespace System.Configuration {
                        if (String.IsNullOrEmpty (streamName))
                                return true;
 
-                       XmlTextReader reader = null;
                        Stream stream = null;
                        
+                       // FIXME: we should remove this kind of hack that
+                       // hides the actual error
                        try {
                                stream = system.Host.OpenStreamForRead (streamName);
                        } catch (Exception) {
                                return false;
                        }
 
-                       try {
-                               reader = new XmlTextReader (stream);
+                       using (XmlTextReader reader = new ConfigXmlTextReader (stream, streamName)) {
                                ReadConfigFile (reader, streamName);
-                       } finally {
-                               if (reader != null)
-                                       reader.Close();
                        }
                        return true;
                }
 
-
-               internal void ReadConfigFile (XmlTextReader reader, string fileName)
+               void ReadConfigFile (XmlReader reader, string fileName)
                {
                        reader.MoveToContent ();
 
@@ -496,16 +501,17 @@ namespace System.Configuration {
                        
                        rootGroup.ReadRootData (reader, this, true);
                }
-               
-               internal void ReadData (XmlTextReader reader, bool allowOverride)
+
+               internal void ReadData (XmlReader reader, bool allowOverride)
                {
                        rootGroup.ReadData (this, reader, allowOverride);
                }
                
 
-               private void ThrowException (string text, XmlTextReader reader)
+               private void ThrowException (string text, XmlReader reader)
                {
-                       throw new ConfigurationException (text, streamName, reader.LineNumber);
+                       IXmlLineInfo li = reader as IXmlLineInfo;
+                       throw new ConfigurationException (text, streamName, li != null ? li.LineNumber : 0);
                }
        }
 }