public static KeyFile Load(string fileName, Encoding encoding) { if (string.IsNullOrWhiteSpace(fileName)) { throw new ArgumentNullException(nameof(fileName)); } var file = new FileInfo(fileName); var keyFile = new KeyFile { FileName = file.FullName, _encoding = encoding }; using (var sr = new StreamReader(file.FullName, encoding)) { var lineNum = 0; while (!sr.EndOfStream) { lineNum++; var currentLine = sr.ReadLine(); if (currentLine != null) { var currentLineTrim = currentLine.Trim(); if (currentLineTrim.TrimStart().StartsWith("/") || currentLineTrim.TrimStart().StartsWith("#")) { keyFile._lines.Add(new CommentLine(currentLine) { LineNum = lineNum }); continue; } } var tokenList = Util.Tokenize(currentLine); if (tokenList == null || tokenList.Count == 0) { keyFile._lines.Add(new BlankLine() { LineNum = lineNum }); continue; } try { int token3; Int32.TryParse(tokenList[2], out token3); if (token3 == -1 || token3 == -2 || token3 == -4 || token3 == 8) { DirectInputBinding directInputBinding; var parsed = DirectInputBinding.TryParse(currentLine, out directInputBinding); if (!parsed) { keyFile._lines.Add(new UnparsableLine(currentLine) { LineNum = lineNum }); continue; } directInputBinding.LineNum = lineNum; keyFile._lines.Add(directInputBinding); } else { KeyBinding keyBinding; var parsed = KeyBinding.TryParse(currentLine, out keyBinding); if (!parsed) { keyFile._lines.Add(new UnparsableLine(currentLine) { LineNum = lineNum }); continue; } keyBinding.LineNum = lineNum; keyFile._lines.Add(keyBinding); } } catch (Exception e) { keyFile._lines.Add(new UnparsableLine(currentLine) { LineNum = lineNum }); Log.Error($"Line {lineNum} in key file {file.FullName} could not be parsed.", e); } } } keyFile.UpdateIndexOfCallbacks(); return(keyFile); }
public static bool TryParse(string input, out DirectInputBinding directInputBinding) { directInputBinding = null; if (input == null) { return(false); } var tokenList = Util.Tokenize(input); if (tokenList.Count < 7) { return(false); } var callback = tokenList[0]; if (string.IsNullOrWhiteSpace(callback)) { return(false); } int buttonIndexOrPovHatNumber; var parsed = Int32.TryParse(tokenList[1], out buttonIndexOrPovHatNumber); if (!parsed) { return(false); } int callbackInvocationBehavior; parsed = Int32.TryParse(tokenList[2], out callbackInvocationBehavior); if (!parsed) { return(false); } int bindingType; parsed = Int32.TryParse(tokenList[3], out bindingType); if (!parsed) { return(false); } int soundId; parsed = Int32.TryParse(tokenList[6], out soundId); if (!parsed) { return(false); } string description = null; if (tokenList.Count >= 8) { var firstQuote = input.IndexOf("\"", StringComparison.OrdinalIgnoreCase); if (firstQuote > 0) { description = input.Substring(firstQuote); } else { return(false); } } switch ((DirectInputBindingType)bindingType) { case DirectInputBindingType.Button: uint triggeringEvent; parsed = UInt32.TryParse(tokenList[4], out triggeringEvent); if (!parsed) { return(false); } directInputBinding = new DirectInputBinding(callback, buttonIndexOrPovHatNumber, (CallbackInvocationBehavior)callbackInvocationBehavior, (TriggeringEvent)triggeringEvent, soundId, description); return(true); case DirectInputBindingType.POVDirection: uint povDirection; parsed = UInt32.TryParse(tokenList[4], out povDirection); if (!parsed) { return(false); } directInputBinding = new DirectInputBinding(callback, buttonIndexOrPovHatNumber, (CallbackInvocationBehavior)callbackInvocationBehavior, (PovDirections)povDirection, soundId, description); return(true); } return(false); }