History

Added support for GSF configuration files on Mono

ritchiecarroll committed 12 years ago

Commit 2bbd6cd1 parent ef6432e13 files · +615 −136Browse files

Showing the changes to Source/Libraries/GSF.Core/Configuration/ConfigurationFile.cs (1 of 13 files). Show all

Unified · Split

Source/Libraries/GSF.Core/Configuration/ConfigurationFile.cs+49−33
@@ -64,7 +64,6 @@ using System.Configuration; · 63 unmodified lines
6464 using System.Globalization;
6565 using System.IO;
6666 using System.Text;
67−using System.Threading;
6867 using System.Web.Configuration;
6968 using System.Web.Hosting;
7069 using System.Xml;
@@ -177,7 +176,6 @@ namespace GSF.Configuration · 106 unmodified lines
177176 #region [ Members ]
178177
179178 // Nested Types
180−
181179 internal class UserConfigurationFile
182180 {
183181 private readonly string m_fileName;
@@ -229,6 +227,7 @@ namespace GSF.Configuration · 45 unmodified lines
229227 public void Write(string category, string name, string value)
230228 {
231229 XmlNode node = GetSetting(category, name);
230+
232231 if ((object)node != null)
233232 {
234233 // Setting exists so update it.
@@ -242,18 +241,20 @@ namespace GSF.Configuration · 7 unmodified lines
242241 setting.SetAttributeValue("value", value);
243242 m_settings.GetXmlNode(category).AppendChild(setting);
244243 }
244+
245245 m_settingsModified = true;
246246 }
247247
248248 public string Read(string category, string name, string defaultValue)
249249 {
250250 XmlNode node = GetSetting(category, name);
251− if ((object)node != null)
252− // Setting exists so return its value.
251+
252+ // If setting exists, return its value
253+ if ((object)node != null && (object)node.Attributes != null)
253254 return node.Attributes["value"].Value;
254− else
255− // Setting doesn't exist so return the default.
256− return defaultValue;
255+
256+ // Setting doesn't exist so return the default
257+ return defaultValue;
257258 }
258259
259260 public XmlNode GetSetting(string category, string name)
@@ -272,7 +273,8 @@ namespace GSF.Configuration · 12 unmodified lines
272273 private System.Configuration.Configuration m_configuration;
273274 private UserConfigurationFile m_userConfiguration;
274275 private volatile ConfigurationSaveMode m_saveMode;
275− private LongSynchronizedOperation m_saveOperation;
276+ private readonly LongSynchronizedOperation m_saveOperation;
277+ internal bool m_forceSave;
276278
277279 #endregion
278280
@@ -288,7 +290,7 @@ namespace GSF.Configuration · 9 unmodified lines
288290
289291 m_configuration = GetConfiguration(configFilePath);
290292
291− if (m_configuration.HasFile)
293+ if (m_configuration.HasFile && File.Exists(m_configuration.FilePath))
292294 ValidateConfigurationFile(m_configuration.FilePath);
293295 else
294296 CreateConfigurationFile(m_configuration.FilePath);
@@ -364,7 +366,7 @@ namespace GSF.Configuration · 69 unmodified lines
364366 /// </summary>
365367 public void Save()
366368 {
367− Save(ConfigurationSaveMode.Modified);
369+ Save(m_forceSave ? ConfigurationSaveMode.Full : ConfigurationSaveMode.Modified);
368370 }
369371
370372 /// <summary>
@@ -373,8 +375,7 @@ namespace GSF.Configuration · 2 unmodified lines
373375 /// <param name="saveMode">One of the <see cref="ConfigurationSaveMode"/> values.</param>
374376 public void Save(ConfigurationSaveMode saveMode)
375377 {
376− if (m_saveMode == ConfigurationSaveMode.Minimal || saveMode == ConfigurationSaveMode.Full)
377− m_saveMode = saveMode;
378+ m_saveMode = saveMode;
378379
379380 // Since the static open method always returns the same instance for the same configuration files,
380381 // synchronizing the instance will sync all saves.
@@ -385,9 +386,10 @@ namespace GSF.Configuration · 4 unmodified lines
385386 {
386387 // Perform configuration save
387388 ConfigurationSaveMode saveMode = m_saveMode;
388− m_configuration.Save(saveMode);
389+ m_configuration.Save(saveMode, m_forceSave);
389390 m_userConfiguration.Save(saveMode == ConfigurationSaveMode.Full);
390391 m_saveMode = ConfigurationSaveMode.Minimal;
392+ m_forceSave = false;
391393 }
392394
393395 /// <summary>
@@ -436,7 +438,7 @@ namespace GSF.Configuration · 42 unmodified lines
436438 private System.Configuration.Configuration GetConfiguration(string configFilePath)
437439 {
438440 ApplicationType appType = Common.GetApplicationType();
439− System.Configuration.Configuration configuration = null;
441+ System.Configuration.Configuration configuration;
440442
441443 if ((object)configFilePath != null)
442444 {
@@ -475,13 +477,15 @@ namespace GSF.Configuration · 32 unmodified lines
475477 if (!string.IsNullOrEmpty(configFilePath))
476478 {
477479 XmlTextWriter configFileWriter = new XmlTextWriter(configFilePath, Encoding.UTF8);
478− configFileWriter.Indentation = 4;
480+ configFileWriter.Indentation = 2;
479481 configFileWriter.Formatting = Formatting.Indented;
482+
480483 // Populates the very basic information required in a config file.
481484 configFileWriter.WriteStartDocument();
482485 configFileWriter.WriteStartElement("configuration");
483486 configFileWriter.WriteEndElement();
484487 configFileWriter.WriteEndDocument();
488+
485489 // Closes the config file.
486490 configFileWriter.Close();
487491
@@ -505,32 +509,44 @@ namespace GSF.Configuration · 17 unmodified lines
505509 // Make sure that the config file has the necessary section information under <customSections />
506510 // that is required by the .Net configuration API to process our custom <categorizedSettings />
507511 // section. The configuration API will raise an exception if it doesn't find this section.
508− if (configFile.DocumentElement.SelectNodes("configSections").Count == 0)
512+ if ((object)configFile.DocumentElement != null)
509513 {
510− // Adds a <configSections> node, if one is not present.
511− configFile.DocumentElement.InsertBefore(configFile.CreateElement("configSections"), configFile.DocumentElement.FirstChild);
514+ XmlNodeList configSections = configFile.DocumentElement.SelectNodes("configSections");
512515
513− configFileModified = true;
514− }
515− XmlNode configSectionsNode = configFile.DocumentElement.SelectSingleNode("configSections");
516− if (configSectionsNode.SelectNodes("section[@name = \'" + CustomSectionName + "\']").Count == 0)
517− {
518− // Adds the <section> node that specifies the DLL that handles the <categorizedSettings> node in
519− // the config file, if one is not present.
520− XmlNode node = configFile.CreateElement("section");
521− node.SetAttributeValue("name", CustomSectionName);
522− node.SetAttributeValue("type", CustomSectionType);
523− configSectionsNode.AppendChild(node);
524−
525− configFileModified = true;
516+ if ((object)configSections != null && configSections.Count == 0)
517+ {
518+ // Add a <configSections> node, if one is not present.
519+ if ((object)configFile.DocumentElement != null)
520+ {
521+ // ReSharper disable once PossibleNullReferenceException
522+ configFile.DocumentElement.InsertBefore(configFile.CreateElement("configSections"), configFile.DocumentElement.FirstChild);
523+ configFileModified = true;
524+ }
525+ }
526+
527+ XmlNode configSectionsNode = configFile.DocumentElement.SelectSingleNode("configSections");
528+
529+ if ((object)configSectionsNode != null)
530+ {
531+ XmlNodeList section = configSectionsNode.SelectNodes("section[@name = \'" + CustomSectionName + "\']");
532+
533+ if ((object)section != null && section.Count == 0)
534+ {
535+ // Adds the <section> node that specifies the DLL that handles the <categorizedSettings> node in
536+ // the config file, if one is not present.
537+ XmlNode node = configFile.CreateElement("section");
538+ node.SetAttributeValue("name", CustomSectionName);
539+ node.SetAttributeValue("type", CustomSectionType);
540+ configSectionsNode.AppendChild(node);
541+ configFileModified = true;
542+ }
543+ }
526544 }
527545
528546 // 11/14/2006 - PCP: We'll save the config file only it was modified. This will prevent ASP.Net
529547 // web sites from restarting every time a configuration element is accessed.
530548 if (configFileModified)
531− {
532549 configFile.Save(configFilePath);
533− }
534550 }
535551 else
536552 {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t