Exemplo n.º 1
0
        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);
        }