using System; using System.IO; using System.Text; using System.Collections.Generic; namespace AniNIX.Shared { public class Configure { // This is the file to configure from private List lines = new List(); /// /// Create a new Configure object /// /// The Config file public Configure(String filename) { StreamReader fileReader = new StreamReader(filename); String line; while (true) { line = fileReader.ReadLine(); if (line == null) break; //Ignore comments prefixed with '#' if (line.StartsWith("#")) continue; if (line.IndexOf('#') > 0) { lines.Add(line.Split('#')[0].Trim()); } else { lines.Add(line.Trim()); } } fileReader.Close(); fileReader.Dispose(); } /// /// Create a new string dictionary from the named section. /// /// The name of the section header /// New Dictionary of read key-value pairs from config section. public Dictionary ReadSection(String section) { Dictionary foundEntries = new Dictionary(); String header = String.Format("[ {0} ]",section); int i = 0, j; // Read to find the header for (i = 0; i < lines.Count; i++) { if (lines[i].Equals(header)) { i++; for (j = i; j < lines.Count && lines[j] != null && !String.IsNullOrWhiteSpace(lines[j]); j++) { int index = lines[j].IndexOf('='); String key = lines[j].Substring(0,index), value = lines[j].Substring(index+1); if (foundEntries.ContainsKey(key)) { foundEntries[key] = value; } else { foundEntries.Add(key,value); } } break; // Most configuration utilities don't allow multiple same-named sections } } return foundEntries; } /// /// If a conf section doesn't use key=value syntax, use this to grab the lines instead. /// /// The name of the section header /// New List of read key-value pairs from config section. public List ReadSectionLines(String section) { List foundEntries = new List(); String header = String.Format("[ {0} ]",section); int i = 0, j; // Read to find the header for (i = 0; i < lines.Count; i++) { if (lines[i].Equals(header)) { i++; for (j = i; j < lines.Count && lines[j] != null && !String.IsNullOrWhiteSpace(lines[j]); j++) { foundEntries.Add(lines[j]); } break; // Most configuration utilities don't allow multiple same-named sections } } return foundEntries; } /// /// Get the headers in a conf file. /// /// The headers from a file public List GetHeaders() { List foundHeaders = new List(); int i = 0; for (i = 0; i < lines.Count; i++) { if (lines[i].Length > 5 && lines[i][0] == '[' && lines[i][lines[i].Length-1] == ']') { foundHeaders.Add(lines[i].Substring(2,lines[i].Length-4)); } } return foundHeaders; } /// /// Get the lines from the file. /// /// The lines from the file public List GetLines() { return this.lines; } /// /// API for printing the configured section /// /// The dictionary that has been read in public static void PrintSectionAsRead(Dictionary sectionEntries) { foreach (KeyValuePair keyValue in sectionEntries) { Console.WriteLine(String.Format("Key: {0} -- Value: {1}",keyValue.Key,keyValue.Value)); } } } }