public override void RunCommand(object sender) { AutomationEngineInstance currentScriptEngine = (AutomationEngineInstance)sender; if (currentScriptEngine.ScriptEngineUI == null) { RunServerTask(sender); return; } var childTaskPath = v_taskPath.ConvertUserVariableToString(currentScriptEngine); if (!File.Exists(childTaskPath)) { throw new FileNotFoundException("Task file was not found"); } frmScriptEngine parentEngine = (frmScriptEngine)currentScriptEngine.ScriptEngineUI; string parentTaskPath = currentScriptEngine.ScriptEngineUI.FilePath; int parentDebugLine = currentScriptEngine.ScriptEngineUI.DebugLineNumber; //create variable list InitializeVariableLists(currentScriptEngine); string projectPath = parentEngine.ProjectPath; _newEngine = new frmScriptEngine(childTaskPath, projectPath, (frmScriptBuilder)CurrentScriptBuilder, ((frmScriptBuilder)CurrentScriptBuilder).EngineLogger, _variableList, null, currentScriptEngine.AppInstances, false, parentEngine.IsDebugMode); _newEngine.IsChildEngine = true; _newEngine.IsHiddenTaskEngine = true; if (IsSteppedInto) { _newEngine.IsNewTaskSteppedInto = true; _newEngine.IsHiddenTaskEngine = false; } ((frmScriptBuilder)CurrentScriptBuilder).EngineLogger.Information("Executing Child Task: " + Path.GetFileName(childTaskPath)); ((frmScriptEngine)currentScriptEngine.ScriptEngineUI).Invoke((Action) delegate() { ((frmScriptEngine)currentScriptEngine.ScriptEngineUI).TopMost = false; }); Application.Run(_newEngine); if (_newEngine.ClosingAllEngines) { currentScriptEngine.ScriptEngineUI.ClosingAllEngines = true; currentScriptEngine.ScriptEngineUI.CloseWhenDone = true; } // Update Current Engine Context Post Run Task UpdateCurrentEngineContext(currentScriptEngine, _newEngine.EngineInstance); ((frmScriptBuilder)CurrentScriptBuilder).EngineLogger.Information("Resuming Parent Task: " + Path.GetFileName(parentTaskPath)); if (parentEngine.IsDebugMode) { ((frmScriptEngine)currentScriptEngine.ScriptEngineUI).Invoke((Action) delegate() { parentEngine.TopMost = true; parentEngine.IsHiddenTaskEngine = true; if ((IsSteppedInto || !_newEngine.IsHiddenTaskEngine) && !_newEngine.IsNewTaskResumed && !_newEngine.IsNewTaskCancelled) { parentEngine.CallBackForm.CurrentEngine = parentEngine; parentEngine.CallBackForm.IsScriptSteppedInto = true; parentEngine.IsHiddenTaskEngine = false; //toggle running flag to allow for tab selection parentEngine.CallBackForm.IsScriptRunning = false; ((frmScriptBuilder)parentEngine.CallBackForm).OpenFile(parentTaskPath); parentEngine.CallBackForm.IsScriptRunning = true; parentEngine.UpdateLineNumber(parentDebugLine + 1); parentEngine.AddStatus("Pausing Before Execution"); } else if (_newEngine.IsNewTaskResumed) { parentEngine.CallBackForm.CurrentEngine = parentEngine; parentEngine.IsNewTaskResumed = true; parentEngine.IsHiddenTaskEngine = true; parentEngine.CallBackForm.IsScriptSteppedInto = false; parentEngine.CallBackForm.IsScriptPaused = false; parentEngine.ResumeParentTask(); } else if (_newEngine.IsNewTaskCancelled) { parentEngine.uiBtnCancel_Click(null, null); } else //child task never stepped into { parentEngine.IsHiddenTaskEngine = false; } }); } else { ((frmScriptEngine)currentScriptEngine.ScriptEngineUI).Invoke((Action) delegate() { parentEngine.TopMost = true; }); } }
public override void RunCommand(object sender) { AutomationEngineInstance currentScriptEngine = (AutomationEngineInstance)sender; var childTaskPath = v_taskPath.ConvertUserVariableToString(currentScriptEngine); frmScriptEngine parentEngine = (frmScriptEngine)currentScriptEngine.TasktEngineUI; string parentTaskPath = currentScriptEngine.TasktEngineUI.FilePath; int parentDebugLine = currentScriptEngine.TasktEngineUI.DebugLineNumber; //create variable list var variableList = new List <ScriptVariable>(); var variableReturnList = new List <ScriptVariable>(); foreach (DataRow rw in v_VariableAssignments.Rows) { var variableName = (string)rw.ItemArray[0]; object variableValue = null; if (((string)rw.ItemArray[1]).StartsWith("{") && ((string)rw.ItemArray[1]).EndsWith("}")) { variableValue = ((string)rw.ItemArray[1]).ConvertUserVariableToObject(currentScriptEngine); } if (variableValue is string || variableValue == null) { variableValue = ((string)rw.ItemArray[1]).ConvertUserVariableToString(currentScriptEngine); } var variableReturn = (string)rw.ItemArray[2]; variableList.Add(new ScriptVariable { VariableName = variableName.Replace("{", "").Replace("}", ""), VariableValue = variableValue }); if (variableReturn == "Yes") { variableReturnList.Add(new ScriptVariable { VariableName = variableName.Replace("{", "").Replace("}", ""), VariableValue = variableValue }); } } NewEngine = new frmScriptEngine(childTaskPath, (frmScriptBuilder)CurrentScriptBuilder, ((frmScriptBuilder)CurrentScriptBuilder).EngineLogger, variableList, null, false, parentEngine.IsDebugMode); NewEngine.IsChildEngine = true; NewEngine.IsHiddenTaskEngine = true; if (IsSteppedInto) { NewEngine.IsNewTaskSteppedInto = true; NewEngine.IsHiddenTaskEngine = false; } ((frmScriptBuilder)CurrentScriptBuilder).EngineLogger.Information("Executing Child Task: " + Path.GetFileName(childTaskPath)); ((frmScriptEngine)currentScriptEngine.TasktEngineUI).Invoke((Action) delegate() { ((frmScriptEngine)currentScriptEngine.TasktEngineUI).TopMost = false; }); Application.Run(NewEngine); if (NewEngine.ClosingAllEngines) { currentScriptEngine.TasktEngineUI.ClosingAllEngines = true; currentScriptEngine.TasktEngineUI.CloseWhenDone = true; } //get new variable list from the new task engine after it finishes running var newVariableList = NewEngine.EngineInstance.VariableList; foreach (var variable in variableReturnList) { //check if the variables we wish to return are in the new variable list if (newVariableList.Exists(x => x.VariableName == variable.VariableName)) { //if yes, get that variable from the new list ScriptVariable newTemp = newVariableList.Where(x => x.VariableName == variable.VariableName).FirstOrDefault(); //check if that variable previously existed in the current engine if (currentScriptEngine.VariableList.Exists(x => x.VariableName == newTemp.VariableName)) { //if yes, overwrite it ScriptVariable currentTemp = currentScriptEngine.VariableList.Where(x => x.VariableName == newTemp.VariableName).FirstOrDefault(); currentScriptEngine.VariableList.Remove(currentTemp); } //Add to current engine variable list currentScriptEngine.VariableList.Add(newTemp); } } //get errors from new engine (if any) var newEngineErrors = NewEngine.EngineInstance.ErrorsOccured; if (newEngineErrors.Count > 0) { currentScriptEngine.ChildScriptFailed = true; foreach (var error in newEngineErrors) { currentScriptEngine.ErrorsOccured.Add(error); } } ((frmScriptBuilder)CurrentScriptBuilder).EngineLogger.Information("Resuming Parent Task: " + Path.GetFileName(parentTaskPath)); if (parentEngine.IsDebugMode) { ((frmScriptEngine)currentScriptEngine.TasktEngineUI).Invoke((Action) delegate() { parentEngine.TopMost = true; parentEngine.IsHiddenTaskEngine = true; if ((IsSteppedInto || !NewEngine.IsHiddenTaskEngine) && !NewEngine.IsNewTaskResumed && !NewEngine.IsNewTaskCancelled) { parentEngine.CallBackForm.CurrentEngine = parentEngine; parentEngine.CallBackForm.IsScriptSteppedInto = true; parentEngine.IsHiddenTaskEngine = false; //toggle running flag to allow for tab selection parentEngine.CallBackForm.IsScriptRunning = false; ((frmScriptBuilder)parentEngine.CallBackForm).OpenFile(parentTaskPath); parentEngine.CallBackForm.IsScriptRunning = true; parentEngine.UpdateLineNumber(parentDebugLine + 1); parentEngine.AddStatus("Pausing Before Execution"); } else if (NewEngine.IsNewTaskResumed) { parentEngine.CallBackForm.CurrentEngine = parentEngine; parentEngine.IsNewTaskResumed = true; parentEngine.IsHiddenTaskEngine = true; parentEngine.CallBackForm.IsScriptSteppedInto = false; parentEngine.CallBackForm.IsScriptPaused = false; parentEngine.ResumeParentTask(); } else if (NewEngine.IsNewTaskCancelled) { parentEngine.uiBtnCancel_Click(null, null); } }); } else { ((frmScriptEngine)currentScriptEngine.TasktEngineUI).Invoke((Action) delegate() { parentEngine.TopMost = true; }); } }