public ProtocolDatabase(int version) { m_Protocols = new Dictionary <int, ProtocolDefinition>(); var directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var protoDir = Path.Combine(directory, ConfigurationManager.AppSettings["ProtocolFolder"]); var filenames = Directory.GetFiles(protoDir, "*.def").OrderByDescending(s => s); foreach (var filename in filenames) { string shortName = Path.GetFileName(filename).Split('.')[0]; int code = OpcodeDatabase.Instance.GetOpcodeByName(shortName); if (code != 0 && !m_Protocols.ContainsKey(code)) { var stream = File.OpenRead(filename); var definition = ProtocolDefinition.ParseFromStream(stream, shortName, version); if (definition != null) { m_Protocols.Add(code, definition); } } } OpcodeDatabase.Instance.NamesToOpcodes.Where(kvp => !m_Protocols.ContainsKey(kvp.Value)) .ToList() .ForEach(kvp => m_Protocols.Add(kvp.Value, new ProtocolDefinition(kvp.Key))); }
public static ProtocolDefinition ParseFromStream(Stream stream, string name, int currentVersion) { ProtocolDefinition result = new ProtocolDefinition(name); var termsDictionary = Enum.GetValues(typeof(ProtocolTerm)).Cast <ProtocolTerm>().ToDictionary(e => e.ToString().ToLowerInvariant(), e => e); using (StreamReader reader = new StreamReader(stream)) { while (!reader.EndOfStream) { string line = reader.ReadLine(); if (!string.IsNullOrWhiteSpace(line)) { if (line.StartsWith("#")) { if (line.StartsWith("# majorPatchVersion >= ")) { int v = 0; if (Int32.TryParse(line.Substring(23), out v) && v > currentVersion) { return(null); } } continue; } line = line.TrimStart(); line = line.Replace("-", "- "); string[] words = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); int i = 0; while (words[i].CompareTo("-") == 0) { i++; } ProtocolTerm term; if (words.Length >= i + 2 && termsDictionary.TryGetValue(words[i], out term)) { result.Lines.Add(new ProtocolLine(i, term, words[i + 1])); } else { } } } } return(result); }