public static List <LogInfo> UserInput(EngineState s, CodeCommand cmd) { List <LogInfo> logs = new List <LogInfo>(); Debug.Assert(cmd.Info.GetType() == typeof(CodeInfo_UserInput)); CodeInfo_UserInput info = cmd.Info as CodeInfo_UserInput; UserInputType type = info.Type; switch (type) { case UserInputType.DirPath: case UserInputType.FilePath: { Debug.Assert(info.SubInfo.GetType() == typeof(UserInputInfo_DirFile)); UserInputInfo_DirFile subInfo = info.SubInfo as UserInputInfo_DirFile; string initPath = StringEscaper.Preprocess(s, subInfo.InitPath); string selectedPath = initPath; if (type == UserInputType.FilePath) { string filter = "All Files|*.*"; string initFile = Path.GetFileName(initPath); if (initFile.StartsWith("*.", StringComparison.Ordinal) || initFile.Equals("*", StringComparison.Ordinal)) { // If wildcard exists, apply to filter. string ext = Path.GetExtension(initFile); if (1 < ext.Length && ext.StartsWith(".", StringComparison.Ordinal)) { ext = ext.Substring(1); } filter = $"{ext} Files|{initFile}"; } Microsoft.Win32.OpenFileDialog dialog = new Microsoft.Win32.OpenFileDialog() { Filter = filter, InitialDirectory = Path.GetDirectoryName(initPath), }; if (dialog.ShowDialog() == true) { selectedPath = dialog.FileName; logs.Add(new LogInfo(LogState.Success, $"File path [{selectedPath}] was chosen by user")); } else { logs.Add(new LogInfo(LogState.Error, "File path was not chosen by user")); return(logs); } } else { VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog() { SelectedPath = initPath, }; bool failure = false; Application.Current.Dispatcher.Invoke(() => { if (dialog.ShowDialog(Application.Current.MainWindow)) { selectedPath = dialog.SelectedPath; logs.Add(new LogInfo(LogState.Success, $"Directory path [{selectedPath}] was chosen by user")); } else { logs.Add(new LogInfo(LogState.Error, "Directory path was not chosen by user")); failure = true; } }); if (failure) { return(logs); } } List <LogInfo> varLogs = Variables.SetVariable(s, subInfo.DestVar, selectedPath); logs.AddRange(varLogs); } break; default: // Error throw new InvalidCodeCommandException($"Wrong UserInputType [{type}]"); } return(logs); }
private void RecursiveFindCodeSection(IReadOnlyList <CodeCommand> codes, List <LogInfo> logs) { string targetCodeSection = null; string targetInterfaceSection = null; foreach (CodeCommand cmd in codes) { switch (cmd.Type) { #region Check CodeSections case CodeType.If: { CodeInfo_If info = cmd.Info.Cast <CodeInfo_If>(); if (info.Condition.Type == BranchConditionType.ExistSection) { // For recursive section call // Ex) If,ExistSection,%ScriptFile%,DoWork,Run,%ScriptFile%,DoWork if (info.Condition.Arg1.Equals(Script.Const.ScriptFile, StringComparison.OrdinalIgnoreCase) && info.Embed.Type == CodeType.Run || info.Embed.Type == CodeType.RunEx || info.Embed.Type == CodeType.Exec) { CodeInfo_RunExec subInfo = info.Embed.Info.Cast <CodeInfo_RunExec>(); if (subInfo.ScriptFile.Equals(Script.Const.ScriptFile, StringComparison.OrdinalIgnoreCase)) { if (info.Condition.Arg2.Equals(subInfo.SectionName, StringComparison.OrdinalIgnoreCase)) { continue; } } } } RecursiveFindCodeSection(info.Link, logs); } break; case CodeType.Else: { CodeInfo_Else info = cmd.Info.Cast <CodeInfo_Else>(); RecursiveFindCodeSection(info.Link, logs); } break; case CodeType.Run: case CodeType.Exec: case CodeType.RunEx: { CodeInfo_RunExec info = cmd.Info.Cast <CodeInfo_RunExec>(); // CodeValidator does not have Variable information, so just check with predefined literal if (info.ScriptFile.Equals(Script.Const.ScriptFile, StringComparison.OrdinalIgnoreCase) && !CodeParser.StringContainsVariable(info.SectionName)) { targetCodeSection = info.SectionName; } } break; case CodeType.Loop: case CodeType.LoopLetter: case CodeType.LoopEx: case CodeType.LoopLetterEx: { CodeInfo_Loop info = cmd.Info.Cast <CodeInfo_Loop>(); if (info.Break) { continue; } // CodeValidator does not have Variable information, so just check with predefined literal if (info.ScriptFile.Equals(Script.Const.ScriptFile, StringComparison.OrdinalIgnoreCase) && !CodeParser.StringContainsVariable(info.SectionName)) { targetCodeSection = info.SectionName; } } break; case CodeType.UserInput: { CodeInfo_UserInput info = cmd.Info.Cast <CodeInfo_UserInput>(); UserInputType type = info.Type; switch (type) { case UserInputType.DirPath: case UserInputType.FilePath: { UserInputInfo_DirFile subInfo = info.SubInfo.Cast <UserInputInfo_DirFile>(); if (info.Type == UserInputType.FilePath) { // Select File if (subInfo.Filter != null) { string filter = StringEscaper.Unescape(subInfo.Filter); if (StringEscaper.IsFileFilterValid(filter) == false) { logs.Add(new LogInfo(LogState.Error, $"File filter pattern [{filter}] is invalid", cmd)); } } } else { // Select Folder if (subInfo.Filter != null) { logs.Add(new LogInfo(LogState.Warning, $"File filters cannot be used for folder selection", cmd)); } } } break; } } break; #endregion #region Check InterfaceSections case CodeType.AddInterface: { CodeInfo_AddInterface info = cmd.Info.Cast <CodeInfo_AddInterface>(); // CodeValidator does not have Variable information, so just check with predefined literal if (info.ScriptFile.Equals(Script.Const.ScriptFile, StringComparison.OrdinalIgnoreCase) && !CodeParser.StringContainsVariable(info.Section)) { targetInterfaceSection = info.Section; } } break; case CodeType.ReadInterface: { CodeInfo_ReadInterface info = cmd.Info.Cast <CodeInfo_ReadInterface>(); // CodeValidator does not have Variable information, so just check with predefined literal if (info.ScriptFile.Equals(Script.Const.ScriptFile, StringComparison.OrdinalIgnoreCase) && !CodeParser.StringContainsVariable(info.Section)) { targetInterfaceSection = info.Section; } } break; case CodeType.WriteInterface: { CodeInfo_WriteInterface info = cmd.Info.Cast <CodeInfo_WriteInterface>(); // CodeValidator does not have Variable information, so just check with predefined literal if (info.ScriptFile.Equals(Script.Const.ScriptFile, StringComparison.OrdinalIgnoreCase) && !CodeParser.StringContainsVariable(info.Section)) { targetInterfaceSection = info.Section; } } break; case CodeType.IniWrite: { // To detect multi-interface without `InterfaceList=`, // Inspect pattern `IniWrite,%ScriptFile%,Main,Interface,<NewInterfaceSection>` CodeInfo_IniWrite info = cmd.Info.Cast <CodeInfo_IniWrite>(); // CodeValidator does not have Variable information, so just check with predefined literal if (info.FileName.Equals(Script.Const.ScriptFile, StringComparison.OrdinalIgnoreCase) && info.Section.Equals(ScriptSection.Names.Main, StringComparison.OrdinalIgnoreCase) && info.Key.Equals(ScriptSection.Names.Interface, StringComparison.OrdinalIgnoreCase) && !CodeParser.StringContainsVariable(info.Value)) { targetInterfaceSection = info.Value; } } break; #endregion } if (targetCodeSection != null) { if (_sc.Sections.ContainsKey(targetCodeSection)) { logs.AddRange(CheckCodeSection(_sc.Sections[targetCodeSection], cmd.RawCode, cmd.LineIdx)); } else { logs.Add(new LogInfo(LogState.Error, $"Section [{targetCodeSection}] does not exist", cmd)); } } if (targetInterfaceSection != null) { if (_sc.Sections.ContainsKey(targetInterfaceSection)) { logs.AddRange(CheckInterfaceSection(_sc.Sections[targetInterfaceSection], cmd.RawCode, cmd.LineIdx)); } else { logs.Add(new LogInfo(LogState.Error, $"Section [{targetInterfaceSection}] does not exist", cmd)); } } } }