public RepgenRunResult FileRun(File file, FileRunStatus callStatus, FileRunPrompt callPrompt, int queue, RunWorkerCompletedEventHandler Notify = null) { if (file.Type != FileType.RepGen) throw new InvalidOperationException("Cannot run a " + file.FileTypeString() + " file"); ISymCommand cmd; callStatus(RunState.Initializing, file); _socket.Write("mm0\u001B"); WaitForCommand("Input"); _socket.Write("1\r"); WaitForCommand("Input"); _socket.Write("11\r"); WaitForPrompt("Specification File"); _socket.Write(file.Name + "\r"); bool erroredOut = false; while (true) { cmd = _socket.ReadCommand(); if (cmd.Command == "Input") { if (cmd.Get("HelpCode") == "20301") break; callStatus(RunState.Prompts, file); string result = callPrompt(cmd.Get("Prompt")); if (result == null) //cancelled { _socket.Write("\u001B"); cmd = _socket.ReadCommand(); while (cmd.Command != "Input") cmd = _socket.ReadCommand(); callStatus(RunState.Cancelled, file); return RepgenRunResult.Cancelled(); } _socket.Write(result.Trim() + '\r'); } else if (cmd.Command == "Bell") callStatus(RunState.Prompts, "Invalid Prompt Input, Please Re-Enter"); else if ((cmd.Command == "Batch") && (cmd.Get("Text") == "No such file or directory")) { cmd = _socket.ReadCommand(); while (cmd.Command != "Input") cmd = _socket.ReadCommand(); callStatus(RunState.Failed, "File not found"); return RepgenRunResult.FileNotFound(); } else if (cmd.Command == "SpecfileErr") erroredOut = true; else if (erroredOut && (cmd.Command == "Batch") && (cmd.Get("Action") == "DisplayLine")) { string err = cmd.Get("Text"); cmd = _socket.ReadCommand(); while (cmd.Command != "Input") cmd = _socket.ReadCommand(); callStatus(RunState.Failed, err); return RepgenRunResult.Error(err); } else if ((cmd.Command == "Batch") && (cmd.Get("Action") == "DisplayLine")) callStatus(RunState.Initializing, cmd.Get("Text")); } while (cmd.Get("Prompt").Contains("Specification File")) { _socket.Write("\r"); cmd = _socket.ReadCommand(); } WaitForPrompt("Batch Options"); _socket.Write("0\r"); Dictionary<int, int> availableQueues = GetQueueList(cmd); if (queue < 0) queue = GetOpenQueue(availableQueues); WaitForPrompt("Batch Queue"); _socket.Write(queue + "\r"); WaitForCommand("Input"); _socket.Write("1\r"); cmd = _socket.ReadCommand(); while (cmd.Command != "Input") cmd = _socket.ReadCommand(); cmd = new SymCommand("Misc"); cmd.Set("InfoType", "BatchQueues"); _socket.Write(cmd); int newestTime = 0; int sequenceNo = -1; cmd = _socket.ReadCommand(); while (!cmd.HasParameter("Done")) { if (cmd.Get("Action") == "QueueEntry") { int currTime = Utilities.ConvertTime(cmd.Get("Time")); if (currTime >= newestTime) { newestTime = currTime; sequenceNo = int.Parse(cmd.Get("Seq")); } } cmd = _socket.ReadCommand(); } callStatus(RunState.Running, sequenceNo); if (Notify != null) { var worker = new BackgroundWorker(); worker.DoWork += (sender, eventArgs) => { Thread.Sleep(5000); // Wait 5 seconds before first check while (IsFileRunning(sequenceNo)) { Thread.Sleep(15000); } object[] result = new object[3]; result[0] = file.Name; result[1] = sequenceNo; result[2] = GetBatchOutputSequence(file.Name, newestTime); eventArgs.Result = result; }; worker.RunWorkerCompleted += Notify; worker.RunWorkerAsync(); } return RepgenRunResult.Okay(sequenceNo, newestTime); }
public RepgenRunResult FileRun(File file, FileRunStatus callStatus, FileRunPrompt callPrompt, int queue, RunWorkerCompletedEventHandler Notify = null) { if (file.Type != FileType.RepGen) { throw new InvalidOperationException("Cannot run a " + file.FileTypeString() + " file"); } ISymCommand cmd; callStatus(RunState.Initializing, file); _socket.Write("mm0\u001B"); WaitForCommand("Input"); _socket.Write("1\r"); WaitForCommand("Input"); _socket.Write("11\r"); WaitForPrompt("Specification File"); _socket.Write(file.Name + "\r"); bool erroredOut = false; while (true) { cmd = _socket.ReadCommand(); if (cmd.Command == "Input") { if (cmd.Get("HelpCode") == "20301") { break; } callStatus(RunState.Prompts, file); string result = callPrompt(cmd.Get("Prompt")); if (result == null) //cancelled { _socket.Write("\u001B"); cmd = _socket.ReadCommand(); while (cmd.Command != "Input") { cmd = _socket.ReadCommand(); } callStatus(RunState.Cancelled, file); return(RepgenRunResult.Cancelled()); } _socket.Write(result.Trim() + '\r'); } else if (cmd.Command == "Bell") { callStatus(RunState.Prompts, "Invalid Prompt Input, Please Re-Enter"); } else if ((cmd.Command == "Batch") && (cmd.Get("Text") == "No such file or directory")) { cmd = _socket.ReadCommand(); while (cmd.Command != "Input") { cmd = _socket.ReadCommand(); } callStatus(RunState.Failed, "File not found"); return(RepgenRunResult.FileNotFound()); } else if (cmd.Command == "SpecfileErr") { erroredOut = true; } else if (erroredOut && (cmd.Command == "Batch") && (cmd.Get("Action") == "DisplayLine")) { string err = cmd.Get("Text"); cmd = _socket.ReadCommand(); while (cmd.Command != "Input") { cmd = _socket.ReadCommand(); } callStatus(RunState.Failed, err); return(RepgenRunResult.Error(err)); } else if ((cmd.Command == "Batch") && (cmd.Get("Action") == "DisplayLine")) { callStatus(RunState.Initializing, cmd.Get("Text")); } } while (cmd.Get("Prompt").Contains("Specification File")) { _socket.Write("\r"); cmd = _socket.ReadCommand(); } WaitForPrompt("Batch Options"); _socket.Write("0\r"); Dictionary <int, int> availableQueues = GetQueueList(cmd); if (queue < 0) { queue = GetOpenQueue(availableQueues); } WaitForPrompt("Batch Queue"); _socket.Write(queue + "\r"); WaitForCommand("Input"); _socket.Write("1\r"); cmd = _socket.ReadCommand(); while (cmd.Command != "Input") { cmd = _socket.ReadCommand(); } cmd = new SymCommand("Misc"); cmd.Set("InfoType", "BatchQueues"); _socket.Write(cmd); int newestTime = 0; int sequenceNo = -1; cmd = _socket.ReadCommand(); while (!cmd.HasParameter("Done")) { if (cmd.Get("Action") == "QueueEntry") { int currTime = Utilities.ConvertTime(cmd.Get("Time")); if (currTime >= newestTime) { newestTime = currTime; sequenceNo = int.Parse(cmd.Get("Seq")); } } cmd = _socket.ReadCommand(); } callStatus(RunState.Running, sequenceNo); if (Notify != null) { var worker = new BackgroundWorker(); worker.DoWork += (sender, eventArgs) => { Thread.Sleep(5000); // Wait 5 seconds before first check while (IsFileRunning(sequenceNo)) { Thread.Sleep(15000); } object[] result = new object[3]; result[0] = file.Name; result[1] = sequenceNo; result[2] = GetBatchOutputSequence(file.Name, newestTime); eventArgs.Result = result; }; worker.RunWorkerCompleted += Notify; worker.RunWorkerAsync(); } return(RepgenRunResult.Okay(sequenceNo, newestTime)); }