示例#1
0
        public void EvaluateProgramCondition(object evalArguments)
        {
            ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program;
            ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback;
            //
            bool isConditionSatisfied = false;

            //
            while (isEngineRunning && program.IsEnabled)
            {
                if (program.IsRunning || !isEngineEnabled)
                {
                    Thread.Sleep(1000);
                    continue;
                }
                //
                program.RoutedEventAck.WaitOne(1000);
                //
                try
                {
                    isConditionSatisfied = false;
                    //
                    var result = program.EvaluateCondition();
                    if (result != null && result.Exception != null)
                    {
                        // runtime error occurred, script is being disabled
                        // so user can notice and fix it
                        List <ProgramError> error = new List <ProgramError>()
                        {
                            program.GetFormattedError(result.Exception, true)
                        };
                        program.ScriptErrors = JsonConvert.SerializeObject(error);
                        program.IsEnabled    = false;
                        RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
                    }
                    else
                    {
                        isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false);
                    }
                    //
                    bool lastResult = program.LastConditionEvaluationResult;
                    program.LastConditionEvaluationResult = isConditionSatisfied;
                    //
                    if (program.ConditionType == ConditionType.OnSwitchTrue)
                    {
                        isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnSwitchFalse)
                    {
                        isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once)
                    {
                        // noop
                    }
                    else if (program.ConditionType == ConditionType.OnFalse)
                    {
                        isConditionSatisfied = !isConditionSatisfied;
                    }
                }
                catch (Exception ex)
                {
                    // a runtime error occured
                    List <ProgramError> error = new List <ProgramError>()
                    {
                        program.GetFormattedError(ex, true)
                    };
                    program.ScriptErrors = JsonConvert.SerializeObject(error);
                    program.IsEnabled    = false;
                    RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' '));
                }
                //
                callback(program, isConditionSatisfied);
                //
                program.RoutedEventAck.Reset();
            }
        }
示例#2
0
        // TODO: v1.1 !!!IMPORTANT!!! move thread allocation and starting to ProgramEngineBase.cs class
        public void Run(ProgramBlock program, string options)
        {
            if (program.IsRunning)
                return;

            if (program.Engine.ProgramThread != null)
            {
                program.Engine.Stop();
                program.IsRunning = false;
            }

            program.IsRunning = true;
            RaiseProgramModuleEvent(program, Properties.PROGRAM_STATUS, "Running");

            program.TriggerTime = DateTime.UtcNow;

            program.Engine.ProgramThread = new Thread(() =>
            {
                MethodRunResult result = null;
                try
                {
                    result = program.Run(options);
                }
                catch (Exception ex)
                {
                    result = new MethodRunResult();
                    result.Exception = ex;
                }
                //
                if (result != null && result.Exception != null && !result.Exception.GetType().Equals(typeof(System.Reflection.TargetException)))
                {
                    // runtime error occurred, script is being disabled
                    // so user can notice and fix it
                    List<ProgramError> error = new List<ProgramError>() { program.GetFormattedError(result.Exception, false) };
                    program.ScriptErrors = JsonConvert.SerializeObject(error);
                    program.IsEnabled = false;
                    RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "CR: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
                }
                program.IsRunning = false;
                program.Engine.ProgramThread = null;
                RaiseProgramModuleEvent(program, Properties.PROGRAM_STATUS, "Idle");
            });
            //
            if (program.ConditionType == ConditionType.Once)
            {
                program.IsEnabled = false;
            }
            //
            try
            {
                program.Engine.ProgramThread.Start();
            }
            catch
            {
                program.Engine.Stop();
                program.IsRunning = false;
                RaiseProgramModuleEvent(program, Properties.PROGRAM_STATUS, "Idle");
            }
            //
            //Thread.Sleep(100);
        }
示例#3
0
 public void Run(ProgramBlock program, string options)
 {
     if (program.IsRunning)
     {
         return;
     }
     //
     if (program.ProgramThread != null)
     {
         program.Stop();
         program.IsRunning = false;
     }
     //
     program.IsRunning = true;
     RaiseProgramModuleEvent(program, Properties.PROGRAM_STATUS, "Running");
     //
     program.TriggerTime   = DateTime.UtcNow;
     program.ProgramThread = new Thread(() =>
     {
         MethodRunResult result = null;
         try
         {
             result = program.Run(options);
         }
         catch (Exception ex)
         {
             result           = new MethodRunResult();
             result.Exception = ex;
         }
         //
         if (result != null && result.Exception != null)
         {
             // runtime error occurred, script is being disabled
             // so user can notice and fix it
             List <ProgramError> error = new List <ProgramError>()
             {
                 program.GetFormattedError(result.Exception, false)
             };
             program.ScriptErrors = JsonConvert.SerializeObject(error);
             program.IsEnabled    = false;
             RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "CR: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
         }
         program.IsRunning     = false;
         program.ProgramThread = null;
         RaiseProgramModuleEvent(program, Properties.PROGRAM_STATUS, "Idle");
     });
     //
     if (program.ConditionType == ConditionType.Once)
     {
         program.IsEnabled = false;
     }
     //
     try
     {
         program.ProgramThread.Start();
     }
     catch
     {
         program.Stop();
         program.IsRunning = false;
         RaiseProgramModuleEvent(program, Properties.PROGRAM_STATUS, "Idle");
     }
     //
     //Thread.Sleep(100);
 }
示例#4
0
        // TODO: v1.1 !!!IMPORTANT!!! possibly move this inside ProgramEngineBase.cs class and rename to EvaluateStartupCode
        public void EvaluateProgramCondition(object evalArguments)
        {
            ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program;
            ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback;
            //
            bool isConditionSatisfied = false;

            //
            while (isEngineRunning && program.IsEnabled)
            {
                // the startup code is not evaluated while the program is running
                if (program.IsRunning || !isEngineEnabled)
                {
                    Thread.Sleep(1000);
                    continue;
                }
                // wait 1 second or a new event
                program.Engine.RoutedEventAck.WaitOne(1000);
                // check if the program is still allowed to run
                if (program.IsRunning || !program.IsEnabled)
                {
                    program.Engine.RoutedEventAck.Reset();
                    continue;
                }
                // evaluate and get result from the code
                try
                {
                    isConditionSatisfied = false;
                    program.WillRun      = false;
                    //
                    var result = program.EvaluateCondition();
                    if (result != null && result.Exception != null)
                    {
                        // runtime error occurred, script is being disabled
                        // so user can notice and fix it
                        List <ProgramError> error = new List <ProgramError>()
                        {
                            program.GetFormattedError(result.Exception, true)
                        };
                        program.ScriptErrors = JsonConvert.SerializeObject(error);
                        program.IsEnabled    = false;
                        RaiseProgramModuleEvent(program, Properties.RuntimeError, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
                    }
                    else
                    {
                        isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false);
                    }
                    //
                    bool lastResult = program.LastConditionEvaluationResult;
                    program.LastConditionEvaluationResult = isConditionSatisfied;
                    //
                    if (program.ConditionType == ConditionType.OnSwitchTrue)
                    {
                        isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnSwitchFalse)
                    {
                        isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once)
                    {
                        // noop
                    }
                    else if (program.ConditionType == ConditionType.OnFalse)
                    {
                        isConditionSatisfied = !isConditionSatisfied;
                    }
                }
                catch (Exception ex)
                {
                    // a runtime error occured
                    if (!ex.GetType().Equals(typeof(System.Reflection.TargetException)))
                    {
                        List <ProgramError> error = new List <ProgramError>()
                        {
                            program.GetFormattedError(ex, true)
                        };
                        program.ScriptErrors = JsonConvert.SerializeObject(error);
                        program.IsEnabled    = false;
                        RaiseProgramModuleEvent(program, Properties.RuntimeError, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' '));
                    }
                }
                //
                callback(program, isConditionSatisfied);
                //
                program.Engine.RoutedEventAck.Reset();
            }
        }
示例#5
0
        // TODO: v1.1 !!!IMPORTANT!!! move thread allocation and starting to ProgramEngineBase.cs class
        public void Run(ProgramBlock program, string options)
        {
            if (program.IsRunning)
            {
                return;
            }

            if (program.Engine.ProgramThread != null)
            {
                program.Engine.Stop();
                program.IsRunning = false;
            }

            program.IsRunning = true;
            RaiseProgramModuleEvent(program, Properties.ProgramStatus, "Running");

            program.TriggerTime = DateTime.UtcNow;

            program.Engine.ProgramThread = new Thread(() =>
            {
                try
                {
                    MethodRunResult result = null;
                    try
                    {
                        result = program.Run(options);
                    }
                    catch (Exception ex)
                    {
                        result           = new MethodRunResult();
                        result.Exception = ex;
                    }
                    if (result != null && result.Exception != null && !result.Exception.GetType().Equals(typeof(System.Reflection.TargetException)))
                    {
                        // runtime error occurred, script is being disabled
                        // so user can notice and fix it
                        List <ProgramError> error = new List <ProgramError>()
                        {
                            program.GetFormattedError(result.Exception, false)
                        };
                        program.ScriptErrors = JsonConvert.SerializeObject(error);
                        program.IsEnabled    = false;
                        RaiseProgramModuleEvent(program, Properties.RuntimeError, "CR: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
                    }
                    RaiseProgramModuleEvent(program, Properties.ProgramStatus, "Idle");
                }
                catch (ThreadAbortException e)
                {
                    // nothing to be done here
                    RaiseProgramModuleEvent(program, Properties.ProgramStatus, "Interrupted");
                }
                finally
                {
                    program.IsRunning            = false;
                    program.Engine.ProgramThread = null;
                }
            });
            //
            if (program.ConditionType == ConditionType.Once)
            {
                program.IsEnabled = false;
            }
            //
            try
            {
                program.Engine.ProgramThread.Start();
            }
            catch
            {
                program.Engine.Stop();
                program.IsRunning = false;
                RaiseProgramModuleEvent(program, Properties.ProgramStatus, "Idle");
            }
            //
            //Thread.Sleep(100);
        }
示例#6
0
        private bool WillProgramRun(ProgramBlock program)
        {
            bool isConditionSatisfied = false;

            // evaluate and get result from the code
            lock (program.OperationLock)
                try
                {
                    program.WillRun = false;
                    //
                    var result = program.EvaluateCondition();
                    if (result != null && result.Exception != null)
                    {
                        // runtime error occurred, script is being disabled
                        // so user can notice and fix it
                        List <ProgramError> error = new List <ProgramError>()
                        {
                            program.GetFormattedError(result.Exception, true)
                        };
                        program.ScriptErrors = JsonConvert.SerializeObject(error);
                        program.IsEnabled    = false;
                        RaiseProgramModuleEvent(program, Properties.RuntimeError, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
                    }
                    else
                    {
                        isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false);
                    }
                    //
                    bool lastResult = program.LastConditionEvaluationResult;
                    program.LastConditionEvaluationResult = isConditionSatisfied;
                    //
                    if (program.ConditionType == ConditionType.OnSwitchTrue)
                    {
                        isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnSwitchFalse)
                    {
                        isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once)
                    {
                        // noop
                    }
                    else if (program.ConditionType == ConditionType.OnFalse)
                    {
                        isConditionSatisfied = !isConditionSatisfied;
                    }
                }
                catch (Exception ex)
                {
                    // a runtime error occured
                    if (!ex.GetType().Equals(typeof(System.Reflection.TargetException)))
                    {
                        List <ProgramError> error = new List <ProgramError>()
                        {
                            program.GetFormattedError(ex, true)
                        };
                        program.ScriptErrors = JsonConvert.SerializeObject(error);
                        program.IsEnabled    = false;
                        RaiseProgramModuleEvent(program, Properties.RuntimeError, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' '));
                    }
                }
            return(isConditionSatisfied && program.IsEnabled);
        }
示例#7
0
        public void EvaluateProgramCondition(object evalArguments)
        {
            ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program;
            ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback;
            //
            bool isConditionSatisfied = false;

            //
            while (isEngineRunning && program.IsEnabled)
            {
                if (program.IsRunning || !isEngineEnabled)
                {
                    Thread.Sleep(1000);
                    continue;
                }
                //
                try
                {
                    isConditionSatisfied = false;
                    //
                    if (program.Type.ToLower() != "wizard")
                    {
                        var result = program.EvaluateCondition();
                        if (result != null && result.Exception != null)
                        {
                            // runtime error occurred, script is being disabled
                            // so user can notice and fix it
                            List <ProgramError> error = new List <ProgramError>()
                            {
                                program.GetFormattedError(result.Exception, true)
                            };
                            program.ScriptErrors = JsonConvert.SerializeObject(error);
                            program.IsEnabled    = false;
                            RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
                        }
                        else
                        {
                            isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false);
                        }
                    }
                    else
                    {
                        // it is a Wizard Script
                        isConditionSatisfied = (program.Conditions.Count > 0);
                        for (int c = 0; c < program.Conditions.Count; c++)
                        {
                            // check for OR logic operator
                            if (program.Conditions[c].ComparisonOperator == ComparisonOperator.LogicOrJoint)
                            {
                                if (isConditionSatisfied)
                                {
                                    break;
                                }
                                else
                                {
                                    isConditionSatisfied = (c < program.Conditions.Count - 1);
                                    continue;
                                }
                            }
                            //
                            bool res = false;
                            try
                            {
                                res = VerifyProgramCondition(program.Conditions[c]);
                            }
                            catch
                            {
                                // TODO: report/handle exception
                            }
                            isConditionSatisfied = (isConditionSatisfied && res);
                        }
                    }
                    //
                    bool lastResult = program.LastConditionEvaluationResult;
                    program.LastConditionEvaluationResult = isConditionSatisfied;
                    //
                    if (program.ConditionType == ConditionType.OnSwitchTrue)
                    {
                        isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnSwitchFalse)
                    {
                        isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once)
                    {
                        // noop
                    }
                    else if (program.ConditionType == ConditionType.OnFalse)
                    {
                        isConditionSatisfied = !isConditionSatisfied;
                    }
                }
                catch (Exception ex)
                {
                    // a runtime error occured
                    List <ProgramError> error = new List <ProgramError>()
                    {
                        program.GetFormattedError(ex, true)
                    };
                    program.ScriptErrors = JsonConvert.SerializeObject(error);
                    program.IsEnabled    = false;
                    RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' '));
                }
                //
                callback(program, isConditionSatisfied);
                //
                Thread.Sleep(500);
            }
        }
示例#8
0
 private bool WillProgramRun(ProgramBlock program)
 {
     bool isConditionSatisfied = false;
     // evaluate and get result from the code
     lock (program.OperationLock)
     try
     {
         program.WillRun = false;
         //
         var result = program.EvaluateCondition();
         if (result != null && result.Exception != null)
         {
             // runtime error occurred, script is being disabled
             // so user can notice and fix it
             List<ProgramError> error = new List<ProgramError>() { program.GetFormattedError(result.Exception, true) };
             program.ScriptErrors = JsonConvert.SerializeObject(error);
             program.IsEnabled = false;
             RaiseProgramModuleEvent(program, Properties.RuntimeError, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
         }
         else
         {
             isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false);
         }
         //
         bool lastResult = program.LastConditionEvaluationResult;
         program.LastConditionEvaluationResult = isConditionSatisfied;
         //
         if (program.ConditionType == ConditionType.OnSwitchTrue)
         {
             isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult);
         }
         else if (program.ConditionType == ConditionType.OnSwitchFalse)
         {
             isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult);
         }
         else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once)
         {
             // noop
         }
         else if (program.ConditionType == ConditionType.OnFalse)
         {
             isConditionSatisfied = !isConditionSatisfied;
         }
     }
     catch (Exception ex)
     {
         // a runtime error occured
         if (!ex.GetType().Equals(typeof(System.Reflection.TargetException)))
         {
             List<ProgramError> error = new List<ProgramError>() { program.GetFormattedError(ex, true) };
             program.ScriptErrors = JsonConvert.SerializeObject(error);
             program.IsEnabled = false;
             RaiseProgramModuleEvent(program, Properties.RuntimeError, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' '));
         }
     }
     return isConditionSatisfied && program.IsEnabled;
 }