using System; using System.IO; using System.Text; using System.Collections; using System.Collections.Specialized; namespace gcodeparser { public class ConfigurationFile { private string mFileName; private Hashtable mSections = new Hashtable(); public ConfigurationFile(string name) { mFileName = name; } public void Load() { StreamReader reader = new StreamReader(mFileName); string line; ConfigurationSection section = AddSection(""); while ((line = reader.ReadLine()) != null) { ProcessLine(ref section, line); } reader.Close(); } private ConfigurationSection AddSection(string name) { ConfigurationSection result = new ConfigurationSection(name); mSections[name] = result; return result; } private void ProcessLine(ref ConfigurationSection section, string line) { if (line != null && line != "") { switch (line[0]) { case '[': ProcessSection(ref section, line); break; case ';': case '#': break; // comment, will be overwritten, but ignore here default: section.ParseEntry(line); break; } } } private void ProcessSection(ref ConfigurationSection section, string line) { line = line.TrimStart('[', ' '); line = line.TrimEnd(']', ' '); section = AddSection(line); } public void Save() { try { StreamWriter writer = new StreamWriter(mFileName, false); foreach (ConfigurationSection section in mSections.Values) { section.Write(writer); } writer.Close(); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine("Failed to store: " + ex.Message); } } public string GetEntryValue(string sectionName, string key) { ConfigurationSection section = mSections[sectionName] as ConfigurationSection; if (section != null) { return section.Entries[key.ToLower()] as string; } return ""; } public void SetEntryValue(string sectionName, string key, string val) { ConfigurationSection section = mSections[sectionName] as ConfigurationSection; if (section == null) { section = new ConfigurationSection(sectionName); mSections[sectionName] = section; } section.Entries[key.ToLower()] = val; } public ConfigurationSection GetSection(string sectionName) { ConfigurationSection result = mSections[sectionName] as ConfigurationSection; if (result != null) return result; return AddSection(sectionName); } } public class ConfigurationSection { //private StringDictionary mEntries = new StringDictionary(); private SortedList mEntries = new SortedList(); private string mSectionName; public SortedList Entries { get { return mEntries; } } public string SectionName { get { return mSectionName; } } public ConfigurationSection(string sectionName) { mSectionName = sectionName; } public int GetInt(string name, int defaultValue) { string res = mEntries[name] as string; if (res != null) { return int.Parse(res); } return defaultValue; } public float GetFloat(string name, float defaultValue) { string res = mEntries[name] as string; if (res != null) { return float.Parse(res); } return defaultValue; } public void SetInt(string name, int val) { mEntries[name] = val.ToString(); } public void SetFloat(string name, float val) { mEntries[name] = val.ToString(); } public long GetLong(string name, long defaultValue) { string res = mEntries[name] as string; if (res != null) { return long.Parse(res); } return defaultValue; } public void SetLong(string name, long val) { mEntries[name] = val.ToString(); } public string GetString(string name) { return mEntries[name] as string; } public void SetString(string name, string val) { mEntries[name] = val; } public bool GetBool(string name, bool defaultValue) { string res = mEntries[name] as string; if (res != null) { res = res.ToLower(); return (res == "true" || res == "1"); } return defaultValue; } public void SetBool(string name, bool val) { mEntries[name] = val ? "true" : "false"; } public int[] GetInts(string name, int[] defaultValue) { string res = mEntries[name] as string; if (res == null || res == string.Empty) return defaultValue; int[] result = DeserializeInts(res); return result == null ? defaultValue : result; } public void SetInts(string name, int[] values) { if (values == null) mEntries[name] = values; mEntries[name] = SerializeWithCommas(values); } internal void ParseEntry(string entryLine) { if (entryLine != null && entryLine != "") { int split = entryLine.IndexOf('='); if (split > 0) { string key = entryLine.Substring(0, split); string val = ""; if (split < entryLine.Length - 1) { val = entryLine.Substring(split + 1); } mEntries[key] = val; } } } internal void Write(TextWriter writer) { if (mSectionName != "") { writer.WriteLine("[{0}]", mSectionName); } foreach (DictionaryEntry entry in mEntries) { writer.WriteLine("{0}={1}", ((string)entry.Key).ToLower(), entry.Value); } writer.WriteLine(); } public static string SerializeWithCommas(params object[] args) { bool isFirst = true; StringBuilder sb = new StringBuilder(); foreach (object obj in args) { if (isFirst) { sb.Append(obj.ToString()); isFirst = false; } else { sb.Append("," + obj.ToString()); } } return sb.ToString(); } public static string SerializeGuidsWithCommas(params Guid[] args) { bool isFirst = true; StringBuilder sb = new StringBuilder(); foreach (Guid guid in args) { long high = 0; long low = 0; GuidToLongs(guid, out high, out low); if (isFirst) { sb.Append(high.ToString() + "&" + low.ToString()); isFirst = false; } else { sb.Append("," + high.ToString() + "&" + low.ToString()); } } return sb.ToString(); } public static int[] DeserializeInts(string target) { string[] strings = target.Split(','); if (strings == null || strings.Length == 0) return null; int[] result = new int[strings.Length]; for (int i = 0; i < strings.Length; ++i) { try { result[i] = int.Parse(strings[i]); } catch { // FIXME: localize throw new Exception(string.Format("Failed to parse int value '{0}' in string '{1}'.", result[i], target)); } } return result; } public static Guid[] DeserializeGuids(string target) { string[] strings = target.Split(','); if (strings == null || strings.Length == 0) return null; Guid[] result = new Guid[strings.Length]; for (int i = 0; i < strings.Length; ++i) { try { string[] longs = strings[i].Split('&'); result[i] = GuidFromLongs( long.Parse(longs[0]), long.Parse(longs[1])); } catch { // FIXME: localize throw new Exception(string.Format("Failed to parse int value '{0}' in string '{1}'.", result[i], target)); } } return result; } private static void GuidToLongs(Guid guid, out long high, out long low) { byte[] bytes = guid.ToByteArray(); high = BitConverter.ToInt64(bytes, 8); low = BitConverter.ToInt64(bytes, 0); } private static Guid GuidFromLongs(long high, long low) { byte[] guiddata = new byte[16]; byte[] byteshigh = BitConverter.GetBytes(high); byte[] byteslow = BitConverter.GetBytes(low); Array.Copy(byteshigh, 0, guiddata, 8, byteshigh.Length); Array.Copy(byteslow, 0, guiddata, 0, byteshigh.Length); return new Guid(guiddata); } } }