view IniFile.cs @ 1:f9444f1786cd

Re #6 - INI parsing library * Add ToString methods * Add types of string and parse to objects instead of parsing to key-value pair * Create method to load INI data from string * Add content of AddSection method
author IBBoard <dev@ibboard.co.uk>
date Sun, 11 Jan 2009 15:37:14 +0000
parents fbde5e1920ba
children 2dde4c1d19d9
line wrap: on
line source

// This file (IniFile.cs) is a part of the IBBoard.Ini library and is copyright 2009 IBBoard.
//
// The file and the library/program it is in are licensed under the GNU LGPL license. Please see COPYING.LGPL for more information and the full license.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace IBBoard.Ini
{		
	/// <summary>
	/// The <code>IniFile</code> provides access to INI formatted data. INI files are no longer used as much as they were, but many older applications including parts of Windows still use them to store data and configuration values in.
	/// </summary>
	public class IniFile : IEnumerable<IniSection>
	{		
		private Dictionary<string, IniSection> sections;
		
		/// <summary>
		/// Default constructor that provides an empty INI file with no sections
		/// </summary>
		public IniFile()
		{
			sections = new Dictionary<string,IniSection>();
		}
				
		/// <summary>
		/// Adds an <see cref="IniSection"/> to the IniFile.
		/// <p>
		/// Throws an ArgumentException if the section already exists in this file
		/// </summary>
		/// <param name="section">
		/// The <see cref="IniSection"/> to add
		/// </param>
		public void AddSection(IniSection section)
		{
			if (!HasSection(section.Name))
			{
				sections.Add(section.Name, section);
			}
			else
			{
				throw new ArgumentException("Ini section already exists with name " + section.Name);
			}
		}

		public IEnumerator<IniSection> GetEnumerator()
		{
			return sections.Values.GetEnumerator();
		}

		IEnumerator IEnumerable.GetEnumerator()
        {
            return sections.Values.GetEnumerator();
        }

		//// <value>
		/// Gets a single section by name. If no section exists with that name then a <see cref=" NonExistantIniSection"/> is returned to remove the need for null checks. To check for the existance of a section use the <code>HasSection</code> method.
		/// </value>
		public IniSection this[string sectionName]
		{
			get
			{	
				IniSection section = null;
				sections.TryGetValue(sectionName.Trim(), out section);
				
				if (section == null)
				{
					section = new NonExistantIniSection();
				}
				
				return section;
			}
		}

		
		public bool HasSection(string sectionName)
		{
			return sections.ContainsKey(sectionName.Trim());
		}
		
		public IniSection[] Sections
		{
			get
			{
				IniSection[] col = new IniSection[sections.Count];
				sections.Values.CopyTo(col, 0);
				return col;
			}
		}

		public override string ToString()
		{
			StringBuilder stringBuilder = new StringBuilder();

			foreach (IniSection section in this)
			{
				stringBuilder.Append(section.ToString());
				stringBuilder.Append("\n");
			}
			
			return stringBuilder.ToString().Trim();
		}

	}
}