using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Console.Network; namespace Tango.Console { public class ConsoleExecutionEngine { private class ParsedCommand { public String Command { get; set; } public String Arguments { get; set; } public ParsedCommand(ConsoleCommandRequest request) { String[] s = request.Command.Split(' '); Command = s.First(); Arguments = String.Join(" ", s.Skip(1)); } } public Task Execute(ConsoleCommandRequest request) { return Task.Factory.StartNew(() => { ParsedCommand parsedCommand = new ParsedCommand(request); if (parsedCommand.Command.ToLower() == "cd") { if (parsedCommand.Arguments.Contains(":\\") && Directory.Exists(parsedCommand.Arguments)) { return CreateResult(parsedCommand.Arguments, String.Empty); } else if (Directory.Exists(Path.Combine(request.WorkingFolder, parsedCommand.Arguments))) { return CreateResult(Path.GetFullPath(Path.Combine(request.WorkingFolder, parsedCommand.Arguments)), String.Empty); } else { return CreateResult(null, "The directory does not exists."); } } String output = String.Empty; String error = String.Empty; var process = new Process(); process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardOutput = true; if (request.RunAsAdministrator) { process.StartInfo.Verb = "runas"; } if (request.WorkingFolder != null) { process.StartInfo.WorkingDirectory = request.WorkingFolder; } if (ConsoleDictionary.GetKnownCommands().Exists(x => x.Name.ToLower() == parsedCommand.Command.ToLower())) { process.StartInfo.FileName = "cmd.exe"; process.StartInfo.Arguments = "/C " + request.Command; } else { process.StartInfo.FileName = parsedCommand.Command; process.StartInfo.Arguments = parsedCommand.Arguments; } process.Start(); bool hasGuid = false; try { process.WaitForInputIdle(5000); hasGuid = true; } catch { } if (!hasGuid) { output = process.StandardOutput.ReadToEnd(); error = process.StandardError.ReadToEnd(); } return CreateResult(request.WorkingFolder, String.IsNullOrWhiteSpace(error) ? output.Replace(request.WorkingFolder + ">", "") : error); }); } public static List GetSuggestions(String folder) { List suggestions = new List(); foreach (var dir in Directory.GetDirectories(Path.GetFullPath(folder))) { suggestions.Add(new ConsoleSuggestion() { Type = ConsoleSuggestionType.Folder, Name = Path.GetFileName(dir) }); } foreach (var file in Directory.GetFiles(Path.GetFullPath(folder))) { suggestions.Add(new ConsoleSuggestion() { Type = ConsoleSuggestionType.File, Name = Path.GetFileName(file), }); } return suggestions; } private ConsoleCommandExecutionResult CreateResult(String workingFolder, String output) { ConsoleCommandExecutionResult result = new ConsoleCommandExecutionResult(); result.WorkingFolder = workingFolder; result.Output = output; result.Suggestions.AddRange(GetSuggestions(workingFolder)); return result; } } }