Beispiel #1
0
        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;
                });
            }
        }